{"version":3,"file":"index.cjs","names":["BaseFilterTranslator","escapeLikePattern","MastraVector","MastraError","ErrorDomain","ErrorCategory","Mutex","#tail","#error","#enqueue","#base","#schemaSnapshot","#pinned","Pool","getSchemaName","getTableName","TABLE_WORKFLOW_SNAPSHOT","TABLE_SPANS","MastraBase","TABLE_SCHEMAS","MastraError","ErrorDomain","ErrorCategory","getSchemaName","getTableName","TABLE_SCHEMAS","AgentsStorage","TABLE_AGENTS","TABLE_AGENT_VERSIONS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","#migrateFromLegacySchema","#migrateVersionsSchema","#migrateToolsToJsonbFormat","#cleanupStaleDrafts","getTableName","getSchemaName","#getById","MastraError","ErrorDomain","ErrorCategory","TABLE_FAVORITES","getSchemaName","getTableName","TABLE_BACKGROUND_TASKS","parseJson","BackgroundTasksStorage","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","BlobStore","TABLE_SKILL_BLOBS","#db","#schema","TABLE_SCHEMAS","getTableName","getSchemaName","#parseRow","ChannelsStorage","TABLE_CHANNEL_INSTALLATIONS","TABLE_CHANNEL_CONFIG","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","getTableName","getSchemaName","#parseInstallationRow","DatasetsStorage","TABLE_DATASETS","TABLE_DATASET_ITEMS","TABLE_DATASET_VERSIONS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","TABLE_CONFIGS","DATASETS_SCHEMA","DATASET_ITEMS_SCHEMA","DATASET_VERSIONS_SCHEMA","#addColumnIfNotExists","getTableName","getSchemaName","#getDatasetById","MastraError","ErrorDomain","ErrorCategory","#listItems","TABLE_EXPERIMENTS","TABLE_EXPERIMENT_RESULTS","#getItemById","ExperimentsStorage","TABLE_EXPERIMENTS","TABLE_EXPERIMENT_RESULTS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","EXPERIMENTS_SCHEMA","EXPERIMENT_RESULTS_SCHEMA","MastraError","ErrorDomain","ErrorCategory","#getExperimentById","getTableName","getSchemaName","#resolvePurgeMetadata","TABLE_DATASETS","TABLE_DATASET_ITEMS","#getExperimentResultById","TABLE_AGENTS","TABLE_SKILLS","FavoritesStorage","TABLE_FAVORITES","#db","#schema","TABLE_SCHEMAS","getTableName","getSchemaName","MastraError","ErrorDomain","ErrorCategory","TABLE_KNOWLEDGE_NODES","TABLE_KNOWLEDGE_RECORDS","TABLE_KNOWLEDGE_MENTIONS","TABLE_KNOWLEDGE_CURSORS","TABLE_KNOWLEDGE_ACTIVITY","TABLE_KNOWLEDGE_SEMANTIC_OUTBOX","parseJson","toDate","KnowledgeStorage","KNOWLEDGE_NODES_SCHEMA","KNOWLEDGE_RECORDS_SCHEMA","KNOWLEDGE_MENTIONS_SCHEMA","KNOWLEDGE_CURSORS_SCHEMA","KNOWLEDGE_ACTIVITY_SCHEMA","KNOWLEDGE_SEMANTIC_OUTBOX_SCHEMA","#client","#executor","#readExecutor","#db","#schemaName","#transaction","#getNodeByName","#resolveTerminalNode","#replaceMentions","#activity","#outbox","#getNode","#resolveNode","KnowledgeNotFoundError","KnowledgeConflictError","#queryKnowledge","#getKnowledge","SNAPSHOT_FIELDS","MCPClientsStorage","TABLE_MCP_CLIENTS","TABLE_MCP_CLIENT_VERSIONS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","#getById","getTableName","getSchemaName","MastraError","ErrorDomain","ErrorCategory","SNAPSHOT_FIELDS","MCPServersStorage","TABLE_MCP_SERVERS","TABLE_MCP_SERVER_VERSIONS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","#getById","getTableName","getSchemaName","MastraError","ErrorDomain","ErrorCategory","OBSERVATIONAL_MEMORY_TABLE_SCHEMA","getSchemaName","getTableName","MemoryStorage","TABLE_MESSAGES","TABLE_RESOURCES","TABLE_THREADS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","dbGetSchemaName","dbGetTableName","#getThreadById","MastraError","ErrorDomain","ErrorCategory","MessageList","#fetchMessagePage","#getResourceById","NotificationsStorage","TABLE_NOTIFICATIONS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","getTableName","getSchemaName","#getNotification","ObservabilityStorage","TABLE_SPANS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","MastraError","ErrorDomain","ErrorCategory","getTableName","getSchemaName","listTracesArgsSchema","TraceStatus","MastraError","ErrorDomain","ErrorCategory","EntityType","coreFeatures","MastraError","ErrorDomain","ErrorCategory","METRIC_DISTINCT_COLUMNS","MastraError","ErrorDomain","ErrorCategory","listFeedbackArgsSchema","listLogsArgsSchema","listMetricsArgsSchema","listScoresArgsSchema","latestRootPredicate","latestSpanPredicate","asIsoTimestamp","coreStorage","TraceStatus","listTracesArgsSchema","BRANCH_SPAN_TYPES","listBranchesArgsSchema","MastraError","coreStorage","ErrorDomain","ErrorCategory","ObservabilityStorage","#client","#readClient","#schema","#partitioning","#discoveryConfig","#traceQueryTimeoutMs","#discovery","#partitionMode","#run","tracingOps.createSpan","tracingOps.batchCreateSpans","tracingOps.getSpan","tracingOps.getSpans","tracesOps.getRootSpan","tracingOps.getTrace","tracingOps.getTraceLight","tracesOps.listTraces","traceQueryOps.queryTraces","traceQueryOps.queryThreads","tracesOps.listBranches","logsOps.batchCreateLogs","metricsOps.batchCreateMetrics","scoresOps.createScore","scoresOps.batchCreateScores","feedbackOps.createFeedback","feedbackOps.batchCreateFeedback","scoresOps.deleteScores","feedbackOps.deleteFeedback","logsOps.listLogs","metricsOps.listMetrics","scoresOps.listScores","scoresOps.getScoreById","feedbackOps.listFeedback","feedbackOps.updateFeedbackReviewStatus","metricsOps.getMetricAggregate","metricsOps.getMetricBreakdown","metricsOps.getMetricTimeSeries","metricsOps.getMetricPercentiles","scoresOps.getScoreAggregate","scoresOps.getScoreBreakdown","scoresOps.getScoreTimeSeries","scoresOps.getScorePercentiles","feedbackOps.getFeedbackAggregate","feedbackOps.getFeedbackBreakdown","feedbackOps.getFeedbackTimeSeries","feedbackOps.getFeedbackPercentiles","discoveryOps.getEntityTypes","discoveryOps.getEntityNames","discoveryOps.getServiceNames","discoveryOps.getEnvironments","discoveryOps.getTags","discoveryOps.getMetricNames","discoveryOps.getMetricLabelKeys","discoveryOps.getMetricLabelValues","tracingOps.batchDeleteTraces","tracingOps.dangerouslyClearTracing","SNAPSHOT_FIELDS","PromptBlocksStorage","TABLE_PROMPT_BLOCKS","TABLE_PROMPT_BLOCK_VERSIONS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","#getById","getTableName","getSchemaName","MastraError","ErrorDomain","ErrorCategory","getSchemaName","getTableName","SchedulesStorage","TABLE_SCHEDULES","TABLE_SCHEDULE_TRIGGERS","#client","#readClient","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","#getSchedule","#table","SNAPSHOT_FIELDS","ScorerDefinitionsStorage","TABLE_SCORER_DEFINITIONS","TABLE_SCORER_DEFINITION_VERSIONS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","#getById","getTableName","getSchemaName","MastraError","ErrorDomain","ErrorCategory","getSchemaName","getTableName","ScoresStorage","TABLE_SCORERS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","MastraError","ErrorDomain","ErrorCategory","saveScorePayloadSchema","SNAPSHOT_FIELDS","SkillsStorage","TABLE_SKILLS","TABLE_SKILL_VERSIONS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","#getById","getTableName","getSchemaName","MastraError","ErrorDomain","ErrorCategory","#getLatestVersion","TABLE_FAVORITES","ThreadStateStorage","TABLE_THREAD_STATE","#db","#schema","TABLE_SCHEMAS","#table","getTableName","getSchemaName","#ensureRetentionIndexes","MastraError","ErrorDomain","ErrorCategory","ToolProviderConnectionsStorage","TABLE_TOOL_PROVIDER_CONNECTIONS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","getTableName","getSchemaName","MastraError","ErrorDomain","ErrorCategory","WorkflowDefinitionsStorage","TABLE_WORKFLOW_DEFINITIONS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","#get","getTableName","getSchemaName","TABLE_WORKFLOW_SNAPSHOT","WorkflowsStorage","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","MastraError","ErrorDomain","ErrorCategory","WorkspacesStorage","TABLE_WORKSPACES","TABLE_WORKSPACE_VERSIONS","#db","#schema","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","#getById","getTableName","getSchemaName","MastraError","ErrorDomain","ErrorCategory","#getLatestVersion","#queryable","#transactionClient","#schemas","#column","#serialize","#buildWhere","#buildCursor","#select","#schema","#buildSelect","#deserializeRow","UniqueViolationError","#updateMany","FactoryStorage","#pool","#ownsPool","#config","#mastraStorage","#ensureCollection","#columnDdl","Pool","getSchemaName","MastraCompositeStore","#writePool","#ownsWritePool","#readPool","#db","#readDb","MastraError","ErrorDomain","ErrorCategory","#buildPool","#initPromise","#runPinnedInit","#writePoolClosed","#createObservabilityClient","#observabilityPool","#ownsObservabilityPool","#observabilityPoolClosed"],"sources":["../src/shared/config.ts","../src/shared/pool-config.ts","../src/vector/filter.ts","../src/vector/sql-builder.ts","../src/vector/index.ts","../src/storage/client.ts","../src/storage/db/constraint-utils.ts","../src/storage/db/pg-errors.ts","../src/storage/db/schema-snapshot.ts","../src/storage/db/index.ts","../src/storage/domains/utils.ts","../src/storage/domains/agents/index.ts","../src/storage/retention.ts","../src/storage/domains/background-tasks/index.ts","../src/storage/domains/blobs/index.ts","../src/storage/domains/channels/index.ts","../src/storage/domains/datasets/index.ts","../src/storage/domains/experiments/index.ts","../src/storage/domains/favorites/index.ts","../src/storage/domains/knowledge/index.ts","../src/storage/domains/mcp-clients/index.ts","../src/storage/domains/mcp-servers/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/notifications/index.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/observability/v-next/signal-schema.ts","../src/storage/domains/observability/v-next/ddl.ts","../src/storage/domains/observability/v-next/discovery.ts","../src/storage/domains/observability/v-next/filters.ts","../src/storage/domains/observability/v-next/review-status.ts","../src/storage/domains/observability/v-next/helpers.ts","../src/storage/domains/observability/v-next/polling.ts","../src/storage/domains/observability/v-next/listing.ts","../src/storage/domains/observability/v-next/olap.ts","../src/storage/db/sanitize-json.ts","../src/storage/domains/observability/v-next/sql.ts","../src/storage/domains/observability/v-next/feedback.ts","../src/storage/domains/observability/v-next/logs.ts","../src/storage/domains/observability/v-next/metrics.ts","../src/storage/domains/observability/v-next/partitioning.ts","../src/storage/domains/observability/v-next/retention.ts","../src/storage/domains/observability/v-next/scores.ts","../src/storage/domains/observability/v-next/trace-query.ts","../src/storage/domains/observability/v-next/traces.ts","../src/storage/domains/observability/v-next/tracing.ts","../src/storage/domains/observability/v-next/index.ts","../src/storage/domains/prompt-blocks/index.ts","../src/storage/domains/schedules/index.ts","../src/storage/domains/scorer-definitions/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/skills/index.ts","../src/storage/domains/thread-state/index.ts","../src/storage/domains/tool-provider-connections/index.ts","../src/storage/domains/workflow-definitions/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/domains/workspaces/index.ts","../src/storage/factory-storage.ts","../src/storage/index.ts","../src/vector/prompt.ts"],"sourcesContent":["import type { ConnectionOptions } from 'node:tls';\nimport type { CreateIndexOptions, RetentionConfig } 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  /** Optional read-replica pool. Falls back to the writer pool when omitted. */\n  readPool?: Pool;\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   * Opt-in, table-granular, age-based retention policies. Declare per-table\n   * `maxAge` per domain (e.g. `{ memory: { messages: { maxAge: '30d' } } }`);\n   * unset tables are kept forever. Wire `storage.prune()` to your own cron to\n   * apply them. See {@link RetentionConfig}.\n   */\n  retention?: RetentionConfig;\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 writer 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  writePool?: never;\n}\n\n/** Pre-configured writer pool using the explicit read/write naming. */\nexport interface WritePoolInstanceConfig extends PostgresBaseConfig {\n  writePool: Pool;\n  pool?: never;\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  | WritePoolInstanceConfig\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 && cfg.pool !== undefined;\n};\n\n/** Type guard for an explicitly named pre-configured writer pool. */\nexport const isWritePoolConfig = (cfg: PostgresStoreConfig): cfg is WritePoolInstanceConfig => {\n  return 'writePool' in cfg && cfg.writePool !== undefined;\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  if ('pool' in config && 'writePool' in config) {\n    throw new Error(`${name}: provide either pool or writePool, not both.`);\n  }\n\n  // Pool config: user provides a pre-configured writer pg.Pool.\n  if (isPoolConfig(config) || isWritePoolConfig(config)) {\n    return;\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 type { ConnectionOptions } from 'node:tls';\nimport type { PoolConfig } from 'pg';\nimport { parse } from 'pg-connection-string';\n\n/**\n * Builds the `pg.Pool` options for a connection-string based config.\n *\n * Shared by both `PostgresStore` and `PgVector` so connection-string SSL\n * precedence behaves identically across the storage and vector code paths.\n *\n * node-postgres re-parses `connectionString` via `pg-connection-string` and\n * `Object.assign`s the parsed result over any explicit options. As a result an\n * `sslmode=` / `ssl=` query param in the URL silently overrides an explicit\n * `ssl` object (e.g. `{ rejectUnauthorized: false }`), producing\n * `UNABLE_TO_GET_ISSUER_CERT_LOCALLY` against self-signed CAs even though the\n * caller asked to skip verification.\n *\n * To avoid that we parse the connection string ourselves and forward the\n * discrete fields, applying the explicit `ssl` last so it always wins. When no\n * explicit `ssl` is provided we keep whatever the URL implied (`sslmode=...`),\n * preserving backwards-compatible behaviour for connection-string-only SSL.\n *\n * @see https://github.com/mastra-ai/mastra/issues/17307\n */\nexport function buildConnectionStringPoolConfig(\n  config: {\n    connectionString: string;\n    ssl?: ConnectionOptions | boolean;\n    max?: number;\n    idleTimeoutMillis?: number;\n  },\n  defaults: { max: number; idleTimeoutMillis: number },\n): PoolConfig {\n  // `parse` returns ports as strings and may include an `ssl` key derived from\n  // the URL; `pg` accepts these discrete fields the same way it would the raw\n  // string, minus the precedence quirk above.\n  const parsed = parse(config.connectionString) as unknown as PoolConfig;\n\n  return {\n    ...parsed,\n    ...(config.ssl !== undefined ? { ssl: config.ssl } : {}),\n    max: config.max ?? defaults.max,\n    idleTimeoutMillis: config.idleTimeoutMillis ?? defaults.idleTimeoutMillis,\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 getTextExtractExpr = (key: string) => {\n  const jsonPathKey = parseJsonPathKey(key);\n  if (!key.includes('.')) {\n    return `metadata->>'${jsonPathKey}'`;\n  }\n  return `metadata#>>'{${jsonPathKey}}'`;\n};\n\nconst getJsonExtractExpr = (key: string) => {\n  const jsonPathKey = parseJsonPathKey(key);\n  if (!key.includes('.')) {\n    return `metadata->'${jsonPathKey}'`;\n  }\n  return `metadata#>'{${jsonPathKey}}'`;\n};\n\nconst createBasicOperator = (symbol: string) => {\n  return (key: string, paramIndex: number) => {\n    const textExtract = getTextExtractExpr(key);\n    return {\n      sql: `CASE\n        WHEN $${paramIndex}::text IS NULL THEN ${textExtract} IS ${symbol === '=' ? '' : 'NOT'} NULL\n        ELSE ${textExtract} ${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 textExtract = getTextExtractExpr(key);\n    const jsonExtract = getJsonExtractExpr(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      // JSONB metadata is schemaless, so a candidate row may hold a non-numeric\n      // value at this path (e.g. { price: 'N/A' }). Casting the column to ::numeric\n      // unconditionally makes Postgres raise 22P02 and fail the ENTIRE query instead\n      // of that row simply not matching. Guard the cast with jsonb_typeof so only\n      // number-typed rows are compared and everything else is excluded, mirroring the\n      // $size/$in pattern already used in this file and MongoDB-style range semantics.\n      return {\n        sql: `(CASE WHEN jsonb_typeof(${jsonExtract}) = 'number' THEN (${textExtract})::numeric ${symbol} $${paramIndex}::numeric ELSE NULL END)`,\n        needsValue: true,\n      };\n    } else {\n      // Use text comparison for strings (including ISO 8601 dates which sort correctly)\n      return {\n        sql: `${textExtract} ${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    // Rewrite every column reference to the per-element alias. Order matters:\n    // replace the longer `metadata#>>` / `metadata->>` tokens before `metadata#>` / `metadata->` so the latter\n    // doesn't partially match the former (e.g. the jsonb_typeof guard emitted by\n    // the numeric operators uses the single-arrow `metadata->` / `metadata#>` form).\n    const sql = result.sql\n      .replaceAll('metadata->>', 'elem->>')\n      .replaceAll('metadata->', 'elem->')\n      .replaceAll('metadata#>>', 'elem#>>')\n      .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 textExtract = getTextExtractExpr(key);\n    const jsonExtract = getJsonExtractExpr(key);\n    return {\n      sql: `(\n        CASE\n          WHEN jsonb_typeof(${jsonExtract}) = 'array' THEN\n            EXISTS (\n              SELECT 1 FROM jsonb_array_elements_text(${jsonExtract}) as elem\n              WHERE elem = ANY($${paramIndex}::text[])\n            )\n          ELSE ${textExtract} = ANY($${paramIndex}::text[])\n        END\n      )`,\n      needsValue: true,\n    };\n  },\n  $nin: (key, paramIndex) => {\n    const textExtract = getTextExtractExpr(key);\n    const jsonExtract = getJsonExtractExpr(key);\n    return {\n      sql: `(\n        CASE\n          WHEN jsonb_typeof(${jsonExtract}) = 'array' THEN\n            NOT EXISTS (\n              SELECT 1 FROM jsonb_array_elements_text(${jsonExtract}) as elem\n              WHERE elem = ANY($${paramIndex}::text[])\n            )\n          ELSE ${textExtract} != ALL($${paramIndex}::text[])\n        END\n      )`,\n      needsValue: true,\n    };\n  },\n  $all: (key, paramIndex) => {\n    const jsonExtract = getJsonExtractExpr(key);\n    return {\n      sql: `CASE WHEN array_length($${paramIndex}::text[], 1) IS NULL THEN false\n            ELSE (${jsonExtract})::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 jsonExtract = getJsonExtractExpr(key);\n    return {\n      sql: `(\n        CASE\n          WHEN jsonb_typeof(${jsonExtract}) = 'array' THEN\n            EXISTS (\n              SELECT 1\n              FROM jsonb_array_elements(${jsonExtract}) as elem\n              WHERE ${sql}\n            )\n          ELSE FALSE\n        END\n      )`,\n      needsValue: true,\n      transformValue: () => values,\n    };\n  },\n  // Element Operators\n  $exists: (key, paramIndex, value) => {\n    const jsonPathKey = parseJsonPathKey(key);\n    // If value is false, check that the key does NOT exist\n    if (value === false) {\n      return {\n        sql: `NOT (metadata ? '${jsonPathKey}')`,\n        needsValue: false,\n      };\n    }\n    // Otherwise (true or truthy), check that the key exists\n    return {\n      sql: `metadata ? '${jsonPathKey}'`,\n      needsValue: false,\n    };\n  },\n\n  // Logical Operators\n  $and: key => ({ sql: `(${key})`, needsValue: false }),\n  $or: key => ({ sql: `(${key})`, needsValue: false }),\n  $not: key => ({ sql: `(${key})`, needsValue: false }),\n  $nor: key => ({ sql: `NOT (${key})`, needsValue: false }),\n\n  // Regex Operators\n  $regex: (key, paramIndex) => {\n    const textExtract = getTextExtractExpr(key);\n    return {\n      sql: `${textExtract} ~ $${paramIndex}`,\n      needsValue: true,\n    };\n  },\n\n  $contains: (key, paramIndex, value: any) => {\n    const textExtract = getTextExtractExpr(key);\n    const jsonExtract = getJsonExtractExpr(key);\n    let sql;\n    if (Array.isArray(value)) {\n      sql = `(${jsonExtract}) ?& $${paramIndex}`;\n    } else if (typeof value === 'string') {\n      sql = `${textExtract} ILIKE '%' || $${paramIndex} || '%' ESCAPE '\\\\'`;\n    } else {\n      sql = `${textExtract} = $${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 jsonExtract = getJsonExtractExpr(key);\n    return {\n      sql: `(\n      CASE\n        WHEN jsonb_typeof(${jsonExtract}) = 'array' THEN\n          jsonb_array_length(${jsonExtract}) = $${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 `${getTextExtractExpr(key)} = $${values.length}`;\n    }\n\n    // Handle operator conditions\n    const entries = Object.entries(value);\n\n    // If multiple operators on same field (e.g., { $gte: 20, $lte: 80 }), combine with AND\n    if (entries.length > 1) {\n      const conditions = entries.map(([operator, operatorValue]) => {\n        // Special handling for nested $not\n        if (operator === '$not') {\n          const nestedEntries = Object.entries(operatorValue as Record<string, unknown>);\n          const nestedConditions = nestedEntries\n            .map(([nestedOp, nestedValue]) => {\n              if (!FILTER_OPERATORS[nestedOp as OperatorType]) {\n                throw new Error(`Invalid operator in $not condition: ${nestedOp}`);\n              }\n              const operatorFn = FILTER_OPERATORS[nestedOp as OperatorType]!;\n              const operatorResult = operatorFn(key, values.length + 1, nestedValue);\n              if (operatorResult.needsValue) {\n                const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : nestedValue;\n                if (Array.isArray(transformedValue) && nestedOp === '$elemMatch') {\n                  values.push(...transformedValue);\n                } else {\n                  values.push(transformedValue);\n                }\n              }\n              return operatorResult.sql;\n            })\n            .join(' AND ');\n          return `NOT (${nestedConditions})`;\n        }\n\n        if (!FILTER_OPERATORS[operator as OperatorType]) {\n          throw new Error(`Invalid operator: ${operator}`);\n        }\n        const operatorFn = FILTER_OPERATORS[operator as OperatorType]!;\n        const operatorResult = operatorFn(key, values.length + 1, operatorValue);\n        if (operatorResult.needsValue) {\n          const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;\n          if (Array.isArray(transformedValue) && operator === '$elemMatch') {\n            values.push(...transformedValue);\n          } else {\n            values.push(transformedValue);\n          }\n        }\n        return operatorResult.sql;\n      });\n      return conditions.join(' AND ');\n    }\n\n    // Single operator case\n    const [[operator, operatorValue] = []] = entries;\n\n    // Special handling for nested $not\n    if (operator === '$not') {\n      const nestedEntries = Object.entries(operatorValue as Record<string, unknown>);\n      const conditions = nestedEntries\n        .map(([nestedOp, nestedValue]) => {\n          if (!FILTER_OPERATORS[nestedOp as OperatorType]) {\n            throw new Error(`Invalid operator in $not condition: ${nestedOp}`);\n          }\n          const operatorFn = FILTER_OPERATORS[nestedOp as OperatorType]!;\n          const operatorResult = operatorFn(key, values.length + 1, nestedValue);\n          if (operatorResult.needsValue) {\n            const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : nestedValue;\n            if (Array.isArray(transformedValue) && nestedOp === '$elemMatch') {\n              values.push(...transformedValue);\n            } else {\n              values.push(transformedValue);\n            }\n          }\n          return operatorResult.sql;\n        })\n        .join(' AND ');\n\n      return `NOT (${conditions})`;\n    }\n    const operatorFn = FILTER_OPERATORS[operator as OperatorType]!;\n    const operatorResult = operatorFn(key, values.length + 1, operatorValue);\n    if (operatorResult.needsValue) {\n      const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;\n      if (Array.isArray(transformedValue) && operator === '$elemMatch') {\n        values.push(...transformedValue);\n      } else {\n        values.push(transformedValue);\n      }\n    }\n    return operatorResult.sql;\n  }\n\n  function handleLogicalOperator(\n    key: '$and' | '$or' | '$not' | '$nor',\n    value: VectorFilter[],\n    parentPath: string,\n  ): string {\n    if (key === '$not') {\n      // For top-level $not\n      const entries = Object.entries(value);\n      const conditions = entries\n        .map(([fieldKey, fieldValue]) => buildCondition(fieldKey, fieldValue, key))\n        .join(' AND ');\n      return `NOT (${conditions})`;\n    }\n\n    // Handle empty conditions\n    if (!value || value.length === 0) {\n      switch (key) {\n        case '$and':\n        case '$nor':\n          return 'true'; // Empty $and/$nor match everything\n        case '$or':\n          return 'false'; // Empty $or matches nothing\n        default:\n          return 'true';\n      }\n    }\n\n    const joinOperator = key === '$or' || key === '$nor' ? 'OR' : 'AND';\n    const conditions = value.map((f: VectorFilter) => {\n      const entries = Object.entries(f || {});\n      if (entries.length === 0) return '';\n\n      const [firstKey, firstValue] = entries[0] || [];\n      if (['$and', '$or', '$not', '$nor'].includes(firstKey as string)) {\n        return buildCondition(firstKey as string, firstValue, parentPath);\n      }\n      return entries.map(([k, v]) => buildCondition(k, v, parentPath)).join(` ${joinOperator} `);\n    });\n\n    const joined = conditions.join(` ${joinOperator} `);\n    const operatorFn = FILTER_OPERATORS[key]!;\n    return operatorFn(joined, 0, value).sql;\n  }\n\n  if (!filter) {\n    return { sql: '', values };\n  }\n\n  const conditions = Object.entries(filter)\n    .map(([key, value]) => buildCondition(key, value, ''))\n    .filter(Boolean)\n    .join(' AND ');\n\n  return { sql: conditions ? `WHERE ${conditions}` : '', values };\n}\n\nexport function buildFilterQuery(filter: PGVectorFilter, minScore: number, topK: number): FilterResult {\n  const values = [minScore, topK];\n\n  function buildCondition(key: string, value: any, parentPath: string): string {\n    // Handle logical operators ($and/$or)\n    if (['$and', '$or', '$not', '$nor'].includes(key)) {\n      return handleLogicalOperator(key as '$and' | '$or' | '$not' | '$nor', value, parentPath);\n    }\n\n    // If condition is not a FilterCondition object, assume it's an equality check\n    if (!value || typeof value !== 'object') {\n      values.push(value);\n      return `${getTextExtractExpr(key)} = $${values.length}`;\n    }\n\n    // Handle operator conditions\n    const entries = Object.entries(value);\n\n    // If multiple operators on same field (e.g., { $gte: 20, $lte: 80 }), combine with AND\n    if (entries.length > 1) {\n      const conditions = entries.map(([operator, operatorValue]) => {\n        // Special handling for nested $not\n        if (operator === '$not') {\n          const nestedEntries = Object.entries(operatorValue as Record<string, unknown>);\n          const nestedConditions = nestedEntries\n            .map(([nestedOp, nestedValue]) => {\n              if (!FILTER_OPERATORS[nestedOp as OperatorType]) {\n                throw new Error(`Invalid operator in $not condition: ${nestedOp}`);\n              }\n              const operatorFn = FILTER_OPERATORS[nestedOp as OperatorType]!;\n              const operatorResult = operatorFn(key, values.length + 1, nestedValue);\n              if (operatorResult.needsValue) {\n                const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : nestedValue;\n                if (Array.isArray(transformedValue) && nestedOp === '$elemMatch') {\n                  values.push(...transformedValue);\n                } else {\n                  values.push(transformedValue);\n                }\n              }\n              return operatorResult.sql;\n            })\n            .join(' AND ');\n          return `NOT (${nestedConditions})`;\n        }\n\n        if (!FILTER_OPERATORS[operator as OperatorType]) {\n          throw new Error(`Invalid operator: ${operator}`);\n        }\n        const operatorFn = FILTER_OPERATORS[operator as OperatorType]!;\n        const operatorResult = operatorFn(key, values.length + 1, operatorValue);\n        if (operatorResult.needsValue) {\n          const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;\n          if (Array.isArray(transformedValue) && operator === '$elemMatch') {\n            values.push(...transformedValue);\n          } else {\n            values.push(transformedValue);\n          }\n        }\n        return operatorResult.sql;\n      });\n      return conditions.join(' AND ');\n    }\n\n    // Single operator case\n    const [[operator, operatorValue] = []] = entries;\n\n    // Special handling for nested $not\n    if (operator === '$not') {\n      const nestedEntries = Object.entries(operatorValue as Record<string, unknown>);\n      const conditions = nestedEntries\n        .map(([nestedOp, nestedValue]) => {\n          if (!FILTER_OPERATORS[nestedOp as OperatorType]) {\n            throw new Error(`Invalid operator in $not condition: ${nestedOp}`);\n          }\n          const operatorFn = FILTER_OPERATORS[nestedOp as OperatorType]!;\n          const operatorResult = operatorFn(key, values.length + 1, nestedValue);\n          if (operatorResult.needsValue) {\n            const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : nestedValue;\n            if (Array.isArray(transformedValue) && nestedOp === '$elemMatch') {\n              values.push(...transformedValue);\n            } else {\n              values.push(transformedValue);\n            }\n          }\n          return operatorResult.sql;\n        })\n        .join(' AND ');\n\n      return `NOT (${conditions})`;\n    }\n    const operatorFn = FILTER_OPERATORS[operator as OperatorType]!;\n    const operatorResult = operatorFn(key, values.length + 1, operatorValue);\n    if (operatorResult.needsValue) {\n      const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;\n      if (Array.isArray(transformedValue) && operator === '$elemMatch') {\n        values.push(...transformedValue);\n      } else {\n        values.push(transformedValue);\n      }\n    }\n    return operatorResult.sql;\n  }\n\n  function handleLogicalOperator(\n    key: '$and' | '$or' | '$not' | '$nor',\n    value: VectorFilter[],\n    parentPath: string,\n  ): string {\n    if (key === '$not') {\n      // For top-level $not\n      const entries = Object.entries(value);\n      const conditions = entries\n        .map(([fieldKey, fieldValue]) => buildCondition(fieldKey, fieldValue, key))\n        .join(' AND ');\n      return `NOT (${conditions})`;\n    }\n\n    // Handle empty conditions\n    if (!value || value.length === 0) {\n      switch (key) {\n        case '$and':\n        case '$nor':\n          return 'true'; // Empty $and/$nor match everything\n        case '$or':\n          return 'false'; // Empty $or matches nothing\n        default:\n          return 'true';\n      }\n    }\n\n    const joinOperator = key === '$or' || key === '$nor' ? 'OR' : 'AND';\n    const conditions = value.map((f: VectorFilter) => {\n      const entries = Object.entries(f || {});\n      if (entries.length === 0) return '';\n\n      const [firstKey, firstValue] = entries[0] || [];\n      if (['$and', '$or', '$not', '$nor'].includes(firstKey as string)) {\n        return buildCondition(firstKey as string, firstValue, parentPath);\n      }\n      return entries.map(([k, v]) => buildCondition(k, v, parentPath)).join(` ${joinOperator} `);\n    });\n\n    const joined = conditions.join(` ${joinOperator} `);\n    const operatorFn = FILTER_OPERATORS[key]!;\n    return operatorFn(joined, 0, value).sql;\n  }\n\n  if (!filter) {\n    return { sql: '', values };\n  }\n\n  const conditions = Object.entries(filter)\n    .map(([key, value]) => buildCondition(key, value, ''))\n    .filter(Boolean)\n    .join(' AND ');\n\n  return { sql: conditions ? `WHERE ${conditions}` : '', values };\n}\n","import { createHash } from 'node:crypto';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createVectorErrorId } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { MastraVector, validateUpsertInput, validateTopK } from '@mastra/core/vector';\nimport type {\n  IndexStats,\n  QueryResult,\n  QueryVectorParams,\n  CreateIndexParams,\n  UpsertVectorParams,\n  DescribeIndexParams,\n  DeleteIndexParams,\n  DeleteVectorParams,\n  DeleteVectorsParams,\n  UpdateVectorParams,\n} from '@mastra/core/vector';\nimport { Mutex } from 'async-mutex';\nimport * as pg from 'pg';\nimport xxhash from 'xxhash-wasm';\n\nimport { validateConfig, isCloudSqlConfig, isConnectionStringConfig, isHostConfig } from '../shared/config';\nimport type { PgVectorConfig } from '../shared/config';\nimport { buildConnectionStringPoolConfig } from '../shared/pool-config';\nimport { PGFilterTranslator } from './filter';\nimport type { PGVectorFilter } from './filter';\nimport { buildFilterQuery, buildDeleteFilterQuery } from './sql-builder';\nimport type { IndexConfig, IndexType, PgMetric, VectorOps, VectorType } from './types';\nexport type { PgMetric, VectorOps, VectorType, IndexConfig, IndexType } 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   * - 'bit': Binary vectors (1 bit per dimension)\n   * - 'sparsevec': Sparse vectors (only non-zero elements stored)\n   */\n  vectorType: VectorType;\n  config: {\n    m?: number;\n    efConstruction?: number;\n    lists?: number;\n    probes?: number;\n  };\n}\n\n/**\n * The subset of {@link PGIndexStats} that can be read from the Postgres catalog alone.\n *\n * Everything here comes from `information_schema.columns`, `pg_attribute` and `pg_index`,\n * which are cheap regardless of how large the table is. The row count is deliberately\n * excluded: it requires `SELECT COUNT(*)`, a full heap scan on large indexes.\n */\ntype PGIndexMetadata = Omit<PGIndexStats, 'count'>;\n\ninterface PgQueryVectorParams extends QueryVectorParams<PGVectorFilter> {\n  namespace?: string;\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 Omit<CreateIndexParams, 'metric'> {\n  /**\n   * Distance metric for the index.\n   * Standard: 'cosine', 'euclidean', 'dotproduct' (work with all vector types)\n   * Bit-specific: 'hamming' (count differing bits), 'jaccard' (1 - intersection/union)\n   *\n   * For 'bit' vectorType, defaults to 'hamming' if not specified.\n   * 'jaccard' requires HNSW index (IVFFlat does not support Jaccard distance).\n   */\n  metric?: PgMetric;\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   * - 'bit': Binary vectors (1 bit per dimension), up to 64,000 dimensions for indexes\n   * - 'sparsevec': Sparse vectors (only non-zero elements), up to 1,000 non-zero elements for indexes\n   *\n   * Use 'halfvec' for large dimension models like text-embedding-3-large (3072 dimensions)\n   * Use 'bit' for binary quantization (reduced storage, faster search)\n   * Use 'sparsevec' for BM25/TF-IDF and other sparse embeddings\n   */\n  vectorType?: VectorType;\n  /**\n   * Metadata fields to create btree indexes for.\n   * This improves query performance when filtering vectors by these metadata fields.\n   *\n   * Each entry creates a btree index on `metadata->>'field_name'`.\n   *\n   * Example: `['thread_id', 'resource_id']` creates indexes that speed up\n   * queries filtering by `thread_id` or `resource_id` in the metadata JSONB column.\n   */\n  metadataIndexes?: string[];\n}\n\ninterface PgDefineIndexParams {\n  indexName: string;\n  metric: PgMetric;\n  indexConfig: IndexConfig;\n  vectorType?: VectorType;\n}\n\ntype PgUpsertVectorParams = UpsertVectorParams<PGVectorFilter> & {\n  namespace?: string;\n};\n\ntype PgUpdateVectorParams = UpdateVectorParams<PGVectorFilter> & {\n  namespace?: string;\n};\n\ntype PgDeleteVectorParams = DeleteVectorParams & {\n  namespace?: string;\n};\n\ntype PgDeleteVectorsParams = DeleteVectorsParams<PGVectorFilter> & {\n  namespace?: string;\n};\n\nconst DEFAULT_NAMESPACE = 'default';\n\n// Postgres allows at most 65535 bind parameters per statement; upserts bind 4 per row.\nconst MAX_UPSERT_ROWS_PER_STATEMENT = Math.floor(65535 / 4);\n\nexport class PgVector extends MastraVector<PGVectorFilter> {\n  public pool: pg.Pool;\n  /**\n   * Cache for the public `getIndexInfo()`. Holds the in-flight promise rather than the\n   * resolved value so concurrent callers on a cold cache share a single round trip.\n   */\n  private describeIndexCache: Map<string, Promise<PGIndexStats>> = new Map();\n  /**\n   * Cache for the catalog-only index metadata used by the internal hot paths\n   * (cache warmup, query, upsert, updateVector, setupIndex). Also memoizes the promise.\n   */\n  private indexMetadataCache: Map<string, Promise<PGIndexMetadata>> = new Map();\n  private createdIndexes = new Map<string, number>();\n  private namespaceReadyIndexes = new Set<string>();\n  /** In-flight lazy namespace migrations, keyed by index name (see {@link ensureNamespaceReady}). */\n  private namespaceReadyCache: Map<string, Promise<void>> = new Map();\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, disableInit: config.disableInit });\n\n      this.schema = config.schemaName;\n\n      let poolConfig: pg.PoolConfig;\n\n      if (isConnectionStringConfig(config)) {\n        // Delegate to the shared helper so an explicit `ssl` option wins over an\n        // `sslmode=`/`ssl=` query param in the connection string, matching\n        // PostgresStore. See https://github.com/mastra-ai/mastra/issues/17307\n        poolConfig = {\n          ...buildConnectionStringPoolConfig(config, { max: 20, 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      // pg emits 'error' on the pool when an idle client's connection drops\n      // (backend restart, network partition, cloud proxies reaping idle\n      // sockets). Without a listener Node escalates the event to an\n      // uncaughtException and crashes the process. The pool already discards\n      // the dead client, so warn and let the next checkout reconnect.\n      this.pool.on('error', err => {\n        this.logger?.warn?.(\n          'PgVector: idle pool client error (pool discards the client and reconnects on next checkout)',\n          {\n            err: err instanceof Error ? err.message : err,\n          },\n        );\n      });\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.getIndexMetadata({ 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   * Sets search_path on the client connection so that vector operators (e.g. <=>, vector_cosine_ops)\n   * are resolvable when the pgvector extension is installed in a non-default schema.\n   *\n   * PostgreSQL's default search_path is (\"$user\", public). If the extension lives in a custom schema\n   * (e.g. \"myapp\"), operator classes and distance operators won't resolve without this.\n   */\n  private async ensureSearchPath(client: pg.PoolClient) {\n    // Lazily detect extension schema if not yet known\n    if (!this.vectorExtensionSchema) {\n      await this.detectVectorExtensionSchema(client);\n    }\n\n    if (\n      this.vectorExtensionSchema &&\n      this.vectorExtensionSchema !== 'public' &&\n      this.vectorExtensionSchema !== 'pg_catalog'\n    ) {\n      const schemas = new Set<string>();\n      schemas.add(this.vectorExtensionSchema);\n      if (this.schema) schemas.add(this.schema);\n      schemas.add('public');\n      await client.query(`SET search_path TO ${[...schemas].map(s => `\"${s}\"`).join(', ')}`);\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  /** Checks if pgvector >= 0.7.0 (required for bit type). */\n  private supportsBit(): boolean {\n    return this.supportsHalfvec();\n  }\n\n  /** Checks if pgvector >= 0.7.0 (required for sparsevec type). */\n  private supportsSparsevec(): boolean {\n    return this.supportsHalfvec();\n  }\n\n  /**\n   * Gets the properly qualified vector type name\n   * @param vectorType - The type of vector storage\n   */\n  private getVectorTypeName(vectorType: VectorType = 'vector', dimension?: number): string {\n    // 'bit' is a native PostgreSQL type (in pg_catalog), not a pgvector extension type.\n    // It must never be schema-qualified with the extension schema.\n    // When dimension is provided, return 'bit(N)' for proper casting (PostgreSQL treats bare 'bit' as 'bit(1)').\n    if (vectorType === 'bit') {\n      return dimension ? `bit(${dimension})` : 'bit';\n    }\n\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   * Returns the operator class, distance operator, and score expression for a\n   * standard (non-bit) vector type prefix and metric.\n   */\n  private getMetricOps(\n    prefix: string,\n    metric: PgMetric,\n  ): Pick<VectorOps, 'operatorClass' | 'distanceOperator' | 'scoreExpr'> {\n    switch (metric) {\n      case 'euclidean':\n        return {\n          operatorClass: `${prefix}_l2_ops`,\n          distanceOperator: '<->',\n          scoreExpr: d => `1.0 / (1.0 + (${d}))`,\n        };\n      case 'dotproduct':\n        return {\n          operatorClass: `${prefix}_ip_ops`,\n          distanceOperator: '<#>',\n          scoreExpr: d => `(${d}) * -1`,\n        };\n      default:\n        return {\n          operatorClass: `${prefix}_cosine_ops`,\n          distanceOperator: '<=>',\n          scoreExpr: d => `1 - (${d})`,\n        };\n    }\n  }\n\n  /**\n   * Returns all vector-type-specific operations for the given vectorType and metric.\n   */\n  private getVectorOps(vectorType: VectorType, metric: PgMetric): VectorOps {\n    switch (vectorType) {\n      case 'bit':\n        return {\n          operatorClass: metric === 'jaccard' ? 'bit_jaccard_ops' : 'bit_hamming_ops',\n          distanceOperator: metric === 'jaccard' ? '<%>' : '<~>',\n          scoreExpr: d => (metric === 'jaccard' ? `1 - (${d})` : `1 - ((${d})::float / bit_length(embedding))`),\n          formatVector: v => v.map(x => (x ? '1' : '0')).join(''),\n          parseEmbedding: e => e.split('').map(c => (c === '1' ? 1 : 0)),\n        };\n\n      case 'sparsevec':\n        return {\n          ...this.getMetricOps('sparsevec', metric),\n          formatVector: (v, dimension) => {\n            const dim = dimension ?? v.length;\n            const nonZero = v\n              .map((val, i) => (val !== 0 ? `${i + 1}:${val}` : null))\n              .filter(Boolean)\n              .join(',');\n            return `{${nonZero}}/${dim}`;\n          },\n          parseEmbedding: e => {\n            const match = e.match(/^\\{([^}]*)\\}\\/(\\d+)$/);\n            if (!match) return [];\n            const dim = parseInt(match[2]!, 10);\n            const result = new Array(dim).fill(0) as number[];\n            const entries = match[1]!;\n            if (entries.trim()) {\n              for (const entry of entries.split(',')) {\n                const [idxStr, valStr] = entry.split(':');\n                const idx = parseInt(idxStr!.trim(), 10) - 1;\n                result[idx] = parseFloat(valStr!.trim());\n              }\n            }\n            return result;\n          },\n        };\n\n      case 'halfvec':\n      case 'vector':\n      default:\n        return {\n          ...this.getMetricOps(vectorType === 'halfvec' ? 'halfvec' : 'vector', metric),\n          formatVector: v => `[${v.join(',')}]`,\n          parseEmbedding: e => JSON.parse(e),\n        };\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      parsedIndexName,\n    };\n  }\n\n  private getSchemaName() {\n    return this.schema ? `\"${parseSqlIdentifier(this.schema, 'schema name')}\"` : undefined;\n  }\n\n  private async ensureNamespaceSchema(indexName: string, client: pg.PoolClient): Promise<void> {\n    const { tableName, parsedIndexName } = this.getTableName(indexName);\n    // Anchor on to_regclass(tableName) so the lookup resolves the same relation as the\n    // unqualified DDL does (via search_path) when no schemaName is configured.\n    const vectorIdColumn = await client.query(\n      `SELECT 1\n       FROM pg_attribute\n       WHERE attrelid = to_regclass($1)\n         AND attname = 'vector_id'\n         AND attnum > 0\n         AND NOT attisdropped`,\n      [tableName],\n    );\n    if (vectorIdColumn.rowCount === 0) {\n      return;\n    }\n\n    await client.query(\n      `ALTER TABLE ${tableName} ADD COLUMN IF NOT EXISTS namespace VARCHAR(255) NOT NULL DEFAULT '${DEFAULT_NAMESPACE}'`,\n    );\n\n    const state = await this.getNamespaceSchemaState(tableName, client);\n    if (!state.composite_index) {\n      const namespaceIndexName = this.getNamespaceIndexName(parsedIndexName);\n      await client.query(\n        `CREATE UNIQUE INDEX IF NOT EXISTS \"${namespaceIndexName}\" ON ${tableName} (namespace, vector_id)`,\n      );\n    }\n\n    const legacyConstraints = await client.query<{ conname: string }>(\n      `SELECT c.conname\n       FROM pg_constraint c\n       WHERE c.conrelid = to_regclass($1)\n         AND c.contype = 'u'\n         AND pg_get_constraintdef(c.oid) = 'UNIQUE (vector_id)'`,\n      [tableName],\n    );\n\n    for (const { conname } of legacyConstraints.rows) {\n      const parsedConstraintName = parseSqlIdentifier(conname, 'constraint name');\n      await client.query(`ALTER TABLE ${tableName} DROP CONSTRAINT \"${parsedConstraintName}\"`);\n    }\n  }\n\n  private getNamespaceIndexName(parsedIndexName: string): string {\n    const fullName = `${parsedIndexName}_namespace_vector_id_idx`;\n    if (fullName.length <= 63) {\n      return fullName;\n    }\n    const hash = createHash('sha256').update(parsedIndexName).digest('hex').slice(0, 32);\n    const suffix = `_ns_${hash}_idx`;\n    return `${parsedIndexName.slice(0, 63 - suffix.length)}${suffix}`;\n  }\n\n  private async getNamespaceSchemaState(tableName: string, client: pg.PoolClient) {\n    const result = await client.query<{\n      vector_id: boolean;\n      namespace: boolean;\n      composite_index: boolean;\n      legacy_constraint: boolean;\n    }>(\n      `SELECT\n         EXISTS (SELECT 1 FROM pg_attribute WHERE attrelid = to_regclass($1)\n           AND attname = 'vector_id' AND attnum > 0 AND NOT attisdropped) AS vector_id,\n         EXISTS (SELECT 1 FROM pg_attribute WHERE attrelid = to_regclass($1)\n           AND attname = 'namespace' AND attnum > 0 AND NOT attisdropped) AS namespace,\n         EXISTS (\n           SELECT 1 FROM pg_index i\n           WHERE i.indrelid = to_regclass($1)\n             AND i.indisunique AND i.indisvalid AND i.indisready AND i.indimmediate\n             AND i.indpred IS NULL AND i.indexprs IS NULL AND i.indnkeyatts = 2\n             AND (SELECT array_agg(a.attname::text ORDER BY a.attname)\n                  FROM unnest(i.indkey) WITH ORDINALITY AS k(attnum, position)\n                  JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = k.attnum\n                  WHERE k.position <= i.indnkeyatts) = ARRAY['namespace', 'vector_id']\n         ) AS composite_index,\n         EXISTS (SELECT 1 FROM pg_constraint WHERE conrelid = to_regclass($1)\n           AND contype = 'u' AND pg_get_constraintdef(oid) = 'UNIQUE (vector_id)') AS legacy_constraint`,\n      [tableName],\n    );\n    return result.rows[0]!;\n  }\n\n  private async reconcileNamespace(indexName: string, client: pg.PoolClient): Promise<boolean> {\n    const { tableName } = this.getTableName(indexName);\n    await client.query('BEGIN');\n    try {\n      // Resolve aliases (explicit schema and search_path) to the same cross-process lock.\n      await client.query('SELECT pg_advisory_xact_lock((1936876916::bigint << 32) | to_regclass($1)::oid::bigint)', [\n        tableName,\n      ]);\n      const state = await this.getNamespaceSchemaState(tableName, client);\n      if (!state.vector_id) {\n        await client.query('ROLLBACK');\n        return false;\n      }\n      if (!state.namespace || !state.composite_index || state.legacy_constraint) {\n        if (this.disableInit || process.env.MASTRA_DISABLE_STORAGE_INIT === 'true') {\n          throw new MastraError({\n            id: createVectorErrorId('PG', 'ENSURE_NAMESPACE', 'MIGRATION_REQUIRED'),\n            domain: ErrorDomain.MASTRA_VECTOR,\n            category: ErrorCategory.USER,\n            text:\n              `Vector index \"${indexName}\" requires namespace migration and schema changes are disabled. ` +\n              `Call createIndex({ indexName: \"${indexName}\", dimension }) with init enabled, ` +\n              `or apply the namespace migration SQL from the @mastra/pg changelog.`,\n            details: { indexName },\n          });\n        }\n        await this.ensureNamespaceSchema(indexName, client);\n        const migrated = await this.getNamespaceSchemaState(tableName, client);\n        if (!migrated.namespace || !migrated.composite_index || migrated.legacy_constraint) {\n          throw new MastraError({\n            id: createVectorErrorId('PG', 'ENSURE_NAMESPACE', 'MIGRATION_REQUIRED'),\n            domain: ErrorDomain.MASTRA_VECTOR,\n            category: ErrorCategory.USER,\n            text: `Vector index \"${indexName}\" requires a valid unique (namespace, vector_id) index. Resolve conflicting index names and retry the namespace migration.`,\n            details: { indexName },\n          });\n        }\n      }\n      await client.query('COMMIT');\n      return true;\n    } catch (error) {\n      await client.query('ROLLBACK');\n      throw error;\n    }\n  }\n\n  /**\n   * Every data path filters on `namespace`, but tables created before that column existed are\n   * only migrated by `createIndex()`, which callers are not required to invoke before reading.\n   * Run the migration lazily instead, once per index per process.\n   */\n  private ensureNamespaceReady(indexName: string): Promise<void> {\n    if (this.namespaceReadyIndexes.has(indexName)) {\n      return Promise.resolve();\n    }\n\n    return this.memoize(this.namespaceReadyCache, indexName, () =>\n      // Share the createIndex mutex so lazy migration never races its DDL on the same table.\n      this.getMutexByName(`create-${indexName}`).runExclusive(async () => {\n        if (this.namespaceReadyIndexes.has(indexName)) {\n          return;\n        }\n\n        const client = await this.pool.connect();\n        try {\n          if (await this.reconcileNamespace(indexName, client)) {\n            this.namespaceReadyIndexes.add(indexName);\n          } else {\n            // Missing/non-vector tables must be checked again after external provisioning.\n            this.namespaceReadyCache.delete(indexName);\n          }\n        } finally {\n          client.release();\n        }\n      }),\n    );\n  }\n\n  transformFilter(filter?: PGVectorFilter) {\n    const translator = new PGFilterTranslator();\n    return translator.translate(filter);\n  }\n\n  /**\n   * Cached variant of {@link describeIndex}, including the row count.\n   *\n   * Internal code paths do not use this - they use the catalog-only\n   * {@link getIndexMetadata}, which never scans the table.\n   */\n  async getIndexInfo({ indexName }: DescribeIndexParams): Promise<PGIndexStats> {\n    return this.memoize(this.describeIndexCache, indexName, () => this.describeIndex({ indexName }));\n  }\n\n  /**\n   * Cached index metadata read from the Postgres catalog only.\n   *\n   * This is what every internal caller needs: none of them read `count`, and paying for\n   * `SELECT COUNT(*)` on a large index costs a full heap scan per call.\n   */\n  private getIndexMetadata({ indexName }: DescribeIndexParams): Promise<PGIndexMetadata> {\n    return this.memoize(this.indexMetadataCache, indexName, () => this.describeIndexMetadata({ indexName }));\n  }\n\n  /**\n   * Stores the in-flight promise in `cache` so concurrent callers on a cold cache share one\n   * round trip, and drops the entry if it rejects so a transient failure is not cached forever.\n   */\n  private memoize<T>(cache: Map<string, Promise<T>>, key: string, load: () => Promise<T>): Promise<T> {\n    const cached = cache.get(key);\n    if (cached) {\n      return cached;\n    }\n    const pending = load();\n    cache.set(key, pending);\n    pending.catch(() => {\n      if (cache.get(key) === pending) {\n        cache.delete(key);\n      }\n    });\n    return pending;\n  }\n\n  /** Drops every cached view of an index, e.g. after its index definition or table changed. */\n  private invalidateIndexCaches(indexName: string) {\n    this.describeIndexCache.delete(indexName);\n    this.indexMetadataCache.delete(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    namespace = DEFAULT_NAMESPACE,\n  }: PgQueryVectorParams): Promise<QueryResult[]> {\n    try {\n      // Validate topK parameter\n      validateTopK('PG', topK);\n      if (queryVector !== undefined) {\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      } else if (!filter || Object.keys(filter).length === 0) {\n        throw new Error('Either queryVector or filter must be provided');\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    // Metadata-only query: filter without vector similarity\n    if (queryVector === undefined) {\n      let client;\n      try {\n        await this.ensureNamespaceReady(indexName);\n        client = await this.pool.connect();\n        const translatedFilter = this.transformFilter(filter);\n        const { sql: filterQuery, values: filterValues } = buildDeleteFilterQuery(translatedFilter);\n        const { tableName } = this.getTableName(indexName);\n\n        const filterClause = filterQuery.trim().replace(/^WHERE\\s+/i, '');\n        const namespaceParam = filterValues.length + 1;\n        const query = `\n          SELECT\n            vector_id as id,\n            metadata\n            ${includeVector ? ', embedding' : ''}\n          FROM ${tableName}\n          WHERE namespace = $${namespaceParam}\n          ${filterClause ? `AND (${filterClause})` : ''}\n          ORDER BY vector_id\n          LIMIT $${namespaceParam + 1}`;\n        const result = await client.query(query, [...filterValues, namespace, topK]);\n\n        return result.rows.map(({ id, metadata, embedding }: { id: string; metadata: any; embedding?: string }) => ({\n          id,\n          score: 0,\n          metadata,\n          ...(includeVector && embedding && { vector: JSON.parse(embedding) }),\n        }));\n      } catch (error) {\n        if (error instanceof MastraError) {\n          this.logger?.trackException(error);\n          throw error;\n        }\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    let client;\n    try {\n      await this.ensureNamespaceReady(indexName);\n      // Load metadata before holding a connection so a cold cache cannot exhaust the pool.\n      const indexInfo = await this.getIndexMetadata({ indexName });\n      // Vector similarity query\n      client = await this.pool.connect();\n      // Set search path so vector operators (e.g. <=>) resolve correctly\n      await this.ensureSearchPath(client);\n      await client.query('BEGIN');\n      const translatedFilter = this.transformFilter(filter);\n      const { sql: filterQuery, values: filterValues } = buildFilterQuery(translatedFilter, minScore, topK);\n\n      const metric = indexInfo.metric ?? 'cosine';\n      const ops = this.getVectorOps(indexInfo.vectorType, metric);\n\n      // Format vector string based on vector type\n      const vectorStr = ops.formatVector(queryVector, indexInfo.dimension);\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        await client.query(`SET LOCAL hnsw.iterative_scan = strict_order`);\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, indexInfo.dimension);\n\n      // Build distance expression and score based on metric and vector type\n      const distanceExpr = `embedding ${ops.distanceOperator} '${vectorStr}'::${qualifiedVectorType}`;\n      const scoreExpr = ops.scoreExpr(distanceExpr);\n\n      // Move ORDER BY and LIMIT inside the CTE for HNSW indexes without filters to enable index usage.\n      // Only safe when minScore won't filter out candidates (minScore <= 0), otherwise the inner LIMIT\n      // cuts off the candidate set before the score threshold is applied, potentially returning fewer rows.\n      // IVFFlat is excluded because with default probes=1, it only searches one cluster and can miss\n      // vectors in other clusters, returning fewer results than expected.\n      const filterClause = filterQuery.trim().replace(/^WHERE\\s+/i, '');\n      const hasFilter = filterClause.length > 0;\n      const useIndexedOrder = indexInfo.type === 'hnsw' && !hasFilter && minScore <= 0;\n      const namespaceParam = filterValues.length + 1;\n\n      const query = useIndexedOrder\n        ? `\n        WITH vector_scores AS (\n          SELECT\n            vector_id as id,\n            ${scoreExpr} as score,\n            metadata\n            ${includeVector ? ', embedding' : ''}\n          FROM ${tableName}\n          WHERE namespace = $${namespaceParam}\n          ORDER BY ${distanceExpr}\n          LIMIT $2\n        )\n        SELECT *\n        FROM vector_scores\n        WHERE score > $1\n        ORDER BY score DESC`\n        : `\n        WITH vector_scores AS (\n          SELECT\n            vector_id as id,\n            ${scoreExpr} as score,\n            metadata\n            ${includeVector ? ', embedding' : ''}\n          FROM ${tableName}\n          WHERE namespace = $${namespaceParam}\n          ${filterClause ? `AND (${filterClause})` : ''}\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, namespace]);\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: ops.parseEmbedding(embedding) }),\n      }));\n    } catch (error) {\n      await client?.query('ROLLBACK');\n      if (error instanceof MastraError) {\n        this.logger?.trackException(error);\n        throw error;\n      }\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    namespace = DEFAULT_NAMESPACE,\n  }: PgUpsertVectorParams): Promise<string[]> {\n    // Validate input parameters\n    validateUpsertInput('PG', vectors, metadata, ids);\n\n    const { tableName } = this.getTableName(indexName);\n\n    let client;\n    try {\n      const indexInfo = await this.getIndexMetadata({ indexName });\n      await this.ensureNamespaceReady(indexName);\n\n      // Start a transaction\n      client = await this.pool.connect();\n      // Set search path so vector type casts (e.g. ::vector, ::halfvec) resolve correctly\n      await this.ensureSearchPath(client);\n\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 namespace = $${filterValues.length + 1} AND (${whereClause})`;\n          const result = await client.query(deleteQuery, [...filterValues, namespace]);\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 qualifiedVectorType = this.getVectorTypeName(indexInfo.vectorType, indexInfo.dimension);\n      const ops = this.getVectorOps(indexInfo.vectorType, indexInfo.metric ?? 'cosine');\n\n      // Postgres multi-row ON CONFLICT DO UPDATE cannot affect the same row twice, so batches\n      // containing duplicate ids keep the serial path (last write wins).\n      const hasDuplicateIds = new Set(vectorIds).size !== vectorIds.length;\n\n      if (hasDuplicateIds) {\n        for (let i = 0; i < vectors.length; i++) {\n          const vectorStr = ops.formatVector(vectors[i]!, indexInfo.dimension);\n          const query = `\n            INSERT INTO ${tableName} (vector_id, embedding, metadata, namespace)\n            VALUES ($1, $2::${qualifiedVectorType}, $3::jsonb, $4)\n            ON CONFLICT (namespace, vector_id)\n            DO UPDATE SET\n              embedding = $2::${qualifiedVectorType},\n              metadata = $3::jsonb\n          `;\n\n          await client.query(query, [vectorIds[i], vectorStr, JSON.stringify(metadata?.[i] || {}), namespace]);\n        }\n      } else {\n        for (let start = 0; start < vectors.length; start += MAX_UPSERT_ROWS_PER_STATEMENT) {\n          const end = Math.min(start + MAX_UPSERT_ROWS_PER_STATEMENT, vectors.length);\n          const rows: string[] = [];\n          const values: any[] = [];\n\n          for (let i = start; i < end; i++) {\n            const base = values.length;\n            rows.push(`($${base + 1}, $${base + 2}::${qualifiedVectorType}, $${base + 3}::jsonb, $${base + 4})`);\n            values.push(\n              vectorIds[i],\n              ops.formatVector(vectors[i]!, indexInfo.dimension),\n              JSON.stringify(metadata?.[i] || {}),\n              namespace,\n            );\n          }\n\n          const query = `\n            INSERT INTO ${tableName} (vector_id, embedding, metadata, namespace)\n            VALUES ${rows.join(', ')}\n            ON CONFLICT (namespace, vector_id)\n            DO UPDATE SET\n              embedding = EXCLUDED.embedding,\n              metadata = EXCLUDED.metadata\n          `;\n\n          await client.query(query, values);\n        }\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 MastraError) {\n        this.logger?.trackException(error);\n        throw error;\n      }\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    metadataIndexes,\n  }: Omit<CreateIndexParams, 'metric'> & {\n    metric?: PgMetric;\n    type: IndexType | undefined;\n    vectorType?: VectorType;\n    metadataIndexes?: string[];\n  }) {\n    const input = JSON.stringify([\n      indexName,\n      dimension,\n      metric,\n      type || 'ivfflat',\n      vectorType,\n      metadataIndexes?.toSorted() ?? [],\n    ]);\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: rawMetric = 'cosine',\n    indexConfig = {},\n    buildIndex = true,\n    vectorType = 'vector',\n    metadataIndexes,\n  }: PgCreateIndexParams): Promise<void> {\n    // Normalize metric for bit vectors: default to 'hamming' unless explicitly 'hamming' or 'jaccard'\n    const metric: PgMetric =\n      vectorType === 'bit' && rawMetric !== 'hamming' && rawMetric !== 'jaccard' ? 'hamming' : rawMetric;\n\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' && vectorType !== 'bit' && vectorType !== 'sparsevec') {\n        throw new Error('vectorType must be \"vector\", \"halfvec\", \"bit\", or \"sparsevec\"');\n      }\n      // Dimension limits for indexed vectors (pgvector restrictions)\n      if (vectorType === 'bit' && dimension > 64000) {\n        throw new Error('bit vectors support up to 64,000 dimensions for indexes');\n      }\n\n      // hamming and jaccard metrics are only valid with bit vectors\n      if ((metric === 'hamming' || metric === 'jaccard') && vectorType !== 'bit') {\n        throw new Error(`${metric} metric is only valid with vectorType 'bit'`);\n      }\n      // IVFFlat does not support Jaccard distance for bit vectors\n      if (indexConfig?.type === 'ivfflat' && vectorType === 'bit' && metric === 'jaccard') {\n        throw new Error('IVFFlat indexes do not support Jaccard distance for bit vectors. Use HNSW instead.');\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    // Skip all DDL when init is disabled - caller manages schema/extension/tables/indexes externally\n    if (this.disableInit || process.env.MASTRA_DISABLE_STORAGE_INIT === 'true') {\n      return;\n    }\n\n    const indexCacheKey = await this.getIndexCacheKey({\n      indexName,\n      dimension,\n      type: indexConfig.type,\n      metric,\n      vectorType,\n      metadataIndexes,\n    });\n    if (this.cachedIndexExists(indexName, indexCacheKey) && this.namespaceReadyIndexes.has(indexName)) {\n      // we already saw this index get created and reconciled since the process started\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) && this.namespaceReadyIndexes.has(indexName)) {\n          // this may have been created and reconciled 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          // Check if bit/sparsevec is supported when requested\n          if (vectorType === 'bit' && !this.supportsBit()) {\n            throw new MastraError({\n              id: createVectorErrorId('PG', 'CREATE_INDEX', 'VECTOR_TYPE_NOT_SUPPORTED'),\n              text:\n                `${vectorType} type requires pgvector >= 0.7.0, but version ${this.vectorExtensionVersion || 'unknown'} is installed. ` +\n                `Either upgrade pgvector or use vectorType: 'vector'.`,\n              domain: ErrorDomain.MASTRA_VECTOR,\n              category: ErrorCategory.USER,\n              details: {\n                indexName,\n                vectorType,\n                installedVersion: this.vectorExtensionVersion,\n              },\n            });\n          }\n\n          if (vectorType === 'sparsevec' && !this.supportsSparsevec()) {\n            throw new MastraError({\n              id: createVectorErrorId('PG', 'CREATE_INDEX', 'VECTOR_TYPE_NOT_SUPPORTED'),\n              text:\n                `${vectorType} type requires pgvector >= 0.7.0, but version ${this.vectorExtensionVersion || 'unknown'} is installed. ` +\n                `Either upgrade pgvector or use vectorType: 'vector'.`,\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          // 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 NOT NULL,\n            embedding ${qualifiedVectorType}(${dimension}),\n            metadata JSONB DEFAULT '{}'::jsonb,\n            namespace VARCHAR(255) NOT NULL DEFAULT '${DEFAULT_NAMESPACE}'\n          );\n        `);\n          if (await this.reconcileNamespace(indexName, client)) {\n            this.namespaceReadyIndexes.add(indexName);\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\n          if (metadataIndexes?.length) {\n            await this.createMetadataIndexes(tableName, indexName, metadataIndexes);\n          }\n        } catch (error: any) {\n          this.createdIndexes.delete(indexName);\n          this.namespaceReadyIndexes.delete(indexName);\n          this.namespaceReadyCache.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, vectorType }: PgDefineIndexParams): Promise<void> {\n    const client = await this.pool.connect();\n    try {\n      await this.setupIndex({ indexName, metric, indexConfig, vectorType }, 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      // sparsevec does not support IVFFlat, so default to HNSW for it\n      const defaultIndexType = vectorType === 'sparsevec' ? 'hnsw' : 'ivfflat';\n      const indexType = isConfigEmpty ? defaultIndexType : indexConfig.type || defaultIndexType;\n\n      // Validate index type restrictions for sparsevec\n      if (indexType === 'ivfflat' && vectorType === 'sparsevec') {\n        throw new MastraError({\n          id: createVectorErrorId('PG', 'BUILD_INDEX', 'UNSUPPORTED_INDEX_TYPE'),\n          text: `IVFFlat indexes do not support sparsevec type. Use HNSW instead.`,\n          domain: ErrorDomain.MASTRA_VECTOR,\n          category: ErrorCategory.USER,\n          details: { indexName, vectorType, indexType },\n        });\n      }\n\n      // Validate index type restrictions for bit + jaccard\n      // IVFFlat supports bit vectors with Hamming distance only, not Jaccard\n      if (indexType === 'ivfflat' && vectorType === 'bit' && metric === 'jaccard') {\n        throw new MastraError({\n          id: createVectorErrorId('PG', 'BUILD_INDEX', 'UNSUPPORTED_INDEX_TYPE'),\n          text: `IVFFlat indexes do not support Jaccard distance for bit vectors. Use HNSW instead.`,\n          domain: ErrorDomain.MASTRA_VECTOR,\n          category: ErrorCategory.USER,\n          details: { indexName, vectorType, indexType, metric },\n        });\n      }\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: PGIndexMetadata | null = null;\n      let dimension = 0;\n      try {\n        existingIndexInfo = await this.describeIndexMetadata({ indexName }, client);\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.invalidateIndexCaches(indexName);\n      } catch {\n        this.logger?.debug(`Index ${indexName} doesn't exist yet, will create it`);\n      }\n\n      if (indexType === 'flat') {\n        this.invalidateIndexCaches(indexName);\n        return;\n      }\n\n      // Set search path so vector operator classes (e.g. vector_cosine_ops) resolve correctly\n      await this.ensureSearchPath(client);\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.getVectorOps(effectiveVectorType, metric).operatorClass;\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 createMetadataIndexes(tableName: string, indexName: string, metadataFields: string[]) {\n    const hasher = await this.hasher;\n    for (const field of metadataFields) {\n      // Hash the field to produce a safe, fixed-length suffix for the index name.\n      // This avoids issues with fields containing characters invalid in SQL identifiers\n      // (e.g. \"user-id\") and keeps the total index name under PostgreSQL's 63-char limit.\n      const fieldHash = hasher.h32(field).toString(16);\n      const prefix = indexName.slice(0, 63 - '_md__idx'.length - fieldHash.length);\n      const metadataIdxName = `\"${prefix}_md_${fieldHash}_idx\"`;\n      // DDL statements don't support bind parameters, so we must interpolate\n      // the field name as a literal. Escape single quotes to prevent SQL injection.\n      const escapedField = field.replace(/'/g, \"''\");\n      // Use CONCURRENTLY to avoid blocking writers on large existing tables.\n      // This must run outside a transaction, so we use pool.query() directly.\n      await this.pool.query(\n        `\n        CREATE INDEX CONCURRENTLY IF NOT EXISTS ${metadataIdxName}\n        ON ${tableName} ((metadata->>'${escapedField}'))\n      `,\n      );\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      // Without an explicit schemaName, look in every schema on the effective search_path\n      // (current_schemas), which is where unqualified CREATE TABLE places tables.\n      const mastraTablesQuery = `\n        SELECT DISTINCT t.table_name\n        FROM information_schema.tables t\n        WHERE t.table_schema = ANY(\n          CASE WHEN $1::text IS NULL THEN current_schemas(false) ELSE ARRAY[$1::text] END\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 = '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', 'bit', 'sparsevec')\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 ?? null]);\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 metadata = await this.describeIndexMetadata({ indexName });\n    const count = await this.countIndexRows({ indexName });\n    return { ...metadata, count };\n  }\n\n  /**\n   * Reads the index metadata that lives in the Postgres catalog. Unlike\n   * {@link describeIndex} it issues no `COUNT(*)`, so its cost does not grow with the\n   * number of rows in the table.\n   */\n  private async describeIndexMetadata(\n    { indexName }: DescribeIndexParams,\n    existingClient?: pg.PoolClient,\n  ): Promise<PGIndexMetadata> {\n    const client = existingClient ?? (await this.pool.connect());\n    try {\n      const { tableName, parsedIndexName } = this.getTableName(indexName);\n\n      // Check if table exists with a vector-type embedding column. Resolving through\n      // to_regclass(tableName) mirrors how the unqualified DDL resolves via search_path\n      // when no schemaName is configured (e.g. \"$user\" schemas).\n      const tableExistsQuery = `\n        SELECT t.typname AS udt_name\n        FROM pg_attribute a\n        JOIN pg_type t ON t.oid = a.atttypid\n        WHERE a.attrelid = to_regclass($1)\n          AND a.attname = 'embedding'\n          AND a.attnum > 0\n          AND NOT a.attisdropped\n          AND t.typname IN ('vector', 'halfvec', 'bit', 'sparsevec')\n        LIMIT 1;\n      `;\n      const tableExists = await client.query(tableExistsQuery, [tableName]);\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 udtName = tableExists.rows[0].udt_name;\n      const vectorType: VectorType =\n        udtName === 'halfvec'\n          ? 'halfvec'\n          : udtName === 'bit'\n            ? 'bit'\n            : udtName === 'sparsevec'\n              ? 'sparsevec'\n              : '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 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            WHERE c.relname = $1\n            AND i.indrelid = to_regclass($2);\n            `;\n\n      const dimResult = await client.query(dimensionQuery, [tableName]);\n      const indexResult = await client.query(indexQuery, [`${parsedIndexName}_vector_idx`, tableName]);\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 operator class to our metric type\n      const metric: PgMetric = operator_class.includes('hamming')\n        ? 'hamming'\n        : operator_class.includes('jaccard')\n          ? 'jaccard'\n          : 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        metric: metric as PGIndexStats['metric'],\n        type: index_method as 'flat' | 'hnsw' | 'ivfflat',\n        vectorType,\n        config,\n      };\n    } catch (e: any) {\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      if (!existingClient) client.release();\n    }\n  }\n\n  /**\n   * Exact row count for an index. This is a full scan of the table, so it is only issued\n   * for the public {@link describeIndex}, never from an internal code path.\n   */\n  private async countIndexRows({ indexName }: DescribeIndexParams): Promise<number> {\n    const client = await this.pool.connect();\n    try {\n      const { tableName } = this.getTableName(indexName);\n      const countResult = await client.query(`\n                SELECT COUNT(*) as count\n                FROM ${tableName};\n            `);\n      return parseInt(countResult.rows[0].count);\n    } catch (e: any) {\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    await this.getMutexByName(`create-${indexName}`).runExclusive(async () => {\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.namespaceReadyIndexes.delete(indexName);\n        this.namespaceReadyCache.delete(indexName);\n        this.indexVectorTypes.delete(indexName);\n        this.invalidateIndexCaches(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\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({\n    indexName,\n    id,\n    filter,\n    update,\n    namespace = DEFAULT_NAMESPACE,\n  }: PgUpdateVectorParams): 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      const indexInfo = await this.getIndexMetadata({ indexName });\n      await this.ensureNamespaceReady(indexName);\n      client = await this.pool.connect();\n      // Set search path so vector type casts (e.g. ::vector, ::halfvec) resolve correctly\n      await this.ensureSearchPath(client);\n\n      const { tableName } = this.getTableName(indexName);\n\n      // Get the properly qualified vector type for this index\n      const qualifiedVectorType = this.getVectorTypeName(indexInfo.vectorType, indexInfo.dimension);\n      const ops = this.getVectorOps(indexInfo.vectorType, indexInfo.metric ?? 'cosine');\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(ops.formatVector(update.vector, indexInfo.dimension));\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      const namespaceIndex = valueIndex;\n      values.push(namespace);\n      valueIndex++;\n\n      if (id) {\n        // Update by ID\n        whereClause = `namespace = $${namespaceIndex} AND 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        whereClause = `namespace = $${namespaceIndex} AND (${whereClause})`;\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, namespace = DEFAULT_NAMESPACE }: PgDeleteVectorParams): Promise<void> {\n    let client;\n    try {\n      await this.ensureNamespaceReady(indexName);\n      client = await this.pool.connect();\n      const { tableName } = this.getTableName(indexName);\n      const query = `\n        DELETE FROM ${tableName}\n        WHERE vector_id = $1 AND namespace = $2\n      `;\n      await client.query(query, [id, namespace]);\n    } catch (error: any) {\n      if (error instanceof MastraError) {\n        throw error;\n      }\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, namespace }: PgDeleteVectorsParams): Promise<void> {\n    let client;\n    const effectiveNamespace = namespace ?? DEFAULT_NAMESPACE;\n    try {\n      await this.ensureNamespaceReady(indexName);\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 && namespace === undefined) {\n        throw new MastraError({\n          id: createVectorErrorId('PG', 'DELETE_VECTORS', 'NO_TARGET'),\n          text: 'Either filter or ids must be provided, unless an explicit namespace is used',\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}) AND namespace = $${ids.length + 1}`;\n        values = [...ids, effectiveNamespace];\n      } else if (filter) {\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 namespace = $${filterValues.length + 1} AND (${whereClause})`;\n        values = [...filterValues, effectiveNamespace];\n      } else {\n        query = `DELETE FROM ${tableName} WHERE namespace = $1`;\n        values = [effectiveNamespace];\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';\nimport type { SchemaSnapshot, SchemaSnapshotHost } from './db/schema-snapshot';\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  /**\n   * Await multiple query promises. Prefer collecting results from\n   * TransactionClient methods (which serialize onto one PoolClient);\n   * do not start raw `client.query` calls concurrently.\n   */\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      try {\n        const result = await callback(txClient);\n        // Drain before COMMIT so fire-and-forget / batch tails can't race it.\n        await txClient.drain();\n        await client.query('COMMIT');\n        return result;\n      } catch (error) {\n        // Drain before ROLLBACK: Promise.all in batch() rejects on the first\n        // failure while later enqueued queries may still be running. Preserve\n        // the callback/drain error that caused this catch.\n        await txClient.drain().catch(() => undefined);\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      }\n    } finally {\n      client.release();\n    }\n  }\n}\n\n/**\n * Transaction client that wraps a PoolClient for executing queries within a transaction.\n *\n * Query methods are serialized through a tail promise (same pattern as\n * PinnedClientAdapter). Callers such as memory.updateMessages historically\n * did `queries.push(t.none(...))` then `await t.batch(queries)` — each\n * `t.none()` is async and starts `client.query` immediately, so by the time\n * batch runs, N queries are already in flight on one PoolClient. pg@8 queues\n * those internally and emits a DeprecationWarning; pg@9 will throw.\n * (#20820)\n */\nclass TransactionClient implements TxClient {\n  /**\n   * Serialization tail. Without this gate, concurrent t.none()/t.query()\n   * from Promise.all / batch land on the same PoolClient at once.\n   */\n  #tail: Promise<void> = Promise.resolve();\n  #error: { value: unknown } | undefined;\n\n  constructor(private readonly client: PoolClient) {}\n\n  #enqueue<T>(fn: () => Promise<T>): Promise<T> {\n    const next = this.#tail.then(fn);\n    this.#tail = next.then(\n      () => undefined,\n      error => {\n        this.#error ??= { value: error };\n      },\n    );\n    return next;\n  }\n\n  /**\n   * Wait until every enqueued query has settled and surface the first failure.\n   * PoolAdapter / PinnedClientAdapter call this before COMMIT/ROLLBACK so\n   * those control statements never overlap in-flight work on the same client.\n   */\n  async drain(): Promise<void> {\n    await this.#tail;\n    if (this.#error) {\n      const { value } = this.#error;\n      this.#error = undefined;\n      throw value;\n    }\n  }\n\n  none(query: string, values?: QueryValues): Promise<null> {\n    return this.#enqueue(async () => {\n      await this.client.query(query, values);\n      return null;\n    });\n  }\n\n  one<T = any>(query: string, values?: QueryValues): Promise<T> {\n    return this.#enqueue(async () => {\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\n  oneOrNone<T = any>(query: string, values?: QueryValues): Promise<T | null> {\n    return this.#enqueue(async () => {\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\n  any<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n    return this.#enqueue(async () => {\n      const result = await this.client.query(query, values);\n      return result.rows as T[];\n    });\n  }\n\n  manyOrNone<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n    return this.any<T>(query, values);\n  }\n\n  many<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n    return this.#enqueue(async () => {\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\n  query(query: string, values?: QueryValues): Promise<QueryResult> {\n    return this.#enqueue(() => this.client.query(query, values));\n  }\n\n  async batch<T>(promises: Promise<T>[]): Promise<T[]> {\n    // Promises are already enqueued (and thus serialized) by the query\n    // methods above; awaiting them together is fine.\n    return Promise.all(promises);\n  }\n}\n\n/**\n * DbClient adapter that pins all queries to a single PoolClient.\n *\n * Used during PostgresStore.init() to funnel every domain's DDL through\n * one backend connection. This collapses ~200 per-statement pool checkouts\n * into a single connection acquisition, which:\n *   - removes connection-handshake RTT on remote/managed Postgres\n *   - makes the entire init look like one transaction to a transaction\n *     pooler (PgBouncer/Supabase), avoiding pooler-budget exhaustion\n *   - eliminates inter-statement lock contention by construction (a single\n *     backend serializes statements naturally)\n *\n * The wrapped client is the caller's responsibility to release.\n */\nexport class PinnedClientAdapter implements DbClient {\n  /**\n   * Serialization tail. Domain init() methods fire via Promise.all in\n   * MastraCompositeStore.#runInit(), so without our own gate every domain's\n   * query() lands on the same PoolClient concurrently. pg@8 queues those\n   * internally and emits a deprecation warning; pg@9 will throw. Chaining\n   * each new query off the previous one's settlement (success or failure)\n   * gives us deterministic FIFO ordering at the adapter layer and removes\n   * the reliance on pg's internal queue.\n   */\n  #tail: Promise<unknown> = Promise.resolve();\n\n  constructor(\n    public readonly $pool: Pool,\n    private readonly pinnedClient: PoolClient,\n  ) {}\n\n  /**\n   * Run `fn` after any previously enqueued work on this pinned client has\n   * settled. Failures in earlier calls don't poison the queue — we always\n   * resume on the next caller's turn.\n   */\n  #enqueue<T>(fn: () => Promise<T>): Promise<T> {\n    const next = this.#tail.then(fn, fn);\n    // Swallow rejection on the chained tail so a failing call doesn't\n    // leave an unhandled rejection on later enqueues.\n    this.#tail = next.catch(() => undefined);\n    return next;\n  }\n\n  connect(): Promise<PoolClient> {\n    // No domain init() currently calls connect(), and silently falling\n    // back to the pool would bypass pinning. Throw so a future code path\n    // that adds a connect()-based init fails loud instead of silently\n    // re-introducing the parallel-DDL fan-out we're trying to prevent.\n    throw new Error(\n      'PinnedClientAdapter.connect() is not supported during PostgresStore.init(). ' +\n        'All DDL must flow through the pinned client.',\n    );\n  }\n\n  none(query: string, values?: QueryValues): Promise<null> {\n    return this.#enqueue(async () => {\n      await this.pinnedClient.query(query, values);\n      return null;\n    });\n  }\n\n  one<T = any>(query: string, values?: QueryValues): Promise<T> {\n    return this.#enqueue(async () => {\n      const result = await this.pinnedClient.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\n  oneOrNone<T = any>(query: string, values?: QueryValues): Promise<T | null> {\n    return this.#enqueue(async () => {\n      const result = await this.pinnedClient.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\n  any<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n    return this.#enqueue(async () => {\n      const result = await this.pinnedClient.query(query, values);\n      return result.rows as T[];\n    });\n  }\n\n  manyOrNone<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n    return this.any<T>(query, values);\n  }\n\n  many<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n    return this.#enqueue(async () => {\n      const result = await this.pinnedClient.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\n  query(query: string, values?: QueryValues): Promise<QueryResult> {\n    return this.#enqueue(() => this.pinnedClient.query(query, values));\n  }\n\n  tx<T>(callback: (t: TxClient) => Promise<T>): Promise<T> {\n    // Enqueue the entire BEGIN/work/COMMIT block so concurrent callers\n    // can't interleave statements inside someone else's transaction.\n    return this.#enqueue(async () => {\n      await this.pinnedClient.query('BEGIN');\n      const txClient = new TransactionClient(this.pinnedClient);\n      try {\n        const result = await callback(txClient);\n        await txClient.drain();\n        await this.pinnedClient.query('COMMIT');\n        return result;\n      } catch (error) {\n        await txClient.drain().catch(() => undefined);\n        try {\n          await this.pinnedClient.query('ROLLBACK');\n        } catch (rollbackError) {\n          console.error('Transaction rollback failed:', rollbackError);\n        }\n        throw error;\n      }\n    });\n  }\n}\n\n/**\n * DbClient wrapper that routes to an alternate client when one is pinned.\n *\n * Most of the time this just forwards to the underlying PoolAdapter.\n * During PostgresStore.init() we temporarily pin a single-client adapter\n * so every domain's DDL flows through one backend connection.\n */\nexport class RoutingDbClient implements DbClient, SchemaSnapshotHost {\n  #base: DbClient;\n  #pinned: DbClient | null = null;\n  #schemaSnapshot: SchemaSnapshot | null = null;\n\n  constructor(base: DbClient) {\n    this.#base = base;\n  }\n\n  /**\n   * Catalog snapshot for the current init window, or `null` outside it.\n   *\n   * It lives here rather than on `PgDB` because every storage domain builds its\n   * own `PgDB` over this one shared client — hanging the snapshot off the\n   * client means one load serves all of them, and its lifetime lines up exactly\n   * with the pinned-init window that `pin()`/`unpin()` already delimit.\n   */\n  get schemaSnapshot(): SchemaSnapshot | null {\n    return this.#schemaSnapshot;\n  }\n\n  /** Install (or clear, with `null`) the init-window catalog snapshot. */\n  setSchemaSnapshot(snapshot: SchemaSnapshot | null): void {\n    this.#schemaSnapshot = snapshot;\n  }\n\n  /** Returns the currently active client (pinned if set, otherwise base). */\n  private get active(): DbClient {\n    return this.#pinned ?? this.#base;\n  }\n\n  /**\n   * Pin a DbClient so all subsequent calls route through it until unpinned.\n   * Throws if a client is already pinned to avoid silent overrides.\n   */\n  pin(client: DbClient): void {\n    if (this.#pinned) {\n      throw new Error('RoutingDbClient already has a pinned client');\n    }\n    this.#pinned = client;\n  }\n\n  unpin(): void {\n    this.#pinned = null;\n  }\n\n  get $pool(): Pool {\n    return this.#base.$pool;\n  }\n\n  connect(): Promise<PoolClient> {\n    return this.active.connect();\n  }\n\n  none(query: string, values?: QueryValues): Promise<null> {\n    return this.active.none(query, values);\n  }\n\n  one<T = any>(query: string, values?: QueryValues): Promise<T> {\n    return this.active.one<T>(query, values);\n  }\n\n  oneOrNone<T = any>(query: string, values?: QueryValues): Promise<T | null> {\n    return this.active.oneOrNone<T>(query, values);\n  }\n\n  any<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n    return this.active.any<T>(query, values);\n  }\n\n  manyOrNone<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n    return this.active.manyOrNone<T>(query, values);\n  }\n\n  many<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n    return this.active.many<T>(query, values);\n  }\n\n  query(query: string, values?: QueryValues): Promise<QueryResult> {\n    return this.active.query(query, values);\n  }\n\n  tx<T>(callback: (t: TxClient) => Promise<T>): Promise<T> {\n    return this.active.tx<T>(callback);\n  }\n}\n","export const POSTGRES_IDENTIFIER_MAX_LENGTH = 63;\n\nexport function truncateIdentifier(value: string, maxLength = POSTGRES_IDENTIFIER_MAX_LENGTH): string {\n  if (maxLength <= 0) return '';\n  if (Buffer.byteLength(value, 'utf-8') <= maxLength) return value;\n\n  let bytes = 0;\n  let end = 0;\n  for (const ch of value) {\n    const chBytes = Buffer.byteLength(ch, 'utf-8');\n    if (bytes + chBytes > maxLength) break;\n    bytes += chBytes;\n    end += ch.length; // surrogate pairs have .length === 2\n  }\n  return value.slice(0, end);\n}\n\n/**\n * Builds a constraint name with an optional schema prefix, truncated to fit\n * within Postgres' identifier length limit.  The result is always lowercased\n * because PostgreSQL folds unquoted identifiers to lowercase when storing them\n * in system catalogs (pg_constraint.conname, pg_indexes.indexname, etc.).\n * Without this normalisation, runtime lookups that compare a mixed-case name\n * against the catalog would silently fail.\n */\nexport function buildConstraintName({\n  baseName,\n  schemaName,\n  maxLength = POSTGRES_IDENTIFIER_MAX_LENGTH,\n}: {\n  baseName: string;\n  schemaName?: string;\n  maxLength?: number;\n}): string {\n  const prefix = schemaName ? `${schemaName}_` : '';\n  return truncateIdentifier(`${prefix}${baseName}`.toLowerCase(), maxLength);\n}\n","/**\n * Postgres error classifiers for concurrent DDL.\n *\n * `CREATE SCHEMA / TABLE / INDEX IF NOT EXISTS` checks aren't atomic against\n * concurrent backends. Two callers racing past the existence probe can both\n * reach the catalog insert; the loser sees a duplicate-object error. These\n * helpers identify the exact codes we treat as \"already exists by the time we\n * look\" so every other error surfaces normally.\n */\n\ninterface PgErrorLike {\n  code?: string;\n  constraint?: string;\n  message?: string;\n}\n\nfunction asPgError(error: unknown): PgErrorLike {\n  return (error ?? {}) as PgErrorLike;\n}\n\n/**\n * True when `error` says a relation with this name already exists in this\n * schema. Covers `42P07` (clean case from `CREATE TABLE`) and `23505`\n * unique-violation races on the relevant pg_catalog indexes, plus a final\n * `/already exists/i` regex fallback for drivers that don't surface a code.\n */\nexport function isDuplicateRelationError(error: unknown): boolean {\n  const { code, constraint, message = '' } = asPgError(error);\n  if (code === '42P07') return true;\n  if (code === '23505' && (constraint === 'pg_type_typname_nsp_index' || constraint === 'pg_class_relname_nsp_index')) {\n    return true;\n  }\n  return /already exists/i.test(message);\n}\n\n/**\n * True when `error` says a schema with this name already exists. Covers\n * `42P06` and the `23505` race on `pg_namespace_nspname_index`, plus a\n * narrower regex fallback than `isDuplicateRelationError` so this helper\n * only swallows schema-existence errors.\n */\nexport function isDuplicateSchemaError(error: unknown): boolean {\n  const { code, constraint, message = '' } = asPgError(error);\n  if (code === '42P06') return true;\n  if (code === '23505' && constraint === 'pg_namespace_nspname_index') return true;\n  return /schema .* already exists/i.test(message);\n}\n","import type { DbClient } from '../client';\n\n/**\n * A read-only picture of one Postgres schema's catalog, taken once at the start\n * of `PostgresStore.init()`.\n *\n * Before this existed, every domain's init converged its own tables by asking\n * the server: an `information_schema.columns` probe per column, a `pg_indexes`\n * probe per index, plus an unconditional `CREATE TABLE IF NOT EXISTS` and a\n * no-op `ALTER TABLE ... ADD COLUMN IF NOT EXISTS` per column. On an\n * already-converged schema that is ~350 statements that change nothing, and\n * because init pins every domain to a single backend connection (issue #17679)\n * they are strictly serialized — warm init cost is ~350 x RTT.\n *\n * The snapshot answers all of those questions locally instead, from three\n * catalog reads.\n *\n * **Init-scoped by design.** The snapshot is installed on the store's\n * `RoutingDbClient` for exactly the pinned-init window and cleared in the same\n * `finally` that unpins, so staleness is bounded to a single init() call and\n * runtime code paths keep querying the live catalog. It is deliberately *not* a\n * process-global cache (that shape was proposed in PR #13960 and closed\n * unmerged): every init re-reads the catalog, so a schema that drifted out of\n * band between inits is still detected and healed.\n *\n * **Why `pg_catalog` and not `information_schema`.** `information_schema` views\n * are privilege-filtered: a role with USAGE on the schema but no grants on a\n * table sees the table but none of its columns, which would make the snapshot\n * report \"table present, zero columns\" and skip DDL that is genuinely needed.\n * The `pg_catalog` views used here are not privilege-filtered, so all three\n * queries share one visibility rule.\n */\nexport interface SchemaSnapshot {\n  /** Schema the snapshot was taken from (`public` when the store has none). */\n  readonly schemaName: string;\n  /** Unqualified names of tables present in the schema. */\n  tables: Set<string>;\n  /** table name -> column names present on that table. */\n  columns: Map<string, Set<string>>;\n  /** table name -> column name -> Postgres type name (`jsonb`, `text`, ...). */\n  columnTypes: Map<string, Map<string, string>>;\n  /** Index names present in the schema, exactly as the catalog stores them. */\n  indexes: Set<string>;\n  /** Names of indexes that are the replica identity of their table. */\n  replicaIdentityIndexes: Set<string>;\n  /**\n   * Lowercased names of PRIMARY KEY indexes. A primary key is always backed by\n   * an index of the same name, so this answers \"does constraint X exist?\" for\n   * primary keys without a `pg_constraint` probe. Lowercased because the\n   * queries it replaces compare `conname = lower($1)`.\n   */\n  primaryKeyIndexes: Set<string>;\n}\n\n/**\n * Implemented by `RoutingDbClient` so the `PgDB` instances that share it (one\n * per storage domain) can all read the single snapshot loaded for the current\n * init window.\n */\nexport interface SchemaSnapshotHost {\n  readonly schemaSnapshot: SchemaSnapshot | null;\n}\n\n/**\n * Returns the snapshot currently installed on `client`, but only when it was\n * taken from the schema the caller operates on. A store configured for another\n * schema (or a client with no snapshot at all) gets `null` and falls back to\n * probing the live catalog.\n */\nexport function getSchemaSnapshot(client: unknown, schemaName: string | undefined): SchemaSnapshot | null {\n  const snapshot = (client as Partial<SchemaSnapshotHost> | null | undefined)?.schemaSnapshot;\n  if (!snapshot) return null;\n  return snapshot.schemaName === (schemaName || 'public') ? snapshot : null;\n}\n\n/**\n * Reads the catalog for `schemaName` in three queries. Must be called on the\n * pinned init client so the snapshot reflects what that connection will see.\n */\nexport async function loadSchemaSnapshot(client: DbClient, schemaName: string | undefined): Promise<SchemaSnapshot> {\n  const schema = schemaName || 'public';\n\n  const [tableRows, columnRows, indexRows] = await Promise.all([\n    client.manyOrNone<{ tablename: string }>(`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = $1`, [\n      schema,\n    ]),\n    client.manyOrNone<{ table_name: string; column_name: string; data_type: string }>(\n      `SELECT c.relname AS table_name, a.attname AS column_name, format_type(a.atttypid, a.atttypmod) AS data_type\n         FROM pg_catalog.pg_class c\n         JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n         JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid\n        WHERE n.nspname = $1\n          AND c.relkind IN ('r', 'p')\n          AND a.attnum > 0\n          AND NOT a.attisdropped`,\n      [schema],\n    ),\n    // pg_index rather than the pg_indexes view: same names, but it also carries\n    // indisreplident, which createTable needs to know whether the\n    // workflow_snapshot unique index is already the table's replica identity,\n    // and indisprimary, which answers primary-key constraint existence.\n    client.manyOrNone<{ indexname: string; is_replica_identity: boolean; is_primary: boolean }>(\n      `SELECT c.relname AS indexname, i.indisreplident AS is_replica_identity, i.indisprimary AS is_primary\n         FROM pg_catalog.pg_index i\n         JOIN pg_catalog.pg_class c ON c.oid = i.indexrelid\n         JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n        WHERE n.nspname = $1`,\n      [schema],\n    ),\n  ]);\n\n  const columns = new Map<string, Set<string>>();\n  const columnTypes = new Map<string, Map<string, string>>();\n  for (const row of columnRows) {\n    let set = columns.get(row.table_name);\n    if (!set) {\n      set = new Set<string>();\n      columns.set(row.table_name, set);\n    }\n    set.add(row.column_name);\n\n    let types = columnTypes.get(row.table_name);\n    if (!types) {\n      types = new Map<string, string>();\n      columnTypes.set(row.table_name, types);\n    }\n    types.set(row.column_name, row.data_type);\n  }\n\n  const indexes = new Set<string>();\n  const replicaIdentityIndexes = new Set<string>();\n  const primaryKeyIndexes = new Set<string>();\n  for (const row of indexRows) {\n    indexes.add(row.indexname);\n    if (row.is_replica_identity) {\n      replicaIdentityIndexes.add(row.indexname);\n    }\n    if (row.is_primary) {\n      primaryKeyIndexes.add(row.indexname.toLowerCase());\n    }\n  }\n\n  return {\n    schemaName: schema,\n    tables: new Set(tableRows.map(r => r.tablename)),\n    columns,\n    columnTypes,\n    indexes,\n    replicaIdentityIndexes,\n    primaryKeyIndexes,\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, QueryValues, TxClient } from '../client';\nimport { PoolAdapter } from '../client';\nimport { buildConstraintName } from './constraint-utils';\nimport { isDuplicateRelationError, isDuplicateSchemaError } from './pg-errors';\nimport { getSchemaSnapshot } from './schema-snapshot';\nimport type { SchemaSnapshot } from './schema-snapshot';\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 writer database client */\n  client: DbClient;\n  /** Optional reader database client. Falls back to `client`. */\n  readClient?: 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 writer pg.Pool */\n  pool: Pool;\n  /** Optional reader pg.Pool. Falls back to `pool`. */\n  readPool?: 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  readClient: 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      readClient: config.readClient ?? 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    const client = new PoolAdapter(config.pool);\n    return {\n      client,\n      readClient: config.readPool && config.readPool !== config.pool ? new PoolAdapter(config.readPool) : client,\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  // pg emits 'error' on the pool when an idle client's connection drops;\n  // without a listener Node escalates the event to an uncaughtException and\n  // crashes the process. No logger is threaded into this helper, so warn on\n  // the console like COLLISION_WARNING does.\n  pool.on('error', err => {\n    console.warn(\n      `resolvePgConfig: idle pool client error (pool discards the client and reconnects on next checkout): ${err instanceof Error ? err.message : String(err)}`,\n    );\n  });\n\n  const client = new PoolAdapter(pool);\n  return {\n    client,\n    readClient: client,\n    schemaName: config.schemaName,\n    skipDefaultIndexes: config.skipDefaultIndexes,\n    indexes: config.indexes,\n  };\n}\n\nexport function getSchemaName(schema?: string) {\n  return schema ? `\"${parseSqlIdentifier(schema, 'schema name')}\"` : '\"public\"';\n}\n\nexport function getTableName({ indexName, schemaName }: { indexName: string; schemaName?: string }) {\n  const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n  const quotedIndexName = `\"${parsedIndexName}\"`;\n  const quotedSchemaName = schemaName;\n  return quotedSchemaName ? `${quotedSchemaName}.${quotedIndexName}` : quotedIndexName;\n}\n\nfunction mapToSqlType(type: StorageColumn['type']): string {\n  switch (type) {\n    case 'uuid':\n      return 'UUID';\n    case 'boolean':\n      return 'BOOLEAN';\n    default:\n      return getSqlType(type);\n  }\n}\n\nexport function generateTableSQL({\n  tableName,\n  schema,\n  schemaName,\n  compositePrimaryKey,\n  includeAllConstraints = false,\n}: {\n  tableName: TABLE_NAMES;\n  schema: Record<string, StorageColumn>;\n  schemaName?: string;\n  compositePrimaryKey?: string[];\n  /** When true, includes all constraints in the SQL (for exports). When false, some constraints are added at runtime after data migration. */\n  includeAllConstraints?: boolean;\n}): string {\n  // Validate composite PK columns exist in schema\n  if (compositePrimaryKey) {\n    for (const col of compositePrimaryKey) {\n      if (!(col in schema)) {\n        throw new Error(`compositePrimaryKey column \"${col}\" does not exist in schema for table \"${tableName}\"`);\n      }\n    }\n  }\n\n  const compositePKSet = compositePrimaryKey ? new Set(compositePrimaryKey) : null;\n\n  const timeZColumns = Object.entries(schema)\n    .filter(([_, def]) => def.type === 'timestamp')\n    .map(([name]) => {\n      const parsedName = parseSqlIdentifier(name, 'column name');\n      return `\"${parsedName}Z\" TIMESTAMPTZ DEFAULT NOW()`;\n    });\n\n  const columns = Object.entries(schema).map(([name, def]) => {\n    const parsedName = parseSqlIdentifier(name, 'column name');\n    const constraints = [];\n    // Skip per-column PRIMARY KEY if column is part of composite PK\n    if (def.primaryKey && !compositePKSet?.has(name)) constraints.push('PRIMARY KEY');\n    if (!def.nullable) constraints.push('NOT NULL');\n    return `\"${parsedName}\" ${mapToSqlType(def.type)} ${constraints.join(' ')}`;\n  });\n\n  const tableConstraints: string[] = [];\n  if (compositePrimaryKey) {\n    const pkCols = compositePrimaryKey.map(c => `\"${parseSqlIdentifier(c, 'column name')}\"`).join(', ');\n    tableConstraints.push(`PRIMARY KEY (${pkCols})`);\n  }\n\n  const finalColumns = [...columns, ...timeZColumns, ...tableConstraints].join(',\\n');\n  // Sanitize schema name before using it in constraint names to ensure valid SQL identifiers\n  const parsedSchemaName = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n  // Use the original (long) base name so existing databases that already have\n  // the constraint under this name are detected by the IF NOT EXISTS check.\n  // buildConstraintName will truncate only when a schema prefix pushes the\n  // combined name past the 63-byte Postgres limit.\n  const workflowSnapshotConstraint = buildConstraintName({\n    baseName: 'mastra_workflow_snapshot_workflow_name_run_id_key',\n    schemaName: parsedSchemaName || undefined,\n  });\n  const spansPrimaryKeyConstraint = buildConstraintName({\n    baseName: 'mastra_ai_spans_traceid_spanid_pk',\n    schemaName: parsedSchemaName || undefined,\n  });\n  const quotedSchemaName = getSchemaName(schemaName);\n  const schemaFilter = parsedSchemaName || 'public';\n\n  const sql = `\n            CREATE TABLE IF NOT EXISTS ${getTableName({ indexName: tableName, schemaName: quotedSchemaName })} (\n              ${finalColumns}\n            );\n            ${\n              tableName === TABLE_WORKFLOW_SNAPSHOT\n                ? `\n            DO $$ BEGIN\n              IF NOT EXISTS (\n                SELECT 1 FROM pg_constraint WHERE conname = lower('${workflowSnapshotConstraint}') AND connamespace = (SELECT oid FROM pg_namespace WHERE nspname = '${schemaFilter}')\n              ) AND NOT EXISTS (\n                SELECT 1 FROM pg_indexes WHERE indexname = lower('${workflowSnapshotConstraint}') AND schemaname = '${schemaFilter}'\n              ) THEN\n                ALTER TABLE ${getTableName({ indexName: tableName, schemaName: quotedSchemaName })}\n                ADD CONSTRAINT ${workflowSnapshotConstraint}\n                UNIQUE (workflow_name, run_id);\n              END IF;\n              IF EXISTS (\n                SELECT 1 FROM pg_index i\n                JOIN pg_class c ON i.indexrelid = c.oid\n                JOIN pg_namespace n ON c.relnamespace = n.oid\n                WHERE c.relname = lower('${workflowSnapshotConstraint}')\n                AND n.nspname = '${schemaFilter}'\n                AND i.indisreplident = false\n              ) THEN\n                ALTER TABLE ${getTableName({ indexName: tableName, schemaName: quotedSchemaName })}\n                REPLICA IDENTITY USING INDEX ${workflowSnapshotConstraint};\n              END IF;\n            END $$;\n            `\n                : ''\n            }\n          ${\n            // For spans table: Include PRIMARY KEY in exports, but not in runtime (handled after deduplication)\n            tableName === TABLE_SPANS && includeAllConstraints\n              ? `\n            DO $$ BEGIN\n              IF NOT EXISTS (\n                SELECT 1 FROM pg_constraint WHERE conname = lower('${spansPrimaryKeyConstraint}') AND connamespace = (SELECT oid FROM pg_namespace WHERE nspname = '${schemaFilter}')\n              ) THEN\n                ALTER TABLE ${getTableName({ indexName: tableName, schemaName: quotedSchemaName })}\n                ADD CONSTRAINT ${spansPrimaryKeyConstraint}\n                PRIMARY KEY (\"traceId\", \"spanId\");\n              END IF;\n            END $$;\n            `\n              : ''\n          }\n          `;\n  // Note: At runtime, PRIMARY KEY for spans table is added separately after deduplication\n  // See PgDB.addSpansPrimaryKey()\n\n  return sql;\n}\n\n/**\n * Generates a CREATE INDEX SQL statement from index options.\n * Used by exportSchemas to produce index DDL without a database connection.\n */\nexport function generateIndexSQL(options: CreateIndexOptions, schemaName?: string): string {\n  const { name, table, columns, unique = false, where, method = 'btree' } = options;\n\n  const quotedSchemaName = getSchemaName(schemaName);\n  const fullTableName = getTableName({ indexName: table, schemaName: quotedSchemaName });\n\n  const uniqueStr = unique ? 'UNIQUE ' : '';\n  const methodStr = method !== 'btree' ? `USING ${method} ` : '';\n\n  const columnsStr = columns\n    .map(col => {\n      if (col.includes(' DESC') || col.includes(' ASC')) {\n        const [colName, ...modifiers] = col.split(' ');\n        if (!colName) {\n          throw new Error(`Invalid column specification: ${col}`);\n        }\n        return `\"${parseSqlIdentifier(colName, 'column name')}\" ${modifiers.join(' ')}`;\n      }\n      return `\"${parseSqlIdentifier(col, 'column name')}\"`;\n    })\n    .join(', ');\n\n  const whereStr = where ? ` WHERE ${where}` : '';\n  const quotedIndexName = `\"${parseSqlIdentifier(name, 'index name')}\"`;\n\n  return `CREATE ${uniqueStr}INDEX IF NOT EXISTS ${quotedIndexName} ON ${fullTableName} ${methodStr}(${columnsStr})${whereStr};`;\n}\n\n/**\n * Generates the SQL for a timestamp trigger function and trigger on a table.\n * Returns the DDL string without executing it.\n */\nexport function generateTimestampTriggerSQL(tableName: string, schemaName?: string): string {\n  const quotedSchemaName = getSchemaName(schemaName);\n  const fullTableName = getTableName({ indexName: tableName, schemaName: quotedSchemaName });\n  const functionName = `${quotedSchemaName}.trigger_set_timestamps`;\n  const parsedTriggerName = parseSqlIdentifier(`${tableName}_timestamps`, 'trigger name');\n  const triggerName = `\"${parsedTriggerName}\"`;\n\n  // Literals for the pg_trigger guard below. The identifiers are already\n  // validated by parseSqlIdentifier, so they cannot carry a quote.\n  const triggerNameLiteral = `'${parsedTriggerName}'`;\n  const tableNameLiteral = `'${parseSqlIdentifier(tableName, 'table name')}'`;\n  const schemaNameLiteral = schemaName ? `'${parseSqlIdentifier(schemaName, 'schema name')}'` : `'public'`;\n\n  return `CREATE OR REPLACE FUNCTION ${functionName}()\nRETURNS TRIGGER AS $$\nBEGIN\n    IF TG_OP = 'INSERT' THEN\n        NEW.\"createdAt\" = NOW();\n        NEW.\"updatedAt\" = NOW();\n        NEW.\"createdAtZ\" = NOW();\n        NEW.\"updatedAtZ\" = NOW();\n    ELSIF TG_OP = 'UPDATE' THEN\n        NEW.\"updatedAt\" = NOW();\n        NEW.\"updatedAtZ\" = NOW();\n        NEW.\"createdAt\" = OLD.\"createdAt\";\n        NEW.\"createdAtZ\" = OLD.\"createdAtZ\";\n    END IF;\n    RETURN NEW;\nEND;\n$$ LANGUAGE plpgsql;\n\nDO $mastra_timestamps_trigger$\nBEGIN\n    -- Recreating the trigger unconditionally would take an ACCESS EXCLUSIVE\n    -- lock on the table (DROP TRIGGER does, even when nothing changes), and\n    -- init runs on every process start. Skip when the trigger is already\n    -- exactly what the CREATE below would produce.\n    --\n    -- tgtype 23 = ROW (1) | BEFORE (2) | INSERT (4) | UPDATE (16), so a trigger\n    -- whose timing or events differ still falls through and gets rebuilt. The\n    -- behaviour itself lives in the function, which is replaced above on every\n    -- init, so an upgraded function body lands without touching the trigger.\n    IF NOT EXISTS (\n        SELECT 1\n        FROM pg_catalog.pg_trigger tg\n        JOIN pg_catalog.pg_class c ON c.oid = tg.tgrelid\n        JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n        WHERE tg.tgname = ${triggerNameLiteral}\n          AND c.relname = ${tableNameLiteral}\n          AND n.nspname = ${schemaNameLiteral}\n          AND NOT tg.tgisinternal\n          AND tg.tgtype = 23\n          AND tg.tgfoid = '${functionName}()'::regprocedure\n    ) THEN\n        DROP TRIGGER IF EXISTS ${triggerName} ON ${fullTableName};\n\n        CREATE TRIGGER ${triggerName}\n            BEFORE INSERT OR UPDATE ON ${fullTableName}\n            FOR EACH ROW\n            EXECUTE FUNCTION ${functionName}();\n    END IF;\nEND\n$mastra_timestamps_trigger$;`;\n}\n\n/**\n * Internal config for PgDB - accepts already-resolved client\n */\nexport interface PgDBInternalConfig {\n  client: DbClient;\n  readClient?: 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\n/**\n * Guard prune batch limits: a non-positive limit deletes nothing while callers'\n * drain checks (`affected < limit`) never fire, which turns the prune loop into\n * an infinite spin. Fail loudly instead.\n */\nfunction assertPositiveLimit(limit: number): void {\n  if (!Number.isSafeInteger(limit) || limit <= 0) {\n    throw new Error(`prune limit must be a positive integer; received ${limit}`);\n  }\n}\n\nexport class PgDB extends MastraBase {\n  public client: DbClient;\n  public readClient: DbClient;\n  public schemaName?: string;\n  public skipDefaultIndexes?: boolean;\n\n  /** Cache of actual table columns: tableName -> Set<columnName> */\n  private tableColumnsCache = new Map<string, Set<string>>();\n\n  /** Cache of column Postgres data types: tableName -> columnName -> data_type */\n  private columnTypeCache = new Map<string, Map<string, string>>();\n\n  constructor(config: PgDBInternalConfig) {\n    super({\n      component: 'STORAGE',\n      name: 'PG_DB_LAYER',\n    });\n\n    this.client = config.client;\n    this.readClient = config.readClient ?? config.client;\n    this.schemaName = config.schemaName;\n    this.skipDefaultIndexes = config.skipDefaultIndexes;\n  }\n\n  /**\n   * Catalog snapshot for the current init window, or `null` outside it.\n   *\n   * When non-null, the init-path methods below answer existence questions from\n   * it instead of round-tripping to the server, and record the objects they\n   * create so later callers in the same init see them. See\n   * {@link SchemaSnapshot} for why it is scoped to init only.\n   */\n  private get schemaSnapshot(): SchemaSnapshot | null {\n    return getSchemaSnapshot(this.client, this.schemaName);\n  }\n\n  /**\n   * Whether the snapshot proves `generateTableSQL` would be a no-op for this\n   * table — i.e. the CREATE statement can be skipped.\n   *\n   * For most tables that is just \"the table exists\". `workflow_snapshot` is the\n   * exception: its generated SQL also carries a DO block that back-fills the\n   * `(workflow_name, run_id)` unique constraint and promotes it to the table's\n   * replica identity, so a table created by an older version still needs the\n   * statement to run.\n   */\n  private snapshotShowsTableConverged(snapshot: SchemaSnapshot, tableName: TABLE_NAMES): boolean {\n    if (!snapshot.tables.has(tableName)) return false;\n\n    if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n      const constraintName = buildConstraintName({\n        baseName: 'mastra_workflow_snapshot_workflow_name_run_id_key',\n        schemaName: this.schemaName ? parseSqlIdentifier(this.schemaName, 'schema name') : undefined,\n      }).toLowerCase();\n      return snapshot.indexes.has(constraintName) && snapshot.replicaIdentityIndexes.has(constraintName);\n    }\n\n    return true;\n  }\n\n  /** Column set for `tableName` in the snapshot, created empty if absent. */\n  private snapshotColumns(snapshot: SchemaSnapshot, tableName: string): Set<string> {\n    let columns = snapshot.columns.get(tableName);\n    if (!columns) {\n      columns = new Set<string>();\n      snapshot.columns.set(tableName, columns);\n    }\n    return columns;\n  }\n\n  /**\n   * Records an out-of-band `ALTER TABLE … RENAME TO` in the init snapshot.\n   *\n   * Init-time migrations that issue raw DDL on `this.client` (instead of going\n   * through createTable/alterTable/createIndex, which maintain the snapshot\n   * themselves) MUST report it through these `note*` methods. A snapshot that\n   * still lists a renamed-away table makes a later createTable() in the same\n   * init skip the rebuild the migration depends on — stranding data. No-op\n   * outside the init window.\n   *\n   * Indexes riding along with a rename keep their names, so the snapshot's\n   * index set stays accurate without changes here.\n   */\n  noteTableRenamed(oldName: string, newName: string): void {\n    const snapshot = this.schemaSnapshot;\n    if (snapshot) {\n      if (snapshot.tables.delete(oldName)) snapshot.tables.add(newName);\n      const columns = snapshot.columns.get(oldName);\n      if (columns) {\n        snapshot.columns.delete(oldName);\n        snapshot.columns.set(newName, columns);\n      }\n    }\n    this.tableColumnsCache.delete(oldName);\n    this.columnTypeCache.delete(oldName);\n    this.tableColumnsCache.delete(newName);\n    this.columnTypeCache.delete(newName);\n  }\n\n  /**\n   * Records an out-of-band `DROP TABLE` in the init snapshot. See\n   * {@link noteTableRenamed} for why raw-DDL migrations must call this.\n   *\n   * The dropped table's indexes vanish with it, but the snapshot's flat index\n   * set cannot map names back to tables. Stale entries only make a later\n   * createIndex() skip a recreate until the next init re-reads the catalog —\n   * the same self-healing bound the rest of the snapshot design accepts.\n   */\n  noteTableDropped(tableName: string): void {\n    const snapshot = this.schemaSnapshot;\n    if (snapshot) {\n      snapshot.tables.delete(tableName);\n      snapshot.columns.delete(tableName);\n      snapshot.columnTypes.delete(tableName);\n    }\n    this.tableColumnsCache.delete(tableName);\n    this.columnTypeCache.delete(tableName);\n  }\n\n  /**\n   * Records an out-of-band `ALTER TABLE … ADD COLUMN` in the init snapshot.\n   * See {@link noteTableRenamed} for why raw-DDL migrations must call this.\n   */\n  noteColumnAdded(tableName: string, column: string): void {\n    const snapshot = this.schemaSnapshot;\n    if (snapshot) this.snapshotColumns(snapshot, tableName).add(column);\n    this.tableColumnsCache.delete(tableName);\n    this.columnTypeCache.delete(tableName);\n  }\n\n  /**\n   * Gets the set of column names that actually exist in the database table.\n   * Results are cached; the cache is invalidated when alterTable() adds new columns.\n   */\n  private async getTableColumns(tableName: TABLE_NAMES): Promise<Set<string>> {\n    const cached = this.tableColumnsCache.get(tableName);\n    if (cached) return cached;\n\n    const schema = this.schemaName || 'public';\n    const rows = await this.client.manyOrNone<{ column_name: string }>(\n      `SELECT column_name FROM information_schema.columns WHERE table_schema = $1 AND table_name = $2`,\n      [schema, tableName],\n    );\n\n    const columns = new Set(rows.map(r => r.column_name));\n    if (columns.size > 0) {\n      this.tableColumnsCache.set(tableName, columns);\n    }\n    return columns;\n  }\n\n  /**\n   * Filters a record to only include columns that exist in the actual database table.\n   * Unknown columns are silently dropped to ensure forward compatibility when newer\n   * domain packages add fields that haven't been migrated yet.\n   */\n  private async filterRecordToKnownColumns(\n    tableName: TABLE_NAMES,\n    record: Record<string, any>,\n  ): Promise<Record<string, any>> {\n    const knownColumns = await this.getTableColumns(tableName);\n    if (knownColumns.size === 0) return record; // Table may not exist yet\n\n    const filtered: Record<string, any> = {};\n    for (const [key, value] of Object.entries(record)) {\n      if (knownColumns.has(key)) {\n        filtered[key] = value;\n      }\n    }\n    return filtered;\n  }\n\n  async hasColumn(table: string, column: string): Promise<boolean> {\n    const schema = this.schemaName || 'public';\n\n    const snapshot = this.schemaSnapshot;\n    if (snapshot) {\n      const columns = snapshot.columns.get(table);\n      if (!columns) return false;\n      return columns.has(column) || columns.has(column.toLowerCase());\n    }\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   * Returns the Postgres data type of a column (e.g. `jsonb`, `json`, `text`),\n   * or null when the table or column does not exist.\n   *\n   * Answered from the init snapshot when one is installed, so a warm `init()`\n   * issues no catalog probe. Outside init, results are cached per instance and\n   * the cache is invalidated alongside {@link tableColumnsCache} whenever DDL\n   * changes a table.\n   */\n  async getColumnType(table: string, column: string): Promise<string | null> {\n    const snapshot = this.schemaSnapshot;\n    if (snapshot) {\n      const types = snapshot.columnTypes.get(table);\n      const known = types?.get(column) ?? types?.get(column.toLowerCase());\n      if (known) return known;\n      // The table exists in the snapshot but the column does not: nothing to probe for.\n      // A table created during this init has no snapshot types yet, so fall through.\n      if (types) return null;\n    }\n\n    const cached = this.columnTypeCache.get(table)?.get(column);\n    if (cached !== undefined) return cached;\n\n    const schema = this.schemaName || 'public';\n    const result = await this.client.oneOrNone<{ data_type: string }>(\n      `SELECT data_type 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    const dataType = result?.data_type ?? null;\n    if (dataType) {\n      if (snapshot) {\n        let snapshotTypes = snapshot.columnTypes.get(table);\n        if (!snapshotTypes) {\n          snapshotTypes = new Map<string, string>();\n          snapshot.columnTypes.set(table, snapshotTypes);\n        }\n        snapshotTypes.set(column, dataType);\n      }\n      let types = this.columnTypeCache.get(table);\n      if (!types) {\n        types = new Map();\n        this.columnTypeCache.set(table, types);\n      }\n      types.set(column, dataType);\n    }\n    return dataType;\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    // During the init window, a snapshot holding tables for this schema proves\n    // the schema exists (the snapshot queries are scoped to it), so the\n    // `information_schema.schemata` probe below would be a warm init's one\n    // remaining per-process round trip. Skip it and mark setup complete. A\n    // cold schema yields an empty snapshot and falls through to the probe.\n    const snapshot = this.schemaSnapshot;\n    if (snapshot && snapshot.tables.size > 0) {\n      schemaSetupRegistry.set(this.schemaName, { promise: null, complete: true });\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              // `CREATE SCHEMA IF NOT EXISTS` is not atomic; a concurrent\n              // backend can race past the existence probe and create the\n              // schema first. Treat duplicate-schema errors as success.\n              if (isDuplicateSchemaError(error)) {\n                this.logger.debug(`Schema \"${schemaNameCapture}\" was created by another process`);\n              } else {\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\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  private async executeInsert(\n    client: Pick<DbClient, 'none'> | Pick<TxClient, 'none'>,\n    { tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> },\n  ): Promise<void> {\n    this.addTimestampZColumns(record);\n\n    // Filter out columns that don't exist in the actual database table\n    const filteredRecord = await this.filterRecordToKnownColumns(tableName, record);\n\n    const schemaName = getSchemaName(this.schemaName);\n    const columns = Object.keys(filteredRecord).map(col => parseSqlIdentifier(col, 'column name'));\n    if (columns.length === 0) return; // No known columns after filtering - skip insert\n    const values = this.prepareValuesForInsert(filteredRecord, tableName);\n    const placeholders = values.map((_, i) => `$${i + 1}`).join(', ');\n    const fullTableName = getTableName({ indexName: tableName, schemaName });\n    const columnList = columns.map(c => `\"${c}\"`).join(', ');\n\n    // For spans table, use ON CONFLICT to handle duplicate (traceId, spanId) gracefully\n    if (tableName === TABLE_SPANS) {\n      // Build update clause for all columns except the primary key columns\n      const updateColumns = columns.filter(c => c !== 'traceId' && c !== 'spanId');\n\n      if (updateColumns.length > 0) {\n        const updateClause = updateColumns.map(c => `\"${c}\" = EXCLUDED.\"${c}\"`).join(', ');\n        await client.none(\n          `INSERT INTO ${fullTableName} (${columnList}) VALUES (${placeholders})\n             ON CONFLICT (\"traceId\", \"spanId\") DO UPDATE SET ${updateClause}`,\n          values,\n        );\n      } else {\n        // Only PK columns provided - use DO NOTHING to avoid invalid SQL\n        await client.none(\n          `INSERT INTO ${fullTableName} (${columnList}) VALUES (${placeholders})\n             ON CONFLICT (\"traceId\", \"spanId\") DO NOTHING`,\n          values,\n        );\n      }\n    } else {\n      await client.none(`INSERT INTO ${fullTableName} (${columnList}) VALUES (${placeholders})`, values);\n    }\n  }\n\n  async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n    try {\n      await this.executeInsert(this.client, { tableName, record });\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'INSERT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            tableName,\n          },\n        },\n        error,\n      );\n    }\n  }\n\n  async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n    try {\n      const schemaName = getSchemaName(this.schemaName);\n      const tableNameWithSchema = getTableName({ indexName: tableName, schemaName });\n\n      // Check if table exists before truncating (handles case where init failed)\n      const tableExists = await this.client.oneOrNone<{ exists: boolean }>(\n        `SELECT EXISTS (\n          SELECT 1 FROM information_schema.tables\n          WHERE table_schema = $1 AND table_name = $2\n        )`,\n        [this.schemaName || 'public', tableName],\n      );\n\n      if (tableExists?.exists) {\n        await this.client.none(`TRUNCATE TABLE ${tableNameWithSchema} CASCADE`);\n      }\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CLEAR_TABLE', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            tableName,\n          },\n        },\n        error,\n      );\n    }\n  }\n\n  async createTable({\n    tableName,\n    schema,\n    compositePrimaryKey,\n  }: {\n    tableName: TABLE_NAMES;\n    schema: Record<string, StorageColumn>;\n    compositePrimaryKey?: string[];\n  }): Promise<void> {\n    try {\n      const timeZColumnNames = Object.entries(schema)\n        .filter(([_, def]) => def.type === 'timestamp')\n        .map(([name]) => name);\n\n      if (this.schemaName) {\n        await this.setupSchema();\n      }\n\n      const snapshot = this.schemaSnapshot;\n      // Skipping the statement when everything it would create is already there\n      // is not only a saved round trip: `CREATE TABLE IF NOT EXISTS` requires\n      // CREATE on the schema, so on a converged schema this is also what lets a\n      // least-privilege role finish init instead of failing with\n      // \"permission denied\".\n      if (!snapshot || !this.snapshotShowsTableConverged(snapshot, tableName)) {\n        const sql = generateTableSQL({ tableName, schema, schemaName: this.schemaName, compositePrimaryKey });\n\n        try {\n          await this.client.none(sql);\n        } catch (error) {\n          // `CREATE TABLE IF NOT EXISTS` is not atomic across concurrent\n          // backends. Two processes can both pass the existence probe and one\n          // surfaces a catalog duplicate error. Treat it as \"already created\".\n          if (!isDuplicateRelationError(error)) throw error;\n        }\n\n        if (snapshot) {\n          snapshot.tables.add(tableName);\n          // generateTableSQL emits the declared columns plus a `Z` twin for\n          // every timestamp column; record both so the alterTable pass below\n          // and later domains don't re-probe for them.\n          const created = this.snapshotColumns(snapshot, tableName);\n          for (const [name, def] of Object.entries(schema)) {\n            const parsedName = parseSqlIdentifier(name, 'column name');\n            created.add(parsedName);\n            if (def.type === 'timestamp') {\n              created.add(`${parsedName}Z`);\n            }\n          }\n        }\n      }\n\n      await this.alterTable({\n        tableName,\n        schema,\n        ifNotExists: timeZColumnNames,\n      });\n\n      // Set up timestamp triggers and run migrations for Spans table\n      if (tableName === TABLE_SPANS) {\n        await this.setupTimestampTriggers(tableName);\n        await this.migrateSpansTable();\n\n        // Check if PRIMARY KEY constraint already exists - if so, skip migration\n        // This avoids running expensive queries on every init after migration is complete\n        const pkExists = await this.spansPrimaryKeyExists();\n        if (!pkExists) {\n          // Check for duplicates before attempting to add PRIMARY KEY\n          const duplicateInfo = await this.checkForDuplicateSpans();\n          if (duplicateInfo.hasDuplicates) {\n            // Duplicates exist - throw error requiring manual migration\n            const errorMessage =\n              `\\n` +\n              `===========================================================================\\n` +\n              `MIGRATION REQUIRED: Duplicate spans detected in ${duplicateInfo.tableName}\\n` +\n              `===========================================================================\\n` +\n              `\\n` +\n              `Found ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations.\\n` +\n              `\\n` +\n              `The spans table requires a unique constraint on (traceId, spanId), but your\\n` +\n              `database contains duplicate entries that must be resolved first.\\n` +\n              `\\n` +\n              `To fix this, run the manual migration command:\\n` +\n              `\\n` +\n              `  npx mastra migrate\\n` +\n              `\\n` +\n              `This command will:\\n` +\n              `  1. Remove duplicate spans (keeping the most complete/recent version)\\n` +\n              `  2. Add the required unique constraint\\n` +\n              `\\n` +\n              `Note: This migration may take some time for large tables.\\n` +\n              `===========================================================================\\n`;\n\n            throw new MastraError({\n              id: createStorageErrorId('PG', 'MIGRATION_REQUIRED', 'DUPLICATE_SPANS'),\n              domain: ErrorDomain.STORAGE,\n              category: ErrorCategory.USER,\n              text: errorMessage,\n            });\n          } else {\n            // No duplicates - safe to add PRIMARY KEY directly\n            await this.addSpansPrimaryKey();\n          }\n        }\n      }\n    } catch (error) {\n      // Rethrow MastraError directly to preserve structured error IDs (e.g., MIGRATION_REQUIRED::DUPLICATE_SPANS)\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_TABLE', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            tableName,\n          },\n        },\n        error,\n      );\n    } finally {\n      // Clear cached columns so subsequent inserts see the fresh schema\n      this.tableColumnsCache.delete(tableName);\n      this.columnTypeCache.delete(tableName);\n    }\n  }\n\n  private async setupTimestampTriggers(tableName: TABLE_NAMES): Promise<void> {\n    const fullTableName = getTableName({ indexName: tableName, schemaName: getSchemaName(this.schemaName) });\n\n    try {\n      const triggerSQL = generateTimestampTriggerSQL(tableName, this.schemaName);\n      await this.client.none(triggerSQL);\n      this.logger?.debug?.(`Set up timestamp triggers for table ${fullTableName}`);\n    } catch (error) {\n      this.logger?.warn?.(`Failed to set up timestamp triggers for ${fullTableName}:`, error);\n    }\n  }\n\n  /**\n   * Migrates the spans table schema from OLD_SPAN_SCHEMA to current SPAN_SCHEMA.\n   * This adds new columns that don't exist in old schema.\n   */\n  private async migrateSpansTable(): Promise<void> {\n    const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n    const schema = TABLE_SCHEMAS[TABLE_SPANS];\n\n    try {\n      // Add any columns from current schema that don't exist in the database\n      for (const [columnName, columnDef] of Object.entries(schema)) {\n        const columnExists = await this.hasColumn(TABLE_SPANS, columnName);\n        if (!columnExists) {\n          const parsedColumnName = parseSqlIdentifier(columnName, 'column name');\n          const sqlType = mapToSqlType(columnDef.type);\n          // Align with createTable: nullable columns omit NOT NULL, non-nullable columns include it\n          const nullable = columnDef.nullable ? '' : 'NOT NULL';\n          const defaultValue = !columnDef.nullable ? this.getDefaultValue(columnDef.type) : '';\n          const alterSql =\n            `ALTER TABLE ${fullTableName} ADD COLUMN IF NOT EXISTS \"${parsedColumnName}\" ${sqlType} ${nullable} ${defaultValue}`.trim();\n          await this.client.none(alterSql);\n          this.noteColumnAdded(TABLE_SPANS, columnName);\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.noteColumnAdded(TABLE_SPANS, `${columnName}Z`);\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.noteColumnAdded(TABLE_SPANS, tzColumnName);\n            this.logger?.debug?.(`Added timezone column '${tzColumnName}' to ${fullTableName}`);\n          }\n        }\n      }\n\n      this.logger?.info?.(`Migration completed for ${fullTableName}`);\n    } catch (error) {\n      // Log warning but don't fail - migrations should be best-effort\n      this.logger?.warn?.(`Failed to migrate spans table ${fullTableName}:`, error);\n    }\n  }\n\n  /**\n   * Deduplicates spans in the mastra_ai_spans table before adding the PRIMARY KEY constraint.\n   * Keeps spans based on priority: completed (endedAt NOT NULL) > most recent updatedAt > most recent createdAt.\n   *\n   * Note: This prioritizes migration completion over perfect data preservation.\n   * Old trace data may be lost, which is acceptable for this use case.\n   */\n  private async deduplicateSpans(): Promise<void> {\n    const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n\n    try {\n      // Quick check: are there any duplicates at all? Use LIMIT 1 for speed on large tables.\n      const duplicateCheck = await this.client.oneOrNone<{ has_duplicates: boolean }>(`\n        SELECT EXISTS (\n          SELECT 1\n          FROM ${fullTableName}\n          GROUP BY \"traceId\", \"spanId\"\n          HAVING COUNT(*) > 1\n          LIMIT 1\n        ) as has_duplicates\n      `);\n\n      if (!duplicateCheck?.has_duplicates) {\n        this.logger?.debug?.(`No duplicate spans found in ${fullTableName}`);\n        return;\n      }\n\n      this.logger?.info?.(`Duplicate spans detected in ${fullTableName}, starting deduplication...`);\n\n      // Delete duplicates directly without fetching details into memory.\n      // This avoids OOM issues on large tables with many duplicates.\n      // Priority: completed spans (endedAt NOT NULL) > most recent updatedAt > most recent createdAt\n      // Uses ctid (physical row id) as final tiebreaker for deterministic results.\n      const result = await this.client.query(`\n        DELETE FROM ${fullTableName} t1\n        USING ${fullTableName} t2\n        WHERE t1.\"traceId\" = t2.\"traceId\"\n          AND t1.\"spanId\" = t2.\"spanId\"\n          AND (\n            -- Keep completed spans over incomplete\n            (t1.\"endedAt\" IS NULL AND t2.\"endedAt\" IS NOT NULL)\n            OR\n            -- If both have same completion status, keep more recent updatedAt\n            (\n              (t1.\"endedAt\" IS NULL) = (t2.\"endedAt\" IS NULL)\n              AND (\n                (t1.\"updatedAt\" < t2.\"updatedAt\")\n                OR (t1.\"updatedAt\" IS NULL AND t2.\"updatedAt\" IS NOT NULL)\n                OR\n                -- If updatedAt is the same, keep more recent createdAt\n                (\n                  (t1.\"updatedAt\" = t2.\"updatedAt\" OR (t1.\"updatedAt\" IS NULL AND t2.\"updatedAt\" IS NULL))\n                  AND (\n                    (t1.\"createdAt\" < t2.\"createdAt\")\n                    OR (t1.\"createdAt\" IS NULL AND t2.\"createdAt\" IS NOT NULL)\n                    OR\n                    -- If all else equal, use ctid as tiebreaker\n                    (\n                      (t1.\"createdAt\" = t2.\"createdAt\" OR (t1.\"createdAt\" IS NULL AND t2.\"createdAt\" IS NULL))\n                      AND t1.ctid < t2.ctid\n                    )\n                  )\n                )\n              )\n            )\n          )\n      `);\n\n      this.logger?.info?.(\n        `Deduplication complete: removed ${result.rowCount ?? 0} duplicate spans from ${fullTableName}`,\n      );\n    } catch (error) {\n      // Re-throw deduplication errors so PRIMARY KEY addition will fail with a clear error\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DEDUPLICATE_SPANS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            tableName: TABLE_SPANS,\n          },\n        },\n        error,\n      );\n    }\n  }\n\n  /**\n   * Checks for duplicate (traceId, spanId) combinations in the spans table.\n   * Returns information about duplicates for logging/CLI purposes.\n   */\n  private async checkForDuplicateSpans(): Promise<{\n    hasDuplicates: boolean;\n    duplicateCount: number;\n    tableName: string;\n  }> {\n    const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n\n    try {\n      // Count duplicate (traceId, spanId) combinations\n      const result = await this.client.oneOrNone<{ duplicate_count: string }>(`\n        SELECT COUNT(*) as duplicate_count\n        FROM (\n          SELECT \"traceId\", \"spanId\"\n          FROM ${fullTableName}\n          GROUP BY \"traceId\", \"spanId\"\n          HAVING COUNT(*) > 1\n        ) duplicates\n      `);\n\n      const duplicateCount = parseInt(result?.duplicate_count ?? '0', 10);\n      return {\n        hasDuplicates: duplicateCount > 0,\n        duplicateCount,\n        tableName: fullTableName,\n      };\n    } catch (error) {\n      // If table doesn't exist or other error, assume no duplicates\n      this.logger?.debug?.(`Could not check for duplicates: ${error}`);\n      return { hasDuplicates: false, duplicateCount: 0, tableName: fullTableName };\n    }\n  }\n\n  /**\n   * Checks if the PRIMARY KEY constraint on (traceId, spanId) already exists on the spans table.\n   * Used to skip deduplication when the constraint already exists (migration already complete).\n   */\n  private async spansPrimaryKeyExists(): Promise<boolean> {\n    const parsedSchemaName = this.schemaName ? parseSqlIdentifier(this.schemaName, 'schema name') : '';\n    const constraintName = buildConstraintName({\n      baseName: 'mastra_ai_spans_traceid_spanid_pk',\n      schemaName: parsedSchemaName || undefined,\n    });\n    const schemaFilter = this.schemaName || 'public';\n\n    // A primary key is always backed by an index of the same name, so the init\n    // snapshot already answers this without a round trip.\n    const snapshot = this.schemaSnapshot;\n    if (snapshot) return snapshot.primaryKeyIndexes.has(constraintName.toLowerCase());\n\n    return this.spansPrimaryKeyExistsLive(constraintName, schemaFilter);\n  }\n\n  /** Live-catalog variant of {@link spansPrimaryKeyExists}, bypassing the snapshot. */\n  private async spansPrimaryKeyExistsLive(constraintName: string, schemaFilter: string): Promise<boolean> {\n    const result = await this.client.oneOrNone<{ exists: boolean }>(\n      `SELECT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = lower($1) AND connamespace = (SELECT oid FROM pg_namespace WHERE nspname = $2)) as exists`,\n      [constraintName, schemaFilter],\n    );\n\n    return result?.exists ?? false;\n  }\n\n  /**\n   * Adds the PRIMARY KEY constraint on (traceId, spanId) to the spans table.\n   * Should be called AFTER deduplication to ensure no duplicate key violations.\n   */\n  private async addSpansPrimaryKey(): Promise<void> {\n    const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n    const parsedSchemaName = this.schemaName ? parseSqlIdentifier(this.schemaName, 'schema name') : '';\n    const constraintName = buildConstraintName({\n      baseName: 'mastra_ai_spans_traceid_spanid_pk',\n      schemaName: parsedSchemaName || undefined,\n    });\n    const schemaFilter = this.schemaName || 'public';\n\n    try {\n      // Check if the constraint already exists\n      const constraintExists = await this.client.oneOrNone<{ exists: boolean }>(\n        `\n        SELECT EXISTS (\n          SELECT 1 FROM pg_constraint WHERE conname = lower($1) AND connamespace = (SELECT oid FROM pg_namespace WHERE nspname = $2)\n        ) as exists\n      `,\n        [constraintName, schemaFilter],\n      );\n\n      if (constraintExists?.exists) {\n        this.logger?.debug?.(`PRIMARY KEY constraint ${constraintName} already exists on ${fullTableName}`);\n        return;\n      }\n\n      // Add the PRIMARY KEY constraint\n      await this.client.none(`\n        ALTER TABLE ${fullTableName}\n        ADD CONSTRAINT ${constraintName}\n        PRIMARY KEY (\"traceId\", \"spanId\")\n      `);\n      this.schemaSnapshot?.primaryKeyIndexes.add(constraintName.toLowerCase());\n\n      this.logger?.info?.(`Added PRIMARY KEY constraint ${constraintName} to ${fullTableName}`);\n    } catch (error) {\n      // Another process may have added the same constraint concurrently\n      // (TOCTOU between the EXISTS check and the ALTER TABLE). Treat the\n      // resulting duplicate-relation / duplicate-object error as success,\n      // but only after confirming the PRIMARY KEY is actually present.\n      // isDuplicateRelationError can also match on unrelated name collisions\n      // (e.g. a stale index with the same name), so the post-check prevents\n      // silently swallowing errors when the constraint is still missing.\n      //\n      // The confirm must hit the live catalog: in this path the init snapshot\n      // (if live) just said the constraint was ABSENT — that is why the ALTER\n      // ran — so re-asking it would deterministically contradict the\n      // concurrent creator and turn a benign race into a thrown error.\n      if (isDuplicateRelationError(error)) {\n        const confirmed = await this.spansPrimaryKeyExistsLive(constraintName, schemaFilter);\n        if (confirmed) {\n          this.schemaSnapshot?.primaryKeyIndexes.add(constraintName.toLowerCase());\n          this.logger?.debug?.(`PRIMARY KEY constraint ${constraintName} was created by another process`);\n          return;\n        }\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'ADD_SPANS_PRIMARY_KEY', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            tableName: TABLE_SPANS,\n            constraintName,\n          },\n        },\n        error,\n      );\n    }\n  }\n\n  /**\n   * Manually run the spans migration to deduplicate and add the unique constraint.\n   * This is intended to be called from the CLI when duplicates are detected.\n   *\n   * @returns Migration result with status and details\n   */\n  async migrateSpans(): Promise<{\n    success: boolean;\n    alreadyMigrated: boolean;\n    duplicatesRemoved: number;\n    message: string;\n  }> {\n    const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n\n    // Check if already migrated\n    const pkExists = await this.spansPrimaryKeyExists();\n    if (pkExists) {\n      return {\n        success: true,\n        alreadyMigrated: true,\n        duplicatesRemoved: 0,\n        message: `Migration already complete. PRIMARY KEY constraint exists on ${fullTableName}.`,\n      };\n    }\n\n    // Check for duplicates\n    const duplicateInfo = await this.checkForDuplicateSpans();\n\n    if (duplicateInfo.hasDuplicates) {\n      this.logger?.info?.(\n        `Found ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations. Starting deduplication...`,\n      );\n\n      // Run deduplication\n      await this.deduplicateSpans();\n    } else {\n      this.logger?.info?.(`No duplicate spans found.`);\n    }\n\n    // Add PRIMARY KEY constraint\n    await this.addSpansPrimaryKey();\n\n    return {\n      success: true,\n      alreadyMigrated: false,\n      duplicatesRemoved: duplicateInfo.duplicateCount,\n      message: duplicateInfo.hasDuplicates\n        ? `Migration complete. Removed duplicates and added PRIMARY KEY constraint to ${fullTableName}.`\n        : `Migration complete. Added PRIMARY KEY constraint to ${fullTableName}.`,\n    };\n  }\n\n  /**\n   * Check migration status for the spans table.\n   * Returns information about whether migration is needed.\n   */\n  async checkSpansMigrationStatus(): Promise<{\n    needsMigration: boolean;\n    hasDuplicates: boolean;\n    duplicateCount: number;\n    constraintExists: boolean;\n    tableName: string;\n  }> {\n    const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n    const pkExists = await this.spansPrimaryKeyExists();\n\n    if (pkExists) {\n      return {\n        needsMigration: false,\n        hasDuplicates: false,\n        duplicateCount: 0,\n        constraintExists: true,\n        tableName: fullTableName,\n      };\n    }\n\n    const duplicateInfo = await this.checkForDuplicateSpans();\n    return {\n      needsMigration: true,\n      hasDuplicates: duplicateInfo.hasDuplicates,\n      duplicateCount: duplicateInfo.duplicateCount,\n      constraintExists: false,\n      tableName: fullTableName,\n    };\n  }\n\n  /**\n   * Alters table schema to add columns if they don't exist\n   * @param tableName Name of the table\n   * @param schema Schema of the table\n   * @param ifNotExists Array of column names to add if they don't exist\n   */\n  async alterTable({\n    tableName,\n    schema,\n    ifNotExists,\n  }: {\n    tableName: TABLE_NAMES;\n    schema: Record<string, StorageColumn>;\n    ifNotExists: string[];\n  }): Promise<void> {\n    const fullTableName = getTableName({ indexName: tableName, schemaName: getSchemaName(this.schemaName) });\n    const snapshot = this.schemaSnapshot;\n    // Every ALTER below is `ADD COLUMN IF NOT EXISTS`, so on a converged schema\n    // they are all no-ops the server still has to parse and acknowledge. When a\n    // snapshot is live, only issue the ones that will actually change something.\n    const knownColumns = snapshot ? this.snapshotColumns(snapshot, tableName) : null;\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          if (!knownColumns?.has(parsedColumnName)) {\n            await this.client.none(alterSql);\n            knownColumns?.add(parsedColumnName);\n          }\n\n          if (sqlType === 'TIMESTAMP') {\n            const tzColumnName = `${parsedColumnName}Z`;\n            if (!knownColumns?.has(tzColumnName)) {\n              const timestampZSql =\n                `ALTER TABLE ${fullTableName} ADD COLUMN IF NOT EXISTS \"${tzColumnName}\" TIMESTAMPTZ DEFAULT NOW()`.trim();\n              await this.client.none(timestampZSql);\n              knownColumns?.add(tzColumnName);\n            }\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    } finally {\n      // Invalidate cached columns after DDL completes so concurrent writers see the new schema\n      this.tableColumnsCache.delete(tableName);\n      this.columnTypeCache.delete(tableName);\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.tx(async tx => {\n        for (const record of records) {\n          await this.executeInsert(tx, { tableName, record });\n        }\n      });\n    } catch (error) {\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    } finally {\n      // Clear cached columns so subsequent createTable+insert sees the fresh schema\n      this.tableColumnsCache.delete(tableName);\n      this.columnTypeCache.delete(tableName);\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 snapshot = this.schemaSnapshot;\n      if (snapshot) {\n        if (snapshot.indexes.has(name)) return;\n      } else {\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\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      snapshot?.indexes.add(name);\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  /**\n   * Runs a caller-built `CREATE INDEX IF NOT EXISTS` statement, unless the init\n   * snapshot already proves `indexName` exists.\n   *\n   * `createIndex` covers the indexes described by {@link CreateIndexOptions};\n   * this is for the two init paths that hand-write their statement (a partial\n   * or otherwise non-standard index) and would otherwise send a no-op DDL on\n   * every warm init.\n   */\n  async createIndexFromStatement(indexName: string, sql: string): Promise<void> {\n    const snapshot = this.schemaSnapshot;\n    if (snapshot?.indexes.has(indexName)) return;\n\n    await this.client.none(sql);\n    snapshot?.indexes.add(indexName);\n  }\n\n  async dropIndex(indexName: string): Promise<void> {\n    try {\n      const schemaName = this.schemaName || 'public';\n      const snapshot = this.schemaSnapshot;\n      if (snapshot) {\n        if (!snapshot.indexes.has(indexName)) return;\n      } else {\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\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      snapshot?.indexes.delete(indexName);\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      await this.executeUpdate(this.client, { tableName, keys, data });\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.tx(async tx => {\n        for (const { keys, data } of updates) {\n          await this.executeUpdate(tx, { tableName, keys, data });\n        }\n      });\n    } catch (error) {\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  // ---------------------------------------------------------------------------\n  // Retention helpers (prune)\n  // ---------------------------------------------------------------------------\n\n  /**\n   * Deletes up to `limit` rows from `tableName` whose `column` value is strictly\n   * older than `cutoff`, in a single bounded statement. Returns the number of\n   * rows deleted so the caller's batch loop can decide whether the table is\n   * drained.\n   *\n   * PostgreSQL has no `DELETE ... LIMIT`, so this targets a bounded set of\n   * physical rows via the `ctid` system column (PG's row identity, analogous to\n   * SQLite's `rowid`). `cutoff` is bound as a parameter — a `Date`/ISO-8601\n   * string compared against a `timestamptz` anchor column, or a `number`\n   * compared against a `bigint` epoch-ms anchor column.\n   */\n  async pruneBatch({\n    tableName,\n    column,\n    cutoff,\n    limit,\n  }: {\n    tableName: TABLE_NAMES;\n    column: string;\n    cutoff: Date | string | number;\n    limit: number;\n  }): Promise<number> {\n    assertPositiveLimit(limit);\n    const fullTableName = getTableName({ indexName: tableName, schemaName: getSchemaName(this.schemaName) });\n    const parsedColumn = `\"${parseSqlIdentifier(column, 'column name')}\"`;\n\n    const sql = `\n      DELETE FROM ${fullTableName}\n      WHERE ctid IN (\n        SELECT ctid FROM ${fullTableName}\n        WHERE ${parsedColumn} < $1\n        LIMIT $2\n      )\n    `;\n\n    const result = await this.client.query(sql, [cutoff, limit]);\n    return result.rowCount ?? 0;\n  }\n\n  /**\n   * Deletes up to `limit` aged parent rows *and* their child rows together, in\n   * a single transaction (used by whole-unit pruning such as experiments →\n   * experiment_results). The aged parent IDs are selected first and both\n   * deletes target that exact ID set, so a bound or abort between batches never\n   * leaves a parent hollow (kept, but with its children gone) or children\n   * orphaned.\n   */\n  async pruneUnitsBatch({\n    parentTable,\n    parentKey,\n    parentColumn,\n    childTable,\n    childForeignKey,\n    cutoff,\n    limit,\n  }: {\n    parentTable: TABLE_NAMES;\n    parentKey: string;\n    parentColumn: string;\n    childTable: TABLE_NAMES;\n    childForeignKey: string;\n    cutoff: Date | string | number;\n    limit: number;\n  }): Promise<{ parents: number; children: number }> {\n    assertPositiveLimit(limit);\n    const schemaName = getSchemaName(this.schemaName);\n    const fullChildTable = getTableName({ indexName: childTable, schemaName });\n    const fullParentTable = getTableName({ indexName: parentTable, schemaName });\n    const childFk = `\"${parseSqlIdentifier(childForeignKey, 'column name')}\"`;\n    const parentPk = `\"${parseSqlIdentifier(parentKey, 'column name')}\"`;\n    const parentCol = `\"${parseSqlIdentifier(parentColumn, 'column name')}\"`;\n\n    return this.client.tx(async t => {\n      const rows = await t.manyOrNone<{ id: unknown }>(\n        `SELECT ${parentPk} AS id FROM ${fullParentTable} WHERE ${parentCol} < $1 LIMIT $2 FOR UPDATE SKIP LOCKED`,\n        [cutoff, limit],\n      );\n      const ids = rows.map(r => r.id);\n      if (ids.length === 0) return { parents: 0, children: 0 };\n\n      const childResult = await t.query(`DELETE FROM ${fullChildTable} WHERE ${childFk} = ANY($1)`, [ids]);\n      const parentResult = await t.query(`DELETE FROM ${fullParentTable} WHERE ${parentPk} = ANY($1)`, [ids]);\n      return {\n        parents: parentResult.rowCount ?? 0,\n        children: childResult.rowCount ?? 0,\n      };\n    });\n  }\n\n  /**\n   * Creates a btree index on `column` for `tableName` if it does not already\n   * exist, so age-based prune deletes stay fast. Delegates to {@link createIndex}\n   * (which is a no-op when the index is present).\n   *\n   * The name is lowercased and truncated to Postgres' 63-byte identifier limit\n   * (schema-prefixed names can exceed it), mirroring {@link buildConstraintName}.\n   */\n  async ensureIndex({\n    indexName,\n    tableName,\n    column,\n  }: {\n    indexName: string;\n    tableName: TABLE_NAMES;\n    column: string;\n  }): Promise<void> {\n    const name = buildConstraintName({ baseName: indexName });\n    await this.createIndex({ name, table: tableName, columns: [column] });\n  }\n\n  private async executeUpdate(\n    client: Pick<DbClient, 'none'> | Pick<TxClient, 'none'>,\n    {\n      tableName,\n      keys,\n      data,\n    }: {\n      tableName: TABLE_NAMES;\n      keys: Record<string, any>;\n      data: Record<string, any>;\n    },\n  ): Promise<void> {\n    // Filter out columns that don't exist in the actual database table\n    const filteredData = await this.filterRecordToKnownColumns(tableName, data);\n    if (Object.keys(filteredData).length === 0) return; // Nothing to update after filtering\n\n    const setColumns: string[] = [];\n    const setValues: QueryValues = [];\n    let paramIndex = 1;\n\n    Object.entries(filteredData).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: QueryValues = [];\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 client.none(sql, values);\n  }\n}\n","import type { DatasetTenancyFilters, ExperimentTenancyFilters, 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 * Resilient JSON parser for values read from PostgreSQL jsonb columns.\n *\n * The `pg` driver auto-deserialises jsonb columns, so:\n *   - jsonb object → JS object  (already parsed, just return it)\n *   - jsonb array  → JS array   (already parsed, just return it)\n *   - jsonb scalar string `\"x\"` → bare JS string `\"x\"` (NOT valid JSON to re-parse)\n *   - jsonb null   → JS null\n *\n * Calling `JSON.parse` on a bare scalar like `\"google/gemini-3-flash\"` throws,\n * which combined with fail-fast `.map(parseRow)` in list methods crashes the\n * entire listing endpoint when a single row contains a jsonb scalar. This\n * helper falls back to returning the raw value so callers get the same scalar\n * the driver materialised.\n *\n * See https://github.com/mastra-ai/mastra/issues/16224.\n */\nexport function parseJsonResilient(value: any, _fieldName?: string): any {\n  if (value == null) return undefined;\n  if (typeof value !== 'string') return value;\n\n  try {\n    return JSON.parse(value);\n  } catch {\n    return value;\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\n/**\n * Tenancy scope shape shared by domains that carry `organizationId` / `projectId`\n * columns (datasets, experiments, ...). Aliases the core tenancy filter types so\n * this helper stays in sync if the core shape ever changes.\n */\nexport type TenancyScope = DatasetTenancyFilters | ExperimentTenancyFilters;\n\n/**\n * Build additional `AND \"col\" = $N` conditions for a tenancy read-scope filter.\n * Uses double-quoted PG identifiers and continues numbering from `startIndex`.\n * Returns empty arrays and unchanged `nextIndex` when no filters apply.\n *\n * Shared across domains (datasets, experiments, ...) so tenancy predicates stay\n * consistent and cross-tenant reads/deletes do not leak.\n */\nexport function tenancyWhere(\n  filters: TenancyScope | undefined,\n  startIndex: number,\n): { conditions: string[]; params: any[]; nextIndex: number } {\n  const conditions: string[] = [];\n  const params: any[] = [];\n  let idx = startIndex;\n  if (filters?.organizationId !== undefined) {\n    conditions.push(`\"organizationId\" = $${idx++}`);\n    params.push(filters.organizationId);\n  }\n  if (filters?.projectId !== undefined) {\n    conditions.push(`\"projectId\" = $${idx++}`);\n    params.push(filters.projectId);\n  }\n  return { conditions, params, nextIndex: idx };\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n  AgentsStorage,\n  createStorageErrorId,\n  normalizePerPage,\n  calculatePagination,\n  TABLE_AGENTS,\n  TABLE_AGENT_VERSIONS,\n  TABLE_SCHEMAS,\n  TABLE_FAVORITES,\n} from '@mastra/core/storage';\nimport type {\n  StorageAgentType,\n  StorageCreateAgentInput,\n  StorageUpdateAgentInput,\n  StorageListAgentsInput,\n  StorageListAgentsOutput,\n  CreateIndexOptions,\n  AgentInstructionBlock,\n} from '@mastra/core/storage';\nimport type {\n  AgentVersion,\n  CreateVersionInput,\n  ListVersionsInput,\n  ListVersionsOutput,\n} from '@mastra/core/storage/domains/agents';\nimport { PgDB, resolvePgConfig, generateTableSQL } from '../../db';\nimport type { DbClient, PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName, parseJsonResilient } from '../utils';\n\nexport class AgentsPG extends AgentsStorage {\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  /** Tables managed by this domain */\n  static readonly MANAGED_TABLES = [TABLE_AGENTS, TABLE_AGENT_VERSIONS] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    // Filter indexes to only those for tables managed by this domain\n    this.#indexes = indexes?.filter(idx => (AgentsPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n  }\n\n  /**\n   * Returns all DDL statements for this domain: tables.\n   * Used by exportSchemas to produce a complete, reproducible schema export.\n   */\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n\n    // Tables\n    for (const tableName of AgentsPG.MANAGED_TABLES) {\n      statements.push(\n        generateTableSQL({\n          tableName,\n          schema: TABLE_SCHEMAS[tableName],\n          schemaName,\n          includeAllConstraints: true,\n        }),\n      );\n    }\n\n    return statements;\n  }\n\n  /**\n   * Returns default index definitions for the agents domain tables.\n   * Currently no default indexes are defined for agents.\n   */\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    return [];\n  }\n\n  /**\n   * Creates default indexes for optimal query performance.\n   * Currently no default indexes are defined for agents.\n   */\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) {\n      return;\n    }\n    // No default indexes for agents domain\n  }\n\n  async init(): Promise<void> {\n    // Migrate from legacy schemas before creating tables\n    await this.#migrateFromLegacySchema();\n    await this.#migrateVersionsSchema();\n\n    await this.#db.createTable({ tableName: TABLE_AGENTS, schema: TABLE_SCHEMAS[TABLE_AGENTS] });\n    await this.#db.createTable({ tableName: TABLE_AGENT_VERSIONS, schema: TABLE_SCHEMAS[TABLE_AGENT_VERSIONS] });\n    // Add new columns for backwards compatibility with intermediate schema versions\n    await this.#db.alterTable({\n      tableName: TABLE_AGENTS,\n      schema: TABLE_SCHEMAS[TABLE_AGENTS],\n      ifNotExists: ['status', 'authorId', 'visibility', 'favoriteCount'],\n    });\n    await this.#db.alterTable({\n      tableName: TABLE_AGENT_VERSIONS,\n      schema: TABLE_SCHEMAS[TABLE_AGENT_VERSIONS],\n      ifNotExists: [\n        'mcpClients',\n        'requestContextSchema',\n        'workspace',\n        'skills',\n        'skillsFormat',\n        'durable',\n        'browser',\n        'toolProviders',\n      ],\n    });\n\n    // Migrate tools field from string[] to JSONB format\n    await this.#migrateToolsToJsonbFormat();\n\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n\n    // Clean up any stale draft records from previously failed createAgent calls\n    await this.#cleanupStaleDrafts();\n  }\n\n  /**\n   * Migrates from the legacy flat agent schema (where config fields like name, instructions, model\n   * were stored directly on mastra_agents) to the new versioned schema (thin agent record + versions table).\n   */\n  async #migrateFromLegacySchema(): Promise<void> {\n    const fullTableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n    const fullVersionsTableName = getTableName({\n      indexName: TABLE_AGENT_VERSIONS,\n      schemaName: getSchemaName(this.#schema),\n    });\n    const legacyTableName = getTableName({\n      indexName: `${TABLE_AGENTS}_legacy`,\n      schemaName: getSchemaName(this.#schema),\n    });\n\n    const hasLegacyColumns = await this.#db.hasColumn(TABLE_AGENTS, 'name');\n\n    if (hasLegacyColumns) {\n      // Current table has legacy schema — rename it and drop old versions table.\n      // Raw DDL bypasses the snapshot-maintaining createTable/alterTable paths,\n      // so each statement reports itself to the init snapshot: otherwise the\n      // createTable() calls below would skip rebuilding the tables this just\n      // renamed away or dropped.\n      await this.#db.client.none(`ALTER TABLE ${fullTableName} RENAME TO \"${TABLE_AGENTS}_legacy\"`);\n      this.#db.noteTableRenamed(TABLE_AGENTS, `${TABLE_AGENTS}_legacy`);\n      await this.#db.client.none(`DROP TABLE IF EXISTS ${fullVersionsTableName}`);\n      this.#db.noteTableDropped(TABLE_AGENT_VERSIONS);\n    }\n\n    // Check if legacy table exists (either just renamed, or left behind by a previous partial migration)\n    const legacyExists = await this.#db.hasColumn(`${TABLE_AGENTS}_legacy`, 'name');\n    if (!legacyExists) return;\n\n    // Read all existing agents from the legacy table\n    const oldAgents = await this.#db.client.manyOrNone(`SELECT * FROM ${legacyTableName}`);\n\n    // Create new tables (IF NOT EXISTS handles idempotency on resume)\n    await this.#db.createTable({ tableName: TABLE_AGENTS, schema: TABLE_SCHEMAS[TABLE_AGENTS] });\n    await this.#db.createTable({ tableName: TABLE_AGENT_VERSIONS, schema: TABLE_SCHEMAS[TABLE_AGENT_VERSIONS] });\n\n    // ON CONFLICT DO NOTHING makes inserts safe for resumed partial migrations\n    for (const row of oldAgents) {\n      const agentId = row.id as string;\n      if (!agentId) continue;\n\n      const versionId = crypto.randomUUID();\n      const now = new Date();\n\n      await this.#db.client.none(\n        `INSERT INTO ${fullTableName} (id, status, \"activeVersionId\", \"authorId\", metadata, \"createdAt\", \"updatedAt\")\n         VALUES ($1, $2, $3, $4, $5, $6, $7)\n         ON CONFLICT (id) DO NOTHING`,\n        [\n          agentId,\n          'published',\n          versionId,\n          row.ownerId ?? row.authorId ?? null,\n          row.metadata ? JSON.stringify(row.metadata) : null,\n          row.createdAt ?? now,\n          row.updatedAt ?? now,\n        ],\n      );\n\n      await this.#db.client.none(\n        `INSERT INTO ${fullVersionsTableName}\n         (id, \"agentId\", \"versionNumber\", name, description, instructions, model, tools,\n          \"defaultOptions\", workflows, agents, \"integrationTools\", \"toolProviders\", \"inputProcessors\",\n          \"outputProcessors\", memory, scorers, \"changedFields\", \"changeMessage\", \"createdAt\")\n         VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20)\n         ON CONFLICT (id) DO NOTHING`,\n        [\n          versionId,\n          agentId,\n          1,\n          row.name ?? agentId,\n          row.description ?? null,\n          this.serializeInstructions(row.instructions ?? ''),\n          row.model ? JSON.stringify(row.model) : '{}',\n          row.tools ? JSON.stringify(row.tools) : null,\n          row.defaultOptions ? JSON.stringify(row.defaultOptions) : null,\n          row.workflows ? JSON.stringify(row.workflows) : null,\n          row.agents ? JSON.stringify(row.agents) : null,\n          row.integrationTools ? JSON.stringify(row.integrationTools) : null,\n          row.toolProviders ? JSON.stringify(row.toolProviders) : null,\n          row.inputProcessors ? JSON.stringify(row.inputProcessors) : null,\n          row.outputProcessors ? JSON.stringify(row.outputProcessors) : null,\n          row.memory ? JSON.stringify(row.memory) : null,\n          row.scorers ? JSON.stringify(row.scorers) : null,\n          null,\n          'Migrated from legacy schema',\n          row.createdAt ?? now,\n        ],\n      );\n    }\n\n    // Drop legacy table only after all inserts succeed\n    await this.#db.client.none(`DROP TABLE IF EXISTS ${legacyTableName}`);\n    this.#db.noteTableDropped(`${TABLE_AGENTS}_legacy`);\n  }\n\n  /**\n   * Migrates the agent_versions table from the old snapshot-based schema (single `snapshot` JSON column)\n   * to the new flat schema (individual config columns). This handles the case where the agents table\n   * was already migrated but the versions table still has the old schema.\n   */\n  async #migrateVersionsSchema(): Promise<void> {\n    const hasSnapshotColumn = await this.#db.hasColumn(TABLE_AGENT_VERSIONS, 'snapshot');\n    if (!hasSnapshotColumn) return;\n\n    const fullVersionsTableName = getTableName({\n      indexName: TABLE_AGENT_VERSIONS,\n      schemaName: getSchemaName(this.#schema),\n    });\n    const legacyTableName = getTableName({\n      indexName: `${TABLE_AGENTS}_legacy`,\n      schemaName: getSchemaName(this.#schema),\n    });\n\n    // Drop the old versions table - the new schema will be created by init(),\n    // which only happens if the snapshot reflects the drop.\n    await this.#db.client.none(`DROP TABLE IF EXISTS ${fullVersionsTableName}`);\n    this.#db.noteTableDropped(TABLE_AGENT_VERSIONS);\n\n    // Also clean up any lingering legacy table from a partial migration\n    await this.#db.client.none(`DROP TABLE IF EXISTS ${legacyTableName}`);\n    this.#db.noteTableDropped(`${TABLE_AGENTS}_legacy`);\n  }\n\n  /**\n   * Migrates the tools field from string[] format to JSONB format { \"tool-key\": { \"description\": \"...\" } }.\n   * This handles the transition from the old format where tools were stored as an array of string keys\n   * to the new format where tools can have per-agent description overrides.\n   */\n  async #migrateToolsToJsonbFormat(): Promise<void> {\n    const fullVersionsTableName = getTableName({\n      indexName: TABLE_AGENT_VERSIONS,\n      schemaName: getSchemaName(this.#schema),\n    });\n\n    try {\n      // Check if any records have tools stored as a JSON array\n      const recordsWithArrayTools = await this.#db.client.any(\n        `SELECT id, tools FROM ${fullVersionsTableName} \n         WHERE tools IS NOT NULL \n         AND jsonb_typeof(tools) = 'array'`,\n      );\n\n      if (recordsWithArrayTools.length === 0) {\n        return; // No migration needed\n      }\n\n      // Convert each record's tools from array to object format\n      for (const record of recordsWithArrayTools) {\n        const toolsArray = record.tools as string[];\n        const toolsObject: Record<string, { description?: string }> = {};\n\n        // Convert each tool string to an object key with empty config\n        for (const toolKey of toolsArray) {\n          toolsObject[toolKey] = {};\n        }\n\n        // Update the record with the new format\n        await this.#db.client.none(\n          `UPDATE ${fullVersionsTableName} \n           SET tools = $1::jsonb \n           WHERE id = $2`,\n          [JSON.stringify(toolsObject), record.id],\n        );\n      }\n\n      this.logger?.info?.(\n        `Migrated ${recordsWithArrayTools.length} agent version(s) tools from array to object format`,\n      );\n    } catch (error) {\n      // Log but don't fail - this is a non-breaking migration\n      this.logger?.warn?.('Failed to migrate tools to JSONB format:', error);\n    }\n  }\n\n  /**\n   * Removes stale draft agent records that have no versions at all.\n   * These are left behind when createAgent partially fails (inserts thin record\n   * but fails to create the version due to schema mismatch).\n   *\n   * A legitimate draft (never published) will have rows in the versions table,\n   * so we must only delete records with zero associated versions.\n   */\n  async #cleanupStaleDrafts(): Promise<void> {\n    try {\n      const agentsTable = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n      const versionsTable = getTableName({\n        indexName: TABLE_AGENT_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.client.none(\n        `DELETE FROM ${agentsTable} a\n         WHERE a.status = 'draft'\n           AND a.\"activeVersionId\" IS NULL\n           AND NOT EXISTS (\n             SELECT 1 FROM ${versionsTable} v WHERE v.\"agentId\" = a.id\n           )`,\n      );\n    } catch {\n      // Non-critical cleanup, ignore errors\n    }\n  }\n\n  /**\n   * Creates custom user-defined indexes for this domain's tables.\n   */\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) {\n      return;\n    }\n\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        // Log but continue - indexes are performance optimizations\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_AGENT_VERSIONS });\n    await this.#db.clearTable({ tableName: TABLE_AGENTS });\n  }\n\n  private parseRow(row: any): StorageAgentType {\n    return {\n      id: row.id as string,\n      status: row.status as 'draft' | 'published' | 'archived',\n      activeVersionId: row.activeVersionId as string | undefined,\n      authorId: row.authorId as string | undefined,\n      visibility: (row.visibility as 'private' | 'public' | undefined) ?? undefined,\n      metadata: parseJsonResilient(row.metadata, 'metadata'),\n      favoriteCount: row.favoriteCount === null || row.favoriteCount === undefined ? 0 : Number(row.favoriteCount),\n      createdAt: row.createdAtZ || row.createdAt,\n      updatedAt: row.updatedAtZ || row.updatedAt,\n    };\n  }\n\n  async getById(id: string): Promise<StorageAgentType | null> {\n    return this.#getById(this.#db.readClient, id);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #getById(client: DbClient, id: string): Promise<StorageAgentType | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n\n      const result = await client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_AGENT_BY_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { agentId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async create(input: { agent: StorageCreateAgentInput }): Promise<StorageAgentType> {\n    const { agent } = input;\n    try {\n      const agentsTable = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      // Default visibility to 'private' for owned agents; leave null for unowned/legacy rows\n      const visibility = agent.visibility ?? (agent.authorId ? 'private' : null);\n\n      // 1. Create the thin agent record with status='draft' and activeVersionId=null\n      await this.#db.client.none(\n        `INSERT INTO ${agentsTable} (\n          id, status, \"authorId\", visibility, metadata, \"favoriteCount\",\n          \"activeVersionId\",\n          \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`,\n        [\n          agent.id,\n          'draft',\n          agent.authorId ?? null,\n          visibility,\n          agent.metadata ? JSON.stringify(agent.metadata) : null,\n          0,\n          null, // activeVersionId starts as null\n          nowIso,\n          nowIso,\n          nowIso,\n          nowIso,\n        ],\n      );\n\n      // 2. Extract config fields from the flat input\n      const { id: _id, authorId: _authorId, visibility: _visibility, metadata: _metadata, ...snapshotConfig } = agent;\n\n      // Create version 1 from the config\n      const versionId = crypto.randomUUID();\n      await this.createVersion({\n        id: versionId,\n        agentId: agent.id,\n        versionNumber: 1,\n        ...snapshotConfig,\n        changedFields: Object.keys(snapshotConfig),\n        changeMessage: 'Initial version',\n      });\n\n      // 3. Return the thin agent record (activeVersionId remains null)\n      return {\n        id: agent.id,\n        status: 'draft',\n        activeVersionId: undefined,\n        authorId: agent.authorId,\n        visibility: visibility ?? undefined,\n        metadata: agent.metadata,\n        favoriteCount: 0,\n        createdAt: now,\n        updatedAt: now,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      // Best-effort cleanup to prevent orphaned draft records\n      try {\n        const agentsTable = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n        await this.#db.client.none(\n          `DELETE FROM ${agentsTable} WHERE id = $1 AND status = 'draft' AND \"activeVersionId\" IS NULL`,\n          [agent.id],\n        );\n      } catch {\n        // Ignore cleanup errors\n      }\n\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_AGENT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { agentId: agent.id },\n        },\n        error,\n      );\n    }\n  }\n\n  async update(input: StorageUpdateAgentInput): Promise<StorageAgentType> {\n    const { id, ...updates } = input;\n    try {\n      const tableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n\n      // First, get the existing agent\n      const existingAgent = await this.#getById(this.#db.client, 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 { authorId, activeVersionId, metadata, status, visibility } = updates;\n\n      // Update metadata fields on the agent record\n      const setClauses: string[] = [];\n      const values: any[] = [];\n      let paramIndex = 1;\n\n      if (authorId !== undefined) {\n        setClauses.push(`\"authorId\" = $${paramIndex++}`);\n        values.push(authorId);\n      }\n\n      if (activeVersionId !== undefined) {\n        setClauses.push(`\"activeVersionId\" = $${paramIndex++}`);\n        values.push(activeVersionId);\n        // Do NOT automatically set status='published' when activeVersionId is updated\n      }\n\n      if (status !== undefined) {\n        setClauses.push(`status = $${paramIndex++}`);\n        values.push(status);\n      }\n\n      if (visibility !== undefined) {\n        setClauses.push(`visibility = $${paramIndex++}`);\n        values.push(visibility);\n      }\n\n      if (metadata !== undefined) {\n        // REPLACE metadata (not merge) - this is standard DB behavior\n        setClauses.push(`metadata = $${paramIndex++}`);\n        values.push(JSON.stringify(metadata));\n      }\n\n      // Always update the updatedAt timestamp\n      const now = new Date().toISOString();\n      setClauses.push(`\"updatedAt\" = $${paramIndex++}`);\n      values.push(now);\n      setClauses.push(`\"updatedAtZ\" = $${paramIndex++}`);\n      values.push(now);\n\n      // Add the ID for the WHERE clause\n      values.push(id);\n\n      // Always update the record (at minimum updatedAt/updatedAtZ are set)\n      await this.#db.client.none(`UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`, values);\n\n      // Return the updated agent\n      const updatedAgent = await this.#getById(this.#db.client, id);\n      if (!updatedAgent) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_AGENT', 'NOT_FOUND_AFTER_UPDATE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.SYSTEM,\n          text: `Agent ${id} not found after update`,\n          details: { agentId: id },\n        });\n      }\n\n      return updatedAgent;\n    } catch (error) {\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_AGENT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { agentId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async delete(id: string): Promise<void> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n\n      // Delete all versions for this agent first\n      await this.deleteVersionsByParentId(id);\n\n      // Then delete the agent\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_AGENT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { agentId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async list(args?: StorageListAgentsInput): Promise<StorageListAgentsOutput> {\n    const {\n      page = 0,\n      perPage: perPageInput,\n      orderBy,\n      authorId,\n      metadata,\n      status,\n      visibility,\n      entityIds,\n      pinFavoritedFor,\n      favoritedOnly,\n    } = args || {};\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    if (page < 0) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('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      // Empty entityIds is short-circuit: no rows possible.\n      if (entityIds && entityIds.length === 0) {\n        return {\n          agents: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      const tableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n      const favoritesTable = getTableName({ indexName: TABLE_FAVORITES, schemaName: getSchemaName(this.#schema) });\n\n      // Build WHERE conditions (referenced via alias `a`).\n      const conditions: string[] = [];\n      const queryParams: any[] = [];\n      let paramIdx = 1;\n\n      // JOIN params come first in the query, but we build WHERE first and prepend later.\n      const joinUserId = pinFavoritedFor;\n      const useJoin = Boolean(joinUserId);\n      let joinSqlIdx: number | null = null;\n      if (useJoin) {\n        joinSqlIdx = paramIdx++;\n      }\n\n      if (status) {\n        conditions.push(`a.status = $${paramIdx++}`);\n        queryParams.push(status);\n      }\n\n      if (authorId !== undefined) {\n        conditions.push(`a.\"authorId\" = $${paramIdx++}`);\n        queryParams.push(authorId);\n      }\n\n      if (visibility !== undefined) {\n        conditions.push(`a.visibility = $${paramIdx++}`);\n        queryParams.push(visibility);\n      }\n\n      if (metadata && Object.keys(metadata).length > 0) {\n        conditions.push(`a.metadata @> $${paramIdx++}::jsonb`);\n        queryParams.push(JSON.stringify(metadata));\n      }\n\n      if (entityIds && entityIds.length > 0) {\n        const placeholders = entityIds.map(() => `$${paramIdx++}`).join(', ');\n        conditions.push(`a.id IN (${placeholders})`);\n        queryParams.push(...entityIds);\n      }\n\n      if (useJoin && favoritedOnly) {\n        conditions.push('s.\"userId\" IS NOT NULL');\n      } else if (favoritedOnly) {\n        // Defensive: favoritedOnly with no userId can never match a real row.\n        conditions.push('1=0');\n      }\n\n      const joinClause =\n        useJoin && joinSqlIdx !== null\n          ? `LEFT JOIN ${favoritesTable} s ON s.\"entityType\" = 'agent' AND s.\"entityId\" = a.id AND s.\"userId\" = $${joinSqlIdx}`\n          : '';\n      const joinParams: any[] = useJoin && joinUserId ? [joinUserId] : [];\n\n      const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n      // Total count (mirrors join + where, no ORDER BY / LIMIT).\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} a ${joinClause} ${whereClause}`,\n        [...joinParams, ...queryParams],\n      );\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      // Compose ORDER BY: favorited-first when JOIN active, then existing field, then id ASC tie-break.\n      const orderByParts: string[] = [];\n      if (useJoin) {\n        orderByParts.push(`(s.\"userId\" IS NOT NULL) DESC`);\n      }\n      orderByParts.push(`a.\"${field}\" ${direction}`);\n      orderByParts.push(`a.\"id\" ASC`);\n      const orderByClause = `ORDER BY ${orderByParts.join(', ')}`;\n\n      const limitValue = perPageInput === false ? total : perPage;\n      const limitIdx = paramIdx++;\n      const offsetIdx = paramIdx++;\n      const dataResult = await this.#db.readClient.manyOrNone(\n        `SELECT a.* FROM ${tableName} a ${joinClause} ${whereClause} ${orderByClause} LIMIT $${limitIdx} OFFSET $${offsetIdx}`,\n        [...joinParams, ...queryParams, limitValue, offset],\n      );\n\n      const agents = (dataResult || []).flatMap(row => {\n        try {\n          return [this.parseRow(row)];\n        } catch (err) {\n          this.logger?.warn?.('[PG] Failed to map agent row, skipping', { id: row?.id, error: err });\n          return [];\n        }\n      });\n\n      return {\n        agents,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_AGENTS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  // ==========================================================================\n  // Agent Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateVersionInput): Promise<AgentVersion> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, \"agentId\", \"versionNumber\",\n          name, description, instructions, model, tools,\n          \"defaultOptions\", workflows, agents, \"integrationTools\", \"toolProviders\",\n          \"inputProcessors\", \"outputProcessors\", memory, scorers,\n          \"mcpClients\", \"requestContextSchema\", workspace, skills, \"skillsFormat\",\n          durable, browser,\n          \"changedFields\", \"changeMessage\",\n          \"createdAt\", \"createdAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28)`,\n        [\n          input.id,\n          input.agentId,\n          input.versionNumber,\n          input.name,\n          input.description ?? null,\n          this.serializeInstructions(input.instructions),\n          JSON.stringify(input.model),\n          input.tools ? JSON.stringify(input.tools) : null,\n          input.defaultOptions ? JSON.stringify(input.defaultOptions) : null,\n          input.workflows ? JSON.stringify(input.workflows) : null,\n          input.agents ? JSON.stringify(input.agents) : null,\n          input.integrationTools ? JSON.stringify(input.integrationTools) : null,\n          input.toolProviders ? JSON.stringify(input.toolProviders) : null,\n          input.inputProcessors ? JSON.stringify(input.inputProcessors) : null,\n          input.outputProcessors ? JSON.stringify(input.outputProcessors) : null,\n          input.memory ? JSON.stringify(input.memory) : null,\n          input.scorers ? JSON.stringify(input.scorers) : null,\n          input.mcpClients ? JSON.stringify(input.mcpClients) : null,\n          input.requestContextSchema ? JSON.stringify(input.requestContextSchema) : null,\n          input.workspace ? JSON.stringify(input.workspace) : null,\n          input.skills ? JSON.stringify(input.skills) : null,\n          input.skillsFormat ?? null,\n          input.durable !== undefined ? JSON.stringify(input.durable) : null,\n          input.browser ? JSON.stringify(input.browser) : null,\n          input.changedFields ? JSON.stringify(input.changedFields) : null,\n          input.changeMessage ?? null,\n          nowIso,\n          nowIso,\n        ],\n      );\n\n      return {\n        ...input,\n        createdAt: now,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: input.id, agentId: input.agentId },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersion(id: string): Promise<AgentVersion | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n      const result = await this.#db.readClient.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersions(ids: string[]): Promise<AgentVersion[]> {\n    if (ids.length === 0) {\n      return [];\n    }\n    try {\n      const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n      const placeholders = ids.map((_, i) => `$${i + 1}`).join(', ');\n      const rows = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} WHERE id IN (${placeholders})`,\n        ids,\n      );\n      return rows.map(row => this.parseVersionRow(row));\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { count: ids.length },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersionByNumber(agentId: string, versionNumber: number): Promise<AgentVersion | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n      const result = await this.#db.readClient.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"agentId\" = $1 AND \"versionNumber\" = $2`,\n        [agentId, versionNumber],\n      );\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_VERSION_BY_NUMBER', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { agentId, versionNumber },\n        },\n        error,\n      );\n    }\n  }\n\n  async getLatestVersion(agentId: string): Promise<AgentVersion | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n      const result = await this.#db.readClient.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"agentId\" = $1 ORDER BY \"versionNumber\" DESC LIMIT 1`,\n        [agentId],\n      );\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_LATEST_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { agentId },\n        },\n        error,\n      );\n    }\n  }\n\n  async listVersions(input: ListVersionsInput): Promise<ListVersionsOutput> {\n    const { agentId, page = 0, perPage: perPageInput, orderBy } = input;\n\n    if (page < 0) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_VERSIONS', 'INVALID_PAGE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { page },\n        },\n        new Error('page must be >= 0'),\n      );\n    }\n\n    const perPage = normalizePerPage(perPageInput, 20);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    try {\n      const { field, direction } = this.parseVersionOrderBy(orderBy);\n      const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n\n      // Get total count\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} WHERE \"agentId\" = $1`,\n        [agentId],\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return {\n          versions: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      // Get paginated results\n      const limitValue = perPageInput === false ? total : perPage;\n      const dataResult = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} WHERE \"agentId\" = $1 ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`,\n        [agentId, limitValue, offset],\n      );\n\n      const versions = (dataResult || []).flatMap(row => {\n        try {\n          return [this.parseVersionRow(row)];\n        } catch (err) {\n          this.logger?.warn?.('[PG] Failed to map agent version row, skipping', { id: row?.id, error: err });\n          return [];\n        }\n      });\n\n      return {\n        versions,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { agentId },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"agentId\" = $1`, [entityId]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_VERSIONS_BY_AGENT_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { agentId: entityId },\n        },\n        error,\n      );\n    }\n  }\n\n  async countVersions(agentId: string): Promise<number> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n      const result = await this.#db.readClient.one(`SELECT COUNT(*) as count FROM ${tableName} WHERE \"agentId\" = $1`, [\n        agentId,\n      ]);\n      return parseInt(result.count, 10);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'COUNT_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { agentId },\n        },\n        error,\n      );\n    }\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  private serializeInstructions(instructions: string | AgentInstructionBlock[] | undefined | null): string | undefined {\n    if (instructions == null) return undefined;\n    return Array.isArray(instructions) ? JSON.stringify(instructions) : instructions;\n  }\n\n  private deserializeInstructions(raw: string | null | undefined): string | AgentInstructionBlock[] {\n    if (!raw) return '';\n    try {\n      const parsed = JSON.parse(raw);\n      if (Array.isArray(parsed)) return parsed as AgentInstructionBlock[];\n    } catch {\n      // Not JSON — plain string\n    }\n    return raw;\n  }\n\n  private parseVersionRow(row: any): AgentVersion {\n    return {\n      id: row.id as string,\n      agentId: row.agentId as string,\n      versionNumber: row.versionNumber as number,\n      name: row.name as string,\n      description: row.description as string | undefined,\n      instructions: this.deserializeInstructions(row.instructions as string),\n      model: parseJsonResilient(row.model, 'model'),\n      tools: parseJsonResilient(row.tools, 'tools'),\n      defaultOptions: parseJsonResilient(row.defaultOptions, 'defaultOptions'),\n      workflows: parseJsonResilient(row.workflows, 'workflows'),\n      agents: parseJsonResilient(row.agents, 'agents'),\n      integrationTools: parseJsonResilient(row.integrationTools, 'integrationTools'),\n      toolProviders: parseJsonResilient(row.toolProviders, 'toolProviders'),\n      inputProcessors: parseJsonResilient(row.inputProcessors, 'inputProcessors'),\n      outputProcessors: parseJsonResilient(row.outputProcessors, 'outputProcessors'),\n      memory: parseJsonResilient(row.memory, 'memory'),\n      scorers: parseJsonResilient(row.scorers, 'scorers'),\n      mcpClients: parseJsonResilient(row.mcpClients, 'mcpClients'),\n      requestContextSchema: parseJsonResilient(row.requestContextSchema, 'requestContextSchema'),\n      workspace: parseJsonResilient(row.workspace, 'workspace'),\n      skills: parseJsonResilient(row.skills, 'skills'),\n      skillsFormat: row.skillsFormat as 'xml' | 'json' | 'markdown' | undefined,\n      durable: parseJsonResilient(row.durable, 'durable'),\n      browser: parseJsonResilient(row.browser, 'browser'),\n      changedFields: parseJsonResilient(row.changedFields, 'changedFields'),\n      changeMessage: row.changeMessage as string | undefined,\n      createdAt: row.createdAtZ || row.createdAt,\n    };\n  }\n}\n","import { parseDuration } from '@mastra/core/storage';\nimport type { TABLE_NAMES, PruneOptions, PruneResult, TableRetentionPolicy } from '@mastra/core/storage';\nimport type { PgDB } from './db';\n\nconst DEFAULT_BATCH_SIZE = 1000;\n\n/** One table to prune, resolved from a policy + the domain's descriptor. */\nexport interface PruneTarget {\n  /** Physical table name. */\n  table: TABLE_NAMES;\n  /** Anchor column for the age comparison. */\n  column: string;\n  /**\n   * How the anchor column stores time, which decides how the cutoff is bound:\n   * - `timestamp` (default): a `Date` compared against a `timestamptz` column.\n   * - `epoch-ms`: a raw millisecond number compared against a `bigint` column\n   *   (e.g. `schedules.triggers.actual_fire_at`).\n   */\n  anchorType: 'timestamp' | 'epoch-ms';\n  /** Retention policy (maxAge + optional batchSize). */\n  policy: TableRetentionPolicy;\n}\n\nasync function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n  if (ms <= 0 || signal?.aborted) return;\n  await new Promise<void>(resolve => {\n    const timer = setTimeout(() => {\n      signal?.removeEventListener('abort', onAbort);\n      resolve();\n    }, ms);\n    const onAbort = () => {\n      clearTimeout(timer);\n      resolve();\n    };\n    signal?.addEventListener('abort', onAbort, { once: true });\n  });\n}\n\n/**\n * Convert a policy's `maxAge` into a cutoff bound matching the anchor's storage\n * type: a `Date` for `timestamptz` columns (pg compares timezone-aware), or a\n * raw millisecond number for `bigint` epoch-ms columns.\n */\nexport function cutoffFor(policy: TableRetentionPolicy, anchorType: 'timestamp' | 'epoch-ms', now = Date.now()) {\n  const cutoffMs = now - parseDuration(policy.maxAge);\n  return anchorType === 'epoch-ms' ? cutoffMs : new Date(cutoffMs);\n}\n\n/**\n * Run the bounded/cancellable batched-delete loop for a single logical target,\n * delegating the actual delete of up to `limit` rows to `deleteBatch`. Returns\n * `{ deleted, done }`; `done: false` means the loop stopped on a bound or the\n * abort signal and eligible rows may remain.\n */\nexport async function runBatchedDelete({\n  deleteBatch,\n  batchSize,\n  options,\n}: {\n  deleteBatch: (limit: number) => Promise<number>;\n  batchSize: number;\n  options?: PruneOptions;\n}): Promise<{ deleted: number; done: boolean }> {\n  // A non-positive batch size would make every batch delete 0 rows while never\n  // reaching the drained exit (`affected < limit` is false for 0 < 0) — an\n  // infinite loop. Reject it up front instead of spinning.\n  if (!Number.isSafeInteger(batchSize) || batchSize <= 0) {\n    throw new Error(`retention batchSize must be a positive integer; received ${batchSize}`);\n  }\n\n  let deleted = 0;\n  let batches = 0;\n\n  while (true) {\n    if (options?.signal?.aborted) return { deleted, done: false };\n    if (options?.maxBatches !== undefined && batches >= options.maxBatches) return { deleted, done: false };\n\n    // Never delete past the per-call row cap.\n    let limit = batchSize;\n    if (options?.maxRows !== undefined) {\n      const remaining = options.maxRows - deleted;\n      if (remaining <= 0) return { deleted, done: false };\n      limit = Math.min(limit, remaining);\n    }\n\n    const affected = await deleteBatch(limit);\n    deleted += affected;\n    batches += 1;\n\n    // Fewer rows than asked for => drained of eligible rows.\n    if (affected < limit) return { deleted, done: true };\n\n    if (options?.pauseMs) {\n      await sleep(options.pauseMs, options.signal);\n    }\n  }\n}\n\n/**\n * Runs the bounded, batched, cancellable delete loop for a set of tables in the\n * given order (callers pass children before parents for cascade-safe pruning),\n * and returns one {@link PruneResult} per table.\n *\n * The loop:\n * - deletes in chunks of `batchSize` (default 1000), each its own statement;\n * - stops a table's loop when a batch deletes fewer rows than requested (drained),\n *   or when `maxBatches`/`maxRows` is hit, or the `signal` aborts — the latter\n *   three leave `done: false` so the caller can resume;\n * - pauses `pauseMs` between batches when set, to avoid starving live traffic.\n *\n * `prune()` only deletes rows; it never reclaims disk. PostgreSQL reuses freed\n * space (dead tuples) via autovacuum on subsequent writes, so tables stop\n * growing. Returning disk to the OS (e.g. `VACUUM FULL`) is left to the operator.\n */\nexport async function runPrune({\n  db,\n  domain,\n  targets,\n  options,\n}: {\n  db: PgDB;\n  domain: string;\n  targets: PruneTarget[];\n  options?: PruneOptions;\n}): Promise<PruneResult[]> {\n  const results: PruneResult[] = [];\n  const now = Date.now();\n\n  for (const target of targets) {\n    if (options?.signal?.aborted) {\n      results.push({ domain, table: target.table, deleted: 0, done: false });\n      continue;\n    }\n\n    const cutoff = cutoffFor(target.policy, target.anchorType, now);\n    const batchSize = target.policy.batchSize ?? DEFAULT_BATCH_SIZE;\n\n    const { deleted, done } = await runBatchedDelete({\n      deleteBatch: limit => db.pruneBatch({ tableName: target.table, column: target.column, cutoff, limit }),\n      batchSize,\n      options,\n    });\n\n    results.push({ domain, table: target.table, deleted, done });\n  }\n\n  return results;\n}\n\n/**\n * Resolve a domain's `{ tableKey: policy }` map plus its descriptor into an\n * ordered list of {@link PruneTarget}s. `order` lists table keys children-first\n * so cascade-dependent rows are removed before their parents. Table keys not in\n * `policies` are skipped (unset = keep forever).\n */\nexport function resolveTargets({\n  policies,\n  descriptor,\n  order,\n}: {\n  policies: Record<string, TableRetentionPolicy>;\n  descriptor: Record<string, { table: string; column: string; anchorType?: 'timestamp' | 'epoch-ms' }>;\n  order: string[];\n}): PruneTarget[] {\n  const targets: PruneTarget[] = [];\n  for (const key of order) {\n    const policy = policies[key];\n    const entry = descriptor[key];\n    if (!policy || !entry) continue;\n    targets.push({\n      table: entry.table as TABLE_NAMES,\n      column: entry.column,\n      anchorType: entry.anchorType ?? 'timestamp',\n      policy,\n    });\n  }\n  return targets;\n}\n","import type {\n  BackgroundTask,\n  BackgroundTaskStatus,\n  TaskFilter,\n  TaskListResult,\n  UpdateBackgroundTask,\n} from '@mastra/core/background-tasks';\nimport type {\n  CreateIndexOptions,\n  TABLE_NAMES,\n  PruneOptions,\n  PruneResult,\n  RetentionTablesDescriptor,\n  TableRetentionPolicy,\n} from '@mastra/core/storage';\nimport { BackgroundTasksStorage, TABLE_BACKGROUND_TASKS, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { runPrune, resolveTargets } from '../../retention';\n\nfunction getSchemaName(schema?: string) {\n  return schema ? `\"${schema}\"` : '\"public\"';\n}\n\nfunction getTableName(schemaName?: string) {\n  const quoted = `\"${TABLE_BACKGROUND_TASKS}\"`;\n  return schemaName ? `${schemaName}.${quoted}` : quoted;\n}\n\nfunction serializeJson(v: unknown): any {\n  if (typeof v === 'object' && v != null) return JSON.stringify(v);\n  return v ?? null;\n}\n\nfunction parseJson(v: unknown): any {\n  if (typeof v === 'string') {\n    try {\n      return JSON.parse(v);\n    } catch {\n      return v;\n    }\n  }\n  return v ?? undefined;\n}\n\n/** Convert a DB row (snake_case) to a BackgroundTask object (camelCase). */\nfunction rowToTask(row: Record<string, any>): BackgroundTask {\n  const createdAt = row.createdAtZ || row.createdAt;\n  const startedAt = row.startedAtZ || row.startedAt;\n  const suspendedAt = row.suspendedAtZ || row.suspendedAt;\n  const completedAt = row.completedAtZ || row.completedAt;\n  return {\n    id: row.id,\n    status: row.status as BackgroundTaskStatus,\n    toolName: row.tool_name,\n    toolCallId: row.tool_call_id,\n    args: parseJson(row.args),\n    agentId: row.agent_id,\n    threadId: row.thread_id ?? undefined,\n    resourceId: row.resource_id ?? undefined,\n    runId: row.run_id,\n    result: parseJson(row.result),\n    error: parseJson(row.error),\n    suspendPayload: parseJson(row.suspend_payload),\n    retryCount: Number(row.retry_count),\n    maxRetries: Number(row.max_retries),\n    timeoutMs: Number(row.timeout_ms),\n    createdAt: createdAt instanceof Date ? createdAt : new Date(createdAt),\n    startedAt: startedAt ? (startedAt instanceof Date ? startedAt : new Date(startedAt)) : undefined,\n    suspendedAt: suspendedAt ? (suspendedAt instanceof Date ? suspendedAt : new Date(suspendedAt)) : undefined,\n    completedAt: completedAt ? (completedAt instanceof Date ? completedAt : new Date(completedAt)) : undefined,\n  };\n}\n\nexport class BackgroundTasksPG extends BackgroundTasksStorage {\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  static readonly MANAGED_TABLES = [TABLE_BACKGROUND_TASKS] as const;\n\n  /**\n   * Completed background tasks accumulate as dead weight. Anchored on the\n   * timezone-aware `completedAtZ` mirror column: NULL (in-flight) rows are\n   * excluded automatically since `completedAtZ < cutoff` is false for NULL.\n   */\n  static override readonly retentionTables: RetentionTablesDescriptor = {\n    backgroundTasks: { table: TABLE_BACKGROUND_TASKS, column: 'completedAtZ', indexed: true },\n  };\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    this.#indexes = indexes?.filter(idx => (BackgroundTasksPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({\n      tableName: TABLE_BACKGROUND_TASKS,\n      schema: TABLE_SCHEMAS[TABLE_BACKGROUND_TASKS],\n    });\n    // Backfill columns added after the initial schema shipped.\n    await this.#db.alterTable({\n      tableName: TABLE_BACKGROUND_TASKS,\n      schema: TABLE_SCHEMAS[TABLE_BACKGROUND_TASKS],\n      ifNotExists: ['suspend_payload', 'suspendedAt'],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  /**\n   * Lazily ensures a btree index exists on each configured policy's retention\n   * anchor column so age-based `prune()` deletes stay fast on large tables.\n   * Called from the prune path (not init) so only deployments that configure\n   * retention pay the index's write/disk overhead. Best-effort: failures are\n   * logged and pruning proceeds (correct, just slower).\n   * Created even with `skipDefaultIndexes` — retention is an explicit opt-in,\n   * so its supporting index is not part of the default index set.\n   */\n  private async ensureRetentionIndexes(policies: Record<string, TableRetentionPolicy>): Promise<void> {\n    const prefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    for (const [key, entry] of Object.entries(BackgroundTasksPG.retentionTables)) {\n      if (!entry.indexed || !policies[key]) continue;\n      try {\n        await this.#db.ensureIndex({\n          indexName: `${prefix}mastra_${key}_retention_idx`,\n          tableName: entry.table as TABLE_NAMES,\n          column: entry.column,\n        });\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create retention index for ${entry.table}:`, error);\n      }\n    }\n  }\n\n  /** Delete completed tasks older than the `backgroundTasks` policy's `maxAge`, batched. */\n  async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n    await this.ensureRetentionIndexes(policies);\n    const targets = resolveTargets({\n      policies,\n      descriptor: BackgroundTasksPG.retentionTables,\n      order: ['backgroundTasks'],\n    });\n    return runPrune({ db: this.#db, domain: 'backgroundTasks', targets, options });\n  }\n\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}mastra_bg_tasks_status_created_at_idx`,\n        table: TABLE_BACKGROUND_TASKS,\n        columns: ['status', 'createdAt'],\n      },\n      {\n        name: `${schemaPrefix}mastra_bg_tasks_agent_status_idx`,\n        table: TABLE_BACKGROUND_TASKS,\n        columns: ['agent_id', 'status'],\n      },\n      {\n        name: `${schemaPrefix}mastra_bg_tasks_thread_idx`,\n        table: TABLE_BACKGROUND_TASKS,\n        columns: ['thread_id', 'createdAt'],\n      },\n      {\n        name: `${schemaPrefix}mastra_bg_tasks_tool_call_idx`,\n        table: TABLE_BACKGROUND_TASKS,\n        columns: ['tool_call_id'],\n      },\n    ];\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n    statements.push(\n      generateTableSQL({\n        tableName: TABLE_BACKGROUND_TASKS,\n        schema: TABLE_SCHEMAS[TABLE_BACKGROUND_TASKS],\n        schemaName,\n        includeAllConstraints: true,\n      }),\n    );\n\n    for (const idx of BackgroundTasksPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    return statements;\n  }\n\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return BackgroundTasksPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) return;\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) return;\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_BACKGROUND_TASKS });\n  }\n\n  async createTask(task: BackgroundTask): Promise<void> {\n    await this.#db.insert({\n      tableName: TABLE_BACKGROUND_TASKS,\n      record: {\n        id: task.id,\n        tool_call_id: task.toolCallId,\n        tool_name: task.toolName,\n        agent_id: task.agentId,\n        thread_id: task.threadId ?? null,\n        resource_id: task.resourceId ?? null,\n        run_id: task.runId,\n        status: task.status,\n        args: serializeJson(task.args),\n        result: serializeJson(task.result),\n        error: serializeJson(task.error),\n        suspend_payload: serializeJson(task.suspendPayload),\n        retry_count: task.retryCount,\n        max_retries: task.maxRetries,\n        timeout_ms: task.timeoutMs,\n        createdAt: task.createdAt.toISOString(),\n        createdAtZ: task.createdAt.toISOString(),\n        startedAt: task.startedAt?.toISOString() ?? null,\n        startedAtZ: task.startedAt?.toISOString() ?? null,\n        suspendedAt: task.suspendedAt?.toISOString() ?? null,\n        suspendedAtZ: task.suspendedAt?.toISOString() ?? null,\n        completedAt: task.completedAt?.toISOString() ?? null,\n        completedAtZ: task.completedAt?.toISOString() ?? null,\n      },\n    });\n  }\n\n  async updateTask(\n    taskId: string,\n    update: UpdateBackgroundTask,\n    options?: { expectedStatus?: BackgroundTask['status'] },\n  ): Promise<boolean> {\n    const setClauses: string[] = [];\n    const params: any[] = [];\n    let paramIdx = 1;\n\n    if ('status' in update) {\n      setClauses.push(`\"status\" = $${paramIdx++}`);\n      params.push(update.status);\n    }\n    if ('result' in update) {\n      setClauses.push(`\"result\" = $${paramIdx++}`);\n      params.push(serializeJson(update.result));\n    }\n    if ('error' in update) {\n      setClauses.push(`\"error\" = $${paramIdx++}`);\n      params.push(serializeJson(update.error));\n    }\n    if ('suspendPayload' in update) {\n      setClauses.push(`\"suspend_payload\" = $${paramIdx++}`);\n      params.push(serializeJson(update.suspendPayload));\n    }\n    if ('retryCount' in update) {\n      setClauses.push(`\"retry_count\" = $${paramIdx++}`);\n      params.push(update.retryCount);\n    }\n    if ('startedAt' in update) {\n      setClauses.push(`\"startedAt\" = $${paramIdx++}`);\n      setClauses.push(`\"startedAtZ\" = $${paramIdx++}`);\n      const val = update.startedAt?.toISOString() ?? null;\n      params.push(val, val);\n    }\n    if ('suspendedAt' in update) {\n      setClauses.push(`\"suspendedAt\" = $${paramIdx++}`);\n      setClauses.push(`\"suspendedAtZ\" = $${paramIdx++}`);\n      const val = update.suspendedAt?.toISOString() ?? null;\n      params.push(val, val);\n    }\n    if ('completedAt' in update) {\n      setClauses.push(`\"completedAt\" = $${paramIdx++}`);\n      setClauses.push(`\"completedAtZ\" = $${paramIdx++}`);\n      const val = update.completedAt?.toISOString() ?? null;\n      params.push(val, val);\n    }\n\n    if (setClauses.length === 0) return false;\n\n    const table = getTableName(getSchemaName(this.#schema));\n    params.push(taskId);\n    let where = `\"id\" = $${paramIdx++}`;\n    if (options?.expectedStatus) {\n      where += ` AND \"status\" = $${paramIdx}`;\n      params.push(options.expectedStatus);\n    }\n    const result = await this.#db.client.query(`UPDATE ${table} SET ${setClauses.join(', ')} WHERE ${where}`, params);\n    return (result.rowCount ?? 0) > 0;\n  }\n\n  async getTask(taskId: string): Promise<BackgroundTask | null> {\n    const table = getTableName(getSchemaName(this.#schema));\n    const row = await this.#db.client.oneOrNone(`SELECT * FROM ${table} WHERE \"id\" = $1`, [taskId]);\n    return row ? rowToTask(row) : null;\n  }\n\n  async listTasks(filter: TaskFilter): Promise<TaskListResult> {\n    const table = getTableName(getSchemaName(this.#schema));\n    const conditions: string[] = [];\n    const params: any[] = [];\n    let paramIdx = 1;\n\n    if (filter.status) {\n      const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n      const placeholders = statuses.map(() => `$${paramIdx++}`);\n      conditions.push(`\"status\" IN (${placeholders.join(', ')})`);\n      params.push(...statuses);\n    }\n    if (filter.agentId) {\n      conditions.push(`\"agent_id\" = $${paramIdx++}`);\n      params.push(filter.agentId);\n    }\n    if (filter.threadId) {\n      conditions.push(`\"thread_id\" = $${paramIdx++}`);\n      params.push(filter.threadId);\n    }\n    if (filter.resourceId) {\n      conditions.push(`\"resource_id\" = $${paramIdx++}`);\n      params.push(filter.resourceId);\n    }\n    if (filter.runId) {\n      conditions.push(`\"run_id\" = $${paramIdx++}`);\n      params.push(filter.runId);\n    }\n    if (filter.toolName) {\n      conditions.push(`\"tool_name\" = $${paramIdx++}`);\n      params.push(filter.toolName);\n    }\n    if (filter.toolCallId) {\n      conditions.push(`\"tool_call_id\" = $${paramIdx++}`);\n      params.push(filter.toolCallId);\n    }\n    // Date range filtering\n    const dateCol =\n      filter.dateFilterBy === 'startedAt'\n        ? '\"startedAt\"'\n        : filter.dateFilterBy === 'suspendedAt'\n          ? '\"suspendedAt\"'\n          : filter.dateFilterBy === 'completedAt'\n            ? '\"completedAt\"'\n            : '\"createdAt\"';\n    if (filter.fromDate) {\n      conditions.push(`${dateCol} >= $${paramIdx++}`);\n      params.push(filter.fromDate.toISOString());\n    }\n    if (filter.toDate) {\n      conditions.push(`${dateCol} < $${paramIdx++}`);\n      params.push(filter.toDate.toISOString());\n    }\n\n    const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n    // Count total matching rows (before pagination)\n    const countResult = await this.#db.readClient.oneOrNone<{ count: string }>(\n      `SELECT COUNT(*) as count FROM ${table} ${where}`,\n      params.slice(0, paramIdx - 1),\n    );\n    const total = Number(countResult?.count ?? 0);\n\n    const orderCol =\n      filter.orderBy === 'startedAt'\n        ? '\"startedAt\"'\n        : filter.orderBy === 'suspendedAt'\n          ? '\"suspendedAt\"'\n          : filter.orderBy === 'completedAt'\n            ? '\"completedAt\"'\n            : '\"createdAt\"';\n    const direction = filter.orderDirection === 'desc' ? 'DESC' : 'ASC';\n\n    let sql = `SELECT * FROM ${table} ${where} ORDER BY ${orderCol} ${direction}`;\n\n    if (filter.perPage != null) {\n      sql += ` LIMIT $${paramIdx++}`;\n      params.push(filter.perPage);\n      if (filter.page != null) {\n        sql += ` OFFSET $${paramIdx++}`;\n        params.push(filter.page * filter.perPage);\n      }\n    }\n\n    const rows = await this.#db.readClient.manyOrNone(sql, params);\n    return { tasks: rows.map(rowToTask), total };\n  }\n\n  async deleteTask(taskId: string): Promise<void> {\n    const table = getTableName(getSchemaName(this.#schema));\n    await this.#db.client.none(`DELETE FROM ${table} WHERE \"id\" = $1`, [taskId]);\n  }\n\n  async deleteTasks(filter: TaskFilter): Promise<void> {\n    const table = getTableName(getSchemaName(this.#schema));\n    const conditions: string[] = [];\n    const params: any[] = [];\n    let paramIdx = 1;\n\n    if (filter.status) {\n      const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n      const placeholders = statuses.map(() => `$${paramIdx++}`);\n      conditions.push(`\"status\" IN (${placeholders.join(', ')})`);\n      params.push(...statuses);\n    }\n    // Date range filtering\n    const dateCol =\n      filter.dateFilterBy === 'startedAt'\n        ? '\"startedAt\"'\n        : filter.dateFilterBy === 'suspendedAt'\n          ? '\"suspendedAt\"'\n          : filter.dateFilterBy === 'completedAt'\n            ? '\"completedAt\"'\n            : '\"createdAt\"';\n    if (filter.fromDate) {\n      conditions.push(`${dateCol} >= $${paramIdx++}`);\n      params.push(filter.fromDate.toISOString());\n    }\n    if (filter.toDate) {\n      conditions.push(`${dateCol} < $${paramIdx++}`);\n      params.push(filter.toDate.toISOString());\n    }\n    if (filter.agentId) {\n      conditions.push(`\"agent_id\" = $${paramIdx++}`);\n      params.push(filter.agentId);\n    }\n\n    if (conditions.length === 0) return; // Safety: don't delete everything\n\n    await this.#db.client.none(`DELETE FROM ${table} WHERE ${conditions.join(' AND ')}`, params);\n  }\n\n  async getRunningCount(): Promise<number> {\n    const table = getTableName(getSchemaName(this.#schema));\n    const result = await this.#db.readClient.oneOrNone<{ count: string }>(\n      `SELECT COUNT(*) FROM ${table} WHERE \"status\" = 'running'`,\n    );\n    return Number(result?.count ?? 0);\n  }\n\n  async getRunningCountByAgent(agentId: string): Promise<number> {\n    const table = getTableName(getSchemaName(this.#schema));\n    const result = await this.#db.readClient.oneOrNone<{ count: string }>(\n      `SELECT COUNT(*) FROM ${table} WHERE \"status\" = 'running' AND \"agent_id\" = $1`,\n      [agentId],\n    );\n    return Number(result?.count ?? 0);\n  }\n}\n","import { BlobStore, TABLE_SKILL_BLOBS, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type { StorageBlobEntry } from '@mastra/core/storage';\n\nimport { PgDB, resolvePgConfig, generateTableSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName } from '../utils';\n\nexport class BlobsPG extends BlobStore {\n  #db: PgDB;\n  #schema: string;\n\n  static readonly MANAGED_TABLES = [TABLE_SKILL_BLOBS] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    return [\n      generateTableSQL({\n        tableName: TABLE_SKILL_BLOBS,\n        schema: TABLE_SCHEMAS[TABLE_SKILL_BLOBS],\n        schemaName,\n        includeAllConstraints: true,\n      }),\n    ];\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({\n      tableName: TABLE_SKILL_BLOBS,\n      schema: TABLE_SCHEMAS[TABLE_SKILL_BLOBS],\n    });\n  }\n\n  async put(entry: StorageBlobEntry): Promise<void> {\n    const tableName = getTableName({ indexName: TABLE_SKILL_BLOBS, schemaName: getSchemaName(this.#schema) });\n    const now = entry.createdAt ?? new Date();\n    const nowIso = now.toISOString();\n    await this.#db.client.none(\n      `INSERT INTO ${tableName} (\"hash\", \"content\", \"size\", \"mimeType\", \"createdAt\", \"createdAtZ\")\n       VALUES ($1, $2, $3, $4, $5, $6)\n       ON CONFLICT (\"hash\") DO NOTHING`,\n      [entry.hash, entry.content, entry.size, entry.mimeType ?? null, nowIso, nowIso],\n    );\n  }\n\n  async get(hash: string): Promise<StorageBlobEntry | null> {\n    const tableName = getTableName({ indexName: TABLE_SKILL_BLOBS, schemaName: getSchemaName(this.#schema) });\n    const row = await this.#db.readClient.oneOrNone(`SELECT * FROM ${tableName} WHERE \"hash\" = $1`, [hash]);\n    if (!row) return null;\n    return this.#parseRow(row);\n  }\n\n  async has(hash: string): Promise<boolean> {\n    const tableName = getTableName({ indexName: TABLE_SKILL_BLOBS, schemaName: getSchemaName(this.#schema) });\n    const row = await this.#db.readClient.oneOrNone(`SELECT 1 FROM ${tableName} WHERE \"hash\" = $1 LIMIT 1`, [hash]);\n    return row !== null;\n  }\n\n  async delete(hash: string): Promise<boolean> {\n    const tableName = getTableName({ indexName: TABLE_SKILL_BLOBS, schemaName: getSchemaName(this.#schema) });\n    const result = await this.#db.client.query(`DELETE FROM ${tableName} WHERE \"hash\" = $1`, [hash]);\n    return (result.rowCount ?? 0) > 0;\n  }\n\n  async putMany(entries: StorageBlobEntry[]): Promise<void> {\n    if (entries.length === 0) return;\n    for (const entry of entries) {\n      await this.put(entry);\n    }\n  }\n\n  async getMany(hashes: string[]): Promise<Map<string, StorageBlobEntry>> {\n    const result = new Map<string, StorageBlobEntry>();\n    if (hashes.length === 0) return result;\n\n    const tableName = getTableName({ indexName: TABLE_SKILL_BLOBS, schemaName: getSchemaName(this.#schema) });\n    const placeholders = hashes.map((_, i) => `$${i + 1}`).join(', ');\n    const rows = await this.#db.readClient.manyOrNone(\n      `SELECT * FROM ${tableName} WHERE \"hash\" IN (${placeholders})`,\n      hashes,\n    );\n    for (const row of rows) {\n      const entry = this.#parseRow(row);\n      result.set(entry.hash, entry);\n    }\n    return result;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_SKILL_BLOBS });\n  }\n\n  #parseRow(row: Record<string, unknown>): StorageBlobEntry {\n    return {\n      hash: row.hash as string,\n      content: row.content as string,\n      size: Number(row.size),\n      mimeType: (row.mimeType as string) || undefined,\n      createdAt: new Date((row.createdAtZ as string) || (row.createdAt as string)),\n    };\n  }\n}\n","import {\n  ChannelsStorage,\n  TABLE_CHANNEL_INSTALLATIONS,\n  TABLE_CHANNEL_CONFIG,\n  TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type { CreateIndexOptions, ChannelInstallation, ChannelConfig } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName } from '../utils';\n\nexport class ChannelsPG extends ChannelsStorage {\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  static readonly MANAGED_TABLES = [TABLE_CHANNEL_INSTALLATIONS, TABLE_CHANNEL_CONFIG] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    this.#indexes = indexes?.filter(idx => (ChannelsPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({\n      tableName: TABLE_CHANNEL_INSTALLATIONS,\n      schema: TABLE_SCHEMAS[TABLE_CHANNEL_INSTALLATIONS],\n    });\n    await this.#db.createTable({\n      tableName: TABLE_CHANNEL_CONFIG,\n      schema: TABLE_SCHEMAS[TABLE_CHANNEL_CONFIG],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}idx_channel_installations_webhook`,\n        table: TABLE_CHANNEL_INSTALLATIONS,\n        columns: ['webhookId'],\n        unique: true,\n      },\n      {\n        name: `${schemaPrefix}idx_channel_installations_platform_agent`,\n        table: TABLE_CHANNEL_INSTALLATIONS,\n        columns: ['platform', 'agentId'],\n      },\n    ];\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n    for (const tableName of ChannelsPG.MANAGED_TABLES) {\n      statements.push(\n        generateTableSQL({\n          tableName,\n          schema: TABLE_SCHEMAS[tableName],\n          schemaName,\n          includeAllConstraints: true,\n        }),\n      );\n    }\n\n    for (const idx of ChannelsPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    return statements;\n  }\n\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return ChannelsPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) return;\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) return;\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_CHANNEL_INSTALLATIONS });\n    await this.#db.clearTable({ tableName: TABLE_CHANNEL_CONFIG });\n  }\n\n  async saveInstallation(installation: ChannelInstallation): Promise<void> {\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_CHANNEL_INSTALLATIONS, schemaName });\n    const now = new Date().toISOString();\n    const createdAt = installation.createdAt?.toISOString() ?? now;\n\n    await this.#db.client.none(\n      `INSERT INTO ${tableName} (\"id\", \"platform\", \"agentId\", \"status\", \"webhookId\", \"data\", \"configHash\", \"error\", \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\")\n       VALUES ($1, $2, $3, $4, $5, $6::jsonb, $7, $8, $9, $10, $11, $12)\n       ON CONFLICT (\"id\") DO UPDATE SET\n         \"platform\" = EXCLUDED.\"platform\",\n         \"agentId\" = EXCLUDED.\"agentId\",\n         \"status\" = EXCLUDED.\"status\",\n         \"webhookId\" = EXCLUDED.\"webhookId\",\n         \"data\" = EXCLUDED.\"data\",\n         \"configHash\" = EXCLUDED.\"configHash\",\n         \"error\" = EXCLUDED.\"error\",\n         \"updatedAt\" = EXCLUDED.\"updatedAt\",\n         \"updatedAtZ\" = EXCLUDED.\"updatedAtZ\"`,\n      [\n        installation.id,\n        installation.platform,\n        installation.agentId,\n        installation.status,\n        installation.webhookId ?? null,\n        JSON.stringify(installation.data),\n        installation.configHash ?? null,\n        installation.error ?? null,\n        createdAt,\n        createdAt,\n        now,\n        now,\n      ],\n    );\n  }\n\n  async getInstallation(id: string): Promise<ChannelInstallation | null> {\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_CHANNEL_INSTALLATIONS, schemaName });\n    const row = await this.#db.readClient.oneOrNone(`SELECT * FROM ${tableName} WHERE \"id\" = $1`, [id]);\n    return row ? this.#parseInstallationRow(row) : null;\n  }\n\n  async getInstallationByAgent(platform: string, agentId: string): Promise<ChannelInstallation | null> {\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_CHANNEL_INSTALLATIONS, schemaName });\n    const row = await this.#db.readClient.oneOrNone(\n      `SELECT * FROM ${tableName} WHERE \"platform\" = $1 AND \"agentId\" = $2 ORDER BY CASE \"status\" WHEN 'active' THEN 0 WHEN 'pending' THEN 1 ELSE 2 END, \"updatedAt\" DESC LIMIT 1`,\n      [platform, agentId],\n    );\n    return row ? this.#parseInstallationRow(row) : null;\n  }\n\n  async getInstallationByWebhookId(webhookId: string): Promise<ChannelInstallation | null> {\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_CHANNEL_INSTALLATIONS, schemaName });\n    const row = await this.#db.readClient.oneOrNone(`SELECT * FROM ${tableName} WHERE \"webhookId\" = $1`, [webhookId]);\n    return row ? this.#parseInstallationRow(row) : null;\n  }\n\n  async listInstallations(platform: string): Promise<ChannelInstallation[]> {\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_CHANNEL_INSTALLATIONS, schemaName });\n    const rows = await this.#db.readClient.manyOrNone(\n      `SELECT * FROM ${tableName} WHERE \"platform\" = $1 ORDER BY \"createdAt\" DESC`,\n      [platform],\n    );\n    return rows.map(row => this.#parseInstallationRow(row));\n  }\n\n  async deleteInstallation(id: string): Promise<void> {\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_CHANNEL_INSTALLATIONS, schemaName });\n    await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"id\" = $1`, [id]);\n  }\n\n  async saveConfig(config: ChannelConfig): Promise<void> {\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_CHANNEL_CONFIG, schemaName });\n    const now = config.updatedAt.toISOString();\n\n    await this.#db.client.none(\n      `INSERT INTO ${tableName} (\"platform\", \"data\", \"updatedAt\", \"updatedAtZ\")\n       VALUES ($1, $2::jsonb, $3, $4)\n       ON CONFLICT (\"platform\") DO UPDATE SET\n         \"data\" = EXCLUDED.\"data\",\n         \"updatedAt\" = EXCLUDED.\"updatedAt\",\n         \"updatedAtZ\" = EXCLUDED.\"updatedAtZ\"`,\n      [config.platform, JSON.stringify(config.data), now, now],\n    );\n  }\n\n  async getConfig(platform: string): Promise<ChannelConfig | null> {\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_CHANNEL_CONFIG, schemaName });\n    const row = await this.#db.readClient.oneOrNone(`SELECT * FROM ${tableName} WHERE \"platform\" = $1`, [platform]);\n    if (!row) return null;\n    return {\n      platform: row.platform as string,\n      data: typeof row.data === 'string' ? JSON.parse(row.data) : (row.data as Record<string, unknown>),\n      updatedAt: new Date((row.updatedAtZ as string) || (row.updatedAt as string)),\n    };\n  }\n\n  async deleteConfig(platform: string): Promise<void> {\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_CHANNEL_CONFIG, schemaName });\n    await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"platform\" = $1`, [platform]);\n  }\n\n  #parseInstallationRow(row: Record<string, unknown>): ChannelInstallation {\n    return {\n      id: row.id as string,\n      platform: row.platform as string,\n      agentId: row.agentId as string,\n      status: row.status as 'pending' | 'active' | 'error',\n      webhookId: (row.webhookId as string) || undefined,\n      data: typeof row.data === 'string' ? JSON.parse(row.data) : (row.data as Record<string, unknown>),\n      configHash: (row.configHash as string) || undefined,\n      error: (row.error as string) || undefined,\n      createdAt: new Date((row.createdAtZ as string) || (row.createdAt as string)),\n      updatedAt: new Date((row.updatedAtZ as string) || (row.updatedAt as string)),\n    };\n  }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n  createStorageErrorId,\n  TABLE_DATASETS,\n  TABLE_DATASET_ITEMS,\n  TABLE_DATASET_VERSIONS,\n  TABLE_EXPERIMENTS,\n  TABLE_EXPERIMENT_RESULTS,\n  TABLE_CONFIGS,\n  TABLE_SCHEMAS,\n  DATASETS_SCHEMA,\n  DATASET_ITEMS_SCHEMA,\n  DATASET_VERSIONS_SCHEMA,\n  DatasetsStorage,\n  calculatePagination,\n  normalizePerPage,\n  safelyParseJSON,\n  ensureDate,\n  hasErrorCode,\n} from '@mastra/core/storage';\nimport type {\n  DatasetRecord,\n  DatasetItem,\n  DatasetItemRow,\n  DatasetVersion,\n  CreateDatasetInput,\n  UpdateDatasetInput,\n  AddDatasetItemInput,\n  UpdateDatasetItemInput,\n  DeleteDatasetItemInput,\n  PurgeDatasetItemInput,\n  ListDatasetsInput,\n  ListDatasetsOutput,\n  ListDatasetItemsInput,\n  ListDatasetItemsOutput,\n  ListDatasetVersionsInput,\n  ListDatasetVersionsOutput,\n  BatchInsertItemsInput,\n  BatchDeleteItemsInput,\n  CreateIndexOptions,\n  TargetType,\n  DatasetTenancyFilters,\n} from '@mastra/core/storage';\nimport type { TxClient } from '../../client';\nimport { PgDB, resolvePgConfig, generateTableSQL } from '../../db';\nimport type { DbClient, PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName, tenancyWhere } from '../utils';\n\n/** Serialize a value for a jsonb column. Returns null for null/undefined. */\nfunction jsonbArg(value: unknown): string | null {\n  return value === undefined || value === null ? null : JSON.stringify(value);\n}\n\nfunction parseStoredJSON<T>(value: unknown): T {\n  if (typeof value === 'string') {\n    try {\n      return JSON.parse(value) as T;\n    } catch {\n      return value as T;\n    }\n  }\n  return value as T;\n}\n\nfunction parseOptionalJSON<T>(value: unknown, emptyValue: null | undefined): T | null | undefined {\n  return value === null || value === undefined ? emptyValue : parseStoredJSON<T>(value);\n}\n\nexport class DatasetsPG extends DatasetsStorage {\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  static readonly MANAGED_TABLES = [TABLE_DATASETS, TABLE_DATASET_ITEMS, TABLE_DATASET_VERSIONS] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    this.#indexes = indexes?.filter(idx => (DatasetsPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    for (const tableName of DatasetsPG.MANAGED_TABLES) {\n      statements.push(\n        generateTableSQL({\n          tableName,\n          schema: TABLE_SCHEMAS[tableName],\n          schemaName,\n          compositePrimaryKey: TABLE_CONFIGS[tableName]?.compositePrimaryKey,\n          includeAllConstraints: true,\n        }),\n      );\n    }\n    return statements;\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({ tableName: TABLE_DATASETS, schema: DATASETS_SCHEMA });\n    await this.#db.createTable({\n      tableName: TABLE_DATASET_ITEMS,\n      schema: DATASET_ITEMS_SCHEMA,\n      compositePrimaryKey: TABLE_CONFIGS[TABLE_DATASET_ITEMS]?.compositePrimaryKey,\n    });\n    await this.#db.createTable({ tableName: TABLE_DATASET_VERSIONS, schema: DATASET_VERSIONS_SCHEMA });\n\n    // Migrate: add new columns to existing tables\n    await this.#addColumnIfNotExists(TABLE_DATASETS, 'requestContextSchema', 'JSONB');\n    await this.#addColumnIfNotExists(TABLE_DATASETS, 'tags', 'JSONB');\n    await this.#addColumnIfNotExists(TABLE_DATASETS, 'targetType', 'TEXT');\n    await this.#addColumnIfNotExists(TABLE_DATASETS, 'targetIds', 'JSONB');\n    await this.#addColumnIfNotExists(TABLE_DATASETS, 'scorerIds', 'JSONB');\n    await this.#addColumnIfNotExists(TABLE_DATASETS, 'organizationId', 'TEXT');\n    await this.#addColumnIfNotExists(TABLE_DATASETS, 'projectId', 'TEXT');\n    await this.#addColumnIfNotExists(TABLE_DATASETS, 'candidateKey', 'TEXT');\n    await this.#addColumnIfNotExists(TABLE_DATASETS, 'candidateId', 'TEXT');\n    await this.#addColumnIfNotExists(TABLE_DATASET_ITEMS, 'requestContext', 'JSONB');\n    await this.#addColumnIfNotExists(TABLE_DATASET_ITEMS, 'source', 'JSONB');\n    await this.#addColumnIfNotExists(TABLE_DATASET_ITEMS, 'expectedTrajectory', 'JSONB');\n    await this.#addColumnIfNotExists(TABLE_DATASET_ITEMS, 'organizationId', 'TEXT');\n    await this.#addColumnIfNotExists(TABLE_DATASET_ITEMS, 'projectId', 'TEXT');\n    await this.#addColumnIfNotExists(TABLE_DATASET_ITEMS, 'toolMocks', 'JSONB');\n    await this.#addColumnIfNotExists(TABLE_DATASET_ITEMS, 'unmockedToolPolicy', 'TEXT');\n    await this.#addColumnIfNotExists(TABLE_DATASET_ITEMS, 'scorerIds', 'JSONB');\n    await this.#addColumnIfNotExists(TABLE_DATASET_ITEMS, 'externalId', 'TEXT');\n\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  async #addColumnIfNotExists(table: string, column: string, sqlType: string): Promise<void> {\n    const exists = await this.#db.hasColumn(table, column);\n    if (!exists) {\n      const fullTableName = getTableName({ indexName: table, schemaName: getSchemaName(this.#schema) });\n      await this.#db.client.none(`ALTER TABLE ${fullTableName} ADD COLUMN \"${column}\" ${sqlType}`);\n      // Raw DDL bypasses alterTable's snapshot maintenance — report it so later\n      // init-path checks in the same window see the column.\n      this.#db.noteColumnAdded(table, column);\n    }\n  }\n\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    return [\n      { name: 'idx_dataset_items_dataset_validto', table: TABLE_DATASET_ITEMS, columns: ['datasetId', 'validTo'] },\n      {\n        name: 'idx_dataset_items_dataset_version',\n        table: TABLE_DATASET_ITEMS,\n        columns: ['datasetId', 'datasetVersion'],\n      },\n      {\n        name: 'idx_dataset_items_external_id_history',\n        table: TABLE_DATASET_ITEMS,\n        columns: ['datasetId', 'externalId', 'datasetVersion'],\n      },\n      {\n        name: 'idx_dataset_items_dataset_validto_deleted',\n        table: TABLE_DATASET_ITEMS,\n        columns: ['datasetId', 'validTo', 'isDeleted'],\n      },\n      {\n        name: 'idx_dataset_versions_dataset_version',\n        table: TABLE_DATASET_VERSIONS,\n        columns: ['datasetId', 'version'],\n      },\n      {\n        name: 'idx_dataset_versions_dataset_version_unique',\n        table: TABLE_DATASET_VERSIONS,\n        columns: ['datasetId', 'version'],\n        unique: true,\n      },\n      // Tenancy: leading-tenant indexes for multi-tenant scans (parity with observability storage).\n      {\n        name: 'idx_datasets_org_project',\n        table: TABLE_DATASETS,\n        columns: ['organizationId', 'projectId'],\n      },\n      {\n        name: 'idx_datasets_candidate',\n        table: TABLE_DATASETS,\n        columns: ['candidateKey', 'candidateId'],\n      },\n      {\n        name: 'idx_dataset_items_org_project',\n        table: TABLE_DATASET_ITEMS,\n        columns: ['organizationId', 'projectId'],\n      },\n    ];\n  }\n\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) return;\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create default index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) return;\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  // --- Row transformers ---\n\n  private transformDatasetRow(row: Record<string, any>): DatasetRecord {\n    return {\n      id: row.id as string,\n      name: row.name as string,\n      description: (row.description as string) ?? undefined,\n      metadata: row.metadata ? safelyParseJSON(row.metadata) : undefined,\n      inputSchema: row.inputSchema ? safelyParseJSON(row.inputSchema) : undefined,\n      groundTruthSchema: row.groundTruthSchema ? safelyParseJSON(row.groundTruthSchema) : undefined,\n      requestContextSchema: row.requestContextSchema ? safelyParseJSON(row.requestContextSchema) : undefined,\n      tags: row.tags ? safelyParseJSON(row.tags) : undefined,\n      targetType: (row.targetType as TargetType) || null,\n      targetIds: row.targetIds || null,\n      scorerIds: row.scorerIds || null,\n      organizationId: (row.organizationId as string | null) ?? null,\n      projectId: (row.projectId as string | null) ?? null,\n      candidateKey: (row.candidateKey as string | null) ?? null,\n      candidateId: (row.candidateId as string | null) ?? null,\n      version: row.version as number,\n      createdAt: ensureDate(row.createdAtZ || row.createdAt)!,\n      updatedAt: ensureDate(row.updatedAtZ || row.updatedAt)!,\n    };\n  }\n\n  private transformItemRow(row: Record<string, any>): DatasetItem {\n    const metadata = parseOptionalJSON<Record<string, unknown>>(row.metadata, undefined);\n    const emptyValue = metadata?.__purged === true ? null : undefined;\n    return {\n      id: row.id as string,\n      datasetId: row.datasetId as string,\n      datasetVersion: row.datasetVersion as number,\n      externalId: (row.externalId as string | null) ?? null,\n      organizationId: (row.organizationId as string | null) ?? null,\n      projectId: (row.projectId as string | null) ?? null,\n      input: row.input === null ? null : parseStoredJSON(row.input),\n      groundTruth: parseOptionalJSON(row.groundTruth, emptyValue),\n      expectedTrajectory: parseOptionalJSON(row.expectedTrajectory, emptyValue),\n      toolMocks: parseOptionalJSON(row.toolMocks, emptyValue),\n      unmockedToolPolicy: row.unmockedToolPolicy ?? emptyValue,\n      scorerIds: parseOptionalJSON(row.scorerIds, emptyValue),\n      requestContext: parseOptionalJSON(row.requestContext, emptyValue),\n      metadata,\n      source: parseOptionalJSON(row.source, emptyValue),\n      createdAt: ensureDate(row.createdAtZ || row.createdAt)!,\n      updatedAt: ensureDate(row.updatedAtZ || row.updatedAt)!,\n    };\n  }\n\n  private transformItemRowFull(row: Record<string, any>): DatasetItemRow {\n    const metadata = parseOptionalJSON<Record<string, unknown>>(row.metadata, undefined);\n    const emptyValue = metadata?.__purged === true ? null : undefined;\n    return {\n      id: row.id as string,\n      datasetId: row.datasetId as string,\n      datasetVersion: row.datasetVersion as number,\n      externalId: (row.externalId as string | null) ?? null,\n      organizationId: (row.organizationId as string | null) ?? null,\n      projectId: (row.projectId as string | null) ?? null,\n      validTo: row.validTo as number | null,\n      isDeleted: Boolean(row.isDeleted),\n      input: row.input === null ? null : parseStoredJSON(row.input),\n      groundTruth: parseOptionalJSON(row.groundTruth, emptyValue),\n      expectedTrajectory: parseOptionalJSON(row.expectedTrajectory, emptyValue),\n      toolMocks: parseOptionalJSON(row.toolMocks, emptyValue),\n      unmockedToolPolicy: row.unmockedToolPolicy ?? emptyValue,\n      scorerIds: parseOptionalJSON(row.scorerIds, emptyValue),\n      requestContext: parseOptionalJSON(row.requestContext, emptyValue),\n      metadata,\n      source: parseOptionalJSON(row.source, emptyValue),\n      createdAt: ensureDate(row.createdAtZ || row.createdAt)!,\n      updatedAt: ensureDate(row.updatedAtZ || row.updatedAt)!,\n    };\n  }\n\n  private transformDatasetVersionRow(row: Record<string, any>): DatasetVersion {\n    return {\n      id: row.id as string,\n      datasetId: row.datasetId as string,\n      version: row.version as number,\n      createdAt: ensureDate(row.createdAtZ || row.createdAt)!,\n    };\n  }\n\n  // --- Dataset CRUD ---\n\n  async createDataset(input: CreateDatasetInput): Promise<DatasetRecord> {\n    try {\n      const id = input.id ?? crypto.randomUUID();\n      if (input.id !== undefined) this.validateCallerDefinedDatasetId(input.id);\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      await this.#db.insert({\n        tableName: TABLE_DATASETS,\n        record: {\n          id,\n          name: input.name,\n          description: input.description ?? null,\n          metadata: input.metadata ?? null,\n          inputSchema: input.inputSchema ?? null,\n          groundTruthSchema: input.groundTruthSchema ?? null,\n          requestContextSchema: input.requestContextSchema ?? null,\n          targetType: input.targetType ?? null,\n          targetIds: input.targetIds ?? null,\n          scorerIds: input.scorerIds ?? null,\n          organizationId: input.organizationId ?? null,\n          projectId: input.projectId ?? null,\n          candidateKey: input.candidateKey ?? null,\n          candidateId: input.candidateId ?? null,\n          version: 0,\n          createdAt: nowIso,\n          updatedAt: nowIso,\n        },\n      });\n\n      return {\n        id,\n        name: input.name,\n        description: input.description,\n        metadata: input.metadata,\n        inputSchema: input.inputSchema ?? undefined,\n        groundTruthSchema: input.groundTruthSchema ?? undefined,\n        requestContextSchema: input.requestContextSchema ?? undefined,\n        targetType: input.targetType ?? null,\n        targetIds: input.targetIds ?? null,\n        scorerIds: input.scorerIds ?? null,\n        organizationId: input.organizationId ?? null,\n        projectId: input.projectId ?? null,\n        candidateKey: input.candidateKey ?? null,\n        candidateId: input.candidateId ?? null,\n        version: 0,\n        createdAt: now,\n        updatedAt: now,\n      };\n    } catch (error) {\n      if (input.id !== undefined && hasErrorCode(error, new Set(['23505']))) {\n        const existing = await this.#getDatasetById(this.#db.client, { id: input.id });\n        if (existing) return this.resolveExistingDataset(existing, { ...input, id: input.id });\n      }\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_DATASET', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async getDatasetById(args: { id: string; filters?: DatasetTenancyFilters }): Promise<DatasetRecord | null> {\n    return this.#getDatasetById(this.#db.readClient, args);\n  }\n\n  protected override getDatasetForMutation(args: {\n    id: string;\n    filters?: DatasetTenancyFilters;\n  }): Promise<DatasetRecord | null> {\n    return this.#getDatasetById(this.#db.client, args);\n  }\n\n  protected override listItemsForMutation(args: ListDatasetItemsInput): Promise<ListDatasetItemsOutput> {\n    return this.#listItems(this.#db.client, args);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #getDatasetById(\n    client: Pick<DbClient, 'oneOrNone'> | Pick<TxClient, 'oneOrNone'>,\n    { id, filters }: { id: string; filters?: DatasetTenancyFilters },\n  ): Promise<DatasetRecord | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n      const { conditions, params } = tenancyWhere(filters, 2);\n      const whereSql = ['\"id\" = $1', ...conditions].join(' AND ');\n      const result = await client.oneOrNone(`SELECT * FROM ${tableName} WHERE ${whereSql}`, [id, ...params]);\n      return result ? this.transformDatasetRow(result) : null;\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_DATASET', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  protected async _doUpdateDataset(args: UpdateDatasetInput): Promise<DatasetRecord> {\n    try {\n      const existing = await this.#getDatasetById(this.#db.client, { id: args.id, filters: args.filters });\n      if (!existing) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_DATASET', 'NOT_FOUND'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { datasetId: args.id },\n        });\n      }\n\n      const tableName = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n      const now = new Date().toISOString();\n      const setClauses: string[] = ['\"updatedAt\" = $1', '\"updatedAtZ\" = $2'];\n      const values: any[] = [now, now];\n      let paramIndex = 3;\n\n      if (args.name !== undefined) {\n        setClauses.push(`\"name\" = $${paramIndex++}`);\n        values.push(args.name);\n      }\n      if (args.description !== undefined) {\n        setClauses.push(`\"description\" = $${paramIndex++}`);\n        values.push(args.description);\n      }\n      if (args.metadata !== undefined) {\n        setClauses.push(`\"metadata\" = $${paramIndex++}`);\n        values.push(JSON.stringify(args.metadata));\n      }\n      if (args.inputSchema !== undefined) {\n        setClauses.push(`\"inputSchema\" = $${paramIndex++}`);\n        values.push(args.inputSchema === null ? null : JSON.stringify(args.inputSchema));\n      }\n      if (args.groundTruthSchema !== undefined) {\n        setClauses.push(`\"groundTruthSchema\" = $${paramIndex++}`);\n        values.push(args.groundTruthSchema === null ? null : JSON.stringify(args.groundTruthSchema));\n      }\n      if (args.requestContextSchema !== undefined) {\n        setClauses.push(`\"requestContextSchema\" = $${paramIndex++}`);\n        values.push(args.requestContextSchema === null ? null : JSON.stringify(args.requestContextSchema));\n      }\n      if (args.tags !== undefined) {\n        setClauses.push(`\"tags\" = $${paramIndex++}`);\n        values.push(args.tags === null ? null : JSON.stringify(args.tags));\n      }\n      if (args.targetType !== undefined) {\n        setClauses.push(`\"targetType\" = $${paramIndex++}`);\n        values.push(args.targetType);\n      }\n      if (args.targetIds !== undefined) {\n        setClauses.push(`\"targetIds\" = $${paramIndex++}`);\n        values.push(args.targetIds === null ? null : JSON.stringify(args.targetIds));\n      }\n      if (args.scorerIds !== undefined) {\n        setClauses.push(`\"scorerIds\" = $${paramIndex++}`);\n        values.push(args.scorerIds === null ? null : JSON.stringify(args.scorerIds));\n      }\n      // Tenancy (organizationId, projectId) and candidate identity (candidateKey,\n      // candidateId) are immutable after creation — they're not part of UpdateDatasetInput.\n\n      values.push(args.id);\n      await this.#db.client.none(\n        `UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE \"id\" = $${paramIndex}`,\n        values,\n      );\n\n      return {\n        ...existing,\n        name: args.name ?? existing.name,\n        description: args.description ?? existing.description,\n        metadata: args.metadata ?? existing.metadata,\n        inputSchema: (args.inputSchema !== undefined ? args.inputSchema : existing.inputSchema) ?? undefined,\n        groundTruthSchema:\n          (args.groundTruthSchema !== undefined ? args.groundTruthSchema : existing.groundTruthSchema) ?? undefined,\n        requestContextSchema:\n          (args.requestContextSchema !== undefined ? args.requestContextSchema : existing.requestContextSchema) ??\n          undefined,\n        tags: (args.tags !== undefined ? args.tags : existing.tags) ?? undefined,\n        targetType: (args.targetType !== undefined ? args.targetType : existing.targetType) ?? null,\n        targetIds: (args.targetIds !== undefined ? args.targetIds : existing.targetIds) ?? null,\n        scorerIds: (args.scorerIds !== undefined ? args.scorerIds : existing.scorerIds) ?? null,\n        organizationId: existing.organizationId ?? null,\n        projectId: existing.projectId ?? null,\n        candidateKey: existing.candidateKey ?? null,\n        candidateId: existing.candidateId ?? null,\n        updatedAt: new Date(now),\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_DATASET', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteDataset({ id, filters }: { id: string; filters?: DatasetTenancyFilters }): Promise<void> {\n    try {\n      const datasetsTable = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n      const itemsTable = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n      const versionsTable = getTableName({\n        indexName: TABLE_DATASET_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const experimentsTable = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n      const experimentResultsTable = getTableName({\n        indexName: TABLE_EXPERIMENT_RESULTS,\n        schemaName: getSchemaName(this.#schema),\n      });\n\n      // Atomic gate + cascade under a single transaction; the tenancy predicate\n      // is folded into a SELECT ... FOR UPDATE lock and the parent DELETE, so\n      // a concurrent delete/recreate under a different tenant cannot let a\n      // scoped delete hit another tenant's row. Silent no-op on mismatch.\n      const { conditions, params } = tenancyWhere(filters, 2);\n      const scopedWhere = ['\"id\" = $1', ...conditions].join(' AND ');\n\n      await this.#db.client.tx(async t => {\n        const locked = await t.oneOrNone(`SELECT \"id\" FROM ${datasetsTable} WHERE ${scopedWhere} FOR UPDATE`, [\n          id,\n          ...params,\n        ]);\n        if (!locked) return;\n\n        // Detach experiments only if their tables exist. We probe with\n        // to_regclass instead of try/catch inside the transaction, because a\n        // failed DML in Postgres puts the connection into an aborted state\n        // (SQLSTATE 25P02), which would cause every subsequent DELETE below\n        // to fail and roll back the whole transaction.\n        const experimentTablesExist = await t.oneOrNone<{ exists: boolean }>(\n          `SELECT to_regclass($1) IS NOT NULL AND to_regclass($2) IS NOT NULL AS exists`,\n          [experimentResultsTable, experimentsTable],\n        );\n        if (experimentTablesExist?.exists) {\n          await t.none(\n            `DELETE FROM ${experimentResultsTable} WHERE \"experimentId\" IN (SELECT \"id\" FROM ${experimentsTable} WHERE \"datasetId\" = $1)`,\n            [id],\n          );\n          await t.none(\n            `UPDATE ${experimentsTable} SET \"datasetId\" = NULL, \"datasetVersion\" = NULL WHERE \"datasetId\" = $1`,\n            [id],\n          );\n        }\n\n        await t.none(`DELETE FROM ${versionsTable} WHERE \"datasetId\" = $1`, [id]);\n        await t.none(`DELETE FROM ${itemsTable} WHERE \"datasetId\" = $1`, [id]);\n        await t.none(`DELETE FROM ${datasetsTable} WHERE ${scopedWhere}`, [id, ...params]);\n      });\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_DATASET', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async listDatasets(args: ListDatasetsInput): Promise<ListDatasetsOutput> {\n    try {\n      const { page, perPage: perPageInput } = args.pagination;\n      const tableName = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n\n      const conditions: string[] = [];\n      const queryParams: any[] = [];\n      let paramIndex = 1;\n\n      if (args.filters) {\n        const { organizationId, projectId, candidateKey, candidateId, targetType, targetIds, name } = args.filters;\n        if (organizationId !== undefined) {\n          conditions.push(`\"organizationId\" = $${paramIndex++}`);\n          queryParams.push(organizationId);\n        }\n        if (projectId !== undefined) {\n          conditions.push(`\"projectId\" = $${paramIndex++}`);\n          queryParams.push(projectId);\n        }\n        if (candidateKey !== undefined) {\n          conditions.push(`\"candidateKey\" = $${paramIndex++}`);\n          queryParams.push(candidateKey);\n        }\n        if (candidateId !== undefined) {\n          conditions.push(`\"candidateId\" = $${paramIndex++}`);\n          queryParams.push(candidateId);\n        }\n        if (targetType !== undefined) {\n          conditions.push(`\"targetType\" = $${paramIndex++}`);\n          queryParams.push(targetType);\n        }\n        if (targetIds !== undefined && targetIds.length > 0) {\n          // jsonb ?| text[] — true if any of the strings exists as a top-level element.\n          conditions.push(`\"targetIds\" ?| $${paramIndex++}::text[]`);\n          queryParams.push(targetIds);\n        }\n        if (name !== undefined && name.length > 0) {\n          conditions.push(`\"name\" ILIKE $${paramIndex++}`);\n          queryParams.push(`%${name}%`);\n        }\n      }\n\n      const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n        queryParams,\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return { datasets: [], pagination: { total: 0, page, perPage: perPageInput, hasMore: false } };\n      }\n\n      const perPage = normalizePerPage(perPageInput, 100);\n      const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n      const limitValue = perPageInput === false ? total : perPage;\n\n      const rows = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"createdAt\" DESC, \"id\" ASC LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`,\n        [...queryParams, limitValue, offset],\n      );\n\n      return {\n        datasets: (rows || []).map(row => this.transformDatasetRow(row)),\n        pagination: {\n          total,\n          page,\n          perPage: perPageForResponse,\n          hasMore: perPageInput === false ? false : offset + perPage < total,\n        },\n      };\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_DATASETS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  // --- SCD-2 mutations ---\n\n  protected async _doAddItem(args: AddDatasetItemInput): Promise<DatasetItem> {\n    try {\n      const datasetsTable = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n      const itemsTable = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n      const versionsTable = getTableName({\n        indexName: TABLE_DATASET_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n\n      const id = crypto.randomUUID();\n      const versionId = crypto.randomUUID();\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      let newVersion: number;\n      let parentOrganizationId: string | null = null;\n      let parentProjectId: string | null = null;\n\n      await this.#db.client.tx(async t => {\n        const row = await t.one(\n          `UPDATE ${datasetsTable} SET \"version\" = \"version\" + 1 WHERE \"id\" = $1 RETURNING \"version\", \"organizationId\", \"projectId\"`,\n          [args.datasetId],\n        );\n        newVersion = row.version as number;\n        parentOrganizationId = (row.organizationId as string | null) ?? null;\n        parentProjectId = (row.projectId as string | null) ?? null;\n\n        await t.none(\n          `INSERT INTO ${itemsTable} (\"id\",\"datasetId\",\"datasetVersion\",\"externalId\",\"organizationId\",\"projectId\",\"validTo\",\"isDeleted\",\"input\",\"groundTruth\",\"expectedTrajectory\",\"toolMocks\",\"unmockedToolPolicy\",\"scorerIds\",\"requestContext\",\"metadata\",\"source\",\"createdAt\",\"createdAtZ\",\"updatedAt\",\"updatedAtZ\") VALUES ($1,$2,$3,$4,$5,$6,NULL,false,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19)`,\n          [\n            id,\n            args.datasetId,\n            newVersion,\n            args.externalId ?? null,\n            parentOrganizationId,\n            parentProjectId,\n            JSON.stringify(args.input),\n            jsonbArg(args.groundTruth),\n            jsonbArg(args.expectedTrajectory),\n            jsonbArg(args.toolMocks),\n            args.unmockedToolPolicy ?? null,\n            jsonbArg(args.scorerIds),\n            jsonbArg(args.requestContext),\n            jsonbArg(args.metadata),\n            jsonbArg(args.source),\n            nowIso,\n            nowIso,\n            nowIso,\n            nowIso,\n          ],\n        );\n\n        await t.none(\n          `INSERT INTO ${versionsTable} (\"id\",\"datasetId\",\"version\",\"createdAt\",\"createdAtZ\") VALUES ($1,$2,$3,$4,$5)`,\n          [versionId, args.datasetId, newVersion, nowIso, nowIso],\n        );\n      });\n\n      return {\n        id,\n        datasetId: args.datasetId,\n        datasetVersion: newVersion!,\n        organizationId: parentOrganizationId,\n        projectId: parentProjectId,\n        input: args.input,\n        groundTruth: args.groundTruth,\n        expectedTrajectory: args.expectedTrajectory,\n        toolMocks: args.toolMocks,\n        unmockedToolPolicy: args.unmockedToolPolicy,\n        scorerIds: args.scorerIds,\n        requestContext: args.requestContext,\n        metadata: args.metadata,\n        source: args.source,\n        createdAt: now,\n        updatedAt: now,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'ADD_ITEM', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  protected async _doUpdateItem(args: UpdateDatasetItemInput): Promise<DatasetItem> {\n    try {\n      const datasetsTable = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n      const itemsTable = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n      const versionsTable = getTableName({\n        indexName: TABLE_DATASET_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n\n      const versionId = crypto.randomUUID();\n      const now = new Date();\n      const nowIso = now.toISOString();\n      let updated!: DatasetItem;\n\n      await this.#db.client.tx(async t => {\n        // Serialize item writers with purge before reading payload data.\n        await t.oneOrNone(`SELECT \"id\" FROM ${datasetsTable} WHERE \"id\" = $1 FOR UPDATE`, [args.datasetId]);\n        const existing = await this.#getItemById(t, { id: args.id });\n        if (!existing) {\n          throw new MastraError({\n            id: createStorageErrorId('PG', 'UPDATE_ITEM', 'NOT_FOUND'),\n            domain: ErrorDomain.STORAGE,\n            category: ErrorCategory.USER,\n            details: { itemId: args.id },\n          });\n        }\n        if (existing.datasetId !== args.datasetId) {\n          throw new MastraError({\n            id: createStorageErrorId('PG', 'UPDATE_ITEM', 'DATASET_MISMATCH'),\n            domain: ErrorDomain.STORAGE,\n            category: ErrorCategory.USER,\n            details: { itemId: args.id, expectedDatasetId: args.datasetId, actualDatasetId: existing.datasetId },\n          });\n        }\n        if (existing.metadata?.__purged === true) {\n          throw new MastraError({\n            id: 'DATASET_ITEM_PURGED',\n            domain: ErrorDomain.STORAGE,\n            category: ErrorCategory.USER,\n            details: { datasetId: args.datasetId, itemId: args.id },\n            text: `Purged dataset item cannot be updated: ${args.id}`,\n          });\n        }\n\n        const mergedInput = args.input !== undefined ? args.input : existing.input;\n        const mergedGroundTruth = args.groundTruth !== undefined ? args.groundTruth : existing.groundTruth;\n        const mergedExpectedTrajectory =\n          args.expectedTrajectory !== undefined ? args.expectedTrajectory : existing.expectedTrajectory;\n        const mergedToolMocks = args.toolMocks !== undefined ? args.toolMocks : existing.toolMocks;\n        const mergedUnmockedToolPolicy =\n          args.unmockedToolPolicy !== undefined ? args.unmockedToolPolicy : existing.unmockedToolPolicy;\n        const mergedScorerIds = args.scorerIds !== undefined ? (args.scorerIds ?? undefined) : existing.scorerIds;\n        const mergedRequestContext = args.requestContext !== undefined ? args.requestContext : existing.requestContext;\n        const mergedMetadata = args.metadata !== undefined ? args.metadata : existing.metadata;\n        const mergedSource = args.source !== undefined ? args.source : existing.source;\n\n        const row = await t.one(\n          `UPDATE ${datasetsTable} SET \"version\" = \"version\" + 1 WHERE \"id\" = $1 RETURNING \"version\", \"organizationId\", \"projectId\"`,\n          [args.datasetId],\n        );\n        const newVersion = row.version as number;\n        const parentOrganizationId = (row.organizationId as string | null) ?? null;\n        const parentProjectId = (row.projectId as string | null) ?? null;\n\n        await t.none(\n          `UPDATE ${itemsTable} SET \"validTo\" = $1 WHERE \"id\" = $2 AND \"validTo\" IS NULL AND \"isDeleted\" = false`,\n          [newVersion, args.id],\n        );\n        await t.none(\n          `INSERT INTO ${itemsTable} (\"id\",\"datasetId\",\"datasetVersion\",\"externalId\",\"organizationId\",\"projectId\",\"validTo\",\"isDeleted\",\"input\",\"groundTruth\",\"expectedTrajectory\",\"toolMocks\",\"unmockedToolPolicy\",\"scorerIds\",\"requestContext\",\"metadata\",\"source\",\"createdAt\",\"createdAtZ\",\"updatedAt\",\"updatedAtZ\") VALUES ($1,$2,$3,$4,$5,$6,NULL,false,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19)`,\n          [\n            args.id,\n            args.datasetId,\n            newVersion,\n            existing.externalId ?? null,\n            parentOrganizationId,\n            parentProjectId,\n            JSON.stringify(mergedInput),\n            jsonbArg(mergedGroundTruth),\n            jsonbArg(mergedExpectedTrajectory),\n            jsonbArg(mergedToolMocks),\n            mergedUnmockedToolPolicy ?? null,\n            jsonbArg(mergedScorerIds),\n            jsonbArg(mergedRequestContext),\n            jsonbArg(mergedMetadata),\n            jsonbArg(mergedSource),\n            existing.createdAt.toISOString(),\n            existing.createdAt.toISOString(),\n            nowIso,\n            nowIso,\n          ],\n        );\n        await t.none(\n          `INSERT INTO ${versionsTable} (\"id\",\"datasetId\",\"version\",\"createdAt\",\"createdAtZ\") VALUES ($1,$2,$3,$4,$5)`,\n          [versionId, args.datasetId, newVersion, nowIso, nowIso],\n        );\n\n        updated = {\n          ...existing,\n          datasetVersion: newVersion,\n          organizationId: parentOrganizationId,\n          projectId: parentProjectId,\n          input: mergedInput,\n          groundTruth: mergedGroundTruth,\n          expectedTrajectory: mergedExpectedTrajectory,\n          toolMocks: mergedToolMocks,\n          unmockedToolPolicy: mergedUnmockedToolPolicy,\n          scorerIds: mergedScorerIds,\n          requestContext: mergedRequestContext,\n          metadata: mergedMetadata,\n          source: mergedSource,\n          updatedAt: now,\n        };\n      });\n      return updated;\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_ITEM', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  protected async _doDeleteItem({ id, datasetId }: DeleteDatasetItemInput): Promise<void> {\n    try {\n      const datasetsTable = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n      const itemsTable = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n      const versionsTable = getTableName({\n        indexName: TABLE_DATASET_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const versionId = crypto.randomUUID();\n      const nowIso = new Date().toISOString();\n\n      await this.#db.client.tx(async t => {\n        await t.oneOrNone(`SELECT \"id\" FROM ${datasetsTable} WHERE \"id\" = $1 FOR UPDATE`, [datasetId]);\n        const existing = await this.#getItemById(t, { id });\n        if (!existing) return;\n        if (existing.datasetId !== datasetId) {\n          throw new MastraError({\n            id: createStorageErrorId('PG', 'DELETE_ITEM', 'DATASET_MISMATCH'),\n            domain: ErrorDomain.STORAGE,\n            category: ErrorCategory.USER,\n            details: { itemId: id, expectedDatasetId: datasetId, actualDatasetId: existing.datasetId },\n          });\n        }\n\n        const row = await t.one(\n          `UPDATE ${datasetsTable} SET \"version\" = \"version\" + 1 WHERE \"id\" = $1 RETURNING \"version\", \"organizationId\", \"projectId\"`,\n          [datasetId],\n        );\n        const newVersion = row.version as number;\n        const parentOrganizationId = (row.organizationId as string | null) ?? null;\n        const parentProjectId = (row.projectId as string | null) ?? null;\n        await t.none(\n          `UPDATE ${itemsTable} SET \"validTo\" = $1 WHERE \"id\" = $2 AND \"validTo\" IS NULL AND \"isDeleted\" = false`,\n          [newVersion, id],\n        );\n        await t.none(\n          `INSERT INTO ${itemsTable} (\"id\",\"datasetId\",\"datasetVersion\",\"externalId\",\"organizationId\",\"projectId\",\"validTo\",\"isDeleted\",\"input\",\"groundTruth\",\"expectedTrajectory\",\"toolMocks\",\"unmockedToolPolicy\",\"scorerIds\",\"requestContext\",\"metadata\",\"source\",\"createdAt\",\"createdAtZ\",\"updatedAt\",\"updatedAtZ\") VALUES ($1,$2,$3,$4,$5,$6,NULL,true,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19)`,\n          [\n            id,\n            datasetId,\n            newVersion,\n            existing.externalId ?? null,\n            parentOrganizationId,\n            parentProjectId,\n            JSON.stringify(existing.input),\n            jsonbArg(existing.groundTruth),\n            jsonbArg(existing.expectedTrajectory),\n            jsonbArg(existing.toolMocks),\n            existing.unmockedToolPolicy ?? null,\n            jsonbArg(existing.scorerIds),\n            jsonbArg(existing.requestContext),\n            jsonbArg(existing.metadata),\n            jsonbArg(existing.source),\n            existing.createdAt.toISOString(),\n            existing.createdAt.toISOString(),\n            nowIso,\n            nowIso,\n          ],\n        );\n        await t.none(\n          `INSERT INTO ${versionsTable} (\"id\",\"datasetId\",\"version\",\"createdAt\",\"createdAtZ\") VALUES ($1,$2,$3,$4,$5)`,\n          [versionId, datasetId, newVersion, nowIso, nowIso],\n        );\n      });\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_ITEM', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  protected async _doPurgeItem({ id, datasetId }: PurgeDatasetItemInput): Promise<void> {\n    try {\n      const datasetsTable = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n      const itemsTable = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n      const experimentsTable = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n      const experimentResultsTable = getTableName({\n        indexName: TABLE_EXPERIMENT_RESULTS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const purgedAt = new Date().toISOString();\n      const purgedMetadata = JSON.stringify({ __purged: true, purgedAt });\n\n      await this.#db.client.tx(async t => {\n        const dataset = await t.oneOrNone(`SELECT \"id\" FROM ${datasetsTable} WHERE \"id\" = $1 FOR UPDATE`, [datasetId]);\n        if (!dataset) return;\n        const item = await t.oneOrNone(\n          `SELECT \"id\" FROM ${itemsTable} WHERE \"id\" = $1 AND \"datasetId\" = $2 LIMIT 1 FOR UPDATE`,\n          [id, datasetId],\n        );\n        if (!item) return;\n\n        await t.none(\n          `UPDATE ${itemsTable} SET \"input\" = 'null'::jsonb, \"groundTruth\" = NULL, \"expectedTrajectory\" = NULL, \"toolMocks\" = NULL, \"unmockedToolPolicy\" = NULL, \"scorerIds\" = NULL, \"requestContext\" = NULL, \"metadata\" = $2::jsonb, \"source\" = NULL WHERE \"id\" = $1 AND \"datasetId\" = $3`,\n          [id, purgedMetadata, datasetId],\n        );\n\n        const experimentTablesExist = await t.one<{ exists: boolean }>(\n          `SELECT to_regclass($1) IS NOT NULL AND to_regclass($2) IS NOT NULL AS exists`,\n          [experimentResultsTable, experimentsTable],\n        );\n        if (experimentTablesExist.exists) {\n          await t.none(\n            `UPDATE ${experimentResultsTable} SET \"input\" = 'null'::jsonb, \"output\" = NULL, \"groundTruth\" = NULL, \"error\" = NULL, \"toolMockReport\" = NULL, \"tags\" = NULL, \"comment\" = NULL, \"metadata\" = $2::jsonb WHERE \"itemId\" = $1 AND \"experimentId\" IN (SELECT \"id\" FROM ${experimentsTable} WHERE \"datasetId\" = $3)`,\n            [id, purgedMetadata, datasetId],\n          );\n        }\n      });\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'PURGE_ITEM', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  protected async _doBatchInsertItems(input: BatchInsertItemsInput): Promise<DatasetItem[]> {\n    try {\n      if (input.items.length === 0) return [];\n      const datasetsTable = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n      const itemsTable = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n      const versionsTable = getTableName({\n        indexName: TABLE_DATASET_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      let results: DatasetItem[] = [];\n\n      await this.#db.client.tx(async t => {\n        const dataset = await t.oneOrNone(\n          `SELECT \"version\", \"organizationId\", \"projectId\" FROM ${datasetsTable} WHERE \"id\" = $1 FOR UPDATE`,\n          [input.datasetId],\n        );\n        if (!dataset)\n          throw new MastraError({\n            id: createStorageErrorId('PG', 'BULK_ADD_ITEMS', 'DATASET_NOT_FOUND'),\n            domain: ErrorDomain.STORAGE,\n            category: ErrorCategory.USER,\n            details: { datasetId: input.datasetId },\n          });\n\n        const externalIds = [...new Set(input.items.flatMap(item => (item.externalId ? [item.externalId] : [])))];\n        const historyRows = externalIds.length\n          ? await t.manyOrNone(\n              `SELECT * FROM ${itemsTable} WHERE \"datasetId\" = $1 AND \"externalId\" = ANY($2::text[]) ORDER BY \"datasetVersion\"`,\n              [input.datasetId, externalIds],\n            )\n          : [];\n        const plan = this.planDatasetItemBatch(\n          input.items,\n          historyRows.map(row => this.transformItemRowFull(row)),\n          () => crypto.randomUUID(),\n        );\n        const resolved = new Map<string, DatasetItem>(\n          [...plan.existingCurrentItems].map(([id, row]) => [id, this.datasetItemFromRow(row)]),\n        );\n        if (plan.inserts.length > 0) {\n          const newVersion = Number(dataset.version) + 1;\n          const now = new Date();\n          const nowIso = now.toISOString();\n          await t.none(`UPDATE ${datasetsTable} SET \"version\" = $2 WHERE \"id\" = $1`, [input.datasetId, newVersion]);\n          for (const { id, item } of plan.inserts) {\n            await t.none(\n              `INSERT INTO ${itemsTable} (\"id\",\"datasetId\",\"datasetVersion\",\"externalId\",\"organizationId\",\"projectId\",\"validTo\",\"isDeleted\",\"input\",\"groundTruth\",\"expectedTrajectory\",\"toolMocks\",\"unmockedToolPolicy\",\"scorerIds\",\"requestContext\",\"metadata\",\"source\",\"createdAt\",\"createdAtZ\",\"updatedAt\",\"updatedAtZ\") VALUES ($1,$2,$3,$4,$5,$6,NULL,false,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19)`,\n              [\n                id,\n                input.datasetId,\n                newVersion,\n                item.externalId ?? null,\n                dataset.organizationId ?? null,\n                dataset.projectId ?? null,\n                JSON.stringify(item.input),\n                jsonbArg(item.groundTruth),\n                jsonbArg(item.expectedTrajectory),\n                jsonbArg(item.toolMocks),\n                item.unmockedToolPolicy ?? null,\n                jsonbArg(item.scorerIds),\n                jsonbArg(item.requestContext),\n                jsonbArg(item.metadata),\n                jsonbArg(item.source),\n                nowIso,\n                nowIso,\n                nowIso,\n                nowIso,\n              ],\n            );\n            resolved.set(id, {\n              id,\n              datasetId: input.datasetId,\n              datasetVersion: newVersion,\n              externalId: item.externalId ?? null,\n              organizationId: dataset.organizationId ?? null,\n              projectId: dataset.projectId ?? null,\n              input: item.input,\n              groundTruth: item.groundTruth,\n              expectedTrajectory: item.expectedTrajectory,\n              toolMocks: item.toolMocks,\n              unmockedToolPolicy: item.unmockedToolPolicy,\n              scorerIds: item.scorerIds,\n              requestContext: item.requestContext,\n              metadata: item.metadata,\n              source: item.source,\n              createdAt: now,\n              updatedAt: now,\n            });\n          }\n          await t.none(\n            `INSERT INTO ${versionsTable} (\"id\",\"datasetId\",\"version\",\"createdAt\",\"createdAtZ\") VALUES ($1,$2,$3,$4,$5)`,\n            [crypto.randomUUID(), input.datasetId, newVersion, nowIso, nowIso],\n          );\n        }\n        results = plan.resolvedIds.map(id => resolved.get(id)!);\n      });\n      return results;\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'BULK_ADD_ITEMS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  protected async _doBatchDeleteItems(input: BatchDeleteItemsInput): Promise<void> {\n    try {\n      const datasetsTable = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n      const itemsTable = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n      const versionsTable = getTableName({\n        indexName: TABLE_DATASET_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n\n      const nowIso = new Date().toISOString();\n      const versionId = crypto.randomUUID();\n\n      await this.#db.client.tx(async t => {\n        await t.oneOrNone(`SELECT \"id\" FROM ${datasetsTable} WHERE \"id\" = $1 FOR UPDATE`, [input.datasetId]);\n        const dataset = await this.#getDatasetById(t, { id: input.datasetId });\n        if (!dataset) {\n          throw new MastraError({\n            id: createStorageErrorId('PG', 'BULK_DELETE_ITEMS', 'DATASET_NOT_FOUND'),\n            domain: ErrorDomain.STORAGE,\n            category: ErrorCategory.USER,\n            details: { datasetId: input.datasetId },\n          });\n        }\n\n        // Fetch current items after taking the dataset lock, skipping missing or mismatched items.\n        const currentRows = await t.manyOrNone(\n          `SELECT * FROM ${itemsTable} WHERE \"id\" = ANY($1::text[]) AND \"datasetId\" = $2 AND \"validTo\" IS NULL AND \"isDeleted\" = false`,\n          [input.itemIds, input.datasetId],\n        );\n        const currentItems = currentRows.map(row => this.transformItemRow(row));\n        if (currentItems.length === 0) return;\n\n        const parentOrganizationId = dataset.organizationId ?? null;\n        const parentProjectId = dataset.projectId ?? null;\n\n        // 1. Single version bump\n        const row = await t.one(\n          `UPDATE ${datasetsTable} SET \"version\" = \"version\" + 1 WHERE \"id\" = $1 RETURNING \"version\"`,\n          [input.datasetId],\n        );\n        const newVersion = row.version as number;\n\n        // 2. For each item: close old row + insert tombstone\n        for (const item of currentItems) {\n          await t.none(\n            `UPDATE ${itemsTable} SET \"validTo\" = $1 WHERE \"id\" = $2 AND \"validTo\" IS NULL AND \"isDeleted\" = false`,\n            [newVersion, item.id],\n          );\n          await t.none(\n            `INSERT INTO ${itemsTable} (\"id\",\"datasetId\",\"datasetVersion\",\"externalId\",\"organizationId\",\"projectId\",\"validTo\",\"isDeleted\",\"input\",\"groundTruth\",\"expectedTrajectory\",\"toolMocks\",\"unmockedToolPolicy\",\"scorerIds\",\"requestContext\",\"metadata\",\"source\",\"createdAt\",\"createdAtZ\",\"updatedAt\",\"updatedAtZ\") VALUES ($1,$2,$3,$4,$5,$6,NULL,true,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19)`,\n            [\n              item.id,\n              input.datasetId,\n              newVersion,\n              item.externalId ?? null,\n              parentOrganizationId,\n              parentProjectId,\n              JSON.stringify(item.input),\n              jsonbArg(item.groundTruth),\n              jsonbArg(item.expectedTrajectory),\n              jsonbArg(item.toolMocks),\n              item.unmockedToolPolicy ?? null,\n              jsonbArg(item.scorerIds),\n              jsonbArg(item.requestContext),\n              jsonbArg(item.metadata),\n              jsonbArg(item.source),\n              item.createdAt.toISOString(),\n              item.createdAt.toISOString(),\n              nowIso,\n              nowIso,\n            ],\n          );\n        }\n\n        // 3. Single dataset_version row\n        await t.none(\n          `INSERT INTO ${versionsTable} (\"id\",\"datasetId\",\"version\",\"createdAt\",\"createdAtZ\") VALUES ($1,$2,$3,$4,$5)`,\n          [versionId, input.datasetId, newVersion, nowIso, nowIso],\n        );\n      });\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'BULK_DELETE_ITEMS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  // --- SCD-2 queries ---\n\n  async getItemById(args: { id: string; datasetVersion?: number }): Promise<DatasetItem | null> {\n    return this.#getItemById(this.#db.readClient, args);\n  }\n\n  async #getItemById(\n    client: Pick<DbClient, 'oneOrNone'> | Pick<TxClient, 'oneOrNone'>,\n    args: { id: string; datasetVersion?: number },\n  ): Promise<DatasetItem | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n      let result;\n\n      if (args.datasetVersion !== undefined) {\n        result = await client.oneOrNone(\n          `SELECT * FROM ${tableName} WHERE \"id\" = $1 AND \"datasetVersion\" <= $2 AND (\"validTo\" IS NULL OR \"validTo\" > $2) AND \"isDeleted\" = false ORDER BY \"datasetVersion\" DESC LIMIT 1`,\n          [args.id, args.datasetVersion],\n        );\n      } else {\n        result = await client.oneOrNone(\n          `SELECT * FROM ${tableName} WHERE \"id\" = $1 AND \"validTo\" IS NULL AND \"isDeleted\" = false`,\n          [args.id],\n        );\n      }\n\n      return result ? this.transformItemRow(result) : null;\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_ITEM', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async getItemsByVersion({ datasetId, version }: { datasetId: string; version: number }): Promise<DatasetItem[]> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n      const rows = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} WHERE \"datasetId\" = $1 AND \"datasetVersion\" <= $2 AND (\"validTo\" IS NULL OR \"validTo\" > $3) AND \"isDeleted\" = false ORDER BY \"createdAt\" DESC, \"id\" ASC`,\n        [datasetId, version, version],\n      );\n      return (rows || []).map(row => this.transformItemRow(row));\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_ITEMS_BY_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async getItemHistory(itemId: string): Promise<DatasetItemRow[]> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n      const rows = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} WHERE \"id\" = $1 ORDER BY \"datasetVersion\" DESC`,\n        [itemId],\n      );\n      return (rows || []).map(row => this.transformItemRowFull(row));\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_ITEM_HISTORY', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async listItems(args: ListDatasetItemsInput): Promise<ListDatasetItemsOutput> {\n    return this.#listItems(this.#db.readClient, args);\n  }\n\n  /**\n   * Same listing against an explicit client. `updateDataset` validates existing\n   * items on the writer so a lagging replica cannot hide freshly inserted rows.\n   */\n  async #listItems(client: DbClient, args: ListDatasetItemsInput): Promise<ListDatasetItemsOutput> {\n    try {\n      const { page, perPage: perPageInput } = args.pagination;\n      const tableName = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n\n      // Build WHERE conditions\n      const conditions: string[] = ['\"datasetId\" = $1'];\n      const queryParams: any[] = [args.datasetId];\n      let paramIndex = 2;\n\n      if (args.version !== undefined) {\n        // SCD-2 time-travel\n        conditions.push(`\"datasetVersion\" <= $${paramIndex++}`);\n        queryParams.push(args.version);\n        conditions.push(`(\"validTo\" IS NULL OR \"validTo\" > $${paramIndex++})`);\n        queryParams.push(args.version);\n        conditions.push(`\"isDeleted\" = false`);\n      } else {\n        // Current items only\n        conditions.push(`\"validTo\" IS NULL`);\n        conditions.push(`\"isDeleted\" = false`);\n      }\n\n      if (args.search) {\n        conditions.push(\n          `(\"input\"::text ILIKE $${paramIndex} OR COALESCE(\"groundTruth\"::text, '') ILIKE $${paramIndex})`,\n        );\n        queryParams.push(`%${args.search}%`);\n        paramIndex++;\n      }\n\n      if (args.filters) {\n        const { organizationId, projectId } = args.filters;\n        if (organizationId !== undefined) {\n          conditions.push(`\"organizationId\" = $${paramIndex++}`);\n          queryParams.push(organizationId);\n        }\n        if (projectId !== undefined) {\n          conditions.push(`\"projectId\" = $${paramIndex++}`);\n          queryParams.push(projectId);\n        }\n      }\n\n      const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n      // Count\n      const countResult = await client.one(`SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`, queryParams);\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return { items: [], pagination: { total: 0, page, perPage: perPageInput, hasMore: false } };\n      }\n\n      const perPage = normalizePerPage(perPageInput, 100);\n      const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n      const limitValue = perPageInput === false ? total : perPage;\n\n      const rows = await client.manyOrNone(\n        `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"createdAt\" DESC, \"id\" ASC LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`,\n        [...queryParams, limitValue, offset],\n      );\n\n      return {\n        items: (rows || []).map(row => this.transformItemRow(row)),\n        pagination: {\n          total,\n          page,\n          perPage: perPageForResponse,\n          hasMore: perPageInput === false ? false : offset + perPage < total,\n        },\n      };\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_ITEMS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  // --- Dataset versions ---\n\n  async createDatasetVersion(datasetId: string, version: number): Promise<DatasetVersion> {\n    try {\n      const id = crypto.randomUUID();\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      await this.#db.insert({\n        tableName: TABLE_DATASET_VERSIONS,\n        record: { id, datasetId, version, createdAt: nowIso },\n      });\n\n      return { id, datasetId, version, createdAt: now };\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_DATASET_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async listDatasetVersions(input: ListDatasetVersionsInput): Promise<ListDatasetVersionsOutput> {\n    try {\n      const { page, perPage: perPageInput } = input.pagination;\n      const tableName = getTableName({ indexName: TABLE_DATASET_VERSIONS, schemaName: getSchemaName(this.#schema) });\n\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} WHERE \"datasetId\" = $1`,\n        [input.datasetId],\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return { versions: [], pagination: { total: 0, page, perPage: perPageInput, hasMore: false } };\n      }\n\n      const perPage = normalizePerPage(perPageInput, 100);\n      const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n      const limitValue = perPageInput === false ? total : perPage;\n\n      const rows = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} WHERE \"datasetId\" = $1 ORDER BY \"version\" DESC LIMIT $2 OFFSET $3`,\n        [input.datasetId, limitValue, offset],\n      );\n\n      return {\n        versions: (rows || []).map(row => this.transformDatasetVersionRow(row)),\n        pagination: {\n          total,\n          page,\n          perPage: perPageForResponse,\n          hasMore: perPageInput === false ? false : offset + perPage < total,\n        },\n      };\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_DATASET_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  // --- Clear ---\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_DATASET_VERSIONS });\n    await this.#db.clearTable({ tableName: TABLE_DATASET_ITEMS });\n    await this.#db.clearTable({ tableName: TABLE_DATASETS });\n  }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n  createStorageErrorId,\n  TABLE_DATASETS,\n  TABLE_DATASET_ITEMS,\n  TABLE_EXPERIMENTS,\n  TABLE_EXPERIMENT_RESULTS,\n  TABLE_SCHEMAS,\n  EXPERIMENTS_SCHEMA,\n  EXPERIMENT_RESULTS_SCHEMA,\n  ExperimentsStorage,\n  calculatePagination,\n  normalizePerPage,\n  safelyParseJSON,\n  ensureDate,\n} from '@mastra/core/storage';\nimport type {\n  Experiment,\n  ExperimentResult,\n  ExperimentReviewCounts,\n  ExperimentTenancyFilters,\n  CreateExperimentInput,\n  UpdateExperimentInput,\n  AddExperimentResultInput,\n  UpdateExperimentResultInput,\n  UpsertExperimentResultInput,\n  ListExperimentsInput,\n  ListExperimentsOutput,\n  ListExperimentResultsInput,\n  ListExperimentResultsOutput,\n  CreateIndexOptions,\n  TABLE_NAMES,\n  PruneOptions,\n  PruneResult,\n  RetentionTablesDescriptor,\n  TableRetentionPolicy,\n} from '@mastra/core/storage';\nimport type { TxClient } from '../../client';\nimport { PgDB, resolvePgConfig, generateTableSQL } from '../../db';\nimport type { DbClient, PgDomainConfig } from '../../db';\nimport { cutoffFor, runBatchedDelete } from '../../retention';\nimport { getTableName, getSchemaName, tenancyWhere } from '../utils';\n\nconst DEFAULT_PRUNE_BATCH_SIZE = 1000;\n\nexport class ExperimentsPG extends ExperimentsStorage {\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  static readonly MANAGED_TABLES = [TABLE_EXPERIMENTS, TABLE_EXPERIMENT_RESULTS] as const;\n\n  /**\n   * Experiments prune as whole units: an aged experiment and its result rows go\n   * together, mirroring `deleteExperiment`. Anchored on `completedAt` (not the\n   * `completedAtZ` mirror, which carries a `DEFAULT NOW()` this domain never\n   * overrides — it holds insert time even for running rows). `completedAt` is\n   * written as a UTC ISO string and stays NULL while running, so\n   * `completedAt < cutoff` is false for in-flight experiments.\n   */\n  static override readonly retentionTables: RetentionTablesDescriptor = {\n    experiments: { table: TABLE_EXPERIMENTS, column: 'completedAt', indexed: true },\n  };\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    this.#indexes = indexes?.filter(idx => (ExperimentsPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    for (const tableName of ExperimentsPG.MANAGED_TABLES) {\n      statements.push(\n        generateTableSQL({\n          tableName,\n          schema: TABLE_SCHEMAS[tableName],\n          schemaName,\n          includeAllConstraints: true,\n        }),\n      );\n    }\n    return statements;\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({ tableName: TABLE_EXPERIMENTS, schema: EXPERIMENTS_SCHEMA });\n    await this.#db.createTable({ tableName: TABLE_EXPERIMENT_RESULTS, schema: EXPERIMENT_RESULTS_SCHEMA });\n    // Add columns introduced after initial schema for backwards compatibility\n    await this.#db.alterTable({\n      tableName: TABLE_EXPERIMENTS,\n      schema: EXPERIMENTS_SCHEMA,\n      ifNotExists: [\n        'agentVersion',\n        'organizationId',\n        'projectId',\n        'provenance',\n        'runnerAttestation',\n        'experimentSetId',\n        'comparisonId',\n        'variantId',\n        'trialIndex',\n        'scorerIds',\n      ],\n    });\n    await this.#db.alterTable({\n      tableName: TABLE_EXPERIMENT_RESULTS,\n      schema: EXPERIMENT_RESULTS_SCHEMA,\n      ifNotExists: [\n        'status',\n        'tags',\n        'comment',\n        'toolMockReport',\n        'metadata',\n        'organizationId',\n        'projectId',\n        'attempt',\n      ],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  /**\n   * Lazily ensures a btree index exists on each configured policy's retention\n   * anchor column so age-based `prune()` deletes stay fast on large tables.\n   * Called from the prune path (not init) so only deployments that configure\n   * retention pay the index's write/disk overhead. Best-effort: failures are\n   * logged and pruning proceeds (correct, just slower).\n   * Created even with `skipDefaultIndexes` — retention is an explicit opt-in,\n   * so its supporting index is not part of the default index set.\n   */\n  private async ensureRetentionIndexes(policies: Record<string, TableRetentionPolicy>): Promise<void> {\n    const prefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    for (const [key, entry] of Object.entries(ExperimentsPG.retentionTables)) {\n      if (!entry.indexed || !policies[key]) continue;\n      try {\n        await this.#db.ensureIndex({\n          indexName: `${prefix}mastra_${key}_retention_idx`,\n          tableName: entry.table as TABLE_NAMES,\n          column: entry.column,\n        });\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create retention index for ${entry.table}:`, error);\n      }\n    }\n  }\n\n  /**\n   * Delete experiments whose `completedAt` is older than the policy's `maxAge`.\n   *\n   * Each batch selects up to `batchSize` aged experiments and deletes their\n   * `experiment_results` rows and the experiment rows in one transaction —\n   * mirroring `deleteExperiment` — so hitting `maxBatches`/`maxRows` or the\n   * abort signal between batches never leaves a run hollow (parent kept,\n   * results gone). NULL `completedAt` (still running) is excluded by the\n   * `< cutoff` predicate. Bounds count whole experiments, not rows.\n   */\n  async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n    const policy = policies['experiments'];\n    if (!policy || options?.signal?.aborted) {\n      return policy\n        ? [\n            { domain: 'experiments', table: TABLE_EXPERIMENT_RESULTS, deleted: 0, done: false },\n            { domain: 'experiments', table: TABLE_EXPERIMENTS, deleted: 0, done: false },\n          ]\n        : [];\n    }\n\n    await this.ensureRetentionIndexes(policies);\n\n    // `completedAt` is a naive TIMESTAMP holding UTC ISO strings, so bind the\n    // cutoff as a UTC ISO string too — a Date would be serialized with the\n    // session's local offset and compared against the wrong wall time.\n    const rawCutoff = cutoffFor(policy, 'timestamp');\n    const cutoff = rawCutoff instanceof Date ? rawCutoff.toISOString() : rawCutoff;\n    const batchSize = policy.batchSize ?? DEFAULT_PRUNE_BATCH_SIZE;\n\n    let childDeleted = 0;\n    const parent = await runBatchedDelete({\n      deleteBatch: async limit => {\n        const { parents, children } = await this.#db.pruneUnitsBatch({\n          parentTable: TABLE_EXPERIMENTS,\n          parentKey: 'id',\n          parentColumn: 'completedAt',\n          childTable: TABLE_EXPERIMENT_RESULTS,\n          childForeignKey: 'experimentId',\n          cutoff,\n          limit,\n        });\n        childDeleted += children;\n        return parents;\n      },\n      batchSize,\n      options,\n    });\n\n    return [\n      { domain: 'experiments', table: TABLE_EXPERIMENT_RESULTS, deleted: childDeleted, done: parent.done },\n      { domain: 'experiments', table: TABLE_EXPERIMENTS, deleted: parent.deleted, done: parent.done },\n    ];\n  }\n\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    return [\n      { name: 'idx_experiments_datasetid', table: TABLE_EXPERIMENTS, columns: ['datasetId'] },\n      {\n        name: 'idx_experiments_grouping',\n        table: TABLE_EXPERIMENTS,\n        columns: ['experimentSetId', 'comparisonId', 'variantId', 'trialIndex'],\n      },\n      { name: 'idx_experiment_results_experimentid', table: TABLE_EXPERIMENT_RESULTS, columns: ['experimentId'] },\n      // The natural key includes `attempt` so external runners can record\n      // repeated trials as separate rows (retry convergence happens per attempt).\n      {\n        name: 'idx_experiment_results_exp_item_attempt',\n        table: TABLE_EXPERIMENT_RESULTS,\n        columns: ['experimentId', 'itemId', 'attempt'],\n        unique: true,\n      },\n      // Tenancy: leading-tenant indexes for multi-tenant scans (parity with datasets domain).\n      {\n        name: 'idx_experiments_org_project',\n        table: TABLE_EXPERIMENTS,\n        columns: ['organizationId', 'projectId'],\n      },\n      {\n        name: 'idx_experiment_results_org_project',\n        table: TABLE_EXPERIMENT_RESULTS,\n        columns: ['organizationId', 'projectId'],\n      },\n      // Tags JSONB GIN index — backs the `\"tags\" @> ...::jsonb` containment filter.\n      {\n        name: 'idx_experiment_results_tags_gin',\n        table: TABLE_EXPERIMENT_RESULTS,\n        columns: ['tags'],\n        method: 'gin',\n      },\n    ];\n  }\n\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) return;\n    // Legacy unique index without `attempt` — superseded by idx_experiment_results_exp_item_attempt.\n    // dropIndex is snapshot-aware, so converged inits stay DDL- and probe-free.\n    try {\n      await this.#db.dropIndex('idx_experiment_results_exp_item');\n    } catch (error) {\n      this.logger?.warn?.('Failed to drop legacy index idx_experiment_results_exp_item:', error);\n    }\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create default index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) return;\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  // --- Row transformers ---\n\n  private transformExperimentRow(row: Record<string, any>): Experiment {\n    return {\n      id: row.id as string,\n      name: (row.name as string) ?? undefined,\n      description: (row.description as string) ?? undefined,\n      metadata: row.metadata ? safelyParseJSON(row.metadata) : undefined,\n      provenance: row.provenance ? safelyParseJSON(row.provenance) : null,\n      runnerAttestation: row.runnerAttestation ? safelyParseJSON(row.runnerAttestation) : null,\n      experimentSetId: (row.experimentSetId as string | null) ?? null,\n      comparisonId: (row.comparisonId as string | null) ?? null,\n      variantId: (row.variantId as string | null) ?? null,\n      trialIndex: row.trialIndex != null ? (row.trialIndex as number) : null,\n      datasetId: (row.datasetId as string | null) ?? null,\n      datasetVersion: row.datasetVersion != null ? (row.datasetVersion as number) : null,\n      agentVersion: (row.agentVersion as string | null) ?? null,\n      organizationId: (row.organizationId as string | null) ?? null,\n      projectId: (row.projectId as string | null) ?? null,\n      targetType: (row.targetType as Experiment['targetType']) ?? null,\n      targetId: (row.targetId as string | null) ?? null,\n      scorerIds: row.scorerIds ? safelyParseJSON(row.scorerIds) : null,\n      status: row.status as Experiment['status'],\n      totalItems: row.totalItems as number,\n      succeededCount: row.succeededCount as number,\n      failedCount: row.failedCount as number,\n      skippedCount: (row.skippedCount as number) ?? 0,\n      startedAt: row.startedAt ? ensureDate(row.startedAtZ || row.startedAt)! : null,\n      completedAt: row.completedAt ? ensureDate(row.completedAtZ || row.completedAt)! : null,\n      createdAt: ensureDate(row.createdAtZ || row.createdAt)!,\n      updatedAt: ensureDate(row.updatedAtZ || row.updatedAt)!,\n    };\n  }\n\n  private transformExperimentResultRow(row: Record<string, any>): ExperimentResult {\n    return {\n      id: row.id as string,\n      experimentId: row.experimentId as string,\n      itemId: row.itemId as string,\n      itemDatasetVersion: row.itemDatasetVersion != null ? (row.itemDatasetVersion as number) : null,\n      organizationId: (row.organizationId as string | null) ?? null,\n      projectId: (row.projectId as string | null) ?? null,\n      input: row.input === null ? null : safelyParseJSON(row.input),\n      output: row.output ? safelyParseJSON(row.output) : null,\n      groundTruth: row.groundTruth ? safelyParseJSON(row.groundTruth) : null,\n      metadata: row.metadata ? safelyParseJSON(row.metadata) : null,\n      error: row.error ? safelyParseJSON(row.error) : null,\n      startedAt: ensureDate(row.startedAtZ || row.startedAt)!,\n      completedAt: ensureDate(row.completedAtZ || row.completedAt)!,\n      retryCount: row.retryCount as number,\n      attempt: row.attempt != null ? (row.attempt as number) : 0,\n      traceId: (row.traceId as string | null) ?? null,\n      status: (row.status as ExperimentResult['status']) ?? null,\n      tags: row.tags ? safelyParseJSON(row.tags) : null,\n      comment: (row.comment as string | null) ?? null,\n      toolMockReport: row.toolMockReport ? safelyParseJSON(row.toolMockReport) : null,\n      createdAt: ensureDate(row.createdAtZ || row.createdAt)!,\n    };\n  }\n\n  // --- Experiment CRUD ---\n\n  async createExperiment(input: CreateExperimentInput): Promise<Experiment> {\n    try {\n      const id = input.id ?? crypto.randomUUID();\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      await this.#db.insert({\n        tableName: TABLE_EXPERIMENTS,\n        record: {\n          id,\n          name: input.name ?? null,\n          description: input.description ?? null,\n          metadata: input.metadata ?? null,\n          provenance: input.provenance ?? null,\n          runnerAttestation: input.runnerAttestation ?? null,\n          experimentSetId: input.experimentSetId ?? null,\n          comparisonId: input.comparisonId ?? null,\n          variantId: input.variantId ?? null,\n          trialIndex: input.trialIndex ?? null,\n          datasetId: input.datasetId ?? null,\n          datasetVersion: input.datasetVersion ?? null,\n          agentVersion: input.agentVersion ?? null,\n          organizationId: input.organizationId ?? null,\n          projectId: input.projectId ?? null,\n          targetType: input.targetType ?? null,\n          targetId: input.targetId ?? null,\n          scorerIds: input.scorerIds ?? null,\n          status: 'pending',\n          totalItems: input.totalItems,\n          succeededCount: 0,\n          failedCount: 0,\n          skippedCount: 0,\n          startedAt: null,\n          completedAt: null,\n          createdAt: nowIso,\n          updatedAt: nowIso,\n        },\n      });\n\n      return {\n        id,\n        name: input.name,\n        description: input.description,\n        metadata: input.metadata,\n        provenance: input.provenance ?? null,\n        runnerAttestation: input.runnerAttestation ?? null,\n        experimentSetId: input.experimentSetId ?? null,\n        comparisonId: input.comparisonId ?? null,\n        variantId: input.variantId ?? null,\n        trialIndex: input.trialIndex ?? null,\n        datasetId: input.datasetId ?? null,\n        datasetVersion: input.datasetVersion ?? null,\n        agentVersion: input.agentVersion ?? null,\n        organizationId: input.organizationId ?? null,\n        projectId: input.projectId ?? null,\n        targetType: input.targetType ?? null,\n        targetId: input.targetId ?? null,\n        scorerIds: input.scorerIds ?? null,\n        status: 'pending',\n        totalItems: input.totalItems,\n        succeededCount: 0,\n        failedCount: 0,\n        skippedCount: 0,\n        startedAt: null,\n        completedAt: null,\n        createdAt: now,\n        updatedAt: now,\n      };\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_EXPERIMENT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async updateExperiment(input: UpdateExperimentInput): Promise<Experiment> {\n    try {\n      const existing = await this.#getExperimentById(this.#db.client, { id: input.id });\n      if (!existing) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_EXPERIMENT', 'NOT_FOUND'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { experimentId: input.id },\n        });\n      }\n\n      const tableName = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n      const now = new Date().toISOString();\n      const setClauses: string[] = ['\"updatedAt\" = $1', '\"updatedAtZ\" = $2'];\n      const values: any[] = [now, now];\n      let paramIndex = 3;\n\n      if (input.name !== undefined) {\n        setClauses.push(`\"name\" = $${paramIndex++}`);\n        values.push(input.name);\n      }\n      if (input.description !== undefined) {\n        setClauses.push(`\"description\" = $${paramIndex++}`);\n        values.push(input.description);\n      }\n      if (input.metadata !== undefined) {\n        setClauses.push(`\"metadata\" = $${paramIndex++}`);\n        values.push(JSON.stringify(input.metadata));\n      }\n      if (input.status !== undefined) {\n        setClauses.push(`\"status\" = $${paramIndex++}`);\n        values.push(input.status);\n      }\n      if (input.succeededCount !== undefined) {\n        setClauses.push(`\"succeededCount\" = $${paramIndex++}`);\n        values.push(input.succeededCount);\n      }\n      if (input.failedCount !== undefined) {\n        setClauses.push(`\"failedCount\" = $${paramIndex++}`);\n        values.push(input.failedCount);\n      }\n      if (input.totalItems !== undefined) {\n        setClauses.push(`\"totalItems\" = $${paramIndex++}`);\n        values.push(input.totalItems);\n      }\n      if (input.skippedCount !== undefined) {\n        setClauses.push(`\"skippedCount\" = $${paramIndex++}`);\n        values.push(input.skippedCount);\n      }\n      if (input.startedAt !== undefined) {\n        setClauses.push(`\"startedAt\" = $${paramIndex++}`);\n        values.push(input.startedAt?.toISOString() ?? null);\n      }\n      if (input.completedAt !== undefined) {\n        setClauses.push(`\"completedAt\" = $${paramIndex++}`);\n        values.push(input.completedAt?.toISOString() ?? null);\n      }\n\n      values.push(input.id);\n      await this.#db.client.none(\n        `UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE \"id\" = $${paramIndex}`,\n        values,\n      );\n\n      // Re-SELECT to get correctly transformed fields (timestamps, jsonb)\n      const updated = await this.#getExperimentById(this.#db.client, { id: input.id });\n      return updated!;\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_EXPERIMENT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async getExperimentById(args: { id: string; filters?: ExperimentTenancyFilters }): Promise<Experiment | null> {\n    return this.#getExperimentById(this.#db.readClient, args);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #getExperimentById(\n    client: DbClient,\n    { id, filters }: { id: string; filters?: ExperimentTenancyFilters },\n  ): Promise<Experiment | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n      const { conditions, params } = tenancyWhere(filters, 2);\n      const whereSql = ['\"id\" = $1', ...conditions].join(' AND ');\n      const result = await client.oneOrNone(`SELECT * FROM ${tableName} WHERE ${whereSql}`, [id, ...params]);\n      return result ? this.transformExperimentRow(result) : null;\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_EXPERIMENT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async listExperiments(args: ListExperimentsInput): Promise<ListExperimentsOutput> {\n    try {\n      const { page, perPage: perPageInput } = args.pagination;\n      const tableName = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n\n      // Build WHERE\n      const conditions: string[] = [];\n      const queryParams: any[] = [];\n      let paramIndex = 1;\n\n      if (args.datasetId) {\n        conditions.push(`\"datasetId\" = $${paramIndex++}`);\n        queryParams.push(args.datasetId);\n      }\n      if (args.targetType) {\n        conditions.push(`\"targetType\" = $${paramIndex++}`);\n        queryParams.push(args.targetType);\n      }\n      if (args.targetId) {\n        conditions.push(`\"targetId\" = $${paramIndex++}`);\n        queryParams.push(args.targetId);\n      }\n      if (args.agentVersion) {\n        conditions.push(`\"agentVersion\" = $${paramIndex++}`);\n        queryParams.push(args.agentVersion);\n      }\n      if (args.status) {\n        conditions.push(`\"status\" = $${paramIndex++}`);\n        queryParams.push(args.status);\n      }\n      if (args.experimentSetId !== undefined) {\n        conditions.push(`\"experimentSetId\" = $${paramIndex++}`);\n        queryParams.push(args.experimentSetId);\n      }\n      if (args.comparisonId !== undefined) {\n        conditions.push(`\"comparisonId\" = $${paramIndex++}`);\n        queryParams.push(args.comparisonId);\n      }\n      if (args.variantId !== undefined) {\n        conditions.push(`\"variantId\" = $${paramIndex++}`);\n        queryParams.push(args.variantId);\n      }\n      if (args.trialIndex !== undefined) {\n        conditions.push(`\"trialIndex\" = $${paramIndex++}`);\n        queryParams.push(args.trialIndex);\n      }\n      if (args.filters) {\n        const { organizationId, projectId } = args.filters;\n        if (organizationId !== undefined) {\n          conditions.push(`\"organizationId\" = $${paramIndex++}`);\n          queryParams.push(organizationId);\n        }\n        if (projectId !== undefined) {\n          conditions.push(`\"projectId\" = $${paramIndex++}`);\n          queryParams.push(projectId);\n        }\n      }\n\n      const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n      // Count\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n        queryParams,\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return { experiments: [], pagination: { total: 0, page, perPage: perPageInput, hasMore: false } };\n      }\n\n      const perPage = normalizePerPage(perPageInput, 100);\n      const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n      const limitValue = perPageInput === false ? total : perPage;\n\n      const rows = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"createdAt\" DESC LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`,\n        [...queryParams, limitValue, offset],\n      );\n\n      return {\n        experiments: (rows || []).map(row => this.transformExperimentRow(row)),\n        pagination: {\n          total,\n          page,\n          perPage: perPageForResponse,\n          hasMore: perPageInput === false ? false : offset + perPage < total,\n        },\n      };\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_EXPERIMENTS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteExperiment({ id, filters }: { id: string; filters?: ExperimentTenancyFilters }): Promise<void> {\n    try {\n      const resultsTable = getTableName({\n        indexName: TABLE_EXPERIMENT_RESULTS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const experimentsTable = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n\n      // Tenancy gate + cascade run in a single transaction with SELECT ... FOR UPDATE,\n      // so a concurrent delete/recreate cannot let a scoped delete hit another tenant's row.\n      // Silent no-op on tenancy mismatch (does not throw).\n      const { conditions, params } = tenancyWhere(filters, 2);\n      const gateSql = `SELECT \"id\" FROM ${experimentsTable} WHERE ${['\"id\" = $1', ...conditions].join(' AND ')} FOR UPDATE`;\n\n      await this.#db.client.tx(async t => {\n        const parent = await t.oneOrNone(gateSql, [id, ...params]);\n        if (!parent) return;\n        await t.none(`DELETE FROM ${resultsTable} WHERE \"experimentId\" = $1`, [id]);\n        await t.none(`DELETE FROM ${experimentsTable} WHERE \"id\" = $1`, [id]);\n      });\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_EXPERIMENT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  // --- Experiment results ---\n\n  async #resolvePurgeMetadata(\n    t: TxClient,\n    datasetId: string | null | undefined,\n    itemId: string,\n  ): Promise<Record<string, unknown> | null> {\n    if (!datasetId) return null;\n\n    const datasetsTable = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n    const itemsTable = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n    const dataset = await t.oneOrNone(`SELECT \"id\" FROM ${datasetsTable} WHERE \"id\" = $1 FOR UPDATE`, [datasetId]);\n    if (!dataset) return null;\n\n    const purge = await t.oneOrNone<{ metadata: Record<string, unknown> }>(\n      `SELECT \"metadata\" FROM ${itemsTable}\n       WHERE \"id\" = $1 AND \"datasetId\" = $2 AND \"metadata\"->>'__purged' = 'true'\n       LIMIT 1`,\n      [itemId, datasetId],\n    );\n    return purge?.metadata ?? null;\n  }\n\n  async addExperimentResult(input: AddExperimentResultInput): Promise<ExperimentResult> {\n    try {\n      const id = input.id ?? crypto.randomUUID();\n      const resultsTable = getTableName({\n        indexName: TABLE_EXPERIMENT_RESULTS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const experimentsTable = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n\n      const row = await this.#db.client.tx(async t => {\n        const owner = await t.oneOrNone<{ datasetId: string | null }>(\n          `SELECT \"datasetId\" FROM ${experimentsTable} WHERE \"id\" = $1`,\n          [input.experimentId],\n        );\n        const purgeMetadata = await this.#resolvePurgeMetadata(t, owner?.datasetId, input.itemId);\n        const nowIso = new Date().toISOString();\n        return t.one(\n          `INSERT INTO ${resultsTable} (\n            \"id\", \"experimentId\", \"itemId\", \"itemDatasetVersion\", \"organizationId\", \"projectId\",\n            \"input\", \"output\", \"groundTruth\", \"metadata\", \"error\", \"startedAt\", \"completedAt\",\n            \"retryCount\", \"attempt\", \"traceId\", \"status\", \"tags\", \"toolMockReport\", \"createdAt\"\n          ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20)\n          RETURNING *`,\n          [\n            id,\n            input.experimentId,\n            input.itemId,\n            input.itemDatasetVersion ?? null,\n            input.organizationId ?? null,\n            input.projectId ?? null,\n            JSON.stringify(purgeMetadata ? null : input.input),\n            purgeMetadata || input.output == null ? null : JSON.stringify(input.output),\n            purgeMetadata || input.groundTruth == null ? null : JSON.stringify(input.groundTruth),\n            JSON.stringify(purgeMetadata ?? input.metadata ?? null),\n            purgeMetadata || input.error == null ? null : JSON.stringify(input.error),\n            input.startedAt.toISOString(),\n            input.completedAt.toISOString(),\n            input.retryCount,\n            input.attempt ?? 0,\n            input.traceId ?? null,\n            input.status ?? null,\n            purgeMetadata || input.tags == null ? null : JSON.stringify(input.tags),\n            purgeMetadata || input.toolMockReport == null ? null : JSON.stringify(input.toolMockReport),\n            nowIso,\n          ],\n        );\n      });\n\n      return this.transformExperimentResultRow(row);\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'ADD_EXPERIMENT_RESULT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async upsertExperimentResult(input: UpsertExperimentResultInput): Promise<ExperimentResult> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_EXPERIMENT_RESULTS, schemaName: getSchemaName(this.#schema) });\n      const experimentsTable = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n      const attempt = input.attempt ?? 0;\n\n      const row = await this.#db.client.tx(async t => {\n        const owner = await t.oneOrNone<{ datasetId: string | null }>(\n          `SELECT \"datasetId\" FROM ${experimentsTable} WHERE \"id\" = $1`,\n          [input.experimentId],\n        );\n        const purgeMetadata = await this.#resolvePurgeMetadata(t, owner?.datasetId, input.itemId);\n\n        // Natural key lookup under FOR UPDATE so concurrent retries serialize\n        // on the same row instead of inserting duplicates.\n        // Note: COALESCE(\"attempt\", 0) is an expression predicate, so the\n        // planner narrows on the (\"experimentId\", \"itemId\") index prefix and\n        // filters the attempt term — bounded cost since one item has few\n        // attempts. Once legacy NULL attempts are backfilled to 0 and the\n        // column is NOT NULL DEFAULT 0, this can become \"attempt\" = $3 for a\n        // full index match.\n        const existing = await t.oneOrNone(\n          `SELECT \"id\" FROM ${tableName} WHERE \"experimentId\" = $1 AND \"itemId\" = $2 AND COALESCE(\"attempt\", 0) = $3 FOR UPDATE`,\n          [input.experimentId, input.itemId, attempt],\n        );\n\n        if (!existing) {\n          const id = crypto.randomUUID();\n          return t.one(\n            `INSERT INTO ${tableName} (\n              \"id\", \"experimentId\", \"itemId\", \"itemDatasetVersion\", \"organizationId\", \"projectId\",\n              \"input\", \"output\", \"groundTruth\", \"metadata\", \"error\", \"startedAt\", \"completedAt\",\n              \"retryCount\", \"attempt\", \"traceId\", \"status\", \"tags\", \"toolMockReport\", \"createdAt\"\n            ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20)\n            RETURNING *`,\n            [\n              id,\n              input.experimentId,\n              input.itemId,\n              input.itemDatasetVersion ?? null,\n              input.organizationId ?? null,\n              input.projectId ?? null,\n              JSON.stringify(purgeMetadata ? null : input.input),\n              purgeMetadata || input.output == null ? null : JSON.stringify(input.output),\n              purgeMetadata || input.groundTruth == null ? null : JSON.stringify(input.groundTruth),\n              JSON.stringify(purgeMetadata ?? input.metadata ?? null),\n              purgeMetadata || input.error == null ? null : JSON.stringify(input.error),\n              input.startedAt.toISOString(),\n              input.completedAt.toISOString(),\n              input.retryCount,\n              attempt,\n              input.traceId ?? null,\n              input.status ?? null,\n              purgeMetadata || input.tags == null ? null : JSON.stringify(input.tags),\n              purgeMetadata || input.toolMockReport == null ? null : JSON.stringify(input.toolMockReport),\n              new Date().toISOString(),\n            ],\n          );\n        }\n\n        // Last write wins on the natural key; keep row id + createdAt stable.\n        return t.one(\n          `UPDATE ${tableName} SET\n            \"itemDatasetVersion\" = $2, \"organizationId\" = $3, \"projectId\" = $4,\n            \"input\" = $5, \"output\" = $6, \"groundTruth\" = $7, \"metadata\" = $8, \"error\" = $9,\n            \"startedAt\" = $10, \"completedAt\" = $11, \"retryCount\" = $12, \"attempt\" = $13,\n            \"traceId\" = $14, \"status\" = $15, \"tags\" = $16, \"toolMockReport\" = $17\n          WHERE \"id\" = $1 RETURNING *`,\n          [\n            existing.id,\n            input.itemDatasetVersion ?? null,\n            input.organizationId ?? null,\n            input.projectId ?? null,\n            JSON.stringify(purgeMetadata ? null : input.input),\n            purgeMetadata || input.output == null ? null : JSON.stringify(input.output),\n            purgeMetadata || input.groundTruth == null ? null : JSON.stringify(input.groundTruth),\n            JSON.stringify(purgeMetadata ?? input.metadata ?? null),\n            purgeMetadata || input.error == null ? null : JSON.stringify(input.error),\n            input.startedAt.toISOString(),\n            input.completedAt.toISOString(),\n            input.retryCount,\n            attempt,\n            input.traceId ?? null,\n            input.status ?? null,\n            purgeMetadata || input.tags == null ? null : JSON.stringify(input.tags),\n            purgeMetadata || input.toolMockReport == null ? null : JSON.stringify(input.toolMockReport),\n          ],\n        );\n      });\n\n      return this.transformExperimentResultRow(row);\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPSERT_EXPERIMENT_RESULT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async updateExperimentResult(input: UpdateExperimentResultInput): Promise<ExperimentResult> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_EXPERIMENT_RESULTS, schemaName: getSchemaName(this.#schema) });\n      const experimentsTable = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n\n      const row = await this.#db.client.tx(async t => {\n        const owner = await t.oneOrNone<{ datasetId: string | null; itemId: string }>(\n          `SELECT e.\"datasetId\", r.\"itemId\"\n           FROM ${tableName} r\n           JOIN ${experimentsTable} e ON e.\"id\" = r.\"experimentId\"\n           WHERE r.\"id\" = $1${input.experimentId !== undefined ? ' AND r.\"experimentId\" = $2' : ''}`,\n          input.experimentId !== undefined ? [input.id, input.experimentId] : [input.id],\n        );\n        if (!owner) return null;\n\n        const purgeMetadata = await this.#resolvePurgeMetadata(t, owner.datasetId, owner.itemId);\n\n        return t.oneOrNone(\n          `UPDATE ${tableName}\n           SET \"status\" = CASE WHEN $2 THEN $3 ELSE \"status\" END,\n               \"tags\" = CASE WHEN $4 THEN NULL WHEN $5 THEN $6::jsonb ELSE \"tags\" END,\n               \"comment\" = CASE WHEN $4 THEN NULL WHEN $7 THEN $8 ELSE \"comment\" END\n           WHERE \"id\" = $1${input.experimentId !== undefined ? ' AND \"experimentId\" = $9' : ''}\n           RETURNING *`,\n          [\n            input.id,\n            input.status !== undefined,\n            input.status ?? null,\n            Boolean(purgeMetadata),\n            input.tags !== undefined,\n            input.tags === undefined ? null : JSON.stringify(input.tags),\n            input.comment !== undefined,\n            input.comment ?? null,\n            ...(input.experimentId !== undefined ? [input.experimentId] : []),\n          ],\n        );\n      });\n\n      if (!row) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_EXPERIMENT_RESULT', 'NOT_FOUND'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { resultId: input.id },\n        });\n      }\n\n      return this.transformExperimentResultRow(row);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_EXPERIMENT_RESULT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async getExperimentResultById(args: {\n    id: string;\n    filters?: ExperimentTenancyFilters;\n  }): Promise<ExperimentResult | null> {\n    return this.#getExperimentResultById(this.#db.readClient, args);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #getExperimentResultById(\n    client: DbClient,\n    { id, filters }: { id: string; filters?: ExperimentTenancyFilters },\n  ): Promise<ExperimentResult | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_EXPERIMENT_RESULTS, schemaName: getSchemaName(this.#schema) });\n      const { conditions, params } = tenancyWhere(filters, 2);\n      const whereSql = ['\"id\" = $1', ...conditions].join(' AND ');\n      const result = await client.oneOrNone(`SELECT * FROM ${tableName} WHERE ${whereSql}`, [id, ...params]);\n      return result ? this.transformExperimentResultRow(result) : null;\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_EXPERIMENT_RESULT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async listExperimentResults(args: ListExperimentResultsInput): Promise<ListExperimentResultsOutput> {\n    try {\n      const { page, perPage: perPageInput } = args.pagination;\n      const tableName = getTableName({ indexName: TABLE_EXPERIMENT_RESULTS, schemaName: getSchemaName(this.#schema) });\n\n      const conditions: string[] = ['\"experimentId\" = $1'];\n      const queryParams: any[] = [args.experimentId];\n      let paramIndex = 2;\n\n      if (args.traceId) {\n        conditions.push(`\"traceId\" = $${paramIndex++}`);\n        queryParams.push(args.traceId);\n      }\n      if (args.status) {\n        conditions.push(`\"status\" = $${paramIndex++}`);\n        queryParams.push(args.status);\n      }\n      // All requested tags must be present (AND semantics)\n      for (const tag of args.tags ?? []) {\n        conditions.push(`\"tags\" @> $${paramIndex++}::jsonb`);\n        queryParams.push(JSON.stringify([tag]));\n      }\n      if (args.filters) {\n        const { organizationId, projectId } = args.filters;\n        if (organizationId !== undefined) {\n          conditions.push(`\"organizationId\" = $${paramIndex++}`);\n          queryParams.push(organizationId);\n        }\n        if (projectId !== undefined) {\n          conditions.push(`\"projectId\" = $${paramIndex++}`);\n          queryParams.push(projectId);\n        }\n      }\n\n      const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n        queryParams,\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return { results: [], pagination: { total: 0, page, perPage: perPageInput, hasMore: false } };\n      }\n\n      const perPage = normalizePerPage(perPageInput, 100);\n      const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n      const limitValue = perPageInput === false ? total : perPage;\n\n      const rows = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"startedAt\" ASC LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`,\n        [...queryParams, limitValue, offset],\n      );\n\n      return {\n        results: (rows || []).map(row => this.transformExperimentResultRow(row)),\n        pagination: {\n          total,\n          page,\n          perPage: perPageForResponse,\n          hasMore: perPageInput === false ? false : offset + perPage < total,\n        },\n      };\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_EXPERIMENT_RESULTS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteExperimentResults({\n    experimentId,\n    filters,\n  }: {\n    experimentId: string;\n    filters?: ExperimentTenancyFilters;\n  }): Promise<void> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_EXPERIMENT_RESULTS, schemaName: getSchemaName(this.#schema) });\n      const experimentsTable = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n\n      // Atomic gate + cascade under SELECT ... FOR UPDATE. Silent no-op on\n      // tenancy mismatch.\n      if (filters?.organizationId !== undefined || filters?.projectId !== undefined) {\n        const { conditions, params } = tenancyWhere(filters, 2);\n        const gateSql = `SELECT \"id\" FROM ${experimentsTable} WHERE ${['\"id\" = $1', ...conditions].join(' AND ')} FOR UPDATE`;\n\n        await this.#db.client.tx(async t => {\n          const parent = await t.oneOrNone(gateSql, [experimentId, ...params]);\n          if (!parent) return;\n          await t.none(`DELETE FROM ${tableName} WHERE \"experimentId\" = $1`, [experimentId]);\n        });\n        return;\n      }\n\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"experimentId\" = $1`, [experimentId]);\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_EXPERIMENT_RESULTS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  // --- Aggregation ---\n\n  async getReviewSummary(): Promise<ExperimentReviewCounts[]> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_EXPERIMENT_RESULTS, schemaName: getSchemaName(this.#schema) });\n      const rows = await this.#db.readClient.manyOrNone(\n        `SELECT\n          \"experimentId\",\n          COUNT(*)::int as total,\n          SUM(CASE WHEN status = 'needs-review' THEN 1 ELSE 0 END)::int as \"needsReview\",\n          SUM(CASE WHEN status = 'reviewed' THEN 1 ELSE 0 END)::int as reviewed,\n          SUM(CASE WHEN status = 'complete' THEN 1 ELSE 0 END)::int as complete\n        FROM ${tableName}\n        GROUP BY \"experimentId\"`,\n      );\n\n      return (rows || []).map(row => ({\n        experimentId: row.experimentId as string,\n        total: Number(row.total ?? 0),\n        needsReview: Number(row.needsReview ?? 0),\n        reviewed: Number(row.reviewed ?? 0),\n        complete: Number(row.complete ?? 0),\n      }));\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_REVIEW_SUMMARY', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  // --- Clear ---\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_EXPERIMENT_RESULTS });\n    await this.#db.clearTable({ tableName: TABLE_EXPERIMENTS });\n  }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n  FavoritesStorage,\n  createStorageErrorId,\n  TABLE_AGENTS,\n  TABLE_SKILLS,\n  TABLE_FAVORITES,\n  TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n  StorageDeleteFavoritesForEntityInput,\n  StorageIsFavoritedBatchInput,\n  StorageListFavoritesInput,\n  StorageFavoriteEntityType,\n  StorageFavoriteKey,\n} from '@mastra/core/storage';\nimport type { FavoriteToggleResult } from '@mastra/core/storage/domains/favorites';\n\nimport { PgDB, resolvePgConfig, generateTableSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName } from '../utils';\n\n/**\n * Maps a favorite entity type to its parent entity table.\n */\nconst ENTITY_TABLE: Record<StorageFavoriteEntityType, typeof TABLE_AGENTS | typeof TABLE_SKILLS> = {\n  agent: TABLE_AGENTS,\n  skill: TABLE_SKILLS,\n};\n\nexport class FavoritesPG extends FavoritesStorage {\n  #db: PgDB;\n  #schema: string;\n\n  static readonly MANAGED_TABLES = [TABLE_FAVORITES] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    for (const tableName of FavoritesPG.MANAGED_TABLES) {\n      statements.push(\n        generateTableSQL({\n          tableName,\n          schema: TABLE_SCHEMAS[tableName],\n          schemaName,\n          compositePrimaryKey: ['userId', 'entityType', 'entityId'],\n          includeAllConstraints: true,\n        }),\n      );\n    }\n    // Lookup index for entity-scoped queries — must mirror init().\n    const fullFavoritesTable = getTableName({ indexName: TABLE_FAVORITES, schemaName: getSchemaName(schemaName) });\n    statements.push(\n      `CREATE INDEX IF NOT EXISTS idx_favorites_entity ON ${fullFavoritesTable} (\"entityType\", \"entityId\");`,\n    );\n    return statements;\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({\n      tableName: TABLE_FAVORITES,\n      schema: TABLE_SCHEMAS[TABLE_FAVORITES],\n      compositePrimaryKey: ['userId', 'entityType', 'entityId'],\n    });\n\n    // Lookup index for entity-scoped queries (cascade delete, count rebuild).\n    const fullTableName = getTableName({ indexName: TABLE_FAVORITES, schemaName: getSchemaName(this.#schema) });\n    await this.#db.createIndexFromStatement(\n      'idx_favorites_entity',\n      `CREATE INDEX IF NOT EXISTS idx_favorites_entity ON ${fullTableName} (\"entityType\", \"entityId\")`,\n    );\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    const fullTableName = getTableName({ indexName: TABLE_FAVORITES, schemaName: getSchemaName(this.#schema) });\n    const fullAgentsTable = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n    const fullSkillsTable = getTableName({ indexName: TABLE_SKILLS, schemaName: getSchemaName(this.#schema) });\n    await this.#db.client.tx(async t => {\n      await t.none(`DELETE FROM ${fullTableName}`);\n      // Reset denormalized counters on parent entities so reads don't return stale counts.\n      await t.none(`UPDATE ${fullAgentsTable} SET \"favoriteCount\" = 0 WHERE \"favoriteCount\" > 0`);\n      await t.none(`UPDATE ${fullSkillsTable} SET \"favoriteCount\" = 0 WHERE \"favoriteCount\" > 0`);\n    });\n  }\n\n  async favorite(input: StorageFavoriteKey): Promise<FavoriteToggleResult> {\n    const { userId, entityType, entityId } = input;\n    const entityTable = ENTITY_TABLE[entityType];\n    const fullFavoritesTable = getTableName({ indexName: TABLE_FAVORITES, schemaName: getSchemaName(this.#schema) });\n    const fullEntityTable = getTableName({ indexName: entityTable, schemaName: getSchemaName(this.#schema) });\n\n    try {\n      return await this.#db.client.tx(async t => {\n        // Verify entity exists; throw before any mutation if not.\n        const entityRow = await t.oneOrNone(`SELECT \"favoriteCount\" FROM ${fullEntityTable} WHERE id = $1`, [entityId]);\n        if (!entityRow) {\n          throw new MastraError({\n            id: createStorageErrorId('PG', 'FAVORITE', 'ENTITY_NOT_FOUND'),\n            domain: ErrorDomain.STORAGE,\n            category: ErrorCategory.USER,\n            text: `${entityType} ${entityId} not found`,\n            details: { entityType, entityId },\n          });\n        }\n\n        // Idempotent insert.\n        const inserted = await t.oneOrNone(\n          `INSERT INTO ${fullFavoritesTable} (\"userId\", \"entityType\", \"entityId\", \"createdAt\", \"createdAtZ\")\n           VALUES ($1, $2, $3, $4, $5)\n           ON CONFLICT (\"userId\", \"entityType\", \"entityId\") DO NOTHING\n           RETURNING \"userId\"`,\n          [userId, entityType, entityId, new Date().toISOString(), new Date().toISOString()],\n        );\n\n        if (inserted) {\n          await t.none(\n            `UPDATE ${fullEntityTable} SET \"favoriteCount\" = COALESCE(\"favoriteCount\", 0) + 1 WHERE id = $1`,\n            [entityId],\n          );\n        }\n\n        const after = await t.one(`SELECT \"favoriteCount\" FROM ${fullEntityTable} WHERE id = $1`, [entityId]);\n        const favoriteCount = Number(after.favoriteCount ?? 0);\n        return { favorited: true, favoriteCount };\n      });\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'FAVORITE', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { entityType, entityId },\n        },\n        error,\n      );\n    }\n  }\n\n  async unfavorite(input: StorageFavoriteKey): Promise<FavoriteToggleResult> {\n    const { userId, entityType, entityId } = input;\n    const entityTable = ENTITY_TABLE[entityType];\n    const fullFavoritesTable = getTableName({ indexName: TABLE_FAVORITES, schemaName: getSchemaName(this.#schema) });\n    const fullEntityTable = getTableName({ indexName: entityTable, schemaName: getSchemaName(this.#schema) });\n\n    try {\n      return await this.#db.client.tx(async t => {\n        const entityRow = await t.oneOrNone(`SELECT \"favoriteCount\" FROM ${fullEntityTable} WHERE id = $1`, [entityId]);\n        if (!entityRow) {\n          throw new MastraError({\n            id: createStorageErrorId('PG', 'UNFAVORITE', 'ENTITY_NOT_FOUND'),\n            domain: ErrorDomain.STORAGE,\n            category: ErrorCategory.USER,\n            text: `${entityType} ${entityId} not found`,\n            details: { entityType, entityId },\n          });\n        }\n\n        const deleted = await t.oneOrNone(\n          `DELETE FROM ${fullFavoritesTable} WHERE \"userId\" = $1 AND \"entityType\" = $2 AND \"entityId\" = $3 RETURNING \"userId\"`,\n          [userId, entityType, entityId],\n        );\n\n        if (deleted) {\n          await t.none(\n            `UPDATE ${fullEntityTable} SET \"favoriteCount\" = GREATEST(COALESCE(\"favoriteCount\", 0) - 1, 0) WHERE id = $1`,\n            [entityId],\n          );\n        }\n\n        const after = await t.one(`SELECT \"favoriteCount\" FROM ${fullEntityTable} WHERE id = $1`, [entityId]);\n        const favoriteCount = Number(after.favoriteCount ?? 0);\n        return { favorited: false, favoriteCount };\n      });\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UNFAVORITE', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { entityType, entityId },\n        },\n        error,\n      );\n    }\n  }\n\n  async isFavorited(input: StorageFavoriteKey): Promise<boolean> {\n    const fullFavoritesTable = getTableName({ indexName: TABLE_FAVORITES, schemaName: getSchemaName(this.#schema) });\n    try {\n      const result = await this.#db.readClient.oneOrNone(\n        `SELECT 1 FROM ${fullFavoritesTable} WHERE \"userId\" = $1 AND \"entityType\" = $2 AND \"entityId\" = $3 LIMIT 1`,\n        [input.userId, input.entityType, input.entityId],\n      );\n      return result !== null;\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'IS_FAVORITED', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async isFavoritedBatch(input: StorageIsFavoritedBatchInput): Promise<Set<string>> {\n    const { userId, entityType, entityIds } = input;\n    if (entityIds.length === 0) {\n      return new Set();\n    }\n    const fullFavoritesTable = getTableName({ indexName: TABLE_FAVORITES, schemaName: getSchemaName(this.#schema) });\n    try {\n      const placeholders = entityIds.map((_, i) => `$${i + 3}`).join(', ');\n      const rows = await this.#db.readClient.manyOrNone<{ entityId: string }>(\n        `SELECT \"entityId\" FROM ${fullFavoritesTable} WHERE \"userId\" = $1 AND \"entityType\" = $2 AND \"entityId\" IN (${placeholders})`,\n        [userId, entityType, ...entityIds],\n      );\n      const set = new Set<string>();\n      for (const row of rows ?? []) {\n        set.add(row.entityId);\n      }\n      return set;\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'IS_FAVORITED_BATCH', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async listFavoritedIds(input: StorageListFavoritesInput): Promise<string[]> {\n    const fullFavoritesTable = getTableName({ indexName: TABLE_FAVORITES, schemaName: getSchemaName(this.#schema) });\n    try {\n      const rows = await this.#db.readClient.manyOrNone<{ entityId: string }>(\n        `SELECT \"entityId\" FROM ${fullFavoritesTable} WHERE \"userId\" = $1 AND \"entityType\" = $2 ORDER BY \"createdAt\" DESC, \"entityId\" ASC`,\n        [input.userId, input.entityType],\n      );\n      return (rows ?? []).map(row => row.entityId);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_FAVORITED_IDS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteFavoritesForEntity(input: StorageDeleteFavoritesForEntityInput): Promise<number> {\n    const fullFavoritesTable = getTableName({ indexName: TABLE_FAVORITES, schemaName: getSchemaName(this.#schema) });\n    const entityTable = ENTITY_TABLE[input.entityType];\n    const fullEntityTable = getTableName({ indexName: entityTable, schemaName: getSchemaName(this.#schema) });\n    try {\n      return await this.#db.client.tx(async t => {\n        // Use a CTE so the server returns the count without materializing each\n        // deleted row. For a hot cascade path this is meaningfully cheaper than\n        // round-tripping every userId back to the client.\n        const result = await t.one<{ count: string }>(\n          `WITH deleted AS (\n             DELETE FROM ${fullFavoritesTable} WHERE \"entityType\" = $1 AND \"entityId\" = $2 RETURNING 1\n           )\n           SELECT COUNT(*)::text AS count FROM deleted`,\n          [input.entityType, input.entityId],\n        );\n        // Reset the parent entity's favoriteCount so stale counts don't linger\n        // when the entity itself isn't being deleted in the same operation.\n        await t.none(`UPDATE ${fullEntityTable} SET \"favoriteCount\" = 0 WHERE id = $1`, [input.entityId]);\n        return Number(result.count);\n      });\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_FAVORITES_FOR_ENTITY', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { entityType: input.entityType, entityId: input.entityId },\n        },\n        error,\n      );\n    }\n  }\n}\n","import {\n  assertKnowledgeCeilingRaised,\n  assertKnowledgeScopeWithinCeiling,\n  canonicalizeKnowledgeScope,\n  createKnowledgeUlid,\n  isKnowledgeScopeVisible,\n  KNOWLEDGE_ACTIVITY_SCHEMA,\n  KNOWLEDGE_CURSORS_SCHEMA,\n  KNOWLEDGE_RECORDS_SCHEMA,\n  KNOWLEDGE_MENTIONS_SCHEMA,\n  KNOWLEDGE_NODES_SCHEMA,\n  KNOWLEDGE_SEMANTIC_OUTBOX_SCHEMA,\n  knowledgeScopeKey,\n  knowledgeSemanticDocumentId,\n  knowledgeSemanticIdempotencyKey,\n  KnowledgeConflictError,\n  KnowledgeNotFoundError,\n  KnowledgeStorage,\n  parseKnowledgeNodeCursor,\n  parseKnowledgeWikilinks,\n  TABLE_KNOWLEDGE_ACTIVITY,\n  TABLE_KNOWLEDGE_CURSORS,\n  TABLE_KNOWLEDGE_RECORDS,\n  TABLE_KNOWLEDGE_MENTIONS,\n  TABLE_KNOWLEDGE_NODES,\n  TABLE_KNOWLEDGE_SEMANTIC_OUTBOX,\n} from '@mastra/core/storage';\nimport type {\n  AppendKnowledgeInput,\n  ClaimKnowledgeSemanticOutboxInput,\n  CreateKnowledgeNodeInput,\n  KnowledgeActivityAction,\n  KnowledgeActivityEvent,\n  KnowledgeCurationCursor,\n  KnowledgeNode,\n  KnowledgeRecord,\n  KnowledgeScope,\n  KnowledgeSemanticDocumentType,\n  KnowledgeSemanticOperation,\n  KnowledgeSemanticOutboxEntry,\n  QueryKnowledgeBySourceInput,\n  QueryKnowledgeInput,\n  QueryKnowledgeOutput,\n  ListKnowledgeNodesInput,\n  SearchKnowledgeInput,\n  SearchKnowledgeResult,\n  UpdateKnowledgeNodeInput,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\nimport type { QueryValues, TxClient } from '../../client';\nimport { generateTableSQL, PgDB, resolvePgConfig } from '../../db';\nimport type { DbClient, PgDomainConfig } from '../../db';\n\n// #21830 shipped this helper in core 1.63.1; resolve it lazily so an older\n// installed core fails feature-detection instead of breaking module load.\nlet assertDescriptionWithinBound: ((description: string | undefined) => void) | undefined;\nasync function assertKnowledgeDescriptionWithinBoundCompat(description: string | undefined): Promise<void> {\n  let assertWithinBound = assertDescriptionWithinBound;\n  if (!assertWithinBound) {\n    const mod: Partial<typeof import('@mastra/core/storage')> = await import('@mastra/core/storage');\n    const resolvedAssert: (description: string | undefined) => void =\n      mod.assertKnowledgeDescriptionWithinBound ??\n      (value => {\n        if (value !== undefined && value.length > 400) {\n          throw new Error('Knowledge node description exceeds the 400 UTF-16 code unit limit');\n        }\n      });\n    assertDescriptionWithinBound = resolvedAssert;\n    assertWithinBound = resolvedAssert;\n  }\n  assertWithinBound(description);\n}\n\ninterface QueryResult {\n  rows: Record<string, unknown>[];\n  rowsAffected: number;\n}\n\ninterface Executor {\n  execute(statement: string | { sql: string; args?: QueryValues }): Promise<QueryResult>;\n}\n\nconst camelCaseColumns = [\n  'canonicalName',\n  'scopeKey',\n  'mergedInto',\n  'createdAt',\n  'updatedAt',\n  'node',\n  'sourceThreadId',\n  'capturedAt',\n  'maxScope',\n  'deletedAt',\n  'deletedBy',\n  'sourceType',\n  'sourceId',\n  'recordId',\n  'lastKnowledgeId',\n  'recordType',\n  'idempotencyKey',\n  'documentId',\n  'documentType',\n  'availableAt',\n  'claimedAt',\n  'claimedBy',\n  'completedAt',\n] as const;\n\nfunction transformSqlCode(sql: string, transform: (code: string) => string): string {\n  return sql\n    .split(/('(?:''|[^'])*')/g)\n    .map((part, index) => (index % 2 === 0 ? transform(part) : part))\n    .join('');\n}\n\nexport function postgresSql(sql: string, schemaName?: string): string {\n  let normalized = transformSqlCode(sql, code => {\n    let transformed = code.replace(/jsonb\\(\\?\\)/g, '?::jsonb');\n    for (const column of camelCaseColumns) {\n      transformed = transformed.replace(new RegExp(`(?<!\")\\\\b${column}\\\\b(?!\")`, 'g'), `\"${column}\"`);\n    }\n    return transformed;\n  });\n  if (schemaName) {\n    const quotedSchema = `\"${parseSqlIdentifier(schemaName, 'schema name')}\"`;\n    normalized = transformSqlCode(normalized, code => {\n      let transformed = code;\n      for (const table of [\n        TABLE_KNOWLEDGE_NODES,\n        TABLE_KNOWLEDGE_RECORDS,\n        TABLE_KNOWLEDGE_MENTIONS,\n        TABLE_KNOWLEDGE_CURSORS,\n        TABLE_KNOWLEDGE_ACTIVITY,\n        TABLE_KNOWLEDGE_SEMANTIC_OUTBOX,\n      ]) {\n        transformed = transformed.replaceAll(`\"${table}\"`, `${quotedSchema}.\"${table}\"`);\n      }\n      return transformed;\n    });\n  }\n  let index = 0;\n  return transformSqlCode(normalized, code => code.replace(/\\?/g, () => `$${++index}`));\n}\n\nfunction createExecutor(client: Pick<DbClient, 'query'> | TxClient, schemaName?: string): Executor {\n  return {\n    async execute(statement) {\n      const sql = typeof statement === 'string' ? statement : statement.sql;\n      const args = typeof statement === 'string' ? [] : (statement.args ?? []);\n      const result = await client.query(postgresSql(sql, schemaName), args);\n      return { rows: result.rows as Record<string, unknown>[], rowsAffected: result.rowCount ?? 0 };\n    },\n  };\n}\n\nconst visibleSql = `(scopeKey = ? OR LEFT(?, LENGTH(scopeKey) + 1) = scopeKey || chr(31))`;\n\nfunction parseJson<T>(value: unknown): T {\n  if (typeof value === 'string') return JSON.parse(value) as T;\n  if (value instanceof Uint8Array) return JSON.parse(new TextDecoder().decode(value)) as T;\n  if (value instanceof ArrayBuffer) return JSON.parse(new TextDecoder().decode(value)) as T;\n  return value as T;\n}\n\n/**\n * Knowledge timestamps are written as UTC digits into timezone-naive columns\n * ({@link postgresTimestamp} and the ISO strings passed to inserts), but the\n * driver parses naive columns in the process-local timezone. Reinterpret the\n * parsed components as UTC so reads return the digits that were stored.\n */\nfunction toDate(value: unknown): Date {\n  if (value instanceof Date) {\n    return new Date(\n      Date.UTC(\n        value.getFullYear(),\n        value.getMonth(),\n        value.getDate(),\n        value.getHours(),\n        value.getMinutes(),\n        value.getSeconds(),\n        value.getMilliseconds(),\n      ),\n    );\n  }\n  const text = String(value);\n  if (/(Z|[+-]\\d{2}(:?\\d{2})?)$/.test(text)) return new Date(text);\n  return new Date(`${text.replace(' ', 'T')}Z`);\n}\n\nfunction optionalDate(value: unknown): Date | undefined {\n  return value == null ? undefined : toDate(value);\n}\n\nfunction postgresTimestamp(value: Date): string {\n  const pad = (part: number, width = 2) => String(part).padStart(width, '0');\n  return `${value.getUTCFullYear()}-${pad(value.getUTCMonth() + 1)}-${pad(value.getUTCDate())} ${pad(value.getUTCHours())}:${pad(value.getUTCMinutes())}:${pad(value.getUTCSeconds())}.${pad(value.getUTCMilliseconds(), 3)}`;\n}\n\nfunction canonicalName(name: string): string {\n  return name.trim().toLocaleLowerCase();\n}\n\nfunction nodeReferenceId(node: KnowledgeNode | string): string {\n  return typeof node === 'string' ? node : node.id;\n}\n\nfunction escapeLikePattern(value: string): string {\n  return value.replaceAll('=', '==').replaceAll('%', '=%').replaceAll('_', '=_');\n}\n\nfunction parseNode(row: Record<string, unknown>): KnowledgeNode {\n  return {\n    id: String(row.id),\n    type: 'node',\n    name: String(row.name),\n    kind: String(row.kind),\n    content: row.content == null ? undefined : String(row.content),\n    description: row.description == null ? undefined : String(row.description),\n    scope: parseJson(row.scopeJson ?? row.scope),\n    version: Number(row.version),\n    mergedInto: row.mergedInto == null ? undefined : String(row.mergedInto),\n    createdAt: toDate(row.createdAt),\n    updatedAt: toDate(row.updatedAt),\n  };\n}\n\nfunction parseKnowledge(row: Record<string, unknown>): KnowledgeRecord {\n  return {\n    id: String(row.id),\n    node: String(row.node),\n    text: String(row.text),\n    scope: parseJson(row.scopeJson ?? row.scope),\n    sourceThreadId: String(row.sourceThreadId),\n    capturedAt: toDate(row.capturedAt),\n    when: optionalDate(row.when),\n    maxScope: row.maxScope == null ? undefined : (String(row.maxScope) as KnowledgeRecord['maxScope']),\n    metadata: row.metadata == null ? undefined : parseJson<Record<string, unknown>>(row.metadata),\n    deletedAt: optionalDate(row.deletedAt),\n    deletedBy: row.deletedBy == null ? undefined : String(row.deletedBy),\n  };\n}\n\nfunction parseOutbox(row: Record<string, unknown>): KnowledgeSemanticOutboxEntry {\n  return {\n    id: String(row.id),\n    idempotencyKey: String(row.idempotencyKey),\n    documentId: String(row.documentId),\n    documentType: String(row.documentType) as KnowledgeSemanticDocumentType,\n    operation: String(row.operation) as KnowledgeSemanticOperation,\n    scope: parseJson(row.scopeJson ?? row.scope),\n    status: String(row.status) as KnowledgeSemanticOutboxEntry['status'],\n    attempts: Number(row.attempts),\n    availableAt: toDate(row.availableAt),\n    claimedAt: optionalDate(row.claimedAt),\n    claimedBy: row.claimedBy == null ? undefined : String(row.claimedBy),\n    createdAt: toDate(row.createdAt),\n    completedAt: optionalDate(row.completedAt),\n  };\n}\n\nfunction knowledgeIndexes(schemaName?: string): Array<{ name: string; sql: string }> {\n  const table = (name: string) => {\n    const quotedName = `\"${parseSqlIdentifier(name, 'table name')}\"`;\n    return schemaName ? `\"${parseSqlIdentifier(schemaName, 'schema name')}\".${quotedName}` : quotedName;\n  };\n  return [\n    {\n      name: 'idx_knowledge_nodes_identity',\n      sql: `CREATE UNIQUE INDEX IF NOT EXISTS idx_knowledge_nodes_identity ON ${table(TABLE_KNOWLEDGE_NODES)} (\"type\", \"scopeKey\", \"canonicalName\");`,\n    },\n    {\n      name: 'idx_knowledge_nodes_scope',\n      sql: `CREATE INDEX IF NOT EXISTS idx_knowledge_nodes_scope ON ${table(TABLE_KNOWLEDGE_NODES)} (\"scopeKey\", \"type\");`,\n    },\n    {\n      name: 'idx_knowledge_records_node_latest',\n      sql: `CREATE INDEX IF NOT EXISTS idx_knowledge_records_node_latest ON ${table(TABLE_KNOWLEDGE_RECORDS)} (\"node\", \"id\" DESC);`,\n    },\n    {\n      name: 'idx_knowledge_records_thread_latest',\n      sql: `CREATE INDEX IF NOT EXISTS idx_knowledge_records_thread_latest ON ${table(TABLE_KNOWLEDGE_RECORDS)} (\"sourceThreadId\", \"id\" DESC);`,\n    },\n    {\n      name: 'idx_knowledge_mentions_record',\n      sql: `CREATE INDEX IF NOT EXISTS idx_knowledge_mentions_record ON ${table(TABLE_KNOWLEDGE_MENTIONS)} (\"recordId\", \"sourceType\", \"sourceId\");`,\n    },\n    {\n      name: 'idx_knowledge_activity_latest',\n      sql: `CREATE INDEX IF NOT EXISTS idx_knowledge_activity_latest ON ${table(TABLE_KNOWLEDGE_ACTIVITY)} (\"id\" DESC);`,\n    },\n    {\n      name: 'idx_knowledge_outbox_idempotency',\n      sql: `CREATE UNIQUE INDEX IF NOT EXISTS idx_knowledge_outbox_idempotency ON ${table(TABLE_KNOWLEDGE_SEMANTIC_OUTBOX)} (\"idempotencyKey\");`,\n    },\n    {\n      name: 'idx_knowledge_outbox_claim',\n      sql: `CREATE INDEX IF NOT EXISTS idx_knowledge_outbox_claim ON ${table(TABLE_KNOWLEDGE_SEMANTIC_OUTBOX)} (\"status\", \"availableAt\", \"createdAt\");`,\n    },\n  ];\n}\n\nfunction knowledgeIndexDDL(schemaName?: string): string[] {\n  return knowledgeIndexes(schemaName).map(index => index.sql);\n}\n\nexport class KnowledgePG extends KnowledgeStorage {\n  static readonly MANAGED_TABLES = [\n    TABLE_KNOWLEDGE_NODES,\n    TABLE_KNOWLEDGE_RECORDS,\n    TABLE_KNOWLEDGE_MENTIONS,\n    TABLE_KNOWLEDGE_CURSORS,\n    TABLE_KNOWLEDGE_ACTIVITY,\n    TABLE_KNOWLEDGE_SEMANTIC_OUTBOX,\n  ] as const;\n\n  static getExportDDL(schemaName?: string): string[] {\n    return [\n      generateTableSQL({\n        tableName: TABLE_KNOWLEDGE_NODES,\n        schema: KNOWLEDGE_NODES_SCHEMA,\n        schemaName,\n        includeAllConstraints: true,\n      }),\n      generateTableSQL({\n        tableName: TABLE_KNOWLEDGE_RECORDS,\n        schema: KNOWLEDGE_RECORDS_SCHEMA,\n        schemaName,\n        includeAllConstraints: true,\n      }),\n      generateTableSQL({\n        tableName: TABLE_KNOWLEDGE_MENTIONS,\n        schema: KNOWLEDGE_MENTIONS_SCHEMA,\n        schemaName,\n        compositePrimaryKey: ['sourceType', 'sourceId', 'recordId'],\n        includeAllConstraints: true,\n      }),\n      generateTableSQL({\n        tableName: TABLE_KNOWLEDGE_CURSORS,\n        schema: KNOWLEDGE_CURSORS_SCHEMA,\n        schemaName,\n        compositePrimaryKey: ['sourceThreadId', 'agent'],\n        includeAllConstraints: true,\n      }),\n      generateTableSQL({\n        tableName: TABLE_KNOWLEDGE_ACTIVITY,\n        schema: KNOWLEDGE_ACTIVITY_SCHEMA,\n        schemaName,\n        includeAllConstraints: true,\n      }),\n      generateTableSQL({\n        tableName: TABLE_KNOWLEDGE_SEMANTIC_OUTBOX,\n        schema: KNOWLEDGE_SEMANTIC_OUTBOX_SCHEMA,\n        schemaName,\n        includeAllConstraints: true,\n      }),\n      ...knowledgeIndexDDL(schemaName),\n    ];\n  }\n\n  readonly #client: DbClient;\n  readonly #executor: Executor;\n  /** Reader-backed executor for standalone reads; mutations and read-modify-write stay on #executor. */\n  readonly #readExecutor: Executor;\n  readonly #db: PgDB;\n  readonly #schemaName?: string;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes } = resolvePgConfig(config);\n    this.#client = client;\n    this.#schemaName = schemaName;\n    this.#executor = createExecutor(client, schemaName);\n    this.#readExecutor = createExecutor(readClient, schemaName);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({ tableName: TABLE_KNOWLEDGE_NODES, schema: KNOWLEDGE_NODES_SCHEMA });\n    // Add description column for backwards compatibility with existing databases\n    await this.#db.alterTable({\n      tableName: TABLE_KNOWLEDGE_NODES,\n      schema: KNOWLEDGE_NODES_SCHEMA,\n      ifNotExists: ['description'],\n    });\n    await this.#db.createTable({ tableName: TABLE_KNOWLEDGE_RECORDS, schema: KNOWLEDGE_RECORDS_SCHEMA });\n    await this.#db.createTable({\n      tableName: TABLE_KNOWLEDGE_MENTIONS,\n      schema: KNOWLEDGE_MENTIONS_SCHEMA,\n      compositePrimaryKey: ['sourceType', 'sourceId', 'recordId'],\n    });\n    await this.#db.createTable({\n      tableName: TABLE_KNOWLEDGE_CURSORS,\n      schema: KNOWLEDGE_CURSORS_SCHEMA,\n      compositePrimaryKey: ['sourceThreadId', 'agent'],\n    });\n    await this.#db.createTable({ tableName: TABLE_KNOWLEDGE_ACTIVITY, schema: KNOWLEDGE_ACTIVITY_SCHEMA });\n    await this.#db.createTable({\n      tableName: TABLE_KNOWLEDGE_SEMANTIC_OUTBOX,\n      schema: KNOWLEDGE_SEMANTIC_OUTBOX_SCHEMA,\n    });\n    await Promise.all(\n      knowledgeIndexes(this.#schemaName).map(index => this.#db.createIndexFromStatement(index.name, index.sql)),\n    );\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#transaction(async tx => {\n      for (const table of [\n        TABLE_KNOWLEDGE_MENTIONS,\n        TABLE_KNOWLEDGE_RECORDS,\n        TABLE_KNOWLEDGE_NODES,\n        TABLE_KNOWLEDGE_CURSORS,\n        TABLE_KNOWLEDGE_ACTIVITY,\n        TABLE_KNOWLEDGE_SEMANTIC_OUTBOX,\n      ]) {\n        await tx.execute(`DELETE FROM \"${table}\"`);\n      }\n    });\n  }\n\n  async createNode(input: CreateKnowledgeNodeInput): Promise<KnowledgeNode> {\n    await assertKnowledgeDescriptionWithinBoundCompat(input.description);\n    const scope = canonicalizeKnowledgeScope(input.scope);\n    return this.#transaction(async tx => {\n      const existing = await this.#getNodeByName(tx, input.name, scope);\n      if (existing) {\n        const terminal = (await this.#resolveTerminalNode(tx, existing.id))!;\n        if (!isKnowledgeScopeVisible(terminal.scope, scope)) {\n          throw new Error(`Merged knowledge node is not visible from scope: ${input.name}`);\n        }\n        return terminal;\n      }\n      const now = new Date();\n      const node: KnowledgeNode = {\n        id: input.id ?? crypto.randomUUID(),\n        type: 'node',\n        name: input.name.trim(),\n        kind: input.kind,\n        content: input.content,\n        description: input.description,\n        scope,\n        version: 1,\n        createdAt: now,\n        updatedAt: now,\n      };\n      await tx.execute({\n        sql: `INSERT INTO \"${TABLE_KNOWLEDGE_NODES}\" (id,type,name,canonicalName,kind,content,description,scope,scopeKey,version,mergedInto,createdAt,updatedAt) VALUES (?,?,?,?,?,?,?,jsonb(?),?,?,NULL,?,?)`,\n        args: [\n          node.id,\n          'node',\n          node.name,\n          canonicalName(node.name),\n          node.kind,\n          node.content ?? null,\n          node.description ?? null,\n          JSON.stringify(scope),\n          knowledgeScopeKey(scope),\n          node.version,\n          now.toISOString(),\n          now.toISOString(),\n        ],\n      });\n      await this.#replaceMentions(tx, 'node', node.id, node.content ?? '', input.resolutionScope ?? scope, scope);\n      await this.#activity(tx, 'node-created', 'node', node.id, scope);\n      await this.#outbox(tx, 'node', node.id, 'upsert', node.version, scope);\n      return node;\n    });\n  }\n\n  async getNode(id: string): Promise<KnowledgeNode | null> {\n    return this.#getNode(this.#readExecutor, id);\n  }\n\n  async getNodeByName(input: { name: string; scope: KnowledgeScope }): Promise<KnowledgeNode | null> {\n    return this.#getNodeByName(this.#readExecutor, input.name, canonicalizeKnowledgeScope(input.scope));\n  }\n\n  async resolveNode(input: { name: string; scope: KnowledgeScope }): Promise<KnowledgeNode | null> {\n    return this.#resolveNode(this.#readExecutor, input.name, canonicalizeKnowledgeScope(input.scope));\n  }\n\n  async listNodes(input: ListKnowledgeNodesInput): Promise<KnowledgeNode[]> {\n    const scope = canonicalizeKnowledgeScope(input.scope);\n    const key = knowledgeScopeKey(scope);\n    const clauses = [`type = 'node'`, 'mergedInto IS NULL', visibleSql];\n    const args: QueryValues = [key, key];\n    if (input.namePrefix) {\n      clauses.push(\"canonicalName LIKE ? ESCAPE '='\");\n      args.push(`${escapeLikePattern(canonicalName(input.namePrefix))}%`);\n    }\n    if (input.kind) {\n      clauses.push('kind = ?');\n      args.push(input.kind);\n    }\n    if (input.hasContent !== undefined)\n      clauses.push(input.hasContent ? \"content IS NOT NULL AND content <> ''\" : \"(content IS NULL OR content = '')\");\n    if (input.cursor) {\n      const cursor = parseKnowledgeNodeCursor(input.cursor, {\n        namePrefix: input.namePrefix,\n        kind: input.kind,\n        hasContent: input.hasContent,\n      });\n      const updatedAt = postgresTimestamp(cursor.updatedAt);\n      clauses.push('(updatedAt < ? OR (updatedAt = ? AND (name > ? OR (name = ? AND id > ?))))');\n      args.push(updatedAt, updatedAt, cursor.name, cursor.name, cursor.id);\n    }\n    args.push(input.limit ?? 100);\n    const result = await this.#readExecutor.execute({\n      sql: `SELECT *, scope AS \"scopeJson\" FROM \"${TABLE_KNOWLEDGE_NODES}\" WHERE ${clauses.join(' AND ')} ORDER BY updatedAt DESC, name ASC, id ASC LIMIT ?`,\n      args,\n    });\n    return result.rows.map(parseNode);\n  }\n\n  async updateNode(input: UpdateKnowledgeNodeInput): Promise<KnowledgeNode> {\n    await assertKnowledgeDescriptionWithinBoundCompat(input.description);\n    return this.#transaction(async tx => {\n      const existing = await this.#getNode(tx, input.id);\n      if (!existing) throw new KnowledgeNotFoundError('node', input.id);\n      if (existing.mergedInto) throw new Error(`Cannot update merged knowledge node: ${input.id}`);\n      const scope = canonicalizeKnowledgeScope(input.scope ?? existing.scope);\n      const name = (input.name ?? existing.name).trim();\n      const content = input.content ?? existing.content;\n      const description = input.description ?? existing.description;\n      const now = new Date();\n      const result = await tx.execute({\n        sql: `UPDATE \"${TABLE_KNOWLEDGE_NODES}\" SET name=?,canonicalName=?,kind=?,content=?,description=?,scope=jsonb(?),scopeKey=?,version=version+1,updatedAt=? WHERE id=? AND type='node' AND version=?`,\n        args: [\n          name,\n          canonicalName(name),\n          input.kind ?? existing.kind,\n          content ?? null,\n          description ?? null,\n          JSON.stringify(scope),\n          knowledgeScopeKey(scope),\n          now.toISOString(),\n          input.id,\n          input.version,\n        ],\n      });\n      if (result.rowsAffected === 0) throw new KnowledgeConflictError(input.id);\n      if (input.content !== undefined || input.name !== undefined || input.scope !== undefined) {\n        await this.#replaceMentions(tx, 'node', input.id, content ?? '', input.resolutionScope ?? scope, scope);\n      }\n      await this.#activity(tx, 'node-updated', 'node', input.id, scope);\n      if (knowledgeScopeKey(existing.scope) !== knowledgeScopeKey(scope)) {\n        await this.#outbox(tx, 'node', input.id, 'delete', createKnowledgeUlid(), existing.scope);\n        const records = await tx.execute({\n          sql: `SELECT id,scope AS \"scopeJson\",deletedAt FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE node=?`,\n          args: [input.id],\n        });\n        for (const row of records.rows) {\n          const factScope = parseJson<KnowledgeScope>(row.scopeJson);\n          await this.#outbox(tx, 'record', String(row.id), 'delete', createKnowledgeUlid(), factScope);\n          if (row.deletedAt == null) {\n            await this.#outbox(tx, 'record', String(row.id), 'upsert', createKnowledgeUlid(), factScope);\n          }\n        }\n      }\n      await this.#outbox(tx, 'node', input.id, 'upsert', input.version + 1, scope);\n      return {\n        ...existing,\n        name,\n        kind: input.kind ?? existing.kind,\n        content,\n        description,\n        scope,\n        version: input.version + 1,\n        updatedAt: now,\n      };\n    });\n  }\n\n  async mergeNodes(input: { sourceId: string; targetId: string; sourceVersion: number }): Promise<KnowledgeNode> {\n    if (input.sourceId === input.targetId) throw new Error('Cannot merge a knowledge node into itself');\n    return this.#transaction(async tx => {\n      const source = await this.#getNode(tx, input.sourceId);\n      if (!source) throw new KnowledgeNotFoundError('node', input.sourceId);\n      const target = await this.#resolveTerminalNode(tx, input.targetId);\n      if (!target) throw new KnowledgeNotFoundError('node', input.targetId);\n      if (target.id === source.id) throw new Error('Cannot create a knowledge merge cycle');\n      if (!isKnowledgeScopeVisible(target.scope, source.scope)) {\n        throw new Error('Cannot merge a knowledge node into a target that is narrower than its source scope');\n      }\n      const affected = await tx.execute({\n        sql: `SELECT DISTINCT m.sourceType,m.sourceId,COALESCE(f.scope,r.scope) AS \"scopeJson\",CASE WHEN f.deletedAt IS NULL THEN 0 ELSE 1 END AS deleted FROM \"${TABLE_KNOWLEDGE_MENTIONS}\" m LEFT JOIN \"${TABLE_KNOWLEDGE_RECORDS}\" f ON m.sourceType='record' AND f.id=m.sourceId LEFT JOIN \"${TABLE_KNOWLEDGE_NODES}\" r ON m.sourceType='node' AND r.id=m.sourceId WHERE m.recordId=?`,\n        args: [source.id],\n      });\n      const movedFacts = await tx.execute({\n        sql: `SELECT id,scope AS \"scopeJson\",deletedAt FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE node=?`,\n        args: [source.id],\n      });\n      const updated = await tx.execute({\n        sql: `UPDATE \"${TABLE_KNOWLEDGE_NODES}\" SET mergedInto=?,version=version+1,updatedAt=? WHERE id=? AND type='node' AND version=? AND mergedInto IS NULL`,\n        args: [target.id, new Date().toISOString(), source.id, input.sourceVersion],\n      });\n      if (updated.rowsAffected === 0) throw new KnowledgeConflictError(source.id);\n      await tx.execute({\n        sql: `UPDATE \"${TABLE_KNOWLEDGE_RECORDS}\" SET node=? WHERE node=?`,\n        args: [target.id, source.id],\n      });\n      await tx.execute({\n        sql: `DELETE FROM \"${TABLE_KNOWLEDGE_MENTIONS}\" WHERE recordId=? AND EXISTS (SELECT 1 FROM \"${TABLE_KNOWLEDGE_MENTIONS}\" target WHERE target.sourceType=\"${TABLE_KNOWLEDGE_MENTIONS}\".sourceType AND target.sourceId=\"${TABLE_KNOWLEDGE_MENTIONS}\".sourceId AND target.recordId=?)`,\n        args: [source.id, target.id],\n      });\n      await tx.execute({\n        sql: `UPDATE \"${TABLE_KNOWLEDGE_MENTIONS}\" SET recordId=? WHERE recordId=?`,\n        args: [target.id, source.id],\n      });\n      for (const row of movedFacts.rows)\n        await this.#outbox(\n          tx,\n          'record',\n          String(row.id),\n          row.deletedAt == null ? 'upsert' : 'delete',\n          createKnowledgeUlid(),\n          parseJson(row.scopeJson),\n        );\n      for (const row of affected.rows)\n        await this.#outbox(\n          tx,\n          String(row.sourceType) as 'record' | 'node',\n          String(row.sourceId),\n          Number(row.deleted) ? 'delete' : 'upsert',\n          createKnowledgeUlid(),\n          parseJson<KnowledgeScope>(row.scopeJson),\n        );\n      // Merge matrix: a target that NEVER had a description (undefined — '' is an explicit curator\n      // clear and wins) adopts the source's; otherwise the target's state is preserved.\n      let mergedTarget = target;\n      if (target.description === undefined && source.description) {\n        const adoptedAt = new Date();\n        // Adoption is conditional on the target state this merge observed: a concurrent write (a new\n        // description, or an intentional '' clear) bumps the version and loses the predicate, so the\n        // merge leaves that newer value alone instead of clobbering it with the source's synopsis.\n        const adopted = await tx.execute({\n          sql: `UPDATE \"${TABLE_KNOWLEDGE_NODES}\" SET description=?,version=version+1,updatedAt=? WHERE id=? AND type='node' AND version=? AND description IS NULL`,\n          args: [source.description, adoptedAt.toISOString(), target.id, target.version],\n        });\n        if (adopted.rowsAffected > 0) {\n          mergedTarget = {\n            ...target,\n            description: source.description,\n            version: target.version + 1,\n            updatedAt: adoptedAt,\n          };\n          await this.#activity(tx, 'node-updated', 'node', target.id, target.scope);\n        }\n      }\n      await this.#activity(tx, 'node-merged', 'node', source.id, source.scope);\n      await this.#outbox(tx, 'node', source.id, 'delete', input.sourceVersion + 1, source.scope);\n      await this.#outbox(tx, 'node', target.id, 'upsert', createKnowledgeUlid(), mergedTarget.scope);\n      return mergedTarget;\n    });\n  }\n\n  async appendKnowledge(input: AppendKnowledgeInput): Promise<KnowledgeRecord> {\n    const scope = canonicalizeKnowledgeScope(input.scope);\n    const resolutionScope = canonicalizeKnowledgeScope(input.resolutionScope);\n    const defaultScope = canonicalizeKnowledgeScope(input.defaultScope);\n    assertKnowledgeScopeWithinCeiling(scope, input.maxScope);\n    return this.#transaction(async tx => {\n      const parent = await this.#resolveTerminalNode(tx, nodeReferenceId(input.node));\n      if (!parent) throw new KnowledgeNotFoundError('node', nodeReferenceId(input.node));\n      const record: KnowledgeRecord = {\n        id: input.id ?? createKnowledgeUlid(),\n        node: parent.id,\n        text: input.text,\n        scope,\n        sourceThreadId: input.sourceThreadId,\n        capturedAt: new Date(),\n        when: input.when ? new Date(input.when) : undefined,\n        maxScope: input.maxScope,\n        metadata: input.metadata,\n      };\n      await tx.execute({\n        sql: `INSERT INTO \"${TABLE_KNOWLEDGE_RECORDS}\" (id,node,text,scope,scopeKey,sourceThreadId,capturedAt,\"when\",maxScope,metadata,deletedAt,deletedBy) VALUES (?,?,?,jsonb(?),?,?,?,?,?,jsonb(?),NULL,NULL)`,\n        args: [\n          record.id,\n          record.node,\n          record.text,\n          JSON.stringify(scope),\n          knowledgeScopeKey(scope),\n          record.sourceThreadId,\n          record.capturedAt.toISOString(),\n          record.when?.toISOString() ?? null,\n          record.maxScope ?? null,\n          record.metadata ? JSON.stringify(record.metadata) : null,\n        ],\n      });\n      await this.#replaceMentions(tx, 'record', record.id, record.text, resolutionScope, defaultScope);\n      await this.#activity(tx, 'record-created', 'record', record.id, scope, record.sourceThreadId);\n      await this.#outbox(tx, 'record', record.id, 'upsert', record.id, scope);\n      return record;\n    });\n  }\n\n  async getKnowledge(input: { id: string; includeDeleted?: boolean }): Promise<KnowledgeRecord | null> {\n    const result = await this.#readExecutor.execute({\n      sql: `SELECT *,scope AS \"scopeJson\" FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE id=?${input.includeDeleted ? '' : ' AND deletedAt IS NULL'}`,\n      args: [input.id],\n    });\n    return result.rows[0] ? parseKnowledge(result.rows[0]) : null;\n  }\n\n  async listKnowledgeAbout(input: QueryKnowledgeInput): Promise<QueryKnowledgeOutput> {\n    return this.#queryKnowledge(input, 'about');\n  }\n  async listKnowledgeMentioning(input: QueryKnowledgeInput): Promise<QueryKnowledgeOutput> {\n    return this.#queryKnowledge(input, 'mentioning');\n  }\n\n  async listKnowledgeRelatedTo(input: QueryKnowledgeInput): Promise<QueryKnowledgeOutput> {\n    return this.#queryKnowledge(input, 'related');\n  }\n\n  async knowledgeBySource(input: QueryKnowledgeBySourceInput): Promise<QueryKnowledgeOutput> {\n    const scope = canonicalizeKnowledgeScope(input.scope);\n    const key = knowledgeScopeKey(scope);\n    const args: QueryValues = [input.sourceThreadId, key, key];\n    if (input.after) args.push(input.after);\n    const limit = input.limit ?? 100;\n    args.push(limit + 1);\n    const result = await this.#readExecutor.execute({\n      sql: `SELECT *,scope AS \"scopeJson\" FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE sourceThreadId=? AND ${visibleSql}${input.includeDeleted ? '' : ' AND deletedAt IS NULL'}${input.after ? ' AND id > ?' : ''} ORDER BY id ASC LIMIT ?`,\n      args,\n    });\n    const records = result.rows.map(parseKnowledge);\n    return {\n      records: records.slice(0, limit),\n      nextCursor: records.length > limit ? records[limit - 1]?.id : undefined,\n    };\n  }\n\n  async removeKnowledge(input: { id: string; deletedBy: string }): Promise<KnowledgeRecord> {\n    return this.#transaction(async tx => {\n      const record = await this.#getKnowledge(tx, input.id, true);\n      if (!record) throw new KnowledgeNotFoundError('record', input.id);\n      if (record.deletedAt) return record;\n      const deletedAt = new Date();\n      await tx.execute({\n        sql: `UPDATE \"${TABLE_KNOWLEDGE_RECORDS}\" SET deletedAt=?,deletedBy=? WHERE id=? AND deletedAt IS NULL`,\n        args: [deletedAt.toISOString(), input.deletedBy, input.id],\n      });\n      await this.#activity(tx, 'record-deleted', 'record', input.id, record.scope, record.sourceThreadId);\n      await this.#outbox(tx, 'record', input.id, 'delete', deletedAt.toISOString(), record.scope);\n      return { ...record, deletedAt, deletedBy: input.deletedBy };\n    });\n  }\n\n  async restoreKnowledge(input: { id: string }): Promise<KnowledgeRecord> {\n    return this.#transaction(async tx => {\n      const record = await this.#getKnowledge(tx, input.id, true);\n      if (!record) throw new KnowledgeNotFoundError('record', input.id);\n      if (!record.deletedAt) return record;\n      await tx.execute({\n        sql: `UPDATE \"${TABLE_KNOWLEDGE_RECORDS}\" SET deletedAt=NULL,deletedBy=NULL WHERE id=?`,\n        args: [input.id],\n      });\n      await this.#activity(tx, 'record-restored', 'record', input.id, record.scope, record.sourceThreadId);\n      await this.#outbox(tx, 'record', input.id, 'upsert', createKnowledgeUlid(), record.scope);\n      return { ...record, deletedAt: undefined, deletedBy: undefined };\n    });\n  }\n\n  async rescopeKnowledge(input: { id: string; scope: KnowledgeScope }): Promise<KnowledgeRecord> {\n    const scope = canonicalizeKnowledgeScope(input.scope);\n    return this.#transaction(async tx => {\n      const record = await this.#getKnowledge(tx, input.id, true);\n      if (!record) throw new KnowledgeNotFoundError('record', input.id);\n      assertKnowledgeScopeWithinCeiling(scope, record.maxScope);\n      await tx.execute({\n        sql: `UPDATE \"${TABLE_KNOWLEDGE_RECORDS}\" SET scope=jsonb(?),scopeKey=? WHERE id=?`,\n        args: [JSON.stringify(scope), knowledgeScopeKey(scope), input.id],\n      });\n      await this.#activity(tx, 'record-rescoped', 'record', input.id, scope, record.sourceThreadId);\n      if (knowledgeScopeKey(record.scope) !== knowledgeScopeKey(scope))\n        await this.#outbox(tx, 'record', input.id, 'delete', createKnowledgeUlid(), record.scope);\n      if (!record.deletedAt) await this.#outbox(tx, 'record', input.id, 'upsert', createKnowledgeUlid(), scope);\n      return { ...record, scope };\n    });\n  }\n\n  async raiseKnowledgeCeiling(input: { id: string; maxScope?: KnowledgeRecord['maxScope'] }): Promise<KnowledgeRecord> {\n    return this.#transaction(async tx => {\n      const record = await this.#getKnowledge(tx, input.id, true);\n      if (!record) throw new KnowledgeNotFoundError('record', input.id);\n      assertKnowledgeScopeWithinCeiling(record.scope, input.maxScope);\n      assertKnowledgeCeilingRaised(record.maxScope, input.maxScope);\n      await tx.execute({\n        sql: `UPDATE \"${TABLE_KNOWLEDGE_RECORDS}\" SET maxScope=? WHERE id=?`,\n        args: [input.maxScope ?? null, input.id],\n      });\n      return { ...record, maxScope: input.maxScope };\n    });\n  }\n\n  async search(input: SearchKnowledgeInput): Promise<SearchKnowledgeResult[]> {\n    const scope = canonicalizeKnowledgeScope(input.scope);\n    const key = knowledgeScopeKey(scope);\n    const normalizedQuery = input.query.trim().toLocaleLowerCase();\n    if (!normalizedQuery) return [];\n    const query = `%${escapeLikePattern(normalizedQuery)}%`;\n    const records = await this.#readExecutor.execute({\n      sql: `SELECT *,scope AS \"scopeJson\" FROM \"${TABLE_KNOWLEDGE_NODES}\" WHERE mergedInto IS NULL AND ${visibleSql} AND (canonicalName LIKE ? ESCAPE '=' OR lower(COALESCE(kind,'')) LIKE ? ESCAPE '=' OR lower(COALESCE(content,'')) LIKE ? ESCAPE '=' OR lower(COALESCE(description,'')) LIKE ? ESCAPE '=') ORDER BY updatedAt DESC LIMIT ?`,\n      args: [key, key, query, query, query, query, input.limit ?? 20],\n    });\n    const results: SearchKnowledgeResult[] = records.rows.map(row => ({\n      type: String(row.type) as 'node',\n      id: String(row.id),\n      recordId: String(row.id),\n      name: String(row.name),\n      // Description joins the snippet only when present so description-less results stay byte-identical.\n      text: [\n        String(row.name),\n        ...(row.description ? [String(row.description)] : []),\n        ...(row.content ? [String(row.content)] : []),\n      ].join('\\n'),\n      scope: parseJson<KnowledgeScope>(row.scopeJson),\n    }));\n    if (results.length < (input.limit ?? 20)) {\n      const records = await this.#readExecutor.execute({\n        sql: `SELECT f.*,f.scope AS \"scopeJson\",r.name,r.scope AS \"parentScopeJson\" FROM \"${TABLE_KNOWLEDGE_RECORDS}\" f JOIN \"${TABLE_KNOWLEDGE_NODES}\" r ON r.id=f.node AND r.type='node' AND r.mergedInto IS NULL WHERE f.deletedAt IS NULL AND ${visibleSql.replaceAll('scopeKey', 'f.scopeKey')} AND lower(f.text) LIKE ? ESCAPE '=' ORDER BY f.id DESC LIMIT ?`,\n        args: [key, key, query, (input.limit ?? 20) - results.length],\n      });\n      results.push(\n        ...records.rows.map(row => {\n          const parentVisible = isKnowledgeScopeVisible(parseJson<KnowledgeScope>(row.parentScopeJson), scope);\n          return {\n            type: 'record' as const,\n            id: String(row.id),\n            recordId: String(row.node),\n            name: parentVisible ? String(row.name) : '(private node)',\n            text: String(row.text),\n            scope: parseJson<KnowledgeScope>(row.scopeJson),\n          };\n        }),\n      );\n    }\n    return results;\n  }\n\n  async getCurationCursor(input: { sourceThreadId: string; agent: string }): Promise<KnowledgeCurationCursor | null> {\n    const result = await this.#executor.execute({\n      sql: `SELECT * FROM \"${TABLE_KNOWLEDGE_CURSORS}\" WHERE sourceThreadId=? AND agent=?`,\n      args: [input.sourceThreadId, input.agent],\n    });\n    const row = result.rows[0];\n    return row\n      ? {\n          sourceThreadId: String(row.sourceThreadId),\n          agent: String(row.agent),\n          lastKnowledgeId: String(row.lastKnowledgeId),\n          updatedAt: toDate(row.updatedAt),\n        }\n      : null;\n  }\n\n  async advanceCurationCursor(input: {\n    sourceThreadId: string;\n    agent: string;\n    lastKnowledgeId: string;\n  }): Promise<KnowledgeCurationCursor> {\n    const updatedAt = new Date();\n    const result = await this.#executor.execute({\n      sql: `INSERT INTO \"${TABLE_KNOWLEDGE_CURSORS}\" (sourceThreadId,agent,lastKnowledgeId,updatedAt) VALUES (?,?,?,?) ON CONFLICT(sourceThreadId,agent) DO UPDATE SET lastKnowledgeId=excluded.lastKnowledgeId,updatedAt=excluded.updatedAt WHERE excluded.lastKnowledgeId >= \"${TABLE_KNOWLEDGE_CURSORS}\".lastKnowledgeId`,\n      args: [input.sourceThreadId, input.agent, input.lastKnowledgeId, updatedAt.toISOString()],\n    });\n    if (result.rowsAffected === 0) throw new Error('Knowledge curation cursor cannot move backwards');\n    return { ...input, updatedAt };\n  }\n\n  async listActivity(input: {\n    scope: KnowledgeScope;\n    after?: string;\n    limit?: number;\n  }): Promise<KnowledgeActivityEvent[]> {\n    const scope = canonicalizeKnowledgeScope(input.scope);\n    const key = knowledgeScopeKey(scope);\n    const result = await this.#readExecutor.execute({\n      sql: `SELECT *,scope AS \"scopeJson\" FROM \"${TABLE_KNOWLEDGE_ACTIVITY}\" WHERE ${visibleSql}${input.after ? ' AND id < ?' : ''} ORDER BY id DESC LIMIT ?`,\n      args: [key, key, ...(input.after ? [input.after] : []), input.limit ?? 100],\n    });\n    return result.rows.map(row => ({\n      id: String(row.id),\n      action: String(row.action) as KnowledgeActivityAction,\n      recordType: String(row.recordType) as KnowledgeSemanticDocumentType,\n      recordId: String(row.recordId),\n      scope: parseJson<KnowledgeScope>(row.scopeJson),\n      sourceThreadId: row.sourceThreadId == null ? undefined : String(row.sourceThreadId),\n      createdAt: toDate(row.createdAt),\n    }));\n  }\n\n  async listSemanticOutbox(\n    input: { status?: KnowledgeSemanticOutboxEntry['status']; scope?: KnowledgeScope; limit?: number } = {},\n  ): Promise<KnowledgeSemanticOutboxEntry[]> {\n    const clauses: string[] = [];\n    const args: QueryValues = [];\n    if (input.status) {\n      clauses.push('status=?');\n      args.push(input.status);\n    }\n    if (input.scope) {\n      const key = knowledgeScopeKey(canonicalizeKnowledgeScope(input.scope));\n      clauses.push(visibleSql);\n      args.push(key, key);\n    }\n    args.push(input.limit ?? 100);\n    const result = await this.#executor.execute({\n      sql: `SELECT *,scope AS \"scopeJson\" FROM \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\"${clauses.length ? ` WHERE ${clauses.join(' AND ')}` : ''} ORDER BY createdAt ASC,id ASC LIMIT ?`,\n      args,\n    });\n    return result.rows.map(parseOutbox);\n  }\n\n  async claimSemanticOutbox(input: ClaimKnowledgeSemanticOutboxInput): Promise<KnowledgeSemanticOutboxEntry[]> {\n    const now = input.now ?? new Date();\n    const stale = new Date(now.getTime() - (input.claimTimeoutMs ?? 60_000));\n    return this.#transaction(async tx => {\n      const clauses = [\n        `availableAt <= ?`,\n        `(status='pending' OR (status='processing' AND claimedAt <= ?))`,\n        `NOT EXISTS (SELECT 1 FROM \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" AS earlier WHERE earlier.documentId = \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\".documentId AND earlier.status != 'completed' AND (earlier.createdAt < \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\".createdAt OR (earlier.createdAt = \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\".createdAt AND earlier.id < \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\".id)))`,\n      ];\n      const args: QueryValues = [now.toISOString(), stale.toISOString()];\n      if (input.scope) {\n        const key = knowledgeScopeKey(canonicalizeKnowledgeScope(input.scope));\n        clauses.push(visibleSql);\n        args.push(key, key);\n      }\n      args.push(input.limit ?? 100);\n      const selected = await tx.execute({\n        sql: `SELECT id FROM \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" WHERE ${clauses.join(' AND ')} ORDER BY createdAt ASC,id ASC LIMIT ? FOR UPDATE SKIP LOCKED`,\n        args,\n      });\n      const ids = selected.rows.map(row => String(row.id));\n      for (const id of ids)\n        await tx.execute({\n          sql: `UPDATE \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" SET status='processing',attempts=attempts+1,claimedAt=?,claimedBy=? WHERE id=?`,\n          args: [now.toISOString(), input.workerId, id],\n        });\n      if (!ids.length) return [];\n      const result = await tx.execute({\n        sql: `SELECT *,scope AS \"scopeJson\" FROM \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" WHERE id IN (${ids.map(() => '?').join(',')}) ORDER BY createdAt ASC,id ASC`,\n        args: ids,\n      });\n      return result.rows.map(parseOutbox);\n    });\n  }\n\n  async completeSemanticOutbox(input: { ids: string[]; workerId: string }): Promise<void> {\n    if (!input.ids.length) return;\n    const now = new Date().toISOString();\n    await this.#transaction(async tx => {\n      for (const id of input.ids)\n        await tx.execute({\n          sql: `UPDATE \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" SET status='completed',completedAt=? WHERE id=? AND status='processing' AND claimedBy=?`,\n          args: [now, id, input.workerId],\n        });\n    });\n  }\n  async releaseSemanticOutbox(input: { ids: string[]; workerId: string; retryAt?: Date }): Promise<void> {\n    if (!input.ids.length) return;\n    await this.#transaction(async tx => {\n      for (const id of input.ids)\n        await tx.execute({\n          sql: `UPDATE \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" SET status='pending',availableAt=?,claimedAt=NULL,claimedBy=NULL WHERE id=? AND status='processing' AND claimedBy=?`,\n          args: [(input.retryAt ?? new Date()).toISOString(), id, input.workerId],\n        });\n    });\n  }\n\n  async #transaction<T>(operation: (tx: Executor) => Promise<T>): Promise<T> {\n    return this.#client.tx(tx => operation(createExecutor(tx, this.#schemaName)));\n  }\n  async #getNode(executor: Executor, id: string): Promise<KnowledgeNode | null> {\n    const result = await executor.execute({\n      sql: `SELECT *,scope AS \"scopeJson\" FROM \"${TABLE_KNOWLEDGE_NODES}\" WHERE id=? AND type='node'`,\n      args: [id],\n    });\n    return result.rows[0] ? parseNode(result.rows[0]) : null;\n  }\n  async #getNodeByName(executor: Executor, name: string, scope: KnowledgeScope): Promise<KnowledgeNode | null> {\n    const result = await executor.execute({\n      sql: `SELECT *,scope AS \"scopeJson\" FROM \"${TABLE_KNOWLEDGE_NODES}\" WHERE type='node' AND scopeKey=? AND canonicalName=?`,\n      args: [knowledgeScopeKey(scope), canonicalName(name)],\n    });\n    return result.rows[0] ? parseNode(result.rows[0]) : null;\n  }\n  async #resolveNode(executor: Executor, name: string, scope: KnowledgeScope): Promise<KnowledgeNode | null> {\n    for (let length = scope.length; length > 0; length--) {\n      const node = await this.#getNodeByName(executor, name, scope.slice(0, length));\n      if (node) {\n        const terminal = await this.#resolveTerminalNode(executor, node.id);\n        if (terminal && isKnowledgeScopeVisible(terminal.scope, scope)) return terminal;\n      }\n    }\n    return null;\n  }\n  async #resolveTerminalNode(executor: Executor, id: string): Promise<KnowledgeNode | null> {\n    let node = await this.#getNode(executor, id);\n    const seen = new Set<string>();\n    while (node?.mergedInto) {\n      if (seen.has(node.id)) throw new Error(`Knowledge merge cycle detected at ${node.id}`);\n      seen.add(node.id);\n      node = await this.#getNode(executor, node.mergedInto);\n    }\n    return node;\n  }\n  async #getKnowledge(executor: Executor, id: string, includeDeleted: boolean): Promise<KnowledgeRecord | null> {\n    const result = await executor.execute({\n      sql: `SELECT *,scope AS \"scopeJson\" FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE id=?${includeDeleted ? '' : ' AND deletedAt IS NULL'}`,\n      args: [id],\n    });\n    return result.rows[0] ? parseKnowledge(result.rows[0]) : null;\n  }\n\n  async #queryKnowledge(\n    input: QueryKnowledgeInput,\n    relationship: 'about' | 'mentioning' | 'related',\n  ): Promise<QueryKnowledgeOutput> {\n    const scope = canonicalizeKnowledgeScope(input.scope);\n    const node = await this.#resolveTerminalNode(this.#readExecutor, nodeReferenceId(input.node));\n    if (!node) return { records: [] };\n    const key = knowledgeScopeKey(scope);\n    const args: QueryValues = [node.id, ...(relationship === 'related' ? [node.id] : []), key, key];\n    if (input.after) args.push(input.after);\n    args.push((input.limit ?? 100) + 1);\n    const result = await this.#readExecutor.execute({\n      sql: `SELECT DISTINCT f.*,f.scope AS \"scopeJson\" FROM \"${TABLE_KNOWLEDGE_RECORDS}\" f${relationship === 'about' ? '' : ` LEFT JOIN \"${TABLE_KNOWLEDGE_MENTIONS}\" m ON m.sourceType='record' AND m.sourceId=f.id`} WHERE ${relationship === 'about' ? 'f.node=?' : relationship === 'mentioning' ? 'm.recordId=?' : '(f.node=? OR m.recordId=?)'} AND ${visibleSql.replaceAll('scopeKey', 'f.scopeKey')}${input.includeDeleted ? '' : ' AND f.deletedAt IS NULL'}${input.after ? ' AND f.id < ?' : ''} ORDER BY f.id DESC LIMIT ?`,\n      args,\n    });\n    const records = result.rows.map(parseKnowledge);\n    const limit = input.limit ?? 100;\n    return {\n      records: records.slice(0, limit),\n      nextCursor: records.length > limit ? records[limit - 1]?.id : undefined,\n    };\n  }\n\n  async #replaceMentions(\n    tx: Executor,\n    sourceType: 'record' | 'node',\n    sourceId: string,\n    text: string,\n    resolutionScope: KnowledgeScope,\n    defaultScope: KnowledgeScope,\n  ): Promise<void> {\n    await tx.execute({\n      sql: `DELETE FROM \"${TABLE_KNOWLEDGE_MENTIONS}\" WHERE sourceType=? AND sourceId=?`,\n      args: [sourceType, sourceId],\n    });\n    for (const name of parseKnowledgeWikilinks(text)) {\n      let node = await this.#resolveNode(tx, name, resolutionScope);\n      if (!node) {\n        node = await this.#getNodeByName(tx, name, defaultScope);\n        if (node) node = await this.#resolveTerminalNode(tx, node.id);\n        if (!node) {\n          const now = new Date();\n          node = {\n            id: crypto.randomUUID(),\n            type: 'node',\n            name,\n            kind: 'node',\n            scope: defaultScope,\n            version: 1,\n            createdAt: now,\n            updatedAt: now,\n          };\n          await tx.execute({\n            sql: `INSERT INTO \"${TABLE_KNOWLEDGE_NODES}\" (id,type,name,canonicalName,kind,content,scope,scopeKey,version,mergedInto,createdAt,updatedAt) VALUES (?,?,?,?,?,NULL,jsonb(?),?,?,NULL,?,?)`,\n            args: [\n              node.id,\n              'node',\n              node.name,\n              canonicalName(node.name),\n              node.kind,\n              JSON.stringify(defaultScope),\n              knowledgeScopeKey(defaultScope),\n              1,\n              now.toISOString(),\n              now.toISOString(),\n            ],\n          });\n          await this.#activity(tx, 'node-created', 'node', node.id, defaultScope);\n          await this.#outbox(tx, 'node', node.id, 'upsert', 1, defaultScope);\n        }\n      }\n      await tx.execute({\n        sql: `INSERT INTO \"${TABLE_KNOWLEDGE_MENTIONS}\" (sourceType,sourceId,recordId) VALUES (?,?,?) ON CONFLICT DO NOTHING`,\n        args: [sourceType, sourceId, node.id],\n      });\n    }\n  }\n\n  async #activity(\n    executor: Executor,\n    action: KnowledgeActivityAction,\n    recordType: KnowledgeSemanticDocumentType,\n    recordId: string,\n    scope: KnowledgeScope,\n    sourceThreadId?: string,\n  ): Promise<void> {\n    const now = new Date();\n    await executor.execute({\n      sql: `INSERT INTO \"${TABLE_KNOWLEDGE_ACTIVITY}\" (id,action,recordType,recordId,scope,scopeKey,sourceThreadId,createdAt) VALUES (?,?,?,?,jsonb(?),?,?,?)`,\n      args: [\n        createKnowledgeUlid(),\n        action,\n        recordType,\n        recordId,\n        JSON.stringify(scope),\n        knowledgeScopeKey(scope),\n        sourceThreadId ?? null,\n        now.toISOString(),\n      ],\n    });\n  }\n  async #outbox(\n    executor: Executor,\n    documentType: KnowledgeSemanticDocumentType,\n    id: string,\n    operation: KnowledgeSemanticOperation,\n    version: number | string,\n    scope: KnowledgeScope,\n  ): Promise<void> {\n    const documentId = knowledgeSemanticDocumentId(documentType, id);\n    const idempotencyKey = knowledgeSemanticIdempotencyKey(documentId, operation, version);\n    const now = new Date();\n    await executor.execute({\n      sql: `INSERT INTO \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" (id,idempotencyKey,documentId,documentType,operation,scope,scopeKey,status,attempts,availableAt,claimedAt,claimedBy,createdAt,completedAt) VALUES (?,?,?,?,?,jsonb(?),?,'pending',0,?,NULL,NULL,?,NULL) ON CONFLICT DO NOTHING`,\n      args: [\n        createKnowledgeUlid(),\n        idempotencyKey,\n        documentId,\n        documentType,\n        operation,\n        JSON.stringify(scope),\n        knowledgeScopeKey(scope),\n        now.toISOString(),\n        now.toISOString(),\n      ],\n    });\n  }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n  MCPClientsStorage,\n  createStorageErrorId,\n  normalizePerPage,\n  calculatePagination,\n  TABLE_MCP_CLIENTS,\n  TABLE_MCP_CLIENT_VERSIONS,\n  TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n  StorageMCPClientType,\n  StorageCreateMCPClientInput,\n  StorageUpdateMCPClientInput,\n  StorageListMCPClientsInput,\n  StorageListMCPClientsOutput,\n  CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type {\n  MCPClientVersion,\n  CreateMCPClientVersionInput,\n  ListMCPClientVersionsInput,\n  ListMCPClientVersionsOutput,\n} from '@mastra/core/storage/domains/mcp-clients';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { DbClient, PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName, parseJsonResilient } from '../utils';\n\nconst SNAPSHOT_FIELDS = ['name', 'description', 'servers'] as const;\n\nexport class MCPClientsPG extends MCPClientsStorage {\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  static readonly MANAGED_TABLES = [TABLE_MCP_CLIENTS, TABLE_MCP_CLIENT_VERSIONS] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    this.#indexes = indexes?.filter(idx => (MCPClientsPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n  }\n\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}idx_mcp_client_versions_client_version`,\n        table: TABLE_MCP_CLIENT_VERSIONS,\n        columns: ['mcpClientId', 'versionNumber'],\n        unique: true,\n      },\n    ];\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n    for (const tableName of MCPClientsPG.MANAGED_TABLES) {\n      statements.push(\n        generateTableSQL({\n          tableName,\n          schema: TABLE_SCHEMAS[tableName],\n          schemaName,\n          includeAllConstraints: true,\n        }),\n      );\n    }\n\n    for (const idx of MCPClientsPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    return statements;\n  }\n\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return MCPClientsPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) {\n      return;\n    }\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch {\n        // Indexes are performance optimizations, continue on failure\n      }\n    }\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({\n      tableName: TABLE_MCP_CLIENTS,\n      schema: TABLE_SCHEMAS[TABLE_MCP_CLIENTS],\n    });\n    await this.#db.createTable({\n      tableName: TABLE_MCP_CLIENT_VERSIONS,\n      schema: TABLE_SCHEMAS[TABLE_MCP_CLIENT_VERSIONS],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) {\n      return;\n    }\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_MCP_CLIENT_VERSIONS });\n    await this.#db.clearTable({ tableName: TABLE_MCP_CLIENTS });\n  }\n\n  // ==========================================================================\n  // MCP Client CRUD Methods\n  // ==========================================================================\n\n  async getById(id: string): Promise<StorageMCPClientType | null> {\n    return this.#getById(this.#db.readClient, id);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #getById(client: DbClient, id: string): Promise<StorageMCPClientType | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_MCP_CLIENTS, schemaName: getSchemaName(this.#schema) });\n      const result = await client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseMCPClientRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_MCP_CLIENT_BY_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpClientId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async create(input: { mcpClient: StorageCreateMCPClientInput }): Promise<StorageMCPClientType> {\n    const { mcpClient } = input;\n    try {\n      const tableName = getTableName({ indexName: TABLE_MCP_CLIENTS, schemaName: getSchemaName(this.#schema) });\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      // 1. Create the thin MCP client record\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, status, \"activeVersionId\", \"authorId\", metadata,\n          \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,\n        [\n          mcpClient.id,\n          'draft',\n          null,\n          mcpClient.authorId ?? null,\n          mcpClient.metadata ? JSON.stringify(mcpClient.metadata) : null,\n          nowIso,\n          nowIso,\n          nowIso,\n          nowIso,\n        ],\n      );\n\n      // 2. Extract snapshot fields and create version 1\n      const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = mcpClient;\n      const versionId = crypto.randomUUID();\n      await this.createVersion({\n        id: versionId,\n        mcpClientId: mcpClient.id,\n        versionNumber: 1,\n        ...snapshotConfig,\n        changedFields: [...SNAPSHOT_FIELDS],\n        changeMessage: 'Initial version',\n      });\n\n      return {\n        id: mcpClient.id,\n        status: 'draft',\n        activeVersionId: undefined,\n        authorId: mcpClient.authorId,\n        metadata: mcpClient.metadata,\n        createdAt: now,\n        updatedAt: now,\n      };\n    } catch (error) {\n      // Best-effort cleanup\n      try {\n        const tableName = getTableName({\n          indexName: TABLE_MCP_CLIENTS,\n          schemaName: getSchemaName(this.#schema),\n        });\n        await this.#db.client.none(\n          `DELETE FROM ${tableName} WHERE id = $1 AND status = 'draft' AND \"activeVersionId\" IS NULL`,\n          [mcpClient.id],\n        );\n      } catch {\n        // Ignore cleanup errors\n      }\n\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_MCP_CLIENT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpClientId: mcpClient.id },\n        },\n        error,\n      );\n    }\n  }\n\n  async update(input: StorageUpdateMCPClientInput): Promise<StorageMCPClientType> {\n    const { id, ...updates } = input;\n    try {\n      const tableName = getTableName({ indexName: TABLE_MCP_CLIENTS, schemaName: getSchemaName(this.#schema) });\n\n      const existingClient = await this.#getById(this.#db.client, id);\n      if (!existingClient) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_MCP_CLIENT', 'NOT_FOUND'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          text: `MCP client ${id} not found`,\n          details: { mcpClientId: id },\n        });\n      }\n\n      const { authorId, activeVersionId, metadata, status } = updates;\n\n      // Update metadata fields on the MCP client record\n      const setClauses: string[] = [];\n      const values: any[] = [];\n      let paramIndex = 1;\n\n      if (authorId !== undefined) {\n        setClauses.push(`\"authorId\" = $${paramIndex++}`);\n        values.push(authorId);\n      }\n\n      if (activeVersionId !== undefined) {\n        setClauses.push(`\"activeVersionId\" = $${paramIndex++}`);\n        values.push(activeVersionId);\n      }\n\n      if (status !== undefined) {\n        setClauses.push(`status = $${paramIndex++}`);\n        values.push(status);\n      }\n\n      if (metadata !== undefined) {\n        const mergedMetadata = { ...(existingClient.metadata || {}), ...metadata };\n        setClauses.push(`metadata = $${paramIndex++}`);\n        values.push(JSON.stringify(mergedMetadata));\n      }\n\n      // Always update timestamps\n      const now = new Date().toISOString();\n      setClauses.push(`\"updatedAt\" = $${paramIndex++}`);\n      values.push(now);\n      setClauses.push(`\"updatedAtZ\" = $${paramIndex++}`);\n      values.push(now);\n\n      values.push(id);\n\n      // Always update the record (at minimum updatedAt/updatedAtZ are set)\n      await this.#db.client.none(`UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`, values);\n\n      const updatedClient = await this.#getById(this.#db.client, id);\n      if (!updatedClient) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_MCP_CLIENT', 'NOT_FOUND_AFTER_UPDATE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.SYSTEM,\n          text: `MCP client ${id} not found after update`,\n          details: { mcpClientId: id },\n        });\n      }\n      return updatedClient;\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_MCP_CLIENT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpClientId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async delete(id: string): Promise<void> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_MCP_CLIENTS, schemaName: getSchemaName(this.#schema) });\n      await this.deleteVersionsByParentId(id);\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_MCP_CLIENT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpClientId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async list(args?: StorageListMCPClientsInput): Promise<StorageListMCPClientsOutput> {\n    const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status = 'published' } = args || {};\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    if (page < 0) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_MCP_CLIENTS', 'INVALID_PAGE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { page },\n        },\n        new Error('page must be >= 0'),\n      );\n    }\n\n    const perPage = normalizePerPage(perPageInput, 100);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    try {\n      const tableName = getTableName({ indexName: TABLE_MCP_CLIENTS, schemaName: getSchemaName(this.#schema) });\n\n      // Build WHERE conditions\n      const conditions: string[] = [];\n      const queryParams: any[] = [];\n      let paramIdx = 1;\n\n      conditions.push(`status = $${paramIdx++}`);\n      queryParams.push(status);\n\n      if (authorId !== undefined) {\n        conditions.push(`\"authorId\" = $${paramIdx++}`);\n        queryParams.push(authorId);\n      }\n\n      if (metadata && Object.keys(metadata).length > 0) {\n        conditions.push(`metadata @> $${paramIdx++}::jsonb`);\n        queryParams.push(JSON.stringify(metadata));\n      }\n\n      const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n      // Get total count\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n        queryParams,\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return {\n          mcpClients: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      const limitValue = perPageInput === false ? total : perPage;\n      const dataResult = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"${field}\" ${direction} LIMIT $${paramIdx++} OFFSET $${paramIdx++}`,\n        [...queryParams, limitValue, offset],\n      );\n\n      const mcpClients = (dataResult || []).flatMap(row => {\n        try {\n          return [this.parseMCPClientRow(row)];\n        } catch (err) {\n          this.logger?.warn?.('[PG] Failed to map mcp client row, skipping', { id: row?.id, error: err });\n          return [];\n        }\n      });\n\n      return {\n        mcpClients,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_MCP_CLIENTS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  // ==========================================================================\n  // MCP Client Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateMCPClientVersionInput): Promise<MCPClientVersion> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_MCP_CLIENT_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, \"mcpClientId\", \"versionNumber\",\n          name, description, servers,\n          \"changedFields\", \"changeMessage\",\n          \"createdAt\", \"createdAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`,\n        [\n          input.id,\n          input.mcpClientId,\n          input.versionNumber,\n          input.name,\n          input.description ?? null,\n          JSON.stringify(input.servers),\n          input.changedFields ? JSON.stringify(input.changedFields) : null,\n          input.changeMessage ?? null,\n          nowIso,\n          nowIso,\n        ],\n      );\n\n      return {\n        ...input,\n        createdAt: now,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_MCP_CLIENT_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: input.id, mcpClientId: input.mcpClientId },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersion(id: string): Promise<MCPClientVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_MCP_CLIENT_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_MCP_CLIENT_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersionByNumber(mcpClientId: string, versionNumber: number): Promise<MCPClientVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_MCP_CLIENT_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"mcpClientId\" = $1 AND \"versionNumber\" = $2`,\n        [mcpClientId, versionNumber],\n      );\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_MCP_CLIENT_VERSION_BY_NUMBER', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpClientId, versionNumber },\n        },\n        error,\n      );\n    }\n  }\n\n  async getLatestVersion(mcpClientId: string): Promise<MCPClientVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_MCP_CLIENT_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"mcpClientId\" = $1 ORDER BY \"versionNumber\" DESC LIMIT 1`,\n        [mcpClientId],\n      );\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_LATEST_MCP_CLIENT_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpClientId },\n        },\n        error,\n      );\n    }\n  }\n\n  async listVersions(input: ListMCPClientVersionsInput): Promise<ListMCPClientVersionsOutput> {\n    const { mcpClientId, page = 0, perPage: perPageInput, orderBy } = input;\n\n    if (page < 0) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_MCP_CLIENT_VERSIONS', 'INVALID_PAGE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { page },\n        },\n        new Error('page must be >= 0'),\n      );\n    }\n\n    const perPage = normalizePerPage(perPageInput, 20);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    try {\n      const { field, direction } = this.parseVersionOrderBy(orderBy);\n      const tableName = getTableName({\n        indexName: TABLE_MCP_CLIENT_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} WHERE \"mcpClientId\" = $1`,\n        [mcpClientId],\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return {\n          versions: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      const limitValue = perPageInput === false ? total : perPage;\n      const dataResult = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} WHERE \"mcpClientId\" = $1 ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`,\n        [mcpClientId, limitValue, offset],\n      );\n\n      const versions = (dataResult || []).flatMap(row => {\n        try {\n          return [this.parseVersionRow(row)];\n        } catch (err) {\n          this.logger?.warn?.('[PG] Failed to map mcp client version row, skipping', { id: row?.id, error: err });\n          return [];\n        }\n      });\n\n      return {\n        versions,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_MCP_CLIENT_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpClientId },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_MCP_CLIENT_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_MCP_CLIENT_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_MCP_CLIENT_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"mcpClientId\" = $1`, [entityId]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_MCP_CLIENT_VERSIONS_BY_MCP_CLIENT_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpClientId: entityId },\n        },\n        error,\n      );\n    }\n  }\n\n  async countVersions(mcpClientId: string): Promise<number> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_MCP_CLIENT_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} WHERE \"mcpClientId\" = $1`,\n        [mcpClientId],\n      );\n      return parseInt(result.count, 10);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'COUNT_MCP_CLIENT_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpClientId },\n        },\n        error,\n      );\n    }\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  private parseMCPClientRow(row: any): StorageMCPClientType {\n    return {\n      id: row.id as string,\n      status: row.status as StorageMCPClientType['status'],\n      activeVersionId: row.activeVersionId as string | undefined,\n      authorId: row.authorId as string | undefined,\n      metadata: parseJsonResilient(row.metadata, 'metadata'),\n      createdAt: new Date(row.createdAtZ || row.createdAt),\n      updatedAt: new Date(row.updatedAtZ || row.updatedAt),\n    };\n  }\n\n  private parseVersionRow(row: any): MCPClientVersion {\n    return {\n      id: row.id as string,\n      mcpClientId: row.mcpClientId as string,\n      versionNumber: row.versionNumber as number,\n      name: row.name as string,\n      description: row.description as string | undefined,\n      servers: parseJsonResilient(row.servers, 'servers'),\n      changedFields: parseJsonResilient(row.changedFields, 'changedFields'),\n      changeMessage: row.changeMessage as string | undefined,\n      createdAt: new Date(row.createdAtZ || row.createdAt),\n    };\n  }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n  MCPServersStorage,\n  createStorageErrorId,\n  normalizePerPage,\n  calculatePagination,\n  TABLE_MCP_SERVERS,\n  TABLE_MCP_SERVER_VERSIONS,\n  TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n  StorageMCPServerType,\n  StorageCreateMCPServerInput,\n  StorageUpdateMCPServerInput,\n  StorageListMCPServersInput,\n  StorageListMCPServersOutput,\n  CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type {\n  MCPServerVersion,\n  CreateMCPServerVersionInput,\n  ListMCPServerVersionsInput,\n  ListMCPServerVersionsOutput,\n} from '@mastra/core/storage/domains/mcp-servers';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { DbClient, PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName, parseJsonResilient } from '../utils';\n\nconst SNAPSHOT_FIELDS = [\n  'name',\n  'version',\n  'description',\n  'instructions',\n  'repository',\n  'releaseDate',\n  'isLatest',\n  'packageCanonical',\n  'tools',\n  'agents',\n  'workflows',\n] as const;\n\nexport class MCPServersPG extends MCPServersStorage {\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  static readonly MANAGED_TABLES = [TABLE_MCP_SERVERS, TABLE_MCP_SERVER_VERSIONS] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    this.#indexes = indexes?.filter(idx => (MCPServersPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n  }\n\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}idx_mcp_server_versions_server_version`,\n        table: TABLE_MCP_SERVER_VERSIONS,\n        columns: ['mcpServerId', 'versionNumber'],\n        unique: true,\n      },\n    ];\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n    for (const tableName of MCPServersPG.MANAGED_TABLES) {\n      statements.push(\n        generateTableSQL({\n          tableName,\n          schema: TABLE_SCHEMAS[tableName],\n          schemaName,\n          includeAllConstraints: true,\n        }),\n      );\n    }\n\n    for (const idx of MCPServersPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    return statements;\n  }\n\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return MCPServersPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) {\n      return;\n    }\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch {\n        // Indexes are performance optimizations, continue on failure\n      }\n    }\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({\n      tableName: TABLE_MCP_SERVERS,\n      schema: TABLE_SCHEMAS[TABLE_MCP_SERVERS],\n    });\n    await this.#db.createTable({\n      tableName: TABLE_MCP_SERVER_VERSIONS,\n      schema: TABLE_SCHEMAS[TABLE_MCP_SERVER_VERSIONS],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) {\n      return;\n    }\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_MCP_SERVER_VERSIONS });\n    await this.#db.clearTable({ tableName: TABLE_MCP_SERVERS });\n  }\n\n  // ==========================================================================\n  // MCP Server CRUD Methods\n  // ==========================================================================\n\n  async getById(id: string): Promise<StorageMCPServerType | null> {\n    return this.#getById(this.#db.readClient, id);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #getById(client: DbClient, id: string): Promise<StorageMCPServerType | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_MCP_SERVERS, schemaName: getSchemaName(this.#schema) });\n      const result = await client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseMCPServerRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_MCP_SERVER_BY_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpServerId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async create(input: { mcpServer: StorageCreateMCPServerInput }): Promise<StorageMCPServerType> {\n    const { mcpServer } = input;\n    try {\n      const tableName = getTableName({ indexName: TABLE_MCP_SERVERS, schemaName: getSchemaName(this.#schema) });\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      // 1. Create the thin MCP server record\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, status, \"activeVersionId\", \"authorId\", metadata,\n          \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,\n        [\n          mcpServer.id,\n          'draft',\n          null,\n          mcpServer.authorId ?? null,\n          mcpServer.metadata ? JSON.stringify(mcpServer.metadata) : null,\n          nowIso,\n          nowIso,\n          nowIso,\n          nowIso,\n        ],\n      );\n\n      // 2. Extract snapshot fields and create version 1\n      const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = mcpServer;\n      const versionId = crypto.randomUUID();\n      await this.createVersion({\n        id: versionId,\n        mcpServerId: mcpServer.id,\n        versionNumber: 1,\n        ...snapshotConfig,\n        changedFields: [...SNAPSHOT_FIELDS],\n        changeMessage: 'Initial version',\n      });\n\n      return {\n        id: mcpServer.id,\n        status: 'draft',\n        activeVersionId: undefined,\n        authorId: mcpServer.authorId,\n        metadata: mcpServer.metadata,\n        createdAt: now,\n        updatedAt: now,\n      };\n    } catch (error) {\n      // Best-effort cleanup\n      try {\n        const tableName = getTableName({\n          indexName: TABLE_MCP_SERVERS,\n          schemaName: getSchemaName(this.#schema),\n        });\n        await this.#db.client.none(\n          `DELETE FROM ${tableName} WHERE id = $1 AND status = 'draft' AND \"activeVersionId\" IS NULL`,\n          [mcpServer.id],\n        );\n      } catch {\n        // Ignore cleanup errors\n      }\n\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_MCP_SERVER', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpServerId: mcpServer.id },\n        },\n        error,\n      );\n    }\n  }\n\n  async update(input: StorageUpdateMCPServerInput): Promise<StorageMCPServerType> {\n    const { id, ...updates } = input;\n    try {\n      const tableName = getTableName({ indexName: TABLE_MCP_SERVERS, schemaName: getSchemaName(this.#schema) });\n\n      const existingServer = await this.#getById(this.#db.client, id);\n      if (!existingServer) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_MCP_SERVER', 'NOT_FOUND'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          text: `MCP server ${id} not found`,\n          details: { mcpServerId: id },\n        });\n      }\n\n      const { authorId, activeVersionId, metadata, status } = updates;\n\n      // Update metadata fields on the MCP server record\n      const setClauses: string[] = [];\n      const values: any[] = [];\n      let paramIndex = 1;\n\n      if (authorId !== undefined) {\n        setClauses.push(`\"authorId\" = $${paramIndex++}`);\n        values.push(authorId);\n      }\n\n      if (activeVersionId !== undefined) {\n        setClauses.push(`\"activeVersionId\" = $${paramIndex++}`);\n        values.push(activeVersionId);\n      }\n\n      if (status !== undefined) {\n        setClauses.push(`status = $${paramIndex++}`);\n        values.push(status);\n      }\n\n      if (metadata !== undefined) {\n        const mergedMetadata = { ...(existingServer.metadata || {}), ...metadata };\n        setClauses.push(`metadata = $${paramIndex++}`);\n        values.push(JSON.stringify(mergedMetadata));\n      }\n\n      // Always update timestamps\n      const now = new Date().toISOString();\n      setClauses.push(`\"updatedAt\" = $${paramIndex++}`);\n      values.push(now);\n      setClauses.push(`\"updatedAtZ\" = $${paramIndex++}`);\n      values.push(now);\n\n      values.push(id);\n\n      // Always update the record (at minimum updatedAt/updatedAtZ are set)\n      await this.#db.client.none(`UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`, values);\n\n      const updatedServer = await this.#getById(this.#db.client, id);\n      if (!updatedServer) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_MCP_SERVER', 'NOT_FOUND_AFTER_UPDATE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.SYSTEM,\n          text: `MCP server ${id} not found after update`,\n          details: { mcpServerId: id },\n        });\n      }\n      return updatedServer;\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_MCP_SERVER', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpServerId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async delete(id: string): Promise<void> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_MCP_SERVERS, schemaName: getSchemaName(this.#schema) });\n      await this.deleteVersionsByParentId(id);\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_MCP_SERVER', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpServerId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async list(args?: StorageListMCPServersInput): Promise<StorageListMCPServersOutput> {\n    const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status = 'published' } = args || {};\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    if (page < 0) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_MCP_SERVERS', 'INVALID_PAGE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { page },\n        },\n        new Error('page must be >= 0'),\n      );\n    }\n\n    const perPage = normalizePerPage(perPageInput, 100);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    try {\n      const tableName = getTableName({ indexName: TABLE_MCP_SERVERS, schemaName: getSchemaName(this.#schema) });\n\n      // Build WHERE conditions\n      const conditions: string[] = [];\n      const queryParams: any[] = [];\n      let paramIdx = 1;\n\n      conditions.push(`status = $${paramIdx++}`);\n      queryParams.push(status);\n\n      if (authorId !== undefined) {\n        conditions.push(`\"authorId\" = $${paramIdx++}`);\n        queryParams.push(authorId);\n      }\n\n      if (metadata && Object.keys(metadata).length > 0) {\n        conditions.push(`metadata @> $${paramIdx++}::jsonb`);\n        queryParams.push(JSON.stringify(metadata));\n      }\n\n      const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n      // Get total count\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n        queryParams,\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return {\n          mcpServers: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      const limitValue = perPageInput === false ? total : perPage;\n      const dataResult = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"${field}\" ${direction} LIMIT $${paramIdx++} OFFSET $${paramIdx++}`,\n        [...queryParams, limitValue, offset],\n      );\n\n      const mcpServers = (dataResult || []).flatMap(row => {\n        try {\n          return [this.parseMCPServerRow(row)];\n        } catch (err) {\n          this.logger?.warn?.('[PG] Failed to map mcp server row, skipping', { id: row?.id, error: err });\n          return [];\n        }\n      });\n\n      return {\n        mcpServers,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_MCP_SERVERS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  // ==========================================================================\n  // MCP Server Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateMCPServerVersionInput): Promise<MCPServerVersion> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_MCP_SERVER_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, \"mcpServerId\", \"versionNumber\",\n          name, version, description, instructions,\n          repository, \"releaseDate\", \"isLatest\", \"packageCanonical\",\n          tools, agents, workflows,\n          \"changedFields\", \"changeMessage\",\n          \"createdAt\", \"createdAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18)`,\n        [\n          input.id,\n          input.mcpServerId,\n          input.versionNumber,\n          input.name,\n          input.version,\n          input.description ?? null,\n          input.instructions ?? null,\n          input.repository ? JSON.stringify(input.repository) : null,\n          input.releaseDate ?? null,\n          input.isLatest ?? null,\n          input.packageCanonical ?? null,\n          input.tools ? JSON.stringify(input.tools) : null,\n          input.agents ? JSON.stringify(input.agents) : null,\n          input.workflows ? JSON.stringify(input.workflows) : null,\n          input.changedFields ? JSON.stringify(input.changedFields) : null,\n          input.changeMessage ?? null,\n          nowIso,\n          nowIso,\n        ],\n      );\n\n      return {\n        ...input,\n        createdAt: now,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_MCP_SERVER_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: input.id, mcpServerId: input.mcpServerId },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersion(id: string): Promise<MCPServerVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_MCP_SERVER_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_MCP_SERVER_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersionByNumber(mcpServerId: string, versionNumber: number): Promise<MCPServerVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_MCP_SERVER_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"mcpServerId\" = $1 AND \"versionNumber\" = $2`,\n        [mcpServerId, versionNumber],\n      );\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_MCP_SERVER_VERSION_BY_NUMBER', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpServerId, versionNumber },\n        },\n        error,\n      );\n    }\n  }\n\n  async getLatestVersion(mcpServerId: string): Promise<MCPServerVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_MCP_SERVER_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"mcpServerId\" = $1 ORDER BY \"versionNumber\" DESC LIMIT 1`,\n        [mcpServerId],\n      );\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_LATEST_MCP_SERVER_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpServerId },\n        },\n        error,\n      );\n    }\n  }\n\n  async listVersions(input: ListMCPServerVersionsInput): Promise<ListMCPServerVersionsOutput> {\n    const { mcpServerId, page = 0, perPage: perPageInput, orderBy } = input;\n\n    if (page < 0) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_MCP_SERVER_VERSIONS', 'INVALID_PAGE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { page },\n        },\n        new Error('page must be >= 0'),\n      );\n    }\n\n    const perPage = normalizePerPage(perPageInput, 20);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    try {\n      const { field, direction } = this.parseVersionOrderBy(orderBy);\n      const tableName = getTableName({\n        indexName: TABLE_MCP_SERVER_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} WHERE \"mcpServerId\" = $1`,\n        [mcpServerId],\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return {\n          versions: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      const limitValue = perPageInput === false ? total : perPage;\n      const dataResult = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} WHERE \"mcpServerId\" = $1 ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`,\n        [mcpServerId, limitValue, offset],\n      );\n\n      const versions = (dataResult || []).flatMap(row => {\n        try {\n          return [this.parseVersionRow(row)];\n        } catch (err) {\n          this.logger?.warn?.('[PG] Failed to map mcp server version row, skipping', { id: row?.id, error: err });\n          return [];\n        }\n      });\n\n      return {\n        versions,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_MCP_SERVER_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpServerId },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_MCP_SERVER_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_MCP_SERVER_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_MCP_SERVER_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"mcpServerId\" = $1`, [entityId]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_MCP_SERVER_VERSIONS_BY_MCP_SERVER_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpServerId: entityId },\n        },\n        error,\n      );\n    }\n  }\n\n  async countVersions(mcpServerId: string): Promise<number> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_MCP_SERVER_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} WHERE \"mcpServerId\" = $1`,\n        [mcpServerId],\n      );\n      return parseInt(result.count, 10);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'COUNT_MCP_SERVER_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { mcpServerId },\n        },\n        error,\n      );\n    }\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  private parseMCPServerRow(row: any): StorageMCPServerType {\n    return {\n      id: row.id as string,\n      status: row.status as StorageMCPServerType['status'],\n      activeVersionId: row.activeVersionId as string | undefined,\n      authorId: row.authorId as string | undefined,\n      metadata: parseJsonResilient(row.metadata, 'metadata'),\n      createdAt: new Date(row.createdAtZ || row.createdAt),\n      updatedAt: new Date(row.updatedAtZ || row.updatedAt),\n    };\n  }\n\n  private parseVersionRow(row: any): MCPServerVersion {\n    return {\n      id: row.id as string,\n      mcpServerId: row.mcpServerId as string,\n      versionNumber: row.versionNumber as number,\n      name: row.name as string,\n      version: row.version as string,\n      description: row.description as string | undefined,\n      instructions: row.instructions as string | undefined,\n      repository: parseJsonResilient(row.repository, 'repository'),\n      releaseDate: row.releaseDate as string | undefined,\n      isLatest: row.isLatest as boolean | undefined,\n      packageCanonical: row.packageCanonical as string | undefined,\n      tools: parseJsonResilient(row.tools, 'tools'),\n      agents: parseJsonResilient(row.agents, 'agents'),\n      workflows: parseJsonResilient(row.workflows, 'workflows'),\n      changedFields: parseJsonResilient(row.changedFields, 'changedFields'),\n      changeMessage: row.changeMessage as string | undefined,\n      createdAt: new Date(row.createdAtZ || row.createdAt),\n    };\n  }\n}\n","import { randomUUID } from 'node:crypto';\nimport { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport {\n  MemoryStorage,\n  normalizePerPage,\n  calculatePagination,\n  OBSERVATIONAL_MEMORY_TABLE_SCHEMA,\n  TABLE_MESSAGES,\n  TABLE_RESOURCES,\n  TABLE_THREADS,\n  TABLE_SCHEMAS,\n  createStorageErrorId,\n  storageMessageMatchesMetadataFilter,\n  validateStorageMetadataFilter,\n} from '@mastra/core/storage';\n\n/**\n * Local constant for the observational memory table name.\n * Defined locally to avoid a static import that crashes on older @mastra/core\n * versions that don't export TABLE_OBSERVATIONAL_MEMORY.\n */\nconst OM_TABLE = 'mastra_observational_memory' as const;\nconst POSTGRES_MAX_BIND_PARAMETERS = 65535;\n// Keep in sync with the message INSERT column list in saveMessages.\nconst MESSAGE_INSERT_BIND_PARAMETERS = 8;\nconst MAX_MESSAGES_PER_INSERT = Math.floor(POSTGRES_MAX_BIND_PARAMETERS / MESSAGE_INSERT_BIND_PARAMETERS);\n\n/**\n * Columns added to the OM table after its initial release.\n * Used in `alterTable({ ifNotExists })` so that databases created on older\n * versions get the new columns automatically.\n *\n * When you add a column to OBSERVATIONAL_MEMORY_SCHEMA in @mastra/core,\n * you MUST also add it here — the unit test `om-migration-columns.test.ts`\n * will fail otherwise.\n */\nexport const OM_MIGRATION_COLUMNS: string[] = [\n  'observedMessageIds',\n  'observedTimezone',\n  'bufferedObservations',\n  'bufferedObservationTokens',\n  'bufferedMessageIds',\n  'bufferedReflection',\n  'bufferedReflectionTokens',\n  'bufferedReflectionInputTokens',\n  'reflectedObservationLineCount',\n  'bufferedObservationChunks',\n  'isBufferingObservation',\n  'isBufferingReflection',\n  'lastBufferedAtTokens',\n  'lastBufferedAtTime',\n  'metadata',\n];\n\n/**\n * The OM schema is imported statically above: the peer dependency range\n * (`@mastra/core >= 1.49.0`) guarantees the export exists. This used to be a\n * dynamic `require` guarded by `typeof require === 'function'` for older core\n * versions, but esbuild rewrites the bare `require` identifier in the ESM\n * bundle to a shim that always throws, and the silent catch meant the\n * published ESM build skipped creating the OM table entirely (#18954).\n */\nconst _omTableSchema: Record<string, Record<string, any>> = OBSERVATIONAL_MEMORY_TABLE_SCHEMA;\nimport type {\n  StorageResourceType,\n  StorageListMessagesInput,\n  StorageListMessagesByResourceIdInput,\n  StorageListMessagesOutput,\n  StorageListThreadsInput,\n  StorageListThreadsOutput,\n  CreateIndexOptions,\n  StorageCloneThreadInput,\n  StorageCopyThreadOutput,\n  ThreadCloneMetadata,\n  ObservationalMemoryRecord,\n  ObservationalMemoryHistoryOptions,\n  BufferedObservationChunk,\n  CreateObservationalMemoryInput,\n  UpdateActiveObservationsInput,\n  UpdateBufferedObservationsInput,\n  SwapBufferedToActiveInput,\n  SwapBufferedToActiveResult,\n  UpdateBufferedReflectionInput,\n  SwapBufferedReflectionToActiveInput,\n  CreateReflectionGenerationInput,\n  UpdateObservationalMemoryConfigInput,\n  PruneOptions,\n  PruneResult,\n  RetentionTablesDescriptor,\n  TableRetentionPolicy,\n  TABLE_NAMES,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport {\n  PgDB,\n  resolvePgConfig,\n  generateTableSQL,\n  generateIndexSQL,\n  getSchemaName as dbGetSchemaName,\n  getTableName as dbGetTableName,\n} from '../../db';\nimport type { DbClient, PgDomainConfig } from '../../db';\nimport { runPrune, runBatchedDelete, resolveTargets } from '../../retention';\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\n/**\n * Bind dates as UTC strings because node-postgres serializes Date parameters\n * for TIMESTAMP columns using the process's local timezone.\n */\nfunction toUtcISOString(date: Date): string {\n  return date.toISOString();\n}\n\nfunction dedupeMessagesForSave(messages: MastraDBMessage[]): MastraDBMessage[] {\n  const deduped = new Map<string, MastraDBMessage>();\n  for (const message of messages) {\n    const existing = deduped.get(message.id);\n    if (existing) {\n      deduped.set(message.id, {\n        ...message,\n        createdAt: existing.createdAt,\n      });\n    } else {\n      deduped.set(message.id, {\n        ...message,\n        createdAt: message.createdAt || new Date(),\n      });\n    }\n  }\n  return Array.from(deduped.values());\n}\n\nexport class MemoryPG extends MemoryStorage {\n  override readonly supportsPartialThreadUpdate = true;\n  readonly supportsObservationalMemory = true;\n\n  /**\n   * Retention-eligible tables. `threads`, `messages`, and `resources` all anchor\n   * on the timezone-aware `createdAtZ` mirror column (kept in sync by triggers),\n   * and are indexed for fast batched deletes. Cascade order is enforced in\n   * `prune()` (children before threads), not here. Observational memory has no\n   * timestamp anchor and is deliberately excluded.\n   */\n  static override readonly retentionTables: RetentionTablesDescriptor = {\n    messages: { table: TABLE_MESSAGES, column: 'createdAtZ', indexed: true },\n    resources: { table: TABLE_RESOURCES, column: 'createdAtZ', indexed: true },\n    threads: { table: TABLE_THREADS, column: 'createdAtZ', indexed: true },\n  };\n\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  /** Tables managed by this domain */\n  static readonly MANAGED_TABLES = [TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES, OM_TABLE] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    // Filter indexes to only those for tables managed by this domain\n    this.#indexes = indexes?.filter(idx => (MemoryPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({ tableName: TABLE_THREADS, schema: TABLE_SCHEMAS[TABLE_THREADS] });\n    await this.#db.createTable({ tableName: TABLE_MESSAGES, schema: TABLE_SCHEMAS[TABLE_MESSAGES] });\n    await this.#db.createTable({ tableName: TABLE_RESOURCES, schema: TABLE_SCHEMAS[TABLE_RESOURCES] });\n\n    // Reuse the module-level `_omTableSchema` (static import). Don't switch\n    // this to `await import('@mastra/core/storage')`: that used to deadlock\n    // `mastra build` output, because bundlers rewrite the dynamic import to\n    // point at the entry chunk that statically depends on this file, so the\n    // cycle never resolves when storage initializes during module\n    // evaluation (#18298).\n    const omSchema = _omTableSchema?.[OM_TABLE];\n\n    if (omSchema) {\n      await this.#db.createTable({\n        tableName: OM_TABLE as any,\n        schema: omSchema,\n      });\n      // Add new OM columns for backwards compatibility with existing databases\n      await this.#db.alterTable({\n        tableName: OM_TABLE as any,\n        schema: omSchema,\n        ifNotExists: OM_MIGRATION_COLUMNS,\n      });\n    }\n    await this.#db.alterTable({\n      tableName: TABLE_MESSAGES,\n      schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n      ifNotExists: ['resourceId'],\n    });\n    if (omSchema) {\n      // Create index on lookupKey for efficient OM queries\n      const omTableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.createIndexFromStatement(\n        'idx_om_lookup_key',\n        `CREATE INDEX IF NOT EXISTS idx_om_lookup_key ON ${omTableName} (\"lookupKey\")`,\n      );\n    }\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  /**\n   * Lazily ensures a btree index exists on each configured policy's retention\n   * anchor column so age-based `prune()` deletes stay fast on large tables.\n   * Called from the prune path (not init) so only deployments that configure\n   * retention pay the index's write/disk overhead. Best-effort: failures are\n   * logged and pruning proceeds (correct, just slower).\n   * Created even with `skipDefaultIndexes` — retention is an explicit opt-in,\n   * so its supporting index is not part of the default index set.\n   */\n  private async ensureRetentionIndexes(policies: Record<string, TableRetentionPolicy>): Promise<void> {\n    const prefix = this.#schema && this.#schema !== 'public' ? `${this.#schema}_` : '';\n    for (const [key, entry] of Object.entries(MemoryPG.retentionTables)) {\n      if (!entry.indexed || !policies[key]) continue;\n      try {\n        await this.#db.ensureIndex({\n          indexName: `${prefix}mastra_${key}_retention_idx`,\n          tableName: entry.table as TABLE_NAMES,\n          column: entry.column,\n        });\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create retention index for ${entry.table}:`, error);\n      }\n    }\n  }\n\n  /**\n   * Returns default index definitions for the memory domain tables.\n   * @param schemaPrefix - Prefix for index names (e.g. \"my_schema_\" or \"\")\n   */\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}mastra_threads_resourceid_createdat_idx`,\n        table: TABLE_THREADS,\n        columns: ['resourceId', 'createdAt DESC'],\n      },\n      {\n        name: `${schemaPrefix}mastra_messages_thread_id_createdat_idx`,\n        table: TABLE_MESSAGES,\n        columns: ['thread_id', 'createdAt DESC'],\n      },\n    ];\n  }\n\n  /**\n   * Returns all DDL statements for this domain: tables (threads, messages, resources, OM), indexes.\n   * Used by exportSchemas to produce a complete, reproducible schema export.\n   */\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n    const quotedSchemaName = dbGetSchemaName(schemaName);\n\n    // Tables: threads, messages, resources\n    for (const tableName of [TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES] as const) {\n      statements.push(\n        generateTableSQL({\n          tableName,\n          schema: TABLE_SCHEMAS[tableName],\n          schemaName,\n          includeAllConstraints: true,\n        }),\n      );\n    }\n\n    // Observational memory table (if schema available in this version of core)\n    const omSchema = _omTableSchema?.[OM_TABLE];\n    if (omSchema) {\n      statements.push(\n        generateTableSQL({\n          tableName: OM_TABLE as any,\n          schema: omSchema,\n          schemaName,\n          includeAllConstraints: true,\n        }),\n      );\n      // idx_om_lookup_key index\n      const fullOmTableName = dbGetTableName({ indexName: OM_TABLE, schemaName: quotedSchemaName });\n      const idxPrefix = schemaPrefix ? `${schemaPrefix}` : '';\n      statements.push(\n        `CREATE INDEX IF NOT EXISTS \"${idxPrefix}idx_om_lookup_key\" ON ${fullOmTableName} (\"lookupKey\");`,\n      );\n    }\n\n    // Default indexes\n    for (const idx of MemoryPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    return statements;\n  }\n\n  /**\n   * Returns default index definitions for this instance's schema.\n   */\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return MemoryPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  /**\n   * Creates default indexes for optimal query performance.\n   */\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) {\n      return;\n    }\n\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        // Log but continue - indexes are performance optimizations\n        this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  /**\n   * Creates custom user-defined indexes for this domain's tables.\n   */\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) {\n      return;\n    }\n\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        // Log but continue - indexes are performance optimizations\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_MESSAGES });\n    await this.#db.clearTable({ tableName: TABLE_THREADS });\n    await this.#db.clearTable({ tableName: TABLE_RESOURCES });\n  }\n\n  /**\n   * Deletes rows older than the configured `maxAge` per table, in bounded,\n   * batched, cancellable chunks. Tables are pruned children-first (messages and\n   * resources before threads) since PostgreSQL has no FK cascade in this schema.\n   * Unset tables are kept forever.\n   *\n   * When a `messages` policy is set, semantic-recall embeddings for pruned\n   * messages are also swept from same-schema `memory_messages*` vector tables\n   * (best-effort, mirroring `deleteThread`). Embeddings held in an external\n   * vector store are out of reach and must be pruned by the operator.\n   */\n  async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n    await this.ensureRetentionIndexes(policies);\n    const targets = resolveTargets({\n      policies,\n      descriptor: MemoryPG.retentionTables,\n      order: ['messages', 'resources', 'threads'],\n    });\n    const results = await runPrune({ db: this.#db, domain: 'memory', targets, options });\n    if (policies['messages']) {\n      await this.pruneOrphanedVectorRows(policies['messages'], options);\n    }\n    return results;\n  }\n\n  /**\n   * Best-effort sweep of semantic-recall vector rows whose source message no\n   * longer exists (e.g. it was just pruned), so recall doesn't keep returning\n   * embeddings that resolve to nothing. Only same-schema default vector tables\n   * (`memory_messages*`) are covered — the same set `deleteThread` cleans up.\n   * Failures are logged, never thrown: vector cleanup must not fail the prune.\n   */\n  private async pruneOrphanedVectorRows(policy: TableRetentionPolicy, options?: PruneOptions): Promise<void> {\n    try {\n      const schemaName = this.#schema || 'public';\n      const vectorTables = await this.#db.client.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      const messagesTable = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n      for (const { tablename } of vectorTables) {\n        const vectorTableName = getTableName({ indexName: tablename, schemaName: getSchemaName(this.#schema) });\n        await runBatchedDelete({\n          deleteBatch: async limit => {\n            const result = await this.#db.client.query(\n              `\n              DELETE FROM ${vectorTableName}\n              WHERE ctid IN (\n                SELECT v.ctid FROM ${vectorTableName} v\n                WHERE v.metadata->>'message_id' IS NOT NULL\n                AND NOT EXISTS (SELECT 1 FROM ${messagesTable} m WHERE m.id = v.metadata->>'message_id')\n                LIMIT $1\n              )\n            `,\n              [limit],\n            );\n            return result.rowCount ?? 0;\n          },\n          batchSize: policy.batchSize ?? 1000,\n          options,\n        });\n      }\n    } catch (error) {\n      this.logger?.warn?.('Failed to sweep orphaned semantic-recall vector rows after prune:', error);\n    }\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({\n    threadId,\n    resourceId,\n  }: {\n    threadId: string;\n    resourceId?: string;\n  }): Promise<StorageThreadType | null> {\n    return this.#getThreadById(this.#db.readClient, { threadId, resourceId });\n  }\n\n  /**\n   * Thread lookup against an explicit client. Mutation paths pass the writer so\n   * a lagging read replica cannot produce false not-found or stale metadata.\n   */\n  async #getThreadById(\n    client: DbClient,\n    { threadId, resourceId }: { threadId: string; resourceId?: string },\n  ): Promise<StorageThreadType | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n\n      let query = `SELECT * FROM ${tableName} WHERE id = $1`;\n      let params: any[] = [threadId];\n\n      if (resourceId !== undefined) {\n        query += ` AND \"resourceId\" = $2`;\n        params.push(resourceId);\n      }\n\n      const thread = await client.oneOrNone<StorageThreadType & { createdAtZ: Date; updatedAtZ: Date }>(query, params);\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  /**\n   * Atomically reassign a thread and all of its messages to a different resource.\n   *\n   * Runs inside a single transaction and takes a `SELECT ... FOR UPDATE` row lock on the\n   * thread, so overlapping transfers of the same thread serialize and can never interleave\n   * the thread update with the message update. Either both the thread and every message move\n   * to the new resource, or neither does — there is no split-ownership window. The thread's\n   * `createdAt` is preserved. Callers are responsible for authorizing the reassignment.\n   */\n  async updateThreadResourceId({\n    threadId,\n    resourceId,\n  }: {\n    threadId: string;\n    resourceId: string;\n  }): Promise<StorageThreadType> {\n    const threadsTable = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n    const messagesTable = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n\n    try {\n      return await this.#db.client.tx(async t => {\n        // Lock the thread row for the duration of the transaction. Concurrent transfers of the\n        // same thread block here until this transaction commits, so they cannot interleave.\n        const thread = await t.oneOrNone<StorageThreadType & { createdAtZ: Date; updatedAtZ: Date }>(\n          `SELECT * FROM ${threadsTable} WHERE id = $1 FOR UPDATE`,\n          [threadId],\n        );\n\n        if (!thread) {\n          throw new Error(`Thread \"${threadId}\" not found`);\n        }\n\n        const normalized: StorageThreadType = {\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\n        if (thread.resourceId === resourceId) {\n          return normalized;\n        }\n\n        await t.none(\n          `UPDATE ${threadsTable} SET \"resourceId\" = $1, \"updatedAt\" = NOW(), \"updatedAtZ\" = NOW() WHERE id = $2`,\n          [resourceId, threadId],\n        );\n        await t.none(`UPDATE ${messagesTable} SET \"resourceId\" = $1 WHERE thread_id = $2`, [resourceId, threadId]);\n\n        return { ...normalized, resourceId, updatedAt: new Date() };\n      });\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_THREAD_RESOURCE_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { threadId, resourceId },\n        },\n        error,\n      );\n    }\n  }\n\n  public async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n    const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n\n    try {\n      // Validate pagination input before normalization\n      // This ensures page === 0 when perPageInput === false\n      this.validatePaginationInput(page, perPageInput ?? 100);\n    } catch (error) {\n      throw new MastraError({\n        id: createStorageErrorId('PG', 'LIST_THREADS', 'INVALID_PAGE'),\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        text: error instanceof Error ? error.message : 'Invalid pagination parameters',\n        details: { page, ...(perPageInput !== undefined && { perPage: perPageInput }) },\n      });\n    }\n\n    const perPage = normalizePerPage(perPageInput, 100);\n\n    // Validate metadata keys to prevent SQL injection\n    try {\n      this.validateMetadataKeys(filter?.metadata);\n    } catch (error) {\n      throw new MastraError({\n        id: createStorageErrorId('PG', 'LIST_THREADS', 'INVALID_METADATA_KEY'),\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        text: error instanceof Error ? error.message : 'Invalid metadata key',\n        details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(', ') : '' },\n      });\n    }\n\n    const { field, direction } = this.parseOrderBy(orderBy);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    try {\n      const tableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n      const whereClauses: string[] = [];\n      const queryParams: any[] = [];\n      let paramIndex = 1;\n\n      // Add resourceId filter if provided\n      if (filter?.resourceId) {\n        whereClauses.push(`\"resourceId\" = $${paramIndex}`);\n        queryParams.push(filter.resourceId);\n        paramIndex++;\n      }\n\n      // Add metadata filters if provided (AND logic)\n      // Uses JSONB containment (@>) to avoid SQL injection and correctly match all value types including null\n      // metadata column is TEXT type storing JSON, so we need to cast to jsonb first\n      if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n        for (const [key, value] of Object.entries(filter.metadata)) {\n          // Use JSONB containment operator - no key interpolation needed\n          whereClauses.push(`metadata::jsonb @> $${paramIndex}::jsonb`);\n          // Build a small JSON object for each key-value pair\n          queryParams.push(JSON.stringify({ [key]: value }));\n          paramIndex++;\n        }\n      }\n\n      const whereClause = whereClauses.length > 0 ? `WHERE ${whereClauses.join(' AND ')}` : '';\n      const baseQuery = `FROM ${tableName} ${whereClause}`;\n\n      const countQuery = `SELECT COUNT(*) ${baseQuery}`;\n      const countResult = await this.#db.readClient.one(countQuery, queryParams);\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return {\n          threads: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      const limitValue = perPageInput === false ? total : perPage;\n      // Select both standard and timezone-aware columns (*Z) for proper UTC timestamp handling\n      const dataQuery = `SELECT id, \"resourceId\", title, metadata, \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\" ${baseQuery} ORDER BY COALESCE(\"${field}Z\", \"${field}\") ${direction} LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`;\n      const rows = await this.#db.readClient.manyOrNone<StorageThreadType & { createdAtZ: Date; updatedAtZ: Date }>(\n        dataQuery,\n        [...queryParams, limitValue, offset],\n      );\n\n      const threads = (rows || []).map(thread => ({\n        id: thread.id,\n        resourceId: thread.resourceId,\n        title: thread.title,\n        metadata: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n        // Use timezone-aware columns (*Z) for correct UTC timestamps, with fallback for legacy data\n        createdAt: thread.createdAtZ || thread.createdAt,\n        updatedAt: thread.updatedAtZ || thread.updatedAt,\n      }));\n\n      return {\n        threads,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      // Re-throw USER errors (validation errors) directly so callers get proper 400 responses\n      if (error instanceof MastraError && error.category === ErrorCategory.USER) {\n        throw error;\n      }\n      const mastraError = new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_THREADS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            ...(filter?.resourceId && { resourceId: filter.resourceId }),\n            hasMetadataFilter: !!filter?.metadata,\n            page,\n          },\n        },\n        error,\n      );\n      this.logger?.error?.(mastraError.toString());\n      this.logger?.trackException(mastraError);\n      throw mastraError;\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      const createdAt = toUtcISOString(thread.createdAt);\n      const updatedAt = toUtcISOString(thread.updatedAt);\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          createdAt,\n          createdAt,\n          updatedAt,\n          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(this.#db.client, { 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: title ?? null,\n        },\n      });\n    }\n\n    const mergedMetadata = {\n      ...existingThread.metadata,\n      ...metadata,\n    };\n\n    try {\n      const now = new Date();\n      const nowStr = toUtcISOString(now);\n      const thread = await this.#db.client.one<StorageThreadType & { createdAtZ: Date; updatedAtZ: Date }>(\n        `UPDATE ${threadTableName}\n                    SET\n                        title = COALESCE($1, title),\n                        metadata = $2,\n                        \"updatedAt\" = $3,\n                        \"updatedAtZ\" = $4\n                    WHERE id = $5\n                    RETURNING *\n                `,\n        [title ?? null, mergedMetadata, nowStr, nowStr, 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: title ?? null,\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 current approach uses two phases for optimal performance:\n   * 1. Batch-fetch all target messages' metadata (thread_id, createdAt) in one query\n   * 2. Build cursor subqueries using \"createdAt\" directly (not COALESCE) so that\n   *    the existing (thread_id, createdAt DESC) index can be used for index scans\n   *    instead of sequential scans. This fixes GitHub issue #11702 where semantic\n   *    recall latency scaled linearly with message count (~30s for 7.4k messages).\n   */\n  private _sortMessages(messages: MastraDBMessage[], field: string, direction: string): MastraDBMessage[] {\n    return messages.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\n  /**\n   * Fetches included messages by ID, discovering their thread automatically.\n   * This handles cross-thread includes where the include item doesn't specify a threadId.\n   * When a resourceId is given, both the target lookup and the surrounding window stay\n   * inside that resource, so an include never leaks another resource's messages.\n   */\n  private async _getIncludedMessages({\n    include,\n    resourceId,\n  }: {\n    include: StorageListMessagesInput['include'];\n    resourceId?: string;\n  }) {\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    // Phase 1: Batch-fetch metadata for all target messages in a single query.\n    // This eliminates the correlated subselects that previously ran per-subquery.\n    const targetIds = include.map(inc => inc.id).filter(Boolean);\n    if (targetIds.length === 0) return null;\n\n    const idPlaceholders = targetIds.map((_, i) => '$' + (i + 1)).join(', ');\n    const targetResourceCondition = resourceId ? ` AND \"resourceId\" = $${targetIds.length + 1}` : '';\n    const targetRows = await this.#db.readClient.manyOrNone<{\n      id: string;\n      thread_id: string;\n      createdAt: Date | string;\n    }>(\n      `SELECT id, thread_id, \"createdAt\" FROM ${tableName} WHERE id IN (${idPlaceholders})${targetResourceCondition}`,\n      resourceId ? [...targetIds, resourceId] : targetIds,\n    );\n\n    if (targetRows.length === 0) return null;\n\n    const targetMap = new Map(targetRows.map(r => [r.id, { threadId: r.thread_id, createdAt: r.createdAt }]));\n\n    // Phase 2: Build cursor subqueries using materialized constants from Phase 1.\n    // Uses \"createdAt\" directly instead of COALESCE(\"createdAtZ\", \"createdAt\") so\n    // the (thread_id, createdAt DESC) composite index covers the query.\n    // createdAt and createdAtZ always store the same instant (createdAtZ is a TIMESTAMPTZ\n    // copy for timezone-correctness), so using createdAt for ordering is safe.\n    const unionQueries: string[] = [];\n    const params: any[] = [];\n    // resourceId is the same for every subquery, so bind it once as $1 and reference\n    // that placeholder from each subquery instead of re-binding it per include item.\n    let resourceCondition = '';\n    if (resourceId) {\n      params.push(resourceId);\n      resourceCondition = ` AND m.\"resourceId\" = $1`;\n    }\n    let paramIdx = params.length + 1;\n\n    for (const inc of include) {\n      const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n      const target = targetMap.get(id);\n      if (!target) continue;\n\n      // Fetch the target message itself plus previous messages.\n      // Uses createdAt <= target's createdAt, ordered DESC, limited to withPreviousMessages + 1\n      const p1 = '$' + paramIdx;\n      const p2 = '$' + (paramIdx + 1);\n      const p3 = '$' + (paramIdx + 2);\n      unionQueries.push(`(\n        SELECT ${selectColumns}\n        FROM ${tableName} m\n        WHERE m.thread_id = ${p1}\n          AND m.\"createdAt\" <= ${p2}${resourceCondition}\n        ORDER BY m.\"createdAt\" DESC, m.id DESC\n        LIMIT ${p3}\n      )`);\n      params.push(target.threadId, target.createdAt, withPreviousMessages + 1);\n      paramIdx += 3;\n\n      // Fetch messages after the target (only if requested)\n      if (withNextMessages > 0) {\n        const p4 = '$' + paramIdx;\n        const p5 = '$' + (paramIdx + 1);\n        const p6 = '$' + (paramIdx + 2);\n        unionQueries.push(`(\n          SELECT ${selectColumns}\n          FROM ${tableName} m\n          WHERE m.thread_id = ${p4}\n            AND m.\"createdAt\" > ${p5}${resourceCondition}\n          ORDER BY m.\"createdAt\" ASC, m.id ASC\n          LIMIT ${p6}\n        )`);\n        params.push(target.threadId, target.createdAt, withNextMessages);\n        paramIdx += 3;\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, id ASC`;\n    }\n    const includedRows = await this.#db.readClient.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.readClient.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      throw mastraError;\n    }\n  }\n\n  /**\n   * Reads one page of messages together with the total row count.\n   *\n   * Every page query carries a skinny scalar `(SELECT COUNT(*) ...)` subquery that\n   * reports the total over the whole WHERE result on the same statement as the page,\n   * so the page costs one database round-trip instead of two. The page and the count\n   * also come from one snapshot, so the count always describes the returned rows. A\n   * separate `COUNT(*)` runs only as a fallback when the page is empty and the caller\n   * asked for a page after the last row, because there is then no row to carry the\n   * count on.\n   */\n  async #fetchMessagePage({\n    selectStatement,\n    tableName,\n    whereClause,\n    orderByStatement,\n    queryParams,\n    perPageInput,\n    perPage,\n    offset,\n    includeTotal = true,\n  }: {\n    selectStatement: string;\n    tableName: string;\n    whereClause: string;\n    orderByStatement: string;\n    queryParams: any[];\n    perPageInput: number | false | undefined;\n    perPage: number;\n    offset: number;\n    includeTotal?: boolean;\n  }): Promise<{ total: number; messages: MessageRowFromDB[]; hasMore?: boolean }> {\n    // When the caller does not need `total` (e.g. agent last-N reads), skip the\n    // `COUNT(*)` subquery entirely. For a bounded page we peek one extra row\n    // (LIMIT perPage + 1) so `hasMore` can be derived without counting the whole\n    // thread. `total` is not a real count in this path, so callers must not use it.\n    if (includeTotal === false && perPageInput !== false) {\n      const peekLimit = perPage + 1;\n      const rows =\n        (await this.#db.readClient.manyOrNone<MessageRowFromDB>(\n          `${selectStatement} FROM ${tableName} ${whereClause} ${orderByStatement} LIMIT $${queryParams.length + 1} OFFSET $${queryParams.length + 2}`,\n          [...queryParams, peekLimit, offset],\n        )) || [];\n      const hasMore = rows.length > perPage;\n      const messages = hasMore ? rows.slice(0, perPage) : rows;\n      return { total: offset + messages.length, messages, hasMore };\n    }\n\n    // `perPageInput === false` means \"every row\", so no LIMIT is applied.\n    const limitClause =\n      perPageInput === false ? '' : ` LIMIT $${queryParams.length + 1} OFFSET $${queryParams.length + 2}`;\n    const dataParams = perPageInput === false ? queryParams : [...queryParams, perPage, offset];\n\n    if (includeTotal === false) {\n      // Unbounded read (perPageInput === false) that does not need `total`: skip the\n      // COUNT(*) subquery. Every matching row is returned, so `hasMore` is false.\n      const rows =\n        (await this.#db.readClient.manyOrNone<MessageRowFromDB>(\n          `${selectStatement} FROM ${tableName} ${whereClause} ${orderByStatement}`,\n          dataParams,\n        )) || [];\n      return { total: rows.length, messages: rows, hasMore: false };\n    }\n\n    // Use a skinny scalar COUNT(*) subquery rather than COUNT(*) OVER (). The window ran over\n    // the full SELECT list, forcing Postgres to materialize/heap-fetch `content` for every\n    // matching row before LIMIT. The uncorrelated subquery is evaluated once (InitPlan) and\n    // can use an index-only scan, while the outer SELECT is served by an index scan + LIMIT.\n    // Both WHERE clauses reference the same positional params, so `dataParams` is unchanged.\n    const rows =\n      (await this.#db.readClient.manyOrNone<MessageRowFromDB & { __total?: string | number }>(\n        `${selectStatement}, (SELECT COUNT(*) FROM ${tableName} ${whereClause}) AS \"__total\" FROM ${tableName} ${whereClause} ${orderByStatement}${limitClause}`,\n        dataParams,\n      )) || [];\n\n    if (rows.length > 0) {\n      return { total: Number(rows[0]!.__total), messages: rows };\n    }\n    if (offset === 0) {\n      return { total: 0, messages: [] };\n    }\n    const countResult = await this.#db.readClient.one(`SELECT COUNT(*) FROM ${tableName} ${whereClause}`, queryParams);\n    return { total: parseInt(countResult.count, 10), messages: [] };\n  }\n\n  public async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n    const {\n      threadId,\n      resourceId,\n      include,\n      filter,\n      perPage: perPageInput,\n      page = 0,\n      orderBy,\n      includeTotal = true,\n    } = 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    const metadataFilter = validateStorageMetadataFilter(filter?.metadata);\n\n    try {\n      const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n      // Order by the raw timestamp column (not COALESCE(\"${field}Z\", \"${field}\")) so the\n      // (thread_id, createdAt DESC) composite index can serve the LIMIT with an index scan\n      // instead of materializing/seq-scanning the whole thread. createdAt and createdAtZ\n      // always store the same instant (createdAtZ is a TIMESTAMPTZ copy), so row selection\n      // under LIMIT is identical. This mirrors the index-safe ordering in _getIncludedMessages.\n      const orderByStatement = `ORDER BY \"${field}\" ${direction}`;\n\n      const selectStatement = `SELECT id, content, role, type, \"createdAt\", \"createdAtZ\", thread_id AS \"threadId\", \"resourceId\"`;\n      const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n\n      const conditions: string[] = [`thread_id IN (${inPlaceholders(threadIds.length)})`];\n      const queryParams: any[] = [...threadIds];\n      let paramIndex = threadIds.length + 1;\n\n      if (resourceId) {\n        conditions.push(`\"resourceId\" = $${paramIndex++}`);\n        queryParams.push(resourceId);\n      }\n\n      if (filter?.dateRange?.start) {\n        const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n        conditions.push(`COALESCE(\"createdAtZ\", \"createdAt\") ${startOp} $${paramIndex++}`);\n        queryParams.push(filter.dateRange.start);\n      }\n\n      if (filter?.dateRange?.end) {\n        const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n        conditions.push(`COALESCE(\"createdAtZ\", \"createdAt\") ${endOp} $${paramIndex++}`);\n        queryParams.push(filter.dateRange.end);\n      }\n\n      const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n      // When perPage is 0 with no includes, there's nothing to return.\n      if (perPage === 0 && (!include || include.length === 0)) {\n        return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n      }\n\n      // When perPage is 0 and we have include targets, skip COUNT(*) and data queries.\n      // This is the semantic recall path where we only need the included messages.\n      if (perPage === 0 && include && include.length > 0) {\n        const includeMessages = await this._getIncludedMessages({ include, resourceId });\n        if (!includeMessages || includeMessages.length === 0) {\n          return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n        }\n        const messagesWithParsedContent = includeMessages.map(row => this.parseRow(row));\n        const list = new MessageList().add(messagesWithParsedContent, 'memory');\n        return {\n          messages: this._sortMessages(list.get.all.db(), field, direction),\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      // The included messages do not depend on the page, so start that read now and\n      // let it overlap the page read. The rejection is captured here so a failure of\n      // the page read cannot leave this promise unhandled.\n      let includeFailure: unknown;\n      const includePromise =\n        include && include.length > 0\n          ? this._getIncludedMessages({ include, resourceId }).catch((error: unknown) => {\n              includeFailure = error;\n              return null;\n            })\n          : null;\n\n      let total: number;\n      let messages: MessageRowFromDB[];\n      let peekedHasMore: boolean | undefined;\n      if (metadataFilter) {\n        const rows = await this.#db.readClient.manyOrNone(\n          `${selectStatement} FROM ${tableName} ${whereClause} ${orderByStatement}`,\n          queryParams,\n        );\n        const filteredRows = (rows || []).filter(row =>\n          storageMessageMatchesMetadataFilter(row.content, metadataFilter),\n        );\n        total = filteredRows.length;\n        messages = perPageInput === false ? filteredRows : filteredRows.slice(offset, offset + perPage);\n      } else {\n        const pageResult = await this.#fetchMessagePage({\n          selectStatement,\n          tableName,\n          whereClause,\n          orderByStatement,\n          queryParams,\n          perPageInput,\n          perPage,\n          offset,\n          includeTotal,\n        });\n        total = pageResult.total;\n        messages = pageResult.messages;\n        peekedHasMore = pageResult.hasMore;\n      }\n      const primaryPageCount = messages.length;\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 includePromise;\n        if (includeFailure) throw includeFailure;\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      const finalMessages = this._sortMessages(list.get.all.db(), field, direction);\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 =\n        peekedHasMore !== undefined\n          ? peekedHasMore\n          : metadataFilter\n            ? perPageInput !== false && offset + primaryPageCount < total\n            : 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      // Re-throw USER errors (validation errors) directly so callers get proper 400 responses\n      if (error instanceof MastraError && error.category === ErrorCategory.USER) {\n        throw error;\n      }\n      const mastraError = new MastraError(\n        {\n          id: createStorageErrorId('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      throw mastraError;\n    }\n  }\n\n  public async listMessagesByResourceId(\n    args: StorageListMessagesByResourceIdInput,\n  ): Promise<StorageListMessagesOutput> {\n    const { resourceId, include, filter, perPage: perPageInput, page = 0, orderBy, includeTotal = true } = args;\n\n    // Validate that resourceId is provided\n    const hasResourceId = resourceId !== undefined && resourceId !== null && resourceId.trim() !== '';\n    if (!hasResourceId) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_MESSAGES_BY_RESOURCE_ID', 'INVALID_QUERY'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: {\n            resourceId: resourceId ?? '',\n          },\n        },\n        new Error('resourceId is required'),\n      );\n    }\n\n    // Validate page parameter\n    if (page < 0) {\n      throw new MastraError({\n        id: createStorageErrorId('PG', 'LIST_MESSAGES_BY_RESOURCE_ID', 'INVALID_PAGE'),\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        text: 'Page number must be non-negative',\n        details: {\n          resourceId,\n          page,\n        },\n      });\n    }\n\n    const perPage = normalizePerPage(perPageInput, 40);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const metadataFilter = validateStorageMetadataFilter(filter?.metadata);\n\n    try {\n      const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n      // Order by the raw timestamp column (not COALESCE(\"${field}Z\", \"${field}\")) so the\n      // (thread_id, createdAt DESC) composite index can serve the LIMIT with an index scan\n      // instead of materializing/seq-scanning the whole thread. createdAt and createdAtZ\n      // always store the same instant (createdAtZ is a TIMESTAMPTZ copy), so row selection\n      // under LIMIT is identical. This mirrors the index-safe ordering in _getIncludedMessages.\n      const orderByStatement = `ORDER BY \"${field}\" ${direction}`;\n\n      const selectStatement = `SELECT id, content, role, type, \"createdAt\", \"createdAtZ\", thread_id AS \"threadId\", \"resourceId\"`;\n      const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n\n      // Build WHERE conditions\n      const conditions: string[] = [];\n      const queryParams: any[] = [];\n      let paramIndex = 1;\n\n      // Add resourceId filter\n      conditions.push(`\"resourceId\" = $${paramIndex++}`);\n      queryParams.push(resourceId);\n\n      if (filter?.dateRange?.start) {\n        const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n        conditions.push(`COALESCE(\"createdAtZ\", \"createdAt\") ${startOp} $${paramIndex++}`);\n        queryParams.push(filter.dateRange.start);\n      }\n\n      if (filter?.dateRange?.end) {\n        const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n        conditions.push(`COALESCE(\"createdAtZ\", \"createdAt\") ${endOp} $${paramIndex++}`);\n        queryParams.push(filter.dateRange.end);\n      }\n\n      const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n      // When perPage is 0 with no includes, there's nothing to return.\n      if (perPage === 0 && (!include || include.length === 0)) {\n        return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n      }\n\n      // Fast path: when perPage is 0 and include is provided, skip COUNT(*) and the\n      // main data query entirely. This is the semantic recall path where only included\n      // (vector-matched) messages are needed. Skipping the COUNT(*) avoids scanning\n      // the entire thread which was a major source of latency for large threads.\n      if (perPage === 0 && include && include.length > 0) {\n        const includeMessages = await this._getIncludedMessages({ include, resourceId });\n        if (!includeMessages || includeMessages.length === 0) {\n          return {\n            messages: [],\n            total: 0,\n            page,\n            perPage: perPageForResponse,\n            hasMore: false,\n          };\n        }\n\n        const messagesWithParsedContent = includeMessages.map(row => this.parseRow(row));\n        const list = new MessageList().add(messagesWithParsedContent, 'memory');\n\n        return {\n          messages: this._sortMessages(list.get.all.db(), field, direction),\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      // The included messages do not depend on the page, so start that read now and\n      // let it overlap the page read. The rejection is captured here so a failure of\n      // the page read cannot leave this promise unhandled.\n      let includeFailure: unknown;\n      const includePromise =\n        include && include.length > 0\n          ? this._getIncludedMessages({ include, resourceId }).catch((error: unknown) => {\n              includeFailure = error;\n              return null;\n            })\n          : null;\n\n      let total: number;\n      let messages: MessageRowFromDB[];\n      let peekedHasMore: boolean | undefined;\n      if (metadataFilter) {\n        const rows = await this.#db.readClient.manyOrNone(\n          `${selectStatement} FROM ${tableName} ${whereClause} ${orderByStatement}`,\n          queryParams,\n        );\n        const filteredRows = (rows || []).filter(row =>\n          storageMessageMatchesMetadataFilter(row.content, metadataFilter),\n        );\n        total = filteredRows.length;\n        messages = perPageInput === false ? filteredRows : filteredRows.slice(offset, offset + perPage);\n      } else {\n        const pageResult = await this.#fetchMessagePage({\n          selectStatement,\n          tableName,\n          whereClause,\n          orderByStatement,\n          queryParams,\n          perPageInput,\n          perPage,\n          offset,\n          includeTotal,\n        });\n        total = pageResult.total;\n        messages = pageResult.messages;\n        peekedHasMore = pageResult.hasMore;\n      }\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 includePromise;\n        if (includeFailure) throw includeFailure;\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      const finalMessages = this._sortMessages(list.get.all.db(), field, direction);\n\n      const hasMore = peekedHasMore !== undefined ? peekedHasMore : perPageInput !== false && offset + perPage < total;\n\n      return {\n        messages: finalMessages,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore,\n      };\n    } catch (error) {\n      // Re-throw USER errors (validation errors) directly so callers get proper 400 responses\n      if (error instanceof MastraError && error.category === ErrorCategory.USER) {\n        throw error;\n      }\n      const mastraError = new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_MESSAGES_BY_RESOURCE_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            resourceId: resourceId ?? '',\n          },\n        },\n        error,\n      );\n      this.logger?.error?.(mastraError.toString());\n      this.logger?.trackException(mastraError);\n      throw mastraError;\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    try {\n      const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n      const threadIds = new Set<string>();\n      for (const message of messages) {\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        threadIds.add(message.threadId);\n      }\n\n      for (const threadIdToCheck of threadIds) {\n        const thread = await this.#getThreadById(this.#db.client, { threadId: threadIdToCheck });\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 ${threadIdToCheck} not found`,\n            details: {\n              threadId: threadIdToCheck,\n            },\n          });\n        }\n      }\n\n      const messagesToSave = dedupeMessagesForSave(messages);\n      await this.#db.client.tx(async t => {\n        for (let offset = 0; offset < messagesToSave.length; offset += MAX_MESSAGES_PER_INSERT) {\n          const batch = messagesToSave.slice(offset, offset + MAX_MESSAGES_PER_INSERT);\n          const values: unknown[] = [];\n          const valuePlaceholders = batch\n            .map((message, messageIndex) => {\n              const createdAt = toUtcISOString(message.createdAt || new Date());\n              values.push(\n                message.id,\n                message.threadId,\n                typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n                createdAt,\n                createdAt,\n                message.role,\n                message.type || 'v2',\n                message.resourceId,\n              );\n\n              const paramOffset = messageIndex * MESSAGE_INSERT_BIND_PARAMETERS;\n              return `(${Array.from(\n                { length: MESSAGE_INSERT_BIND_PARAMETERS },\n                (_, paramIndex) => `$${paramOffset + paramIndex + 1}`,\n              ).join(', ')})`;\n            })\n            .join(', ');\n\n          await t.none(\n            `INSERT INTO ${tableName} (id, thread_id, content, \"createdAt\", \"createdAtZ\", role, type, \"resourceId\")\n             VALUES ${valuePlaceholders}\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            values,\n          );\n        }\n\n        const threadTableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n        const now = toUtcISOString(new Date());\n        for (const threadIdToUpdate of threadIds) {\n          await t.none(\n            `UPDATE ${threadTableName}\n              SET\n                \"updatedAt\" = $1,\n                \"updatedAtZ\" = $2\n              WHERE id = $3`,\n            [now, now, threadIdToUpdate],\n          );\n        }\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      if (error instanceof MastraError) {\n        throw error;\n      }\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          await t.none(\n            `UPDATE ${threadTableName} SET \"updatedAt\" = NOW(), \"updatedAtZ\" = NOW() WHERE id IN (${inPlaceholders(threadIds.length)})`,\n            threadIds,\n          );\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    return this.#getResourceById(this.#db.readClient, resourceId);\n  }\n\n  async #getResourceById(client: DbClient, resourceId: string): Promise<StorageResourceType | null> {\n    const tableName = getTableName({ indexName: TABLE_RESOURCES, schemaName: getSchemaName(this.#schema) });\n    const result = await 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    const createdAt = toUtcISOString(resource.createdAt);\n    const updatedAt = toUtcISOString(resource.updatedAt);\n    await this.#db.insert({\n      tableName: TABLE_RESOURCES,\n      record: {\n        ...resource,\n        metadata: JSON.stringify(resource.metadata),\n        createdAt,\n        updatedAt,\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(this.#db.client, resourceId);\n\n    if (!existingResource) {\n      const newResource: StorageResourceType = {\n        id: resourceId,\n        workingMemory,\n        metadata: metadata || {},\n        createdAt: new Date(),\n        updatedAt: new Date(),\n      };\n      return this.saveResource({ resource: newResource });\n    }\n\n    const updatedResource = {\n      ...existingResource,\n      workingMemory: workingMemory !== undefined ? workingMemory : existingResource.workingMemory,\n      metadata: {\n        ...existingResource.metadata,\n        ...metadata,\n      },\n      updatedAt: new Date(),\n    };\n\n    const tableName = getTableName({ indexName: TABLE_RESOURCES, schemaName: getSchemaName(this.#schema) });\n\n    const updates: string[] = [];\n    const values: any[] = [];\n    let paramIndex = 1;\n\n    if (workingMemory !== undefined) {\n      updates.push(`\"workingMemory\" = $${paramIndex}`);\n      values.push(workingMemory);\n      paramIndex++;\n    }\n\n    if (metadata) {\n      updates.push(`metadata = $${paramIndex}`);\n      values.push(JSON.stringify(updatedResource.metadata));\n      paramIndex++;\n    }\n\n    const updatedAtStr = updatedResource.updatedAt.toISOString();\n    updates.push(`\"updatedAt\" = $${paramIndex++}`);\n    values.push(updatedAtStr);\n    updates.push(`\"updatedAtZ\" = $${paramIndex++}`);\n    values.push(updatedAtStr);\n\n    values.push(resourceId);\n\n    await this.#db.client.none(`UPDATE ${tableName} SET ${updates.join(', ')} WHERE id = $${paramIndex}`, values);\n\n    return updatedResource;\n  }\n\n  async copyThread(args: StorageCloneThreadInput): Promise<StorageCopyThreadOutput> {\n    const { sourceThreadId, newThreadId: providedThreadId, resourceId, title, metadata, options } = args;\n\n    // Get the source thread\n    const sourceThread = await this.#getThreadById(this.#db.client, { threadId: sourceThreadId });\n    if (!sourceThread) {\n      throw new MastraError({\n        id: createStorageErrorId('PG', 'CLONE_THREAD', 'SOURCE_NOT_FOUND'),\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        text: `Source thread with id ${sourceThreadId} not found`,\n        details: { sourceThreadId },\n      });\n    }\n\n    // Use provided ID or generate a new one\n    const newThreadId = providedThreadId || crypto.randomUUID();\n\n    // Check if the new thread ID already exists\n    const existingThread = await this.#getThreadById(this.#db.client, { threadId: newThreadId });\n    if (existingThread) {\n      throw new MastraError({\n        id: createStorageErrorId('PG', 'CLONE_THREAD', 'THREAD_EXISTS'),\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        text: `Thread with id ${newThreadId} already exists`,\n        details: { newThreadId },\n      });\n    }\n\n    const threadTableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n    const messageTableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n\n    try {\n      return await this.#db.client.tx(async t => {\n        // Build message query with filters. Only ids (and createdAt for ordering / clone\n        // metadata) are read here — content is copied inside the database via\n        // INSERT … SELECT and never returned to the JS heap.\n        let messageQuery = `SELECT id, \"createdAt\"\n                            FROM ${messageTableName} WHERE thread_id = $1`;\n        const messageParams: any[] = [sourceThreadId];\n        let paramIndex = 2;\n\n        // Apply date filters\n        if (options?.messageFilter?.startDate) {\n          messageQuery += ` AND COALESCE(\"createdAtZ\", \"createdAt\") >= $${paramIndex++}`;\n          messageParams.push(options.messageFilter.startDate);\n        }\n        if (options?.messageFilter?.endDate) {\n          messageQuery += ` AND COALESCE(\"createdAtZ\", \"createdAt\") <= $${paramIndex++}`;\n          messageParams.push(options.messageFilter.endDate);\n        }\n\n        // Apply message ID filter\n        if (options?.messageFilter?.messageIds && options.messageFilter.messageIds.length > 0) {\n          messageQuery += ` AND id IN (${options.messageFilter.messageIds.map(() => `$${paramIndex++}`).join(', ')})`;\n          messageParams.push(...options.messageFilter.messageIds);\n        }\n\n        messageQuery += ` ORDER BY \"createdAt\" ASC`;\n\n        // Apply message limit (from most recent, so we need to reverse order for limit then sort back)\n        if (options?.messageLimit && options.messageLimit > 0) {\n          // Get messages ordered DESC to get most recent, limited, then we'll reverse\n          const limitQuery = `SELECT * FROM (${messageQuery.replace('ORDER BY \"createdAt\" ASC', 'ORDER BY \"createdAt\" DESC')} LIMIT $${paramIndex}) AS limited ORDER BY \"createdAt\" ASC`;\n          messageParams.push(options.messageLimit);\n          messageQuery = limitQuery;\n        }\n\n        const sourceMessages = await t.manyOrNone<Pick<MessageRowFromDB, 'id' | 'createdAt'>>(\n          messageQuery,\n          messageParams,\n        );\n\n        const now = new Date();\n        const nowStr = toUtcISOString(now);\n\n        // Determine the last message ID for clone metadata\n        const lastMessageId = sourceMessages.length > 0 ? sourceMessages[sourceMessages.length - 1]!.id : undefined;\n\n        // Create clone metadata\n        const cloneMetadata: ThreadCloneMetadata = {\n          sourceThreadId,\n          clonedAt: now,\n          ...(lastMessageId && { lastMessageId }),\n        };\n\n        // Create the new thread\n        const newThread: StorageThreadType = {\n          id: newThreadId,\n          resourceId: resourceId || sourceThread.resourceId,\n          title: title || (sourceThread.title ? `Clone of ${sourceThread.title}` : ''),\n          metadata: {\n            ...metadata,\n            clone: cloneMetadata,\n          },\n          createdAt: now,\n          updatedAt: now,\n        };\n\n        // Insert the new thread\n        await t.none(\n          `INSERT INTO ${threadTableName} (\n            id,\n            \"resourceId\",\n            title,\n            metadata,\n            \"createdAt\",\n            \"createdAtZ\",\n            \"updatedAt\",\n            \"updatedAtZ\"\n          ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`,\n          [\n            newThread.id,\n            newThread.resourceId,\n            newThread.title,\n            newThread.metadata ? JSON.stringify(newThread.metadata) : null,\n            nowStr,\n            nowStr,\n            nowStr,\n            nowStr,\n          ],\n        );\n\n        // Copy messages under new IDs. content/role/type are read from the source row\n        // within SQL and never materialized in the JS heap.\n        const messageIdMap: Record<string, string> = {};\n        const targetResourceId = resourceId || sourceThread.resourceId;\n\n        for (const sourceMsg of sourceMessages) {\n          const newMessageId = crypto.randomUUID();\n          messageIdMap[sourceMsg.id] = newMessageId;\n\n          const insertResult = await t.query(\n            `INSERT INTO ${messageTableName} (id, thread_id, content, \"createdAt\", \"createdAtZ\", role, type, \"resourceId\")\n             SELECT $1, $2, content, \"createdAt\", \"createdAtZ\", role, type, $3\n             FROM ${messageTableName} WHERE id = $4`,\n            [newMessageId, newThreadId, targetResourceId, sourceMsg.id],\n          );\n          if (insertResult.rowCount !== 1) {\n            throw new Error(\n              `Failed to copy message ${sourceMsg.id}: expected 1 row copied but got ${insertResult.rowCount}`,\n            );\n          }\n        }\n\n        return { thread: newThread, messageIdMap };\n      });\n    } catch (error) {\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CLONE_THREAD', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { sourceThreadId, newThreadId },\n        },\n        error,\n      );\n    }\n  }\n\n  // ============================================\n  // Observational Memory Methods\n  // ============================================\n\n  private getOMKey(threadId: string | null, resourceId: string): string {\n    return threadId ? `thread:${threadId}` : `resource:${resourceId}`;\n  }\n\n  private parseOMRow(row: any): ObservationalMemoryRecord {\n    // OM is a new table - use timezone-aware columns (*Z) directly (no legacy fallback needed)\n    return {\n      id: row.id,\n      scope: row.scope,\n      threadId: row.threadId || null,\n      resourceId: row.resourceId,\n      createdAt: new Date(row.createdAtZ),\n      updatedAt: new Date(row.updatedAtZ),\n      lastObservedAt: row.lastObservedAtZ ? new Date(row.lastObservedAtZ) : undefined,\n      originType: row.originType || 'initial',\n      generationCount: Number(row.generationCount || 0),\n      activeObservations: row.activeObservations || '',\n      // Handle new chunk-based structure\n      bufferedObservationChunks: row.bufferedObservationChunks\n        ? typeof row.bufferedObservationChunks === 'string'\n          ? JSON.parse(row.bufferedObservationChunks)\n          : row.bufferedObservationChunks\n        : undefined,\n      // Deprecated fields (for backward compatibility)\n      bufferedObservations: row.activeObservationsPendingUpdate || undefined,\n      bufferedObservationTokens: row.bufferedObservationTokens ? Number(row.bufferedObservationTokens) : undefined,\n      bufferedMessageIds: undefined, // Use bufferedObservationChunks instead\n      bufferedReflection: row.bufferedReflection || undefined,\n      bufferedReflectionTokens: row.bufferedReflectionTokens ? Number(row.bufferedReflectionTokens) : undefined,\n      bufferedReflectionInputTokens: row.bufferedReflectionInputTokens\n        ? Number(row.bufferedReflectionInputTokens)\n        : undefined,\n      reflectedObservationLineCount: row.reflectedObservationLineCount\n        ? Number(row.reflectedObservationLineCount)\n        : undefined,\n      totalTokensObserved: Number(row.totalTokensObserved || 0),\n      observationTokenCount: Number(row.observationTokenCount || 0),\n      pendingMessageTokens: Number(row.pendingMessageTokens || 0),\n      isReflecting: Boolean(row.isReflecting),\n      isObserving: Boolean(row.isObserving),\n      isBufferingObservation: row.isBufferingObservation === true || row.isBufferingObservation === 'true',\n      isBufferingReflection: row.isBufferingReflection === true || row.isBufferingReflection === 'true',\n      lastBufferedAtTokens:\n        typeof row.lastBufferedAtTokens === 'number'\n          ? row.lastBufferedAtTokens\n          : parseInt(String(row.lastBufferedAtTokens ?? '0'), 10) || 0,\n      lastBufferedAtTime: row.lastBufferedAtTime ? new Date(String(row.lastBufferedAtTime)) : null,\n      config: row.config ? (typeof row.config === 'string' ? JSON.parse(row.config) : row.config) : {},\n      metadata: row.metadata ? (typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata) : undefined,\n      observedMessageIds: row.observedMessageIds\n        ? typeof row.observedMessageIds === 'string'\n          ? JSON.parse(row.observedMessageIds)\n          : row.observedMessageIds\n        : undefined,\n      observedTimezone: row.observedTimezone || undefined,\n    };\n  }\n\n  async getObservationalMemory(threadId: string | null, resourceId: string): Promise<ObservationalMemoryRecord | null> {\n    try {\n      const lookupKey = this.getOMKey(threadId, resourceId);\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"lookupKey\" = $1 ORDER BY \"generationCount\" DESC LIMIT 1`,\n        [lookupKey],\n      );\n      if (!result) return null;\n      return this.parseOMRow(result);\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_OBSERVATIONAL_MEMORY', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { threadId, resourceId },\n        },\n        error,\n      );\n    }\n  }\n\n  async getObservationalMemoryHistory(\n    threadId: string | null,\n    resourceId: string,\n    limit: number = 10,\n    options?: ObservationalMemoryHistoryOptions,\n  ): Promise<ObservationalMemoryRecord[]> {\n    try {\n      const lookupKey = this.getOMKey(threadId, resourceId);\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n\n      const conditions = [`\"lookupKey\" = $1`];\n      const params: unknown[] = [lookupKey];\n      let paramIndex = 2;\n\n      if (options?.from) {\n        conditions.push(`\"createdAtZ\" >= $${paramIndex}`);\n        params.push(options.from.toISOString());\n        paramIndex++;\n      }\n      if (options?.to) {\n        conditions.push(`\"createdAtZ\" <= $${paramIndex}`);\n        params.push(options.to.toISOString());\n        paramIndex++;\n      }\n\n      params.push(limit);\n      let sql = `SELECT * FROM ${tableName} WHERE ${conditions.join(' AND ')} ORDER BY \"generationCount\" DESC LIMIT $${paramIndex}`;\n      paramIndex++;\n\n      if (options?.offset != null) {\n        params.push(options.offset);\n        sql += ` OFFSET $${paramIndex}`;\n      }\n\n      const result = await this.#db.readClient.manyOrNone(sql, params);\n      if (!result) return [];\n      return result.map(row => this.parseOMRow(row));\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_OBSERVATIONAL_MEMORY_HISTORY', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { threadId, resourceId, limit },\n        },\n        error,\n      );\n    }\n  }\n\n  async initializeObservationalMemory(input: CreateObservationalMemoryInput): Promise<ObservationalMemoryRecord> {\n    try {\n      const id = crypto.randomUUID();\n      const now = new Date();\n      const lookupKey = this.getOMKey(input.threadId, input.resourceId);\n\n      const record: ObservationalMemoryRecord = {\n        id,\n        scope: input.scope,\n        threadId: input.threadId,\n        resourceId: input.resourceId,\n        createdAt: now,\n        updatedAt: now,\n        lastObservedAt: undefined,\n        originType: 'initial',\n        generationCount: 0,\n        activeObservations: '',\n        totalTokensObserved: 0,\n        observationTokenCount: 0,\n        pendingMessageTokens: 0,\n        isReflecting: false,\n        isObserving: false,\n        isBufferingObservation: false,\n        isBufferingReflection: false,\n        lastBufferedAtTokens: 0,\n        lastBufferedAtTime: null,\n        config: input.config,\n        observedTimezone: input.observedTimezone,\n      };\n\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const nowStr = now.toISOString();\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, \"lookupKey\", scope, \"resourceId\", \"threadId\",\n          \"activeObservations\", \"activeObservationsPendingUpdate\",\n          \"originType\", config, \"generationCount\", \"lastObservedAt\", \"lastObservedAtZ\", \"lastReflectionAt\", \"lastReflectionAtZ\",\n          \"pendingMessageTokens\", \"totalTokensObserved\", \"observationTokenCount\",\n          \"isObserving\", \"isReflecting\", \"isBufferingObservation\", \"isBufferingReflection\", \"lastBufferedAtTokens\", \"lastBufferedAtTime\",\n          \"observedTimezone\", \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28)`,\n        [\n          id,\n          lookupKey,\n          input.scope,\n          input.resourceId,\n          input.threadId || null,\n          '',\n          null,\n          'initial',\n          JSON.stringify(input.config),\n          0,\n          null, // lastObservedAt\n          null, // lastObservedAtZ\n          null, // lastReflectionAt\n          null, // lastReflectionAtZ\n          0,\n          0,\n          0,\n          false,\n          false,\n          false, // isBufferingObservation\n          false, // isBufferingReflection\n          0, // lastBufferedAtTokens\n          null, // lastBufferedAtTime\n          input.observedTimezone || null,\n          nowStr, // createdAt\n          nowStr, // createdAtZ\n          nowStr, // updatedAt\n          nowStr, // updatedAtZ\n        ],\n      );\n\n      return record;\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'INITIALIZE_OBSERVATIONAL_MEMORY', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { threadId: input.threadId, resourceId: input.resourceId },\n        },\n        error,\n      );\n    }\n  }\n\n  async insertObservationalMemoryRecord(record: ObservationalMemoryRecord): Promise<void> {\n    try {\n      const lookupKey = this.getOMKey(record.threadId, record.resourceId);\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const lastObservedAtStr = record.lastObservedAt ? record.lastObservedAt.toISOString() : null;\n      const lastBufferedAtTimeStr = record.lastBufferedAtTime ? record.lastBufferedAtTime.toISOString() : null;\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, \"lookupKey\", scope, \"resourceId\", \"threadId\",\n          \"activeObservations\", \"activeObservationsPendingUpdate\",\n          \"originType\", config, \"generationCount\", \"lastObservedAt\", \"lastObservedAtZ\", \"lastReflectionAt\", \"lastReflectionAtZ\",\n          \"pendingMessageTokens\", \"totalTokensObserved\", \"observationTokenCount\",\n          \"observedMessageIds\", \"bufferedObservationChunks\",\n          \"bufferedReflection\", \"bufferedReflectionTokens\", \"bufferedReflectionInputTokens\",\n          \"reflectedObservationLineCount\",\n          \"isObserving\", \"isReflecting\", \"isBufferingObservation\", \"isBufferingReflection\",\n          \"lastBufferedAtTokens\", \"lastBufferedAtTime\",\n          \"observedTimezone\", metadata, \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35)`,\n        [\n          record.id,\n          lookupKey,\n          record.scope,\n          record.resourceId,\n          record.threadId || null,\n          record.activeObservations || '',\n          null,\n          record.originType || 'initial',\n          record.config ? JSON.stringify(record.config) : null,\n          record.generationCount || 0,\n          lastObservedAtStr,\n          lastObservedAtStr,\n          null, // lastReflectionAt\n          null, // lastReflectionAtZ\n          record.pendingMessageTokens || 0,\n          record.totalTokensObserved || 0,\n          record.observationTokenCount || 0,\n          record.observedMessageIds ? JSON.stringify(record.observedMessageIds) : null,\n          record.bufferedObservationChunks ? JSON.stringify(record.bufferedObservationChunks) : null,\n          record.bufferedReflection || null,\n          record.bufferedReflectionTokens ?? null,\n          record.bufferedReflectionInputTokens ?? null,\n          record.reflectedObservationLineCount ?? null,\n          record.isObserving || false,\n          record.isReflecting || false,\n          record.isBufferingObservation || false,\n          record.isBufferingReflection || false,\n          record.lastBufferedAtTokens || 0,\n          lastBufferedAtTimeStr,\n          record.observedTimezone || null,\n          record.metadata ? JSON.stringify(record.metadata) : null,\n          record.createdAt.toISOString(),\n          record.createdAt.toISOString(),\n          record.updatedAt.toISOString(),\n          record.updatedAt.toISOString(),\n        ],\n      );\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'INSERT_OBSERVATIONAL_MEMORY_RECORD', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id: record.id, threadId: record.threadId, resourceId: record.resourceId },\n        },\n        error,\n      );\n    }\n  }\n\n  async updateActiveObservations(input: UpdateActiveObservationsInput): Promise<void> {\n    try {\n      const now = new Date();\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n\n      const lastObservedAtStr = input.lastObservedAt.toISOString();\n      const nowStr = now.toISOString();\n      const observedMessageIdsJson = input.observedMessageIds ? JSON.stringify(input.observedMessageIds) : null;\n      const result = await this.#db.client.query(\n        `UPDATE ${tableName} SET\n          \"activeObservations\" = $1,\n          \"lastObservedAt\" = $2,\n          \"lastObservedAtZ\" = $3,\n          \"pendingMessageTokens\" = 0,\n          \"observationTokenCount\" = $4,\n          \"totalTokensObserved\" = \"totalTokensObserved\" + $5,\n          \"observedMessageIds\" = $6,\n          \"updatedAt\" = $7,\n          \"updatedAtZ\" = $8\n        WHERE id = $9`,\n        [\n          input.observations,\n          lastObservedAtStr,\n          lastObservedAtStr,\n          Math.round(input.tokenCount),\n          Math.round(input.tokenCount),\n          observedMessageIdsJson,\n          nowStr,\n          nowStr,\n          input.id,\n        ],\n      );\n\n      if (result.rowCount === 0) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_ACTIVE_OBSERVATIONS', 'NOT_FOUND'),\n          text: `Observational memory record not found: ${input.id}`,\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id: input.id },\n        });\n      }\n    } catch (error) {\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_ACTIVE_OBSERVATIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id: input.id },\n        },\n        error,\n      );\n    }\n  }\n\n  async createReflectionGeneration(input: CreateReflectionGenerationInput): Promise<ObservationalMemoryRecord> {\n    try {\n      const id = crypto.randomUUID();\n      const now = new Date();\n      const lookupKey = this.getOMKey(input.currentRecord.threadId, input.currentRecord.resourceId);\n\n      const record: ObservationalMemoryRecord = {\n        id,\n        scope: input.currentRecord.scope,\n        threadId: input.currentRecord.threadId,\n        resourceId: input.currentRecord.resourceId,\n        createdAt: now,\n        updatedAt: now,\n        lastObservedAt: input.currentRecord.lastObservedAt,\n        originType: 'reflection',\n        generationCount: input.currentRecord.generationCount + 1,\n        activeObservations: input.reflection,\n        totalTokensObserved: input.currentRecord.totalTokensObserved,\n        observationTokenCount: input.tokenCount,\n        pendingMessageTokens: 0,\n        isReflecting: false,\n        isObserving: false,\n        isBufferingObservation: false,\n        isBufferingReflection: false,\n        lastBufferedAtTokens: 0,\n        lastBufferedAtTime: null,\n        config: input.currentRecord.config,\n        metadata: input.currentRecord.metadata,\n        observedTimezone: input.currentRecord.observedTimezone,\n      };\n\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const nowStr = now.toISOString();\n      const lastObservedAtStr = record.lastObservedAt?.toISOString() || null;\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, \"lookupKey\", scope, \"resourceId\", \"threadId\",\n          \"activeObservations\", \"activeObservationsPendingUpdate\",\n          \"originType\", config, \"generationCount\", \"lastObservedAt\", \"lastObservedAtZ\", \"lastReflectionAt\", \"lastReflectionAtZ\",\n          \"pendingMessageTokens\", \"totalTokensObserved\", \"observationTokenCount\",\n          \"isObserving\", \"isReflecting\", \"isBufferingObservation\", \"isBufferingReflection\", \"lastBufferedAtTokens\", \"lastBufferedAtTime\",\n          \"observedTimezone\", metadata, \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29)`,\n        [\n          id,\n          lookupKey,\n          record.scope,\n          record.resourceId,\n          record.threadId || null,\n          input.reflection,\n          null,\n          'reflection',\n          JSON.stringify(record.config),\n          input.currentRecord.generationCount + 1,\n          lastObservedAtStr, // lastObservedAt\n          lastObservedAtStr, // lastObservedAtZ\n          nowStr, // lastReflectionAt\n          nowStr, // lastReflectionAtZ\n          record.pendingMessageTokens,\n          Math.round(record.totalTokensObserved),\n          Math.round(record.observationTokenCount),\n          false, // isObserving\n          false, // isReflecting\n          false, // isBufferingObservation\n          false, // isBufferingReflection\n          0, // lastBufferedAtTokens\n          null, // lastBufferedAtTime\n          record.observedTimezone || null,\n          record.metadata ? JSON.stringify(record.metadata) : null,\n          nowStr, // createdAt\n          nowStr, // createdAtZ\n          nowStr, // updatedAt\n          nowStr, // updatedAtZ\n        ],\n      );\n\n      return record;\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_REFLECTION_GENERATION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { currentRecordId: input.currentRecord.id },\n        },\n        error,\n      );\n    }\n  }\n\n  async setReflectingFlag(id: string, isReflecting: boolean): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const nowStr = new Date().toISOString();\n      const result = await this.#db.client.query(\n        `UPDATE ${tableName} SET \"isReflecting\" = $1, \"updatedAt\" = $2, \"updatedAtZ\" = $3 WHERE id = $4`,\n        [isReflecting, nowStr, nowStr, id],\n      );\n\n      if (result.rowCount === 0) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'SET_REFLECTING_FLAG', 'NOT_FOUND'),\n          text: `Observational memory record not found: ${id}`,\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id, isReflecting },\n        });\n      }\n    } catch (error) {\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'SET_REFLECTING_FLAG', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id, isReflecting },\n        },\n        error,\n      );\n    }\n  }\n\n  async setObservingFlag(id: string, isObserving: boolean): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const nowStr = new Date().toISOString();\n      const result = await this.#db.client.query(\n        `UPDATE ${tableName} SET \"isObserving\" = $1, \"updatedAt\" = $2, \"updatedAtZ\" = $3 WHERE id = $4`,\n        [isObserving, nowStr, nowStr, id],\n      );\n\n      if (result.rowCount === 0) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'SET_OBSERVING_FLAG', 'NOT_FOUND'),\n          text: `Observational memory record not found: ${id}`,\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id, isObserving },\n        });\n      }\n    } catch (error) {\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'SET_OBSERVING_FLAG', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id, isObserving },\n        },\n        error,\n      );\n    }\n  }\n\n  async setBufferingObservationFlag(id: string, isBuffering: boolean, lastBufferedAtTokens?: number): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const nowStr = new Date().toISOString();\n\n      let query: string;\n      let values: any[];\n\n      if (lastBufferedAtTokens !== undefined) {\n        query = `UPDATE ${tableName} SET \"isBufferingObservation\" = $1, \"lastBufferedAtTokens\" = $2, \"updatedAt\" = $3, \"updatedAtZ\" = $4 WHERE id = $5`;\n        values = [isBuffering, Math.round(lastBufferedAtTokens), nowStr, nowStr, id];\n      } else {\n        query = `UPDATE ${tableName} SET \"isBufferingObservation\" = $1, \"updatedAt\" = $2, \"updatedAtZ\" = $3 WHERE id = $4`;\n        values = [isBuffering, nowStr, nowStr, id];\n      }\n\n      const result = await this.#db.client.query(query, values);\n\n      if (result.rowCount === 0) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'SET_BUFFERING_OBSERVATION_FLAG', 'NOT_FOUND'),\n          text: `Observational memory record not found: ${id}`,\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id, isBuffering, lastBufferedAtTokens: lastBufferedAtTokens ?? null },\n        });\n      }\n    } catch (error) {\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'SET_BUFFERING_OBSERVATION_FLAG', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id, isBuffering, lastBufferedAtTokens: lastBufferedAtTokens ?? null },\n        },\n        error,\n      );\n    }\n  }\n\n  async setBufferingReflectionFlag(id: string, isBuffering: boolean): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const nowStr = new Date().toISOString();\n      const result = await this.#db.client.query(\n        `UPDATE ${tableName} SET \"isBufferingReflection\" = $1, \"updatedAt\" = $2, \"updatedAtZ\" = $3 WHERE id = $4`,\n        [isBuffering, nowStr, nowStr, id],\n      );\n\n      if (result.rowCount === 0) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'SET_BUFFERING_REFLECTION_FLAG', 'NOT_FOUND'),\n          text: `Observational memory record not found: ${id}`,\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id, isBuffering },\n        });\n      }\n    } catch (error) {\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'SET_BUFFERING_REFLECTION_FLAG', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id, isBuffering },\n        },\n        error,\n      );\n    }\n  }\n\n  async clearObservationalMemory(threadId: string | null, resourceId: string): Promise<void> {\n    try {\n      const lookupKey = this.getOMKey(threadId, resourceId);\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"lookupKey\" = $1`, [lookupKey]);\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CLEAR_OBSERVATIONAL_MEMORY', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { threadId, resourceId },\n        },\n        error,\n      );\n    }\n  }\n\n  async setPendingMessageTokens(id: string, tokenCount: number): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const nowStr = new Date().toISOString();\n      const result = await this.#db.client.query(\n        `UPDATE ${tableName} SET \n          \"pendingMessageTokens\" = $1, \n          \"updatedAt\" = $2,\n          \"updatedAtZ\" = $3\n        WHERE id = $4`,\n        [Math.round(tokenCount), nowStr, nowStr, id],\n      );\n\n      if (result.rowCount === 0) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'SET_PENDING_MESSAGE_TOKENS', 'NOT_FOUND'),\n          text: `Observational memory record not found: ${id}`,\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id, tokenCount },\n        });\n      }\n    } catch (error) {\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'SET_PENDING_MESSAGE_TOKENS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id, tokenCount },\n        },\n        error,\n      );\n    }\n  }\n\n  async updateObservationalMemoryConfig(input: UpdateObservationalMemoryConfigInput): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n\n      // Read current config\n      const selectResult = await this.#db.client.query(`SELECT config FROM ${tableName} WHERE id = $1`, [input.id]);\n\n      if (selectResult.rowCount === 0) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_OM_CONFIG', 'NOT_FOUND'),\n          text: `Observational memory record not found: ${input.id}`,\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id: input.id },\n        });\n      }\n\n      const row = selectResult.rows[0];\n      const existing: Record<string, unknown> = row.config\n        ? typeof row.config === 'string'\n          ? JSON.parse(row.config)\n          : row.config\n        : {};\n      const merged = this.deepMergeConfig(existing, input.config);\n      const nowStr = new Date().toISOString();\n\n      await this.#db.client.query(\n        `UPDATE ${tableName} SET config = $1, \"updatedAt\" = $2, \"updatedAtZ\" = $3 WHERE id = $4`,\n        [JSON.stringify(merged), nowStr, nowStr, input.id],\n      );\n    } catch (error) {\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_OM_CONFIG', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id: input.id },\n        },\n        error,\n      );\n    }\n  }\n\n  // ============================================\n  // Async Buffering Methods\n  // ============================================\n\n  async updateBufferedObservations(input: UpdateBufferedObservationsInput): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const nowStr = new Date().toISOString();\n\n      // Create new chunk with ID and timestamp\n      const newChunk: BufferedObservationChunk = {\n        id: `ombuf-${randomUUID()}`,\n        cycleId: input.chunk.cycleId,\n        observations: input.chunk.observations,\n        tokenCount: Math.round(input.chunk.tokenCount),\n        messageIds: input.chunk.messageIds,\n        messageTokens: Math.round(input.chunk.messageTokens ?? 0),\n        lastObservedAt: input.chunk.lastObservedAt,\n        createdAt: new Date(),\n        suggestedContinuation: input.chunk.suggestedContinuation,\n        currentTask: input.chunk.currentTask,\n        threadTitle: input.chunk.threadTitle,\n        extractedValues: input.chunk.extractedValues,\n        extractionFailures: input.chunk.extractionFailures,\n      };\n\n      // Append the chunk only if this cycle has not already been persisted by a previous attempt.\n      const lastBufferedAtTime = input.lastBufferedAtTime ? input.lastBufferedAtTime.toISOString() : null;\n      const result = await this.#db.client.query(\n        `UPDATE ${tableName} SET\n          \"bufferedObservationChunks\" = CASE\n            WHEN EXISTS (\n              SELECT 1\n              FROM jsonb_array_elements(COALESCE(\"bufferedObservationChunks\", '[]'::jsonb)) AS chunk\n              WHERE chunk->>'cycleId' = $2\n            ) THEN COALESCE(\"bufferedObservationChunks\", '[]'::jsonb)\n            ELSE COALESCE(\"bufferedObservationChunks\", '[]'::jsonb) || $1::jsonb\n          END,\n          \"lastBufferedAtTime\" = COALESCE($3, \"lastBufferedAtTime\"),\n          \"updatedAt\" = $4,\n          \"updatedAtZ\" = $5\n        WHERE id = $6`,\n        [JSON.stringify([newChunk]), input.chunk.cycleId, lastBufferedAtTime, nowStr, nowStr, input.id],\n      );\n\n      if (result.rowCount === 0) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_BUFFERED_OBSERVATIONS', 'NOT_FOUND'),\n          text: `Observational memory record not found: ${input.id}`,\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id: input.id },\n        });\n      }\n    } catch (error) {\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_BUFFERED_OBSERVATIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id: input.id },\n        },\n        error,\n      );\n    }\n  }\n\n  async swapBufferedToActive(input: SwapBufferedToActiveInput): Promise<SwapBufferedToActiveResult> {\n    try {\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const nowStr = new Date().toISOString();\n\n      // Get current record\n      const record = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [input.id]);\n      if (!record) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'SWAP_BUFFERED_TO_ACTIVE', 'NOT_FOUND'),\n          text: `Observational memory record not found: ${input.id}`,\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id: input.id },\n        });\n      }\n\n      // Parse buffered chunks\n      let chunks: BufferedObservationChunk[] = [];\n      if (record.bufferedObservationChunks) {\n        try {\n          const parsed =\n            typeof record.bufferedObservationChunks === 'string'\n              ? JSON.parse(record.bufferedObservationChunks)\n              : record.bufferedObservationChunks;\n          chunks = Array.isArray(parsed) ? parsed : [];\n        } catch {\n          chunks = [];\n        }\n      }\n\n      if (chunks.length === 0) {\n        return {\n          chunksActivated: 0,\n          messageTokensActivated: 0,\n          observationTokensActivated: 0,\n          messagesActivated: 0,\n          activatedCycleIds: [],\n          activatedMessageIds: [],\n        };\n      }\n\n      // Calculate target message tokens to activate based on new formula:\n      // retentionFloor = threshold * (1 - ratio) represents tokens to keep as raw messages\n      // targetMessageTokens = max(0, currentPending - retentionFloor) represents tokens to activate\n      const retentionFloor = input.messageTokensThreshold * (1 - input.activationRatio);\n      const targetMessageTokens = Math.max(0, input.currentPendingTokens - retentionFloor);\n\n      // Find the closest chunk boundary to the target, biased over (prefer removing\n      // slightly more than the target so remaining context lands at or below retentionFloor).\n      // Track both best-over and best-under boundaries so we can fall back to under\n      // if the over boundary would overshoot by too much.\n      let cumulativeMessageTokens = 0;\n      let chunksToActivate = 0;\n      let bestOverBoundary = 0;\n      let bestOverTokens = 0;\n      let bestUnderBoundary = 0;\n      let bestUnderTokens = 0;\n\n      for (let i = 0; i < chunks.length; i++) {\n        cumulativeMessageTokens += chunks[i]!.messageTokens ?? 0;\n        const boundary = i + 1;\n\n        if (cumulativeMessageTokens >= targetMessageTokens) {\n          // Over or equal — track the closest (lowest) over boundary\n          if (bestOverBoundary === 0 || cumulativeMessageTokens < bestOverTokens) {\n            bestOverBoundary = boundary;\n            bestOverTokens = cumulativeMessageTokens;\n          }\n        } else {\n          // Under — track the closest (highest) under boundary\n          if (cumulativeMessageTokens > bestUnderTokens) {\n            bestUnderBoundary = boundary;\n            bestUnderTokens = cumulativeMessageTokens;\n          }\n        }\n      }\n\n      // Safeguard: if the over boundary would eat into more than 95% of the\n      // retention floor, fall back to the best under boundary instead.\n      // This prevents edge cases where a large chunk overshoots dramatically.\n      // When forceMaxActivation is set (above blockAfter), still prefer the over\n      // boundary, but never if it would leave fewer than the smaller of 1000\n      // tokens or the retention floor remaining.\n      const maxOvershoot = retentionFloor * 0.95;\n      const overshoot = bestOverTokens - targetMessageTokens;\n      const remainingAfterOver = input.currentPendingTokens - bestOverTokens;\n      const remainingAfterUnder = input.currentPendingTokens - bestUnderTokens;\n      // When activationRatio ≈ 1.0, retentionFloor is 0 and minRemaining becomes 0 — intentional for \"activate everything\" configs.\n      const minRemaining = Math.min(1000, retentionFloor);\n\n      if (input.forceMaxActivation && bestOverBoundary > 0 && remainingAfterOver >= minRemaining) {\n        chunksToActivate = bestOverBoundary;\n      } else if (bestOverBoundary > 0 && overshoot <= maxOvershoot && remainingAfterOver >= minRemaining) {\n        chunksToActivate = bestOverBoundary;\n      } else if (bestUnderBoundary > 0 && remainingAfterUnder >= minRemaining) {\n        chunksToActivate = bestUnderBoundary;\n      } else if (bestOverBoundary > 0) {\n        // All boundaries are over and exceed the safeguard — still activate\n        // the closest over boundary (better than nothing)\n        chunksToActivate = bestOverBoundary;\n      } else {\n        chunksToActivate = 1;\n      }\n\n      // Split chunks\n      const activatedChunks = chunks.slice(0, chunksToActivate);\n      const remainingChunks = chunks.slice(chunksToActivate);\n\n      // Combine activated observations\n      const activatedContent = activatedChunks.map(c => c.observations).join('\\n\\n');\n      const activatedTokens = Math.round(activatedChunks.reduce((sum, c) => sum + c.tokenCount, 0));\n      const activatedMessageTokens = Math.round(activatedChunks.reduce((sum, c) => sum + (c.messageTokens ?? 0), 0));\n      const activatedMessageCount = activatedChunks.reduce((sum, c) => sum + c.messageIds.length, 0);\n      const activatedCycleIds = activatedChunks.map(c => c.cycleId).filter((id): id is string => !!id);\n      const activatedMessageIds = activatedChunks.flatMap(c => c.messageIds ?? []);\n\n      // Derive lastObservedAt from the latest activated chunk, or use provided value\n      const latestChunk = activatedChunks[activatedChunks.length - 1];\n      const lastObservedAt =\n        input.lastObservedAt ?? (latestChunk?.lastObservedAt ? new Date(latestChunk.lastObservedAt) : new Date());\n      const lastObservedAtStr = lastObservedAt.toISOString();\n\n      // NOTE: We intentionally do NOT add message IDs to observedMessageIds during buffered activation.\n      // Buffered chunks represent observations of messages as they were at buffering time.\n      // With streaming, messages grow after buffering, so we rely on lastObservedAt for filtering.\n      // New content after lastObservedAt will be picked up in subsequent observations.\n\n      // Atomic conditional update — the WHERE clause ensures chunks haven't already\n      // been swapped by a concurrent run. If another run cleared the chunks first,\n      // this UPDATE matches 0 rows and we return early with chunksActivated: 0.\n      // Include message boundary delimiter for cache stability.\n      const boundary = `\\n\\n--- message boundary (${lastObservedAt.toISOString()}) ---\\n\\n`;\n      const updateResult = await this.#db.client.query(\n        `UPDATE ${tableName} SET\n          \"activeObservations\" = CASE\n            WHEN \"activeObservations\" IS NOT NULL AND \"activeObservations\" != ''\n            THEN \"activeObservations\" || $10 || $1\n            ELSE $1\n          END,\n          \"observationTokenCount\" = COALESCE(\"observationTokenCount\", 0) + $2,\n          \"pendingMessageTokens\" = GREATEST(0, COALESCE(\"pendingMessageTokens\", 0) - $3),\n          \"bufferedObservationChunks\" = $4,\n          \"lastObservedAt\" = $5,\n          \"lastObservedAtZ\" = $6,\n          \"updatedAt\" = $7,\n          \"updatedAtZ\" = $8\n        WHERE id = $9\n          AND \"bufferedObservationChunks\" IS NOT NULL\n          AND \"bufferedObservationChunks\"::text != '[]'`,\n        [\n          activatedContent,\n          activatedTokens,\n          activatedMessageTokens,\n          remainingChunks.length > 0 ? JSON.stringify(remainingChunks) : null,\n          lastObservedAtStr,\n          lastObservedAtStr,\n          nowStr,\n          nowStr,\n          input.id,\n          boundary,\n        ],\n      );\n\n      if (updateResult.rowCount === 0) {\n        return {\n          chunksActivated: 0,\n          messageTokensActivated: 0,\n          observationTokensActivated: 0,\n          messagesActivated: 0,\n          activatedCycleIds: [],\n          activatedMessageIds: [],\n        };\n      }\n\n      // Use hints from the most recent activated chunk only — stale hints from older chunks are discarded\n      const latestChunkHints = activatedChunks[activatedChunks.length - 1];\n\n      return {\n        chunksActivated: activatedChunks.length,\n        messageTokensActivated: activatedMessageTokens,\n        observationTokensActivated: activatedTokens,\n        messagesActivated: activatedMessageCount,\n        activatedCycleIds,\n        activatedMessageIds,\n        observations: activatedContent,\n        perChunk: activatedChunks.map(c => ({\n          cycleId: c.cycleId ?? '',\n          messageTokens: c.messageTokens ?? 0,\n          observationTokens: c.tokenCount,\n          messageCount: c.messageIds.length,\n          observations: c.observations,\n        })),\n        suggestedContinuation: latestChunkHints?.suggestedContinuation ?? undefined,\n        currentTask: latestChunkHints?.currentTask ?? undefined,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'SWAP_BUFFERED_TO_ACTIVE', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id: input.id },\n        },\n        error,\n      );\n    }\n  }\n\n  async updateBufferedReflection(input: UpdateBufferedReflectionInput): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const nowStr = new Date().toISOString();\n\n      // Append reflection to existing buffered content\n      const result = await this.#db.client.query(\n        `UPDATE ${tableName} SET\n          \"bufferedReflection\" = CASE \n            WHEN \"bufferedReflection\" IS NOT NULL AND \"bufferedReflection\" != '' \n            THEN \"bufferedReflection\" || E'\\\\n\\\\n' || $1\n            ELSE $1\n          END,\n          \"bufferedReflectionTokens\" = COALESCE(\"bufferedReflectionTokens\", 0) + $2,\n          \"bufferedReflectionInputTokens\" = COALESCE(\"bufferedReflectionInputTokens\", 0) + $3,\n          \"reflectedObservationLineCount\" = $4,\n          \"updatedAt\" = $5,\n          \"updatedAtZ\" = $6\n        WHERE id = $7`,\n        [\n          input.reflection,\n          Math.round(input.tokenCount),\n          Math.round(input.inputTokenCount),\n          input.reflectedObservationLineCount,\n          nowStr,\n          nowStr,\n          input.id,\n        ],\n      );\n\n      if (result.rowCount === 0) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_BUFFERED_REFLECTION', 'NOT_FOUND'),\n          text: `Observational memory record not found: ${input.id}`,\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id: input.id },\n        });\n      }\n    } catch (error) {\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_BUFFERED_REFLECTION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id: input.id },\n        },\n        error,\n      );\n    }\n  }\n\n  async swapBufferedReflectionToActive(input: SwapBufferedReflectionToActiveInput): Promise<ObservationalMemoryRecord> {\n    try {\n      const tableName = getTableName({\n        indexName: OM_TABLE,\n        schemaName: getSchemaName(this.#schema),\n      });\n\n      // Get current record to calculate split\n      const record = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [\n        input.currentRecord.id,\n      ]);\n      if (!record) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'NOT_FOUND'),\n          text: `Observational memory record not found: ${input.currentRecord.id}`,\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id: input.currentRecord.id },\n        });\n      }\n\n      const bufferedReflection = record.bufferedReflection || '';\n      const reflectedLineCount = Number(record.reflectedObservationLineCount || 0);\n\n      if (!bufferedReflection) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'NO_CONTENT'),\n          text: 'No buffered reflection to swap',\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { id: input.currentRecord.id },\n        });\n      }\n\n      // Split current activeObservations by the recorded boundary.\n      // Lines 0..reflectedLineCount were reflected on → replaced by bufferedReflection.\n      // Lines after reflectedLineCount were added after reflection started → kept as-is.\n      const currentObservations = (record.activeObservations as string) || '';\n      const allLines = currentObservations.split('\\n');\n      const unreflectedLines = allLines.slice(reflectedLineCount);\n      const unreflectedContent = unreflectedLines.join('\\n').trim();\n\n      // New activeObservations = bufferedReflection + unreflected observations\n      const newObservations = unreflectedContent\n        ? `${bufferedReflection}\\n\\n${unreflectedContent}`\n        : bufferedReflection;\n\n      // Create new generation with the merged content.\n      // tokenCount is computed by the processor using its token counter on the combined content.\n      const newRecord = await this.createReflectionGeneration({\n        currentRecord: input.currentRecord,\n        reflection: newObservations,\n        tokenCount: input.tokenCount,\n      });\n\n      // Clear buffered state on old record\n      const nowStr = new Date().toISOString();\n      await this.#db.client.query(\n        `UPDATE ${tableName} SET\n          \"bufferedReflection\" = NULL,\n          \"bufferedReflectionTokens\" = NULL,\n          \"bufferedReflectionInputTokens\" = NULL,\n          \"reflectedObservationLineCount\" = NULL,\n          \"updatedAt\" = $1,\n          \"updatedAtZ\" = $2\n        WHERE id = $3`,\n        [nowStr, nowStr, input.currentRecord.id],\n      );\n\n      return newRecord;\n    } catch (error) {\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { id: input.currentRecord.id },\n        },\n        error,\n      );\n    }\n  }\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { NotificationsStorage, TABLE_NOTIFICATIONS, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type {\n  CreateIndexOptions,\n  CreateNotificationInput,\n  ListDueNotificationsInput,\n  ListNotificationsInput,\n  NotificationPriority,\n  NotificationRecord,\n  NotificationSignalAttributes,\n  NotificationStatus,\n  UpdateNotificationInput,\n  TABLE_NAMES,\n  PruneOptions,\n  PruneResult,\n  RetentionTablesDescriptor,\n  TableRetentionPolicy,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { DbClient, PgDomainConfig } from '../../db';\nimport { runPrune, resolveTargets } from '../../retention';\nimport { getSchemaName, getTableName, parseJsonResilient } from '../utils';\n\nconst statusTimestamp = (status: NotificationStatus, now: Date) => {\n  if (status === 'delivered') return { deliveredAt: now };\n  if (status === 'seen') return { seenAt: now };\n  if (status === 'dismissed') return { dismissedAt: now };\n  if (status === 'archived') return { archivedAt: now };\n  if (status === 'discarded') return { discardedAt: now };\n  return {};\n};\n\nconst parseDate = (value: unknown): Date | undefined => {\n  if (value == null) return undefined;\n  return value instanceof Date ? value : new Date(String(value));\n};\n\nconst cloneValue = <T>(value: T | undefined): T | undefined =>\n  value === undefined ? undefined : structuredClone(value);\n\nfunction rowToNotification(row: Record<string, unknown>): NotificationRecord {\n  return {\n    id: String(row.id),\n    threadId: String(row.threadId),\n    source: String(row.source),\n    kind: String(row.kind),\n    priority: String(row.priority) as NotificationPriority,\n    status: String(row.status) as NotificationStatus,\n    summary: String(row.summary),\n    payload: parseJsonResilient(row.payload),\n    resourceId: row.resourceId == null ? undefined : String(row.resourceId),\n    agentId: row.agentId == null ? undefined : String(row.agentId),\n    sourceId: row.sourceId == null ? undefined : String(row.sourceId),\n    dedupeKey: row.dedupeKey == null ? undefined : String(row.dedupeKey),\n    coalesceKey: row.coalesceKey == null ? undefined : String(row.coalesceKey),\n    coalescedCount: Number(row.coalescedCount ?? 1),\n    attributes: parseJsonResilient(row.attributes) as NotificationSignalAttributes | undefined,\n    createdAt: parseDate(row.createdAt) ?? new Date(),\n    updatedAt: parseDate(row.updatedAt) ?? new Date(),\n    deliveredAt: parseDate(row.deliveredAt),\n    seenAt: parseDate(row.seenAt),\n    dismissedAt: parseDate(row.dismissedAt),\n    archivedAt: parseDate(row.archivedAt),\n    discardedAt: parseDate(row.discardedAt),\n    deliverAt: parseDate(row.deliverAt),\n    summaryAt: parseDate(row.summaryAt),\n    deliveryReason: row.deliveryReason == null ? undefined : String(row.deliveryReason),\n    deliveryAttempts: Number(row.deliveryAttempts ?? 0),\n    lastDeliveryAttemptAt: parseDate(row.lastDeliveryAttemptAt),\n    lastDeliveryError: row.lastDeliveryError == null ? undefined : String(row.lastDeliveryError),\n    deliveredSignalId: row.deliveredSignalId == null ? undefined : String(row.deliveredSignalId),\n    summarySignalId: row.summarySignalId == null ? undefined : String(row.summarySignalId),\n    metadata: parseJsonResilient(row.metadata) as Record<string, unknown> | undefined,\n  };\n}\n\nfunction addArrayFilter<T extends string>(conditions: string[], args: unknown[], column: string, value?: T | T[]) {\n  if (!value) return;\n  const values = Array.isArray(value) ? value : [value];\n  const start = args.length + 1;\n  conditions.push(`\"${column}\" IN (${values.map((_, index) => `$${start + index}`).join(', ')})`);\n  args.push(...values);\n}\n\nfunction normalizeRecordForInsert(record: NotificationRecord): Record<string, unknown> {\n  return {\n    ...record,\n    payload: record.payload ?? null,\n    attributes: record.attributes ?? null,\n    metadata: record.metadata ?? null,\n    resourceId: record.resourceId ?? null,\n    agentId: record.agentId ?? null,\n    sourceId: record.sourceId ?? null,\n    dedupeKey: record.dedupeKey ?? null,\n    coalesceKey: record.coalesceKey ?? null,\n    deliveredAt: record.deliveredAt ?? null,\n    seenAt: record.seenAt ?? null,\n    dismissedAt: record.dismissedAt ?? null,\n    archivedAt: record.archivedAt ?? null,\n    discardedAt: record.discardedAt ?? null,\n    deliverAt: record.deliverAt ?? null,\n    summaryAt: record.summaryAt ?? null,\n    deliveryReason: record.deliveryReason ?? null,\n    lastDeliveryAttemptAt: record.lastDeliveryAttemptAt ?? null,\n    lastDeliveryError: record.lastDeliveryError ?? null,\n    deliveredSignalId: record.deliveredSignalId ?? null,\n    summarySignalId: record.summarySignalId ?? null,\n  };\n}\n\nexport class NotificationsPG extends NotificationsStorage {\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  static readonly MANAGED_TABLES = [TABLE_NOTIFICATIONS] as const;\n\n  /**\n   * Notifications are an append-only event feed that grows unbounded. Single\n   * table, anchored on the timezone-aware `createdAtZ` mirror column.\n   */\n  static override readonly retentionTables: RetentionTablesDescriptor = {\n    notifications: { table: TABLE_NOTIFICATIONS, column: 'createdAtZ', indexed: true },\n  };\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    this.#indexes = indexes?.filter(idx => (NotificationsPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({\n      tableName: TABLE_NOTIFICATIONS,\n      schema: TABLE_SCHEMAS[TABLE_NOTIFICATIONS],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  /**\n   * Lazily ensures a btree index exists on each configured policy's retention\n   * anchor column so age-based `prune()` deletes stay fast on large tables.\n   * Called from the prune path (not init) so only deployments that configure\n   * retention pay the index's write/disk overhead. Best-effort: failures are\n   * logged and pruning proceeds (correct, just slower).\n   * Created even with `skipDefaultIndexes` — retention is an explicit opt-in,\n   * so its supporting index is not part of the default index set.\n   */\n  private async ensureRetentionIndexes(policies: Record<string, TableRetentionPolicy>): Promise<void> {\n    const prefix = this.#schema && this.#schema !== 'public' ? `${this.#schema}_` : '';\n    for (const [key, entry] of Object.entries(NotificationsPG.retentionTables)) {\n      if (!entry.indexed || !policies[key]) continue;\n      try {\n        await this.#db.ensureIndex({\n          indexName: `${prefix}mastra_${key}_retention_idx`,\n          tableName: entry.table as TABLE_NAMES,\n          column: entry.column,\n        });\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create retention index for ${entry.table}:`, error);\n      }\n    }\n  }\n\n  /** Delete notifications older than the `notifications` policy's `maxAge`, batched. */\n  async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n    await this.ensureRetentionIndexes(policies);\n    const targets = resolveTargets({\n      policies,\n      descriptor: NotificationsPG.retentionTables,\n      order: ['notifications'],\n    });\n    return runPrune({ db: this.#db, domain: 'notifications', targets, options });\n  }\n\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}idx_notifications_thread_status_updated`,\n        table: TABLE_NOTIFICATIONS,\n        columns: ['threadId', 'status', 'updatedAt'],\n      },\n      {\n        name: `${schemaPrefix}idx_notifications_coalescing`,\n        table: TABLE_NOTIFICATIONS,\n        columns: ['threadId', 'source', 'kind', 'status', 'agentId', 'resourceId', 'dedupeKey', 'coalesceKey'],\n      },\n      {\n        name: `${schemaPrefix}idx_notifications_due`,\n        table: TABLE_NOTIFICATIONS,\n        columns: ['status', 'deliverAt', 'summaryAt'],\n      },\n    ];\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n    statements.push(\n      generateTableSQL({\n        tableName: TABLE_NOTIFICATIONS,\n        schema: TABLE_SCHEMAS[TABLE_NOTIFICATIONS],\n        schemaName,\n        includeAllConstraints: true,\n      }),\n    );\n\n    for (const idx of NotificationsPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    return statements;\n  }\n\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return NotificationsPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) return;\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) return;\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_NOTIFICATIONS });\n  }\n\n  private async updateNotificationRow(threadId: string, id: string, data: Record<string, unknown>): Promise<void> {\n    const entries = Object.entries(data).filter(([, value]) => value !== undefined);\n    if (entries.length === 0) return;\n\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_NOTIFICATIONS, schemaName });\n    const setColumns = entries.map(([key], index) => `\"${parseSqlIdentifier(key, 'column name')}\" = $${index + 1}`);\n    const values = entries.map(([key, value]) => {\n      const columnSchema = TABLE_SCHEMAS[TABLE_NOTIFICATIONS][key];\n      if (columnSchema?.type === 'jsonb' && value !== null) return JSON.stringify(value);\n      return value;\n    });\n\n    await this.#db.client.none(\n      `UPDATE ${tableName} SET ${setColumns.join(', ')} WHERE \"threadId\" = $${values.length + 1} AND \"id\" = $${values.length + 2}`,\n      [...values, threadId, id],\n    );\n  }\n\n  async createNotification(input: CreateNotificationInput): Promise<NotificationRecord> {\n    const existing = await this.findCoalescable(input);\n    if (existing) {\n      const now = new Date();\n      const attributes = input.attributes\n        ? { ...cloneValue(existing.attributes), ...cloneValue(input.attributes) }\n        : cloneValue(existing.attributes);\n      const metadata = input.metadata\n        ? { ...cloneValue(existing.metadata), ...cloneValue(input.metadata) }\n        : cloneValue(existing.metadata);\n      await this.updateNotificationRow(existing.threadId, existing.id, {\n        summary: input.summary,\n        payload: cloneValue(input.payload ?? existing.payload) ?? null,\n        priority: input.priority ?? existing.priority,\n        attributes: attributes ?? null,\n        updatedAt: now,\n        deliverAt: input.deliverAt ?? existing.deliverAt ?? null,\n        summaryAt: input.summaryAt ?? existing.summaryAt ?? null,\n        deliveryReason: input.deliveryReason ?? existing.deliveryReason ?? null,\n        coalescedCount: (existing.coalescedCount ?? 1) + 1,\n        metadata: metadata ?? null,\n      });\n      const updated = await this.#getNotification(this.#db.client, { threadId: existing.threadId, id: existing.id });\n      if (!updated) throw new Error(`Notification ${existing.id} was not found for thread ${existing.threadId}`);\n      return updated;\n    }\n\n    const now = input.createdAt ?? new Date();\n    const record: NotificationRecord = {\n      id: input.id ?? randomUUID(),\n      threadId: input.threadId,\n      source: input.source,\n      kind: input.kind,\n      priority: input.priority ?? 'medium',\n      status: 'pending',\n      summary: input.summary,\n      payload: cloneValue(input.payload),\n      resourceId: input.resourceId,\n      agentId: input.agentId,\n      sourceId: input.sourceId,\n      dedupeKey: input.dedupeKey,\n      coalesceKey: input.coalesceKey,\n      coalescedCount: 1,\n      attributes: cloneValue(input.attributes),\n      createdAt: now,\n      updatedAt: now,\n      deliverAt: input.deliverAt,\n      summaryAt: input.summaryAt,\n      deliveryReason: input.deliveryReason,\n      deliveryAttempts: 0,\n      metadata: cloneValue(input.metadata),\n    };\n\n    await this.#db.insert({ tableName: TABLE_NOTIFICATIONS, record: normalizeRecordForInsert(record) });\n    return record;\n  }\n\n  async listNotifications(input: ListNotificationsInput): Promise<NotificationRecord[]> {\n    const conditions = ['\"threadId\" = $1'];\n    const args: unknown[] = [input.threadId];\n\n    addArrayFilter(conditions, args, 'status', input.status);\n    addArrayFilter(conditions, args, 'priority', input.priority);\n\n    if (input.source) {\n      args.push(input.source);\n      conditions.push(`\"source\" = $${args.length}`);\n    }\n    if (input.resourceId) {\n      args.push(input.resourceId);\n      conditions.push(`\"resourceId\" = $${args.length}`);\n    }\n    if (input.agentId) {\n      args.push(input.agentId);\n      conditions.push(`\"agentId\" = $${args.length}`);\n    }\n    if (input.search) {\n      const search = `%${input.search.toLowerCase()}%`;\n      args.push(search, search);\n      conditions.push(`(LOWER(\"summary\") LIKE $${args.length - 1} OR LOWER(\"kind\") LIKE $${args.length})`);\n    }\n\n    const limit = input.limit ? ` LIMIT $${args.length + 1}` : '';\n    if (input.limit) args.push(input.limit);\n\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_NOTIFICATIONS, schemaName });\n    const rows = await this.#db.readClient.manyOrNone(\n      `SELECT * FROM ${tableName} WHERE ${conditions.join(' AND ')} ORDER BY \"updatedAt\" DESC${limit}`,\n      args,\n    );\n\n    return rows.map(row => rowToNotification(row));\n  }\n\n  async listDueNotifications(input: ListDueNotificationsInput): Promise<NotificationRecord[]> {\n    const conditions = [\n      '\"status\" = $1',\n      '((\"deliverAt\" IS NOT NULL AND \"deliverAt\" <= $2) OR (\"summaryAt\" IS NOT NULL AND \"summaryAt\" <= $3))',\n    ];\n    const args: unknown[] = ['pending', input.now, input.now];\n\n    if (input.agentId) {\n      args.push(input.agentId);\n      conditions.push(`\"agentId\" = $${args.length}`);\n    }\n    if (input.resourceId) {\n      args.push(input.resourceId);\n      conditions.push(`\"resourceId\" = $${args.length}`);\n    }\n\n    const limit = input.limit ? ` LIMIT $${args.length + 1}` : '';\n    if (input.limit) args.push(input.limit);\n\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_NOTIFICATIONS, schemaName });\n    const rows = await this.#db.readClient.manyOrNone(\n      `SELECT * FROM ${tableName} WHERE ${conditions.join(' AND ')} ORDER BY CASE WHEN \"deliverAt\" IS NULL THEN \"summaryAt\" WHEN \"summaryAt\" IS NULL THEN \"deliverAt\" WHEN \"deliverAt\" <= \"summaryAt\" THEN \"deliverAt\" ELSE \"summaryAt\" END ASC, \"updatedAt\" ASC${limit}`,\n      args,\n    );\n\n    return rows.map(row => rowToNotification(row));\n  }\n\n  async getNotification(input: { threadId: string; id: string }): Promise<NotificationRecord | null> {\n    return this.#getNotification(this.#db.readClient, input);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #getNotification(\n    client: DbClient,\n    input: { threadId: string; id: string },\n  ): Promise<NotificationRecord | null> {\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_NOTIFICATIONS, schemaName });\n    const row = await client.oneOrNone(`SELECT * FROM ${tableName} WHERE \"threadId\" = $1 AND \"id\" = $2 LIMIT 1`, [\n      input.threadId,\n      input.id,\n    ]);\n    return row ? rowToNotification(row) : null;\n  }\n\n  async updateNotification(input: UpdateNotificationInput): Promise<NotificationRecord> {\n    const existing = await this.#getNotification(this.#db.client, { threadId: input.threadId, id: input.id });\n    if (!existing) {\n      throw new Error(`Notification ${input.id} was not found for thread ${input.threadId}`);\n    }\n\n    const now = new Date();\n    await this.updateNotificationRow(input.threadId, input.id, {\n      ...(input.status ? { status: input.status, ...statusTimestamp(input.status, now) } : {}),\n      ...(input.summary !== undefined ? { summary: input.summary } : {}),\n      ...(input.payload !== undefined ? { payload: cloneValue(input.payload) } : {}),\n      ...(input.attributes !== undefined ? { attributes: cloneValue(input.attributes) } : {}),\n      ...(input.metadata !== undefined ? { metadata: cloneValue(input.metadata) } : {}),\n      ...(input.deliverAt !== undefined ? { deliverAt: input.deliverAt } : {}),\n      ...(input.summaryAt !== undefined ? { summaryAt: input.summaryAt } : {}),\n      ...(input.deliveryReason !== undefined ? { deliveryReason: input.deliveryReason } : {}),\n      ...(input.deliveryAttempts !== undefined ? { deliveryAttempts: input.deliveryAttempts } : {}),\n      ...(input.lastDeliveryAttemptAt !== undefined ? { lastDeliveryAttemptAt: input.lastDeliveryAttemptAt } : {}),\n      ...(input.lastDeliveryError !== undefined ? { lastDeliveryError: input.lastDeliveryError } : {}),\n      ...(input.deliveredSignalId !== undefined ? { deliveredSignalId: input.deliveredSignalId } : {}),\n      ...(input.summarySignalId !== undefined ? { summarySignalId: input.summarySignalId } : {}),\n      updatedAt: now,\n    });\n\n    const updated = await this.#getNotification(this.#db.client, { threadId: input.threadId, id: input.id });\n    if (!updated) throw new Error(`Notification ${input.id} was not found for thread ${input.threadId}`);\n    return updated;\n  }\n\n  // Inlined instead of importing `UpdateNotificationsStatusInput` so this adapter's `.d.ts` stays valid\n  // against older @mastra/core versions that predate the bulk method.\n  override async updateNotificationsStatus(input: {\n    threadId: string;\n    ids: string[];\n    status: NotificationStatus;\n  }): Promise<NotificationRecord[]> {\n    const ids = Array.from(new Set(input.ids));\n    if (ids.length === 0) return [];\n\n    const now = new Date();\n    const assignments: Record<string, unknown> = {\n      status: input.status,\n      ...statusTimestamp(input.status, now),\n      updatedAt: now,\n    };\n    const columns = Object.keys(assignments);\n    const setClause = columns\n      .map((column, index) => `\"${parseSqlIdentifier(column, 'column name')}\" = $${index + 1}`)\n      .join(', ');\n\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_NOTIFICATIONS, schemaName });\n    // Bind the id list as one array parameter so the statement's parameter count is\n    // independent of how many ids are passed.\n    const rows = await this.#db.client.manyOrNone(\n      `UPDATE ${tableName} SET ${setClause} WHERE \"threadId\" = $${columns.length + 1} AND \"id\" = ANY($${columns.length + 2}::text[]) RETURNING *`,\n      [...Object.values(assignments), input.threadId, ids],\n    );\n    return rows.map(rowToNotification);\n  }\n\n  private async findCoalescable(input: CreateNotificationInput): Promise<NotificationRecord | undefined> {\n    if (!input.dedupeKey && !input.coalesceKey) return undefined;\n\n    const schemaName = getSchemaName(this.#schema);\n    const tableName = getTableName({ indexName: TABLE_NOTIFICATIONS, schemaName });\n    // Runs immediately before an insert/update, so it must observe the latest writes.\n    const row = await this.#db.client.oneOrNone(\n      `SELECT * FROM ${tableName} WHERE \"threadId\" = $1 AND \"source\" = $2 AND \"kind\" = $3 AND \"status\" = $4 AND ((\"agentId\" = $5::text) OR (\"agentId\" IS NULL AND $5::text IS NULL)) AND ((\"resourceId\" = $6::text) OR (\"resourceId\" IS NULL AND $6::text IS NULL)) AND (($7::text IS NOT NULL AND \"dedupeKey\" = $7::text) OR ($8::text IS NOT NULL AND \"coalesceKey\" = $8::text)) ORDER BY \"updatedAt\" DESC LIMIT 1`,\n      [\n        input.threadId,\n        input.source,\n        input.kind,\n        'pending',\n        input.agentId ?? null,\n        input.resourceId ?? null,\n        input.dedupeKey ?? null,\n        input.coalesceKey ?? null,\n      ],\n    );\n\n    return row ? rowToNotification(row) : undefined;\n  }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n  createStorageErrorId,\n  listTracesArgsSchema,\n  ObservabilityStorage,\n  TABLE_SCHEMAS,\n  TABLE_SPANS,\n  toTraceSpans,\n  TraceStatus,\n} from '@mastra/core/storage';\nimport type {\n  SpanRecord,\n  TracingStorageStrategy,\n  ListTracesArgs,\n  ListTracesResponse,\n  UpdateSpanArgs,\n  BatchDeleteTracesArgs,\n  BatchUpdateSpansArgs,\n  BatchCreateSpansArgs,\n  CreateSpanArgs,\n  GetSpanArgs,\n  GetSpanResponse,\n  GetRootSpanArgs,\n  GetRootSpanResponse,\n  GetTraceArgs,\n  GetTraceResponse,\n  GetTraceLightResponse,\n  LightSpanRecord,\n  CreateIndexOptions,\n  PruneOptions,\n  PruneResult,\n  RetentionTablesDescriptor,\n  TableRetentionPolicy,\n  TABLE_NAMES,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL, generateTimestampTriggerSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { runPrune, resolveTargets } from '../../retention';\nimport { transformFromSqlRow, getTableName, getSchemaName } from '../utils';\n\nexport class ObservabilityPG extends ObservabilityStorage {\n  /**\n   * Retention-eligible tables. The observability domain has a single physical\n   * table (`mastra_ai_spans`); spans anchor on the timezone-aware `startedAtZ`\n   * mirror column and are indexed for fast batched deletes.\n   */\n  static override readonly retentionTables: RetentionTablesDescriptor = {\n    spans: { table: TABLE_SPANS, column: 'startedAtZ', indexed: true },\n  };\n\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  /** Tables managed by this domain */\n  static readonly MANAGED_TABLES = [TABLE_SPANS] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, 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    // Add requestContext column for backwards compatibility with existing databases\n    await this.#db.alterTable({\n      tableName: TABLE_SPANS,\n      schema: TABLE_SCHEMAS[TABLE_SPANS],\n      ifNotExists: ['requestContext'],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  /**\n   * Lazily ensures a btree index exists on each configured policy's retention\n   * anchor column so age-based `prune()` deletes stay fast on large span tables.\n   * Called from the prune path (not init) so only deployments that configure\n   * retention pay the index's write/disk overhead. Best-effort: failures are\n   * logged and pruning proceeds (correct, just slower).\n   * Created even with `skipDefaultIndexes` — retention is an explicit opt-in,\n   * so its supporting index is not part of the default index set.\n   */\n  private async ensureRetentionIndexes(policies: Record<string, TableRetentionPolicy>): Promise<void> {\n    const prefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    for (const [key, entry] of Object.entries(ObservabilityPG.retentionTables)) {\n      if (!entry.indexed || !policies[key]) continue;\n      try {\n        await this.#db.ensureIndex({\n          indexName: `${prefix}mastra_${key}_retention_idx`,\n          tableName: entry.table as TABLE_NAMES,\n          column: entry.column,\n        });\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create retention index for ${entry.table}:`, error);\n      }\n    }\n  }\n\n  /**\n   * Returns default index definitions for the observability domain tables.\n   * @param schemaPrefix - Prefix for index names (e.g. \"my_schema_\" or \"\")\n   */\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}mastra_ai_spans_traceid_startedat_idx`,\n        table: TABLE_SPANS,\n        columns: ['traceId', 'startedAt DESC'],\n      },\n      {\n        name: `${schemaPrefix}mastra_ai_spans_parentspanid_startedat_idx`,\n        table: TABLE_SPANS,\n        columns: ['parentSpanId', 'startedAt DESC'],\n      },\n      {\n        name: `${schemaPrefix}mastra_ai_spans_name_idx`,\n        table: TABLE_SPANS,\n        columns: ['name'],\n      },\n      {\n        name: `${schemaPrefix}mastra_ai_spans_spantype_startedat_idx`,\n        table: TABLE_SPANS,\n        columns: ['spanType', 'startedAt DESC'],\n      },\n      // Root spans partial index - every listTraces query filters parentSpanId IS NULL\n      {\n        name: `${schemaPrefix}mastra_ai_spans_root_spans_idx`,\n        table: TABLE_SPANS,\n        columns: ['startedAt DESC'],\n        where: '\"parentSpanId\" IS NULL',\n      },\n      // Entity identification indexes - common filtering patterns\n      {\n        name: `${schemaPrefix}mastra_ai_spans_entitytype_entityid_idx`,\n        table: TABLE_SPANS,\n        columns: ['entityType', 'entityId'],\n      },\n      {\n        name: `${schemaPrefix}mastra_ai_spans_entitytype_entityname_idx`,\n        table: TABLE_SPANS,\n        columns: ['entityType', 'entityName'],\n      },\n      // Multi-tenant filtering - organizationId + userId\n      {\n        name: `${schemaPrefix}mastra_ai_spans_orgid_userid_idx`,\n        table: TABLE_SPANS,\n        columns: ['organizationId', 'userId'],\n      },\n      // Metadata JSONB GIN index - for custom filtering with @> containment\n      {\n        name: `${schemaPrefix}mastra_ai_spans_metadata_gin_idx`,\n        table: TABLE_SPANS,\n        columns: ['metadata'],\n        method: 'gin',\n      },\n      // Tags array GIN index - for array containment queries\n      {\n        name: `${schemaPrefix}mastra_ai_spans_tags_gin_idx`,\n        table: TABLE_SPANS,\n        columns: ['tags'],\n        method: 'gin',\n      },\n    ];\n  }\n\n  /**\n   * Returns all DDL statements for this domain: table, constraints, timestamp trigger, and indexes.\n   * Used by exportSchemas to produce a complete, reproducible schema export.\n   */\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n    // Table\n    statements.push(\n      generateTableSQL({\n        tableName: TABLE_SPANS,\n        schema: TABLE_SCHEMAS[TABLE_SPANS],\n        schemaName,\n        includeAllConstraints: true,\n      }),\n    );\n\n    // Timestamp trigger\n    statements.push(generateTimestampTriggerSQL(TABLE_SPANS, schemaName));\n\n    // Indexes\n    for (const idx of ObservabilityPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    return statements;\n  }\n\n  /**\n   * Returns default index definitions for this instance's schema.\n   */\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return ObservabilityPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  /**\n   * Creates default indexes for optimal query performance.\n   */\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) {\n      return;\n    }\n\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        // Log but continue - indexes are performance optimizations\n        this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  /**\n   * Creates custom user-defined indexes for this domain's tables.\n   */\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) {\n      return;\n    }\n\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        // Log but continue - indexes are performance optimizations\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  /**\n   * Manually run the spans migration to deduplicate and add the unique constraint.\n   * This is intended to be called from the CLI when duplicates are detected.\n   *\n   * @returns Migration result with status and details\n   */\n  async migrateSpans(): Promise<{\n    success: boolean;\n    alreadyMigrated: boolean;\n    duplicatesRemoved: number;\n    message: string;\n  }> {\n    return this.#db.migrateSpans();\n  }\n\n  /**\n   * Check migration status for the spans table.\n   * Returns information about whether migration is needed.\n   */\n  async checkSpansMigrationStatus(): Promise<{\n    needsMigration: boolean;\n    hasDuplicates: boolean;\n    duplicateCount: number;\n    constraintExists: boolean;\n    tableName: string;\n  }> {\n    return this.#db.checkSpansMigrationStatus();\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_SPANS });\n  }\n\n  /**\n   * Deletes spans older than the configured `maxAge`, in bounded, batched,\n   * cancellable chunks. Unset = keep forever.\n   */\n  async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n    await this.ensureRetentionIndexes(policies);\n    const targets = resolveTargets({\n      policies,\n      descriptor: ObservabilityPG.retentionTables,\n      order: ['spans'],\n    });\n    return runPrune({ db: this.#db, domain: 'observability', targets, options });\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.readClient.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.readClient.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.readClient.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 getTraceLight(args: GetTraceArgs): Promise<GetTraceLightResponse | 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.readClient.manyOrNone<LightSpanRecord>(\n        `SELECT\n          \"traceId\", \"spanId\", \"parentSpanId\", \"name\",\n          \"entityType\", \"entityId\", \"entityName\",\n          \"spanType\", \"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<LightSpanRecord>({\n            tableName: TABLE_SPANS,\n            sqlRow: span,\n          }),\n        ),\n      };\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_TRACE_LIGHT', '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 = pagination?.page ?? 0;\n    const perPage = pagination?.perPage ?? 10;\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 orderField = orderBy?.field ?? 'startedAt';\n      const sortField = `${orderField}Z`;\n      const sortDirection = orderBy?.direction ?? 'DESC';\n      let orderClause: string;\n      if (orderField === '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.readClient.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.readClient.manyOrNone<SpanRecord>(\n        `SELECT\n          r.\"traceId\", r.\"spanId\", r.\"parentSpanId\", r.\"name\",\n          r.\"entityType\", r.\"entityId\", r.\"entityName\",\n          r.\"userId\", r.\"organizationId\", r.\"resourceId\",\n          r.\"runId\", r.\"sessionId\", r.\"threadId\", r.\"requestId\",\n          r.\"environment\", r.\"source\", r.\"serviceName\", r.\"scope\",\n          r.\"spanType\", r.\"attributes\", r.\"metadata\", r.\"tags\", r.\"links\",\n          r.\"input\", r.\"output\", r.\"error\", r.\"isEvent\",\n          r.\"startedAtZ\" as \"startedAt\", r.\"endedAtZ\" as \"endedAt\",\n          r.\"createdAtZ\" as \"createdAt\", r.\"updatedAtZ\" as \"updatedAt\"\n        FROM ${tableName} r\n        ${whereClause}\n        ${orderClause}\n        LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`,\n        [...params, perPage, page * perPage],\n      );\n\n      return {\n        pagination: {\n          total: count,\n          page,\n          perPage,\n          hasMore: (page + 1) * perPage < count,\n        },\n        spans: toTraceSpans(\n          spans.map(span =>\n            transformFromSqlRow<SpanRecord>({\n              tableName: TABLE_SPANS,\n              sqlRow: span,\n            }),\n          ),\n        ),\n      };\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_TRACES', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n        },\n        error,\n      );\n    }\n  }\n\n  async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n    try {\n      const records = args.records.map(record => {\n        const startedAt = record.startedAt instanceof Date ? record.startedAt.toISOString() : record.startedAt;\n        const endedAt = record.endedAt instanceof Date ? record.endedAt.toISOString() : record.endedAt;\n\n        return {\n          ...record,\n          startedAt,\n          endedAt,\n          startedAtZ: startedAt,\n          endedAtZ: endedAt,\n        };\n      });\n\n      return this.#db.batchInsert({\n        tableName: TABLE_SPANS,\n        records,\n      });\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'BATCH_CREATE_SPANS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n        },\n        error,\n      );\n    }\n  }\n\n  async batchUpdateSpans(args: BatchUpdateSpansArgs): Promise<void> {\n    try {\n      return this.#db.batchUpdate({\n        tableName: TABLE_SPANS,\n        updates: args.records.map(record => {\n          const data: Record<string, any> = { ...record.updates };\n          if (data.endedAt instanceof Date) {\n            const endedAt = data.endedAt.toISOString();\n            data.endedAt = endedAt;\n            data.endedAtZ = endedAt;\n          }\n          if (data.startedAt instanceof Date) {\n            const startedAt = data.startedAt.toISOString();\n            data.startedAt = startedAt;\n            data.startedAtZ = startedAt;\n          }\n\n          return {\n            keys: { spanId: record.spanId, traceId: record.traceId },\n            data,\n          };\n        }),\n      });\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'BATCH_UPDATE_SPANS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n        },\n        error,\n      );\n    }\n  }\n\n  async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n    this.assertUnscopedBatchDeleteTraces(args);\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","type ColumnType = 'bigserial' | 'boolean' | 'double precision' | 'jsonb' | 'text' | 'text[]' | 'timestamptz' | 'xid8';\n\ninterface SignalColumn {\n  name: string;\n  type: ColumnType;\n  nullable?: boolean;\n  defaultSql?: string;\n}\n\nconst CURSOR_ID_COLUMN = { name: 'cursorId', type: 'bigserial' } as const satisfies SignalColumn;\nconst XACT_ID_COLUMN = {\n  name: 'xactId',\n  type: 'xid8',\n  defaultSql: 'pg_current_xact_id()',\n} as const satisfies SignalColumn;\n\nconst COMMON_CONTEXT_COLUMNS = [\n  { name: 'traceId', type: 'text', nullable: true },\n  { name: 'spanId', type: 'text', nullable: true },\n  { name: 'experimentId', type: 'text', nullable: true },\n  { name: 'entityType', type: 'text', nullable: true },\n  { name: 'entityId', type: 'text', nullable: true },\n  { name: 'entityName', type: 'text', nullable: true },\n  { name: 'entityVersionId', type: 'text', nullable: true },\n  { name: 'parentEntityType', type: 'text', nullable: true },\n  { name: 'parentEntityId', type: 'text', nullable: true },\n  { name: 'parentEntityName', type: 'text', nullable: true },\n  { name: 'parentEntityVersionId', type: 'text', nullable: true },\n  { name: 'rootEntityType', type: 'text', nullable: true },\n  { name: 'rootEntityId', type: 'text', nullable: true },\n  { name: 'rootEntityName', type: 'text', nullable: true },\n  { name: 'rootEntityVersionId', type: 'text', nullable: true },\n  { name: 'userId', type: 'text', nullable: true },\n  { name: 'organizationId', type: 'text', nullable: true },\n  { name: 'resourceId', type: 'text', nullable: true },\n  { name: 'runId', type: 'text', nullable: true },\n  { name: 'sessionId', type: 'text', nullable: true },\n  { name: 'threadId', type: 'text', nullable: true },\n  { name: 'requestId', type: 'text', nullable: true },\n  { name: 'environment', type: 'text', nullable: true },\n  { name: 'executionSource', type: 'text', nullable: true },\n  { name: 'serviceName', type: 'text', nullable: true },\n] as const satisfies readonly SignalColumn[];\n\nexport const SPAN_EVENT_COLUMNS = [\n  CURSOR_ID_COLUMN,\n  XACT_ID_COLUMN,\n  { name: 'traceId', type: 'text' },\n  { name: 'spanId', type: 'text' },\n  { name: 'parentSpanId', type: 'text', nullable: true },\n  { name: 'experimentId', type: 'text', nullable: true },\n  { name: 'entityType', type: 'text', nullable: true },\n  { name: 'entityId', type: 'text', nullable: true },\n  { name: 'entityName', type: 'text', nullable: true },\n  { name: 'entityVersionId', type: 'text', nullable: true },\n  { name: 'parentEntityType', type: 'text', nullable: true },\n  { name: 'parentEntityId', type: 'text', nullable: true },\n  { name: 'parentEntityName', type: 'text', nullable: true },\n  { name: 'parentEntityVersionId', type: 'text', nullable: true },\n  { name: 'rootEntityType', type: 'text', nullable: true },\n  { name: 'rootEntityId', type: 'text', nullable: true },\n  { name: 'rootEntityName', type: 'text', nullable: true },\n  { name: 'rootEntityVersionId', type: 'text', nullable: true },\n  { name: 'userId', type: 'text', nullable: true },\n  { name: 'organizationId', type: 'text', nullable: true },\n  { name: 'resourceId', type: 'text', nullable: true },\n  { name: 'runId', type: 'text', nullable: true },\n  { name: 'sessionId', type: 'text', nullable: true },\n  { name: 'threadId', type: 'text', nullable: true },\n  { name: 'requestId', type: 'text', nullable: true },\n  { name: 'environment', type: 'text', nullable: true },\n  { name: 'executionSource', type: 'text', nullable: true },\n  { name: 'serviceName', type: 'text', nullable: true },\n  { name: 'name', type: 'text' },\n  { name: 'spanType', type: 'text' },\n  { name: 'isEvent', type: 'boolean', defaultSql: 'false' },\n  // True for a span that has started but not yet ended. `endedAt` is part of\n  // the primary key and the partition key, so it can never be NULL in storage;\n  // this flag is what distinguishes a running span (whose `endedAt` column\n  // holds a synthesized copy of `startedAt`) from a genuinely ended one.\n  { name: 'isPending', type: 'boolean', defaultSql: 'false' },\n  { name: 'startedAt', type: 'timestamptz' },\n  { name: 'endedAt', type: 'timestamptz' },\n  { name: 'tags', type: 'text[]', defaultSql: \"'{}'\" },\n  { name: 'metadataSearch', type: 'jsonb', defaultSql: \"'{}'::jsonb\" },\n  { name: 'attributes', type: 'jsonb', nullable: true },\n  { name: 'scope', type: 'jsonb', nullable: true },\n  { name: 'links', type: 'jsonb', nullable: true },\n  { name: 'input', type: 'jsonb', nullable: true },\n  { name: 'output', type: 'jsonb', nullable: true },\n  { name: 'error', type: 'jsonb', nullable: true },\n  { name: 'metadataRaw', type: 'jsonb', nullable: true },\n  { name: 'requestContext', type: 'jsonb', nullable: true },\n] as const satisfies readonly SignalColumn[];\n\nexport const METRIC_EVENT_COLUMNS = [\n  CURSOR_ID_COLUMN,\n  XACT_ID_COLUMN,\n  { name: 'metricId', type: 'text' },\n  { name: 'timestamp', type: 'timestamptz' },\n  { name: 'name', type: 'text' },\n  { name: 'value', type: 'double precision' },\n  ...COMMON_CONTEXT_COLUMNS,\n  { name: 'provider', type: 'text', nullable: true },\n  { name: 'model', type: 'text', nullable: true },\n  { name: 'estimatedCost', type: 'double precision', nullable: true },\n  { name: 'costUnit', type: 'text', nullable: true },\n  { name: 'tags', type: 'text[]', defaultSql: \"'{}'\" },\n  { name: 'labels', type: 'jsonb', defaultSql: \"'{}'::jsonb\" },\n  { name: 'costMetadata', type: 'jsonb', nullable: true },\n  { name: 'metadata', type: 'jsonb', nullable: true },\n  { name: 'scope', type: 'jsonb', nullable: true },\n] as const satisfies readonly SignalColumn[];\n\nexport const LOG_EVENT_COLUMNS = [\n  CURSOR_ID_COLUMN,\n  XACT_ID_COLUMN,\n  { name: 'logId', type: 'text' },\n  { name: 'timestamp', type: 'timestamptz' },\n  { name: 'level', type: 'text' },\n  { name: 'message', type: 'text' },\n  ...COMMON_CONTEXT_COLUMNS,\n  { name: 'tags', type: 'text[]', defaultSql: \"'{}'\" },\n  { name: 'data', type: 'jsonb', nullable: true },\n  { name: 'metadata', type: 'jsonb', nullable: true },\n  { name: 'scope', type: 'jsonb', nullable: true },\n] as const satisfies readonly SignalColumn[];\n\nexport const SCORE_EVENT_COLUMNS = [\n  CURSOR_ID_COLUMN,\n  XACT_ID_COLUMN,\n  { name: 'scoreId', type: 'text' },\n  { name: 'timestamp', type: 'timestamptz' },\n  { name: 'scorerId', type: 'text' },\n  { name: 'scorerVersion', type: 'text', nullable: true },\n  { name: 'scoreSource', type: 'text', nullable: true },\n  { name: 'score', type: 'double precision' },\n  { name: 'reason', type: 'text', nullable: true },\n  ...COMMON_CONTEXT_COLUMNS,\n  { name: 'scoreTraceId', type: 'text', nullable: true },\n  { name: 'tags', type: 'text[]', defaultSql: \"'{}'\" },\n  { name: 'metadata', type: 'jsonb', nullable: true },\n  { name: 'scope', type: 'jsonb', nullable: true },\n] as const satisfies readonly SignalColumn[];\n\nexport const FEEDBACK_EVENT_COLUMNS = [\n  CURSOR_ID_COLUMN,\n  XACT_ID_COLUMN,\n  { name: 'feedbackId', type: 'text' },\n  { name: 'timestamp', type: 'timestamptz' },\n  { name: 'feedbackSource', type: 'text' },\n  { name: 'feedbackType', type: 'text' },\n  { name: 'valueString', type: 'text', nullable: true },\n  { name: 'valueNumber', type: 'double precision', nullable: true },\n  { name: 'comment', type: 'text', nullable: true },\n  { name: 'feedbackUserId', type: 'text', nullable: true },\n  { name: 'sourceId', type: 'text', nullable: true },\n  { name: 'reviewStatus', type: 'text', defaultSql: \"'needs-review'\" },\n  ...COMMON_CONTEXT_COLUMNS,\n  { name: 'tags', type: 'text[]', defaultSql: \"'{}'\" },\n  { name: 'metadata', type: 'jsonb', nullable: true },\n  { name: 'scope', type: 'jsonb', nullable: true },\n] as const satisfies readonly SignalColumn[];\n\nexport const SPAN_LIGHT_SELECT_COLUMN_NAMES = [\n  'cursorId',\n  'xactId',\n  'traceId',\n  'spanId',\n  'parentSpanId',\n  'name',\n  'entityType',\n  'entityId',\n  'entityName',\n  'spanType',\n  'error',\n  'isEvent',\n  'isPending',\n  'startedAt',\n  'endedAt',\n] as const;\n\nfunction quotedColumnName(name: string): string {\n  return `\"${name}\"`;\n}\n\nfunction columnDefinition(column: SignalColumn): string {\n  const nullable = column.nullable ? '' : ' NOT NULL';\n  const defaultSql = column.defaultSql ? ` DEFAULT ${column.defaultSql}` : '';\n  return `  ${quotedColumnName(column.name)} ${column.type}${nullable}${defaultSql}`;\n}\n\nexport function buildColumnDefinitions(columns: readonly SignalColumn[]): string {\n  return columns.map(columnDefinition).join(',\\n');\n}\n\nexport function buildSelectColumns(columns: readonly SignalColumn[]): string {\n  return `\\n  ${columns.map(column => quotedColumnName(column.name)).join(',\\n  ')}\\n`;\n}\n\nexport function buildNamedSelectColumns(columnNames: readonly string[]): string {\n  return `\\n  ${columnNames.map(quotedColumnName).join(',\\n  ')}\\n`;\n}\n\nfunction columnNamesByType(columns: readonly SignalColumn[], type: ColumnType): string[] {\n  return columns.filter(column => column.type === type).map(column => column.name);\n}\n\nfunction typedColumnNames(columns: readonly SignalColumn[]): Set<string> {\n  return new Set(\n    columns\n      .filter(column => !['bigserial', 'jsonb', 'text[]', 'xid8'].includes(column.type))\n      .map(column => column.name),\n  );\n}\n\nconst ALL_EVENT_COLUMNS = [\n  ...SPAN_EVENT_COLUMNS,\n  ...METRIC_EVENT_COLUMNS,\n  ...LOG_EVENT_COLUMNS,\n  ...SCORE_EVENT_COLUMNS,\n  ...FEEDBACK_EVENT_COLUMNS,\n] as const;\n\nexport const JSONB_COLUMNS = new Set(columnNamesByType(ALL_EVENT_COLUMNS, 'jsonb'));\nexport const TEXT_ARRAY_COLUMNS = new Set(columnNamesByType(ALL_EVENT_COLUMNS, 'text[]'));\n\nexport const METRIC_TYPED_COLUMNS = typedColumnNames(METRIC_EVENT_COLUMNS);\nexport const SCORE_TYPED_COLUMNS = typedColumnNames(SCORE_EVENT_COLUMNS);\nexport const FEEDBACK_TYPED_COLUMNS = typedColumnNames(FEEDBACK_EVENT_COLUMNS);\n","/**\n * Raw DDL for Postgres v-next observability tables.\n *\n * One table per signal:\n *   - mastra_span_events       (insert-only ended spans; root spans surfaced\n *                               via partial indexes, not a separate table)\n *   - mastra_metric_events\n *   - mastra_log_events\n *   - mastra_score_events\n *   - mastra_feedback_events\n *   - mastra_observability_discovery (cache table for discovery values)\n *\n * Physical conventions:\n *   - timestamptz for all timestamps (millisecond precision; Postgres native)\n *   - text + jsonb for IDs and payloads\n *   - text[] for `tags`, jsonb for `metadataSearch` / `labels`\n *   - Range partitioning by day on the time column (endedAt for spans, timestamp\n *     for others). Partition key is part of every primary key, as Postgres\n *     requires for partitioned tables.\n *   - Root-span lookups (the `listTraces` / `getRootSpan` read surface) are\n *     served by partial indexes on `mastra_span_events`\n *     (`WHERE \"parentSpanId\" IS NULL`). This is the Postgres-idiomatic\n *     equivalent of the ClickHouse `mastra_trace_roots` incremental MV:\n *     selective enough to act as a projection while avoiding the trigger,\n *     duplicate storage, and write amplification of a second table. The\n *     partial indexes are also chunk-local on a Timescale hypertable, so the\n *     same plan applies there.\n *   - Retention is intentionally NOT implemented in this domain; the partition\n *     skeleton exists so a future `mastra retention` CLI command can drop or\n *     compress old partitions. pg_partman is detected and used when available.\n *   - TimescaleDB is detected and create_hypertable() is called when the\n *     extension is present. The base DDL is identical either way.\n */\n\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport {\n  buildColumnDefinitions,\n  FEEDBACK_EVENT_COLUMNS,\n  LOG_EVENT_COLUMNS,\n  METRIC_EVENT_COLUMNS,\n  SCORE_EVENT_COLUMNS,\n  SPAN_EVENT_COLUMNS,\n} from './signal-schema';\n\n// ---------------------------------------------------------------------------\n// Table names\n// ---------------------------------------------------------------------------\n\nexport const TABLE_SPAN_EVENTS = 'mastra_span_events';\nexport const TABLE_METRIC_EVENTS = 'mastra_metric_events';\nexport const TABLE_LOG_EVENTS = 'mastra_log_events';\nexport const TABLE_SCORE_EVENTS = 'mastra_score_events';\nexport const TABLE_FEEDBACK_EVENTS = 'mastra_feedback_events';\nexport const TABLE_DISCOVERY = 'mastra_observability_discovery';\n\nexport const ALL_SIGNAL_TABLES = [\n  TABLE_SPAN_EVENTS,\n  TABLE_METRIC_EVENTS,\n  TABLE_LOG_EVENTS,\n  TABLE_SCORE_EVENTS,\n  TABLE_FEEDBACK_EVENTS,\n] as const;\n\nexport const ALL_TABLE_NAMES = [...ALL_SIGNAL_TABLES, TABLE_DISCOVERY] as const;\n\n/** Maps each signal table to the column used as its partition / TTL key. */\nexport const SIGNAL_TIME_COLUMN: Record<(typeof ALL_SIGNAL_TABLES)[number], string> = {\n  [TABLE_SPAN_EVENTS]: 'endedAt',\n  [TABLE_METRIC_EVENTS]: 'timestamp',\n  [TABLE_LOG_EVENTS]: 'timestamp',\n  [TABLE_SCORE_EVENTS]: 'timestamp',\n  [TABLE_FEEDBACK_EVENTS]: 'timestamp',\n};\n\n// ---------------------------------------------------------------------------\n// Schema-aware identifier helpers\n// ---------------------------------------------------------------------------\n\n/** Returns a fully-qualified, double-quoted table name. */\nexport function qualifiedTable(schema: string, table: string): string {\n  const s = parseSqlIdentifier(schema, 'schema name');\n  const t = parseSqlIdentifier(table, 'table name');\n  return `\"${s}\".\"${t}\"`;\n}\n\n/** Returns a parsed, quoted, schema-prefixed object name (constraint, index, etc.). */\nexport function qualifiedName(schema: string, name: string): string {\n  const s = parseSqlIdentifier(schema, 'schema name');\n  const n = parseSqlIdentifier(name, 'object name');\n  return `\"${s}\".\"${n}\"`;\n}\n\n/** Schema CREATE. Safe to run repeatedly before table DDL. */\nexport function schemaDDL(schema: string): string {\n  const s = parseSqlIdentifier(schema, 'schema name');\n  return `CREATE SCHEMA IF NOT EXISTS \"${s}\"`;\n}\n\n// ---------------------------------------------------------------------------\n// Mode-aware partitioning clause\n// ---------------------------------------------------------------------------\n\n/**\n * Postgres declarative partitioning and Timescale hypertables are mutually\n * exclusive. When running on Timescale, the base table must NOT be declared\n * `PARTITION BY` — `create_hypertable()` handles chunking internally. For\n * native and pg_partman modes we keep `PARTITION BY RANGE` so future\n * partitions can be created with `CREATE TABLE ... PARTITION OF`.\n */\nfunction partitionClause(mode: TableDDLMode, column: string): string {\n  return mode === 'timescale' ? '' : `PARTITION BY RANGE (\"${column}\")`;\n}\n\nexport type TableDDLMode = 'timescale' | 'partitioned';\n\n// ---------------------------------------------------------------------------\n// Span events DDL — completed spans, insert-only\n// ---------------------------------------------------------------------------\n\nfunction spanEventsTableDDL(schema: string, mode: TableDDLMode): string {\n  return `\nCREATE TABLE IF NOT EXISTS ${qualifiedTable(schema, TABLE_SPAN_EVENTS)} (\n${buildColumnDefinitions(SPAN_EVENT_COLUMNS)},\n  PRIMARY KEY (\"traceId\", \"spanId\", \"endedAt\")\n)\n${partitionClause(mode, 'endedAt')}\n`.trim();\n}\n\n// ---------------------------------------------------------------------------\n// Metric / log / score / feedback DDL\n// ---------------------------------------------------------------------------\n\nfunction metricEventsTableDDL(schema: string, mode: TableDDLMode): string {\n  return `\nCREATE TABLE IF NOT EXISTS ${qualifiedTable(schema, TABLE_METRIC_EVENTS)} (\n${buildColumnDefinitions(METRIC_EVENT_COLUMNS)},\n  PRIMARY KEY (\"metricId\", \"timestamp\")\n)\n${partitionClause(mode, 'timestamp')}\n`.trim();\n}\n\nfunction logEventsTableDDL(schema: string, mode: TableDDLMode): string {\n  return `\nCREATE TABLE IF NOT EXISTS ${qualifiedTable(schema, TABLE_LOG_EVENTS)} (\n${buildColumnDefinitions(LOG_EVENT_COLUMNS)},\n  PRIMARY KEY (\"logId\", \"timestamp\")\n)\n${partitionClause(mode, 'timestamp')}\n`.trim();\n}\n\nfunction scoreEventsTableDDL(schema: string, mode: TableDDLMode): string {\n  return `\nCREATE TABLE IF NOT EXISTS ${qualifiedTable(schema, TABLE_SCORE_EVENTS)} (\n${buildColumnDefinitions(SCORE_EVENT_COLUMNS)},\n  PRIMARY KEY (\"scoreId\", \"timestamp\")\n)\n${partitionClause(mode, 'timestamp')}\n`.trim();\n}\n\nfunction feedbackEventsTableDDL(schema: string, mode: TableDDLMode): string {\n  return `\nCREATE TABLE IF NOT EXISTS ${qualifiedTable(schema, TABLE_FEEDBACK_EVENTS)} (\n${buildColumnDefinitions(FEEDBACK_EVENT_COLUMNS)},\n  PRIMARY KEY (\"feedbackId\", \"timestamp\")\n)\n${partitionClause(mode, 'timestamp')}\n`.trim();\n}\n\n// ---------------------------------------------------------------------------\n// Discovery cache table — refreshed lazily by readers\n// ---------------------------------------------------------------------------\n\nfunction discoveryTableDDL(schema: string): string {\n  return `\nCREATE TABLE IF NOT EXISTS ${qualifiedTable(schema, TABLE_DISCOVERY)} (\n  \"cacheKey\"              text PRIMARY KEY,\n  \"refreshedAt\"           timestamptz NOT NULL,\n  \"values\"                jsonb NOT NULL DEFAULT '[]'::jsonb\n)\n`.trim();\n}\n\n// ---------------------------------------------------------------------------\n// Index definitions per table — partition-local btrees, GINs, and partial\n// indexes that act as a root-span projection on span_events.\n// ---------------------------------------------------------------------------\n\ninterface IndexSpec {\n  name: string;\n  table: string;\n  columns: string;\n  using?: 'btree' | 'gin';\n  where?: string;\n}\n\n/**\n * Filter that selects only root spans. Used to make several span_events\n * indexes act as a projection for the `listTraces` / `getRootSpan` read path.\n */\nconst ROOT_SPAN_WHERE = '\"parentSpanId\" IS NULL';\n\nfunction tableIndexes(): IndexSpec[] {\n  return [\n    // span_events — full-table indexes used by getTrace / getSpan\n    { name: 'mastra_span_events_traceid_idx', table: TABLE_SPAN_EVENTS, columns: '(\"traceId\", \"endedAt\" DESC)' },\n    {\n      name: 'mastra_span_events_parentspan_idx',\n      table: TABLE_SPAN_EVENTS,\n      columns: '(\"parentSpanId\", \"endedAt\" DESC)',\n    },\n    { name: 'mastra_span_events_name_idx', table: TABLE_SPAN_EVENTS, columns: '(\"name\")' },\n    // Used by listBranches page mode (filter by spanType, order by startedAt).\n    { name: 'mastra_span_events_spantype_idx', table: TABLE_SPAN_EVENTS, columns: '(\"spanType\", \"startedAt\" DESC)' },\n    { name: 'mastra_span_events_entity_idx', table: TABLE_SPAN_EVENTS, columns: '(\"entityType\", \"entityId\")' },\n    {\n      name: 'mastra_span_events_orgid_userid_idx',\n      table: TABLE_SPAN_EVENTS,\n      columns: '(\"organizationId\", \"userId\")',\n    },\n    {\n      name: 'mastra_span_events_metadatasearch_gin',\n      table: TABLE_SPAN_EVENTS,\n      columns: '(\"metadataSearch\" jsonb_path_ops)',\n      using: 'gin',\n    },\n    { name: 'mastra_span_events_tags_gin', table: TABLE_SPAN_EVENTS, columns: '(\"tags\")', using: 'gin' },\n\n    // span_events — partial indexes acting as the root-span projection. The\n    // listTraces filter surface (startedAt / spanType / entityType / etc.) is\n    // covered by these; rows where parentSpanId IS NOT NULL are excluded from\n    // the index, so the index is the size of a separate trace_roots table.\n    {\n      name: 'mastra_span_events_root_startedat_idx',\n      table: TABLE_SPAN_EVENTS,\n      columns: '(\"startedAt\" DESC)',\n      where: ROOT_SPAN_WHERE,\n    },\n    {\n      name: 'mastra_span_events_root_endedat_idx',\n      table: TABLE_SPAN_EVENTS,\n      columns: '(\"endedAt\" DESC)',\n      where: ROOT_SPAN_WHERE,\n    },\n    {\n      name: 'mastra_span_events_root_spantype_idx',\n      table: TABLE_SPAN_EVENTS,\n      columns: '(\"spanType\", \"startedAt\" DESC)',\n      where: ROOT_SPAN_WHERE,\n    },\n    {\n      name: 'mastra_span_events_root_entityname_idx',\n      table: TABLE_SPAN_EVENTS,\n      columns: '(\"entityType\", \"entityName\", \"startedAt\" DESC)',\n      where: ROOT_SPAN_WHERE,\n    },\n    {\n      name: 'mastra_span_events_root_traceid_idx',\n      table: TABLE_SPAN_EVENTS,\n      columns: '(\"traceId\")',\n      where: ROOT_SPAN_WHERE,\n    },\n    // Delta polling: transaction-safe cursor ordering. Full-table coverage so the same index\n    // serves both listTraces (combined with the `parentSpanId IS NULL`\n    // predicate) and listBranches (combined with `spanType IN (...)`).\n    {\n      name: 'mastra_span_events_cursor_idx',\n      table: TABLE_SPAN_EVENTS,\n      columns: '(\"xactId\", \"cursorId\")',\n    },\n\n    // metric_events\n    { name: 'mastra_metric_events_name_ts_idx', table: TABLE_METRIC_EVENTS, columns: '(\"name\", \"timestamp\" DESC)' },\n    {\n      name: 'mastra_metric_events_entity_idx',\n      table: TABLE_METRIC_EVENTS,\n      columns: '(\"entityType\", \"entityId\", \"timestamp\" DESC)',\n    },\n    { name: 'mastra_metric_events_traceid_idx', table: TABLE_METRIC_EVENTS, columns: '(\"traceId\")' },\n    { name: 'mastra_metric_events_labels_gin', table: TABLE_METRIC_EVENTS, columns: '(\"labels\")', using: 'gin' },\n    { name: 'mastra_metric_events_tags_gin', table: TABLE_METRIC_EVENTS, columns: '(\"tags\")', using: 'gin' },\n    { name: 'mastra_metric_events_cursor_idx', table: TABLE_METRIC_EVENTS, columns: '(\"xactId\", \"cursorId\")' },\n\n    // log_events\n    { name: 'mastra_log_events_ts_idx', table: TABLE_LOG_EVENTS, columns: '(\"timestamp\" DESC)' },\n    { name: 'mastra_log_events_level_ts_idx', table: TABLE_LOG_EVENTS, columns: '(\"level\", \"timestamp\" DESC)' },\n    { name: 'mastra_log_events_traceid_idx', table: TABLE_LOG_EVENTS, columns: '(\"traceId\")' },\n    {\n      name: 'mastra_log_events_entity_idx',\n      table: TABLE_LOG_EVENTS,\n      columns: '(\"entityType\", \"entityId\", \"timestamp\" DESC)',\n    },\n    { name: 'mastra_log_events_tags_gin', table: TABLE_LOG_EVENTS, columns: '(\"tags\")', using: 'gin' },\n    { name: 'mastra_log_events_cursor_idx', table: TABLE_LOG_EVENTS, columns: '(\"xactId\", \"cursorId\")' },\n\n    // score_events\n    { name: 'mastra_score_events_traceid_idx', table: TABLE_SCORE_EVENTS, columns: '(\"traceId\", \"timestamp\" DESC)' },\n    { name: 'mastra_score_events_scorerid_idx', table: TABLE_SCORE_EVENTS, columns: '(\"scorerId\", \"timestamp\" DESC)' },\n    {\n      name: 'mastra_score_events_entity_idx',\n      table: TABLE_SCORE_EVENTS,\n      columns: '(\"entityType\", \"entityId\", \"timestamp\" DESC)',\n    },\n    { name: 'mastra_score_events_tags_gin', table: TABLE_SCORE_EVENTS, columns: '(\"tags\")', using: 'gin' },\n    { name: 'mastra_score_events_cursor_idx', table: TABLE_SCORE_EVENTS, columns: '(\"xactId\", \"cursorId\")' },\n\n    // feedback_events\n    {\n      name: 'mastra_feedback_events_traceid_idx',\n      table: TABLE_FEEDBACK_EVENTS,\n      columns: '(\"traceId\", \"timestamp\" DESC)',\n    },\n    {\n      name: 'mastra_feedback_events_type_idx',\n      table: TABLE_FEEDBACK_EVENTS,\n      columns: '(\"feedbackType\", \"timestamp\" DESC)',\n    },\n    {\n      name: 'mastra_feedback_events_entity_idx',\n      table: TABLE_FEEDBACK_EVENTS,\n      columns: '(\"entityType\", \"entityId\", \"timestamp\" DESC)',\n    },\n    { name: 'mastra_feedback_events_tags_gin', table: TABLE_FEEDBACK_EVENTS, columns: '(\"tags\")', using: 'gin' },\n    { name: 'mastra_feedback_events_cursor_idx', table: TABLE_FEEDBACK_EVENTS, columns: '(\"xactId\", \"cursorId\")' },\n  ];\n}\n\nfunction indexDDL(schema: string, spec: IndexSpec): string {\n  const idxName = parseSqlIdentifier(spec.name, 'index name');\n  const using = spec.using ? `USING ${spec.using}` : '';\n  const where = spec.where ? `WHERE ${spec.where}` : '';\n  return `CREATE INDEX IF NOT EXISTS \"${idxName}\" ON ${qualifiedTable(schema, spec.table)} ${using} ${spec.columns} ${where}`.replace(\n    /\\s+/g,\n    ' ',\n  );\n}\n\n// ---------------------------------------------------------------------------\n// Public DDL accessors\n// ---------------------------------------------------------------------------\n\n/** All table CREATEs in dependency-safe order. */\nexport function allTableDDL(schema: string, mode: TableDDLMode): string[] {\n  return [\n    spanEventsTableDDL(schema, mode),\n    metricEventsTableDDL(schema, mode),\n    logEventsTableDDL(schema, mode),\n    scoreEventsTableDDL(schema, mode),\n    feedbackEventsTableDDL(schema, mode),\n    discoveryTableDDL(schema),\n  ];\n}\n\n/**\n * Additive column migrations for tables created by an older version of this\n * schema. `CREATE TABLE IF NOT EXISTS` is a no-op on an existing table, so new\n * columns have to be added out of band.\n *\n * `ALTER TABLE` takes an AccessExclusiveLock on the partitioned parent, so\n * callers must check {@link columnExistsSQL} first and only run the statement\n * when the column is genuinely missing. On Postgres 11+ the non-volatile\n * default does not rewrite the table, and the ALTER cascades to partitions.\n */\nexport function additiveColumns(schema: string): { table: string; column: string; ddl: string }[] {\n  return [\n    {\n      table: TABLE_SPAN_EVENTS,\n      column: 'isPending',\n      ddl: `ALTER TABLE ${qualifiedTable(schema, TABLE_SPAN_EVENTS)} ADD COLUMN IF NOT EXISTS \"isPending\" boolean NOT NULL DEFAULT false`,\n    },\n    {\n      table: TABLE_FEEDBACK_EVENTS,\n      column: 'reviewStatus',\n      ddl: `ALTER TABLE ${qualifiedTable(schema, TABLE_FEEDBACK_EVENTS)} ADD COLUMN IF NOT EXISTS \"reviewStatus\" text NOT NULL DEFAULT 'needs-review'`,\n    },\n  ];\n}\n\n/** Existence probe for an additive column. Params: schema, table, column. */\nexport const columnExistsSQL = `SELECT 1 FROM information_schema.columns\n   WHERE table_schema = $1 AND table_name = $2 AND column_name = $3`;\n\n/** Index CREATEs. Safe to run repeatedly. */\nexport function allIndexDDL(schema: string): string[] {\n  return tableIndexes().map(spec => indexDDL(schema, spec));\n}\n","/**\n * Discovery operations for the v-next Postgres observability domain.\n *\n * Backed by a single cache table (`mastra_observability_discovery`) keyed by a\n * cacheKey string. Reads use stale-while-revalidate semantics:\n *\n *   - if no cache row exists, compute synchronously and serve.\n *   - if cache row exists and is fresher than `discoveryTtlSeconds`, serve as-is.\n *   - if cache row is stale, kick off an async refresh and serve the cached\n *     value. The refresh upserts on a single row keyed by cacheKey, so\n *     concurrent readers race harmlessly with last-write-wins semantics.\n *\n * No in-memory caching: the table-backed cache works across multiple\n * frontends pointing at the same database and survives serverless restarts.\n */\n\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n  EntityType,\n  GetEntityNamesArgs,\n  GetEntityNamesResponse,\n  GetEntityTypesArgs,\n  GetEntityTypesResponse,\n  GetEnvironmentsArgs,\n  GetEnvironmentsResponse,\n  GetMetricLabelKeysArgs,\n  GetMetricLabelKeysResponse,\n  GetMetricLabelValuesArgs,\n  GetMetricLabelValuesResponse,\n  GetMetricNamesArgs,\n  GetMetricNamesResponse,\n  GetServiceNamesArgs,\n  GetServiceNamesResponse,\n  GetTagsArgs,\n  GetTagsResponse,\n} from '@mastra/core/storage';\n\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\nimport type { DbClient } from '../../../client';\nimport {\n  qualifiedTable,\n  TABLE_DISCOVERY,\n  TABLE_LOG_EVENTS,\n  TABLE_METRIC_EVENTS,\n  TABLE_SCORE_EVENTS,\n  TABLE_FEEDBACK_EVENTS,\n  TABLE_SPAN_EVENTS,\n  SIGNAL_TIME_COLUMN,\n} from './ddl';\n\nconst DEFAULT_TTL_SECONDS = 5 * 60; // 5 minutes\nconst DEFAULT_LOOKBACK_SECONDS = 30 * 24 * 60 * 60; // 30 days\n\n/** All signal tables that contain a column. Used by cross-signal discovery. */\nconst SIGNAL_TABLES_WITH_CONTEXT = [\n  TABLE_SPAN_EVENTS,\n  TABLE_METRIC_EVENTS,\n  TABLE_LOG_EVENTS,\n  TABLE_SCORE_EVENTS,\n  TABLE_FEEDBACK_EVENTS,\n] as const;\n\n/** Tables for entity-type / entity-name / tag discovery (excludes scores/feedback). */\nconst ENTITY_DISCOVERY_TABLES = [TABLE_SPAN_EVENTS, TABLE_METRIC_EVENTS, TABLE_LOG_EVENTS] as const;\n\nexport interface DiscoveryConfig {\n  /** TTL for cached values in seconds. Default 300 (5 minutes). */\n  ttlSeconds?: number;\n  /**\n   * Only scan events newer than this many seconds when refreshing a discovery\n   * value. Default 2592000 (30 days).\n   *\n   * The predicate targets each signal table's partition range key\n   * (`SIGNAL_TIME_COLUMN`), so bounding the window lets Postgres prune\n   * partitions on native/pg_partman layouts and exclude chunks on Timescale\n   * instead of visiting all history on every refresh.\n   *\n   * Set to 0 to scan all history (the behavior before this option existed).\n   * Note that a value last seen outside the window disappears from discovery\n   * results until it is seen again.\n   */\n  lookbackSeconds?: number;\n  /**\n   * Logger used to report background refresh failures. Injected by the\n   * domain class (`ObservabilityStoragePostgresVNext`) so discovery\n   * warnings land in the framework logger alongside the rest of the store.\n   * Falls back to `console.warn` when absent so direct callers (tests,\n   * scripts) still see refresh failures.\n   * @internal\n   */\n  logger?: IMastraLogger;\n}\n\n/**\n * In-process dedupe for concurrent refreshes against the same cache key.\n *\n * Covers two stampede shapes:\n *  - cold start: N concurrent first-callers all want the values, but only\n *    one of them needs to actually run `refresh()` + `upsertCache()`. The\n *    others await the same promise.\n *  - stale refresh: N concurrent stale-readers serve the cached values\n *    immediately and share one background refresh.\n *\n * The map keys are `\"schema:cacheKey\"` so multiple schemas using the same\n * key don't share an entry. Entries clear themselves via `.finally` after\n * the refresh settles.\n */\nconst inFlightRefreshes = new Map<string, Promise<string[]>>();\n\nfunction startOrJoinRefresh(\n  dedupeKey: string,\n  cacheKey: string,\n  refresh: () => Promise<string[]>,\n  upsert: (values: string[]) => Promise<void>,\n  logger: IMastraLogger | undefined,\n): Promise<string[]> {\n  const existing = inFlightRefreshes.get(dedupeKey);\n  if (existing) return existing;\n\n  const promise = (async () => {\n    try {\n      const values = await refresh();\n      await upsert(values);\n      return values;\n    } catch (error) {\n      // Surface refresh failures — silently swallowing them would mask real\n      // DB/connectivity issues behind permanently stale data. Prefer the\n      // framework logger so warnings land in the same stream as the rest\n      // of the store; fall back to console.warn for direct callers (tests,\n      // scripts) that don't inject one.\n      const message = `[observability/v-next] background refresh failed for discovery cache key \"${cacheKey}\"`;\n      if (logger) {\n        logger.warn(message, { error });\n      } else {\n        console.warn(message + ':', error);\n      }\n      throw error;\n    } finally {\n      inFlightRefreshes.delete(dedupeKey);\n    }\n  })();\n\n  inFlightRefreshes.set(dedupeKey, promise);\n  return promise;\n}\n\n/**\n * Read the cache row for `cacheKey` and decide whether to refresh.\n *\n * Stale-while-revalidate semantics:\n *  - Fresh cache hit: return the stored values immediately.\n *  - Stale cache hit: return the cached values immediately AND kick off a\n *    background refresh (deduped) so the next reader sees fresh data.\n *    Concurrent stale readers don't await the shared refresh — that's the\n *    \"while-revalidate\" half of SWR.\n *  - Cold miss (no row at all): block on the refresh and return its values.\n *    Concurrent cold callers share one refresh promise via the dedupe map.\n */\nasync function readWithRefresh(\n  client: DbClient,\n  schema: string,\n  cacheKey: string,\n  refresh: () => Promise<string[]>,\n  ttlSeconds: number,\n  logger: IMastraLogger | undefined,\n): Promise<string[]> {\n  const table = qualifiedTable(schema, TABLE_DISCOVERY);\n  // pg returns `timestamptz` as a JS Date — type the field accordingly.\n  const row = await client.oneOrNone<{ values: string[]; refreshedAt: Date }>(\n    `SELECT \"values\", \"refreshedAt\" FROM ${table} WHERE \"cacheKey\" = $1`,\n    [cacheKey],\n  );\n\n  const dedupeKey = `${schema}:${cacheKey}`;\n  const startRefresh = () =>\n    startOrJoinRefresh(dedupeKey, cacheKey, refresh, values => upsertCache(client, schema, cacheKey, values), logger);\n\n  // Force-refresh path: `ttlSeconds <= 0` is the contract used by\n  // `refreshAllDiscoveryCaches()` (and the future `mastra observability\n  // discovery refresh` CLI) to mean \"block until the cache is rewritten\".\n  // Check this before cache freshness because consecutive forced refreshes can\n  // occur in the same millisecond.\n  if (ttlSeconds <= 0) {\n    try {\n      return await startRefresh();\n    } catch {\n      // Already logged inside startOrJoinRefresh. Fall back to whatever we\n      // had cached so the caller still gets a defined value.\n      return row?.values ?? [];\n    }\n  }\n\n  const refreshedAtMs = row ? new Date(row.refreshedAt).getTime() : 0;\n  const stale = !row || Date.now() - refreshedAtMs > ttlSeconds * 1000;\n\n  if (!stale) return row!.values;\n\n  if (!row) {\n    // Cold path: no cached values to serve. Block on (or join) the refresh.\n    try {\n      return await startRefresh();\n    } catch {\n      // Already logged inside startOrJoinRefresh; return empty so the caller\n      // gets a defined value instead of throwing.\n      return [];\n    }\n  }\n\n  // Stale path: serve the cached values immediately and revalidate in the\n  // background — but only if this process wins the claim. `inFlightRefreshes`\n  // dedupes within one process; the claim extends that to every process\n  // pointing at the same database, so N frontends going stale together run\n  // one refresh instead of N.\n  const previousRefreshedAt = row.refreshedAt;\n  void claimRefresh(client, schema, cacheKey, ttlSeconds)\n    .then(claimedAt => {\n      // Lost the claim: another process is already refreshing this key.\n      if (!claimedAt) return;\n      return startRefresh().then(\n        // Success rewrites `refreshedAt` via upsertCache.\n        () => {},\n        // Failure (already logged by startOrJoinRefresh) hands the claim\n        // back by restoring the timestamp we found, so the next reader\n        // retries instead of waiting out a TTL on a stamp that never\n        // corresponded to a completed refresh.\n        () => releaseClaim(client, schema, cacheKey, previousRefreshedAt, claimedAt),\n      );\n    })\n    .catch(() => {});\n  return row.values;\n}\n\n/**\n * Try to become the process that refreshes `cacheKey`.\n *\n * The conditional UPDATE re-checks staleness in the database and stamps\n * `refreshedAt` in the same statement, so exactly one caller can transition a\n * given cache row out of the stale window — losers see zero rows updated and\n * skip their refresh. This is the cross-process counterpart to\n * `inFlightRefreshes`: N frontends going stale together run one refresh\n * instead of N.\n *\n * It reuses the cache table rather than an advisory lock because `DbClient`\n * is pool-backed, so a transaction-scoped lock would mean threading explicit\n * transaction handling through the discovery read path.\n *\n * The stamp is provisional in both directions: a completed refresh overwrites\n * it via `upsertCache`, and a failed one restores it via `releaseClaim`.\n *\n * Returns the exact provisional stamp written by the claim (or `null` when\n * the claim was lost) so `releaseClaim` can restore the row only while it\n * still holds this claim's stamp.\n */\nasync function claimRefresh(\n  client: DbClient,\n  schema: string,\n  cacheKey: string,\n  ttlSeconds: number,\n): Promise<string | null> {\n  const table = qualifiedTable(schema, TABLE_DISCOVERY);\n  // The stamp is returned as text so the microsecond precision Postgres\n  // stores survives the round trip — a JS Date only holds milliseconds,\n  // which would break the exact-match guard in `releaseClaim`.\n  const claimed = await client.oneOrNone<{ refreshedAt: string }>(\n    `UPDATE ${table} SET \"refreshedAt\" = NOW()\n      WHERE \"cacheKey\" = $1 AND \"refreshedAt\" <= NOW() - ($2 || ' seconds')::interval\n     RETURNING \"refreshedAt\"::text AS \"refreshedAt\"`,\n    [cacheKey, Math.floor(ttlSeconds)],\n  );\n  return claimed?.refreshedAt ?? null;\n}\n\n/**\n * Hand back a claim whose refresh failed by restoring the timestamp the\n * claiming reader observed. Guarded on the row still holding this claim's\n * exact provisional stamp so a refresh that completed in the meantime\n * (another process, or a later claim) isn't dragged backwards into staleness.\n */\nasync function releaseClaim(\n  client: DbClient,\n  schema: string,\n  cacheKey: string,\n  previousRefreshedAt: Date,\n  claimedAt: string,\n): Promise<void> {\n  const table = qualifiedTable(schema, TABLE_DISCOVERY);\n  try {\n    await client.query(\n      `UPDATE ${table} SET \"refreshedAt\" = $2\n        WHERE \"cacheKey\" = $1 AND \"refreshedAt\" = $3::timestamptz`,\n      [cacheKey, previousRefreshedAt, claimedAt],\n    );\n  } catch {\n    // Best-effort: the claim expires on its own once the TTL elapses.\n  }\n}\n\nasync function upsertCache(client: DbClient, schema: string, cacheKey: string, values: string[]): Promise<void> {\n  const table = qualifiedTable(schema, TABLE_DISCOVERY);\n  await client.query(\n    `INSERT INTO ${table} (\"cacheKey\", \"refreshedAt\", \"values\")\n     VALUES ($1, NOW(), $2::jsonb)\n     ON CONFLICT (\"cacheKey\") DO UPDATE SET\n       \"refreshedAt\" = EXCLUDED.\"refreshedAt\",\n       \"values\" = EXCLUDED.\"values\"`,\n    [cacheKey, JSON.stringify(values)],\n  );\n}\n\n// ---------------------------------------------------------------------------\n// Per-discovery refresh queries\n// ---------------------------------------------------------------------------\n\n/**\n * Time predicate that bounds a discovery refresh to recent events.\n *\n * Each signal table is range-partitioned on its own time column\n * (`SIGNAL_TIME_COLUMN`: `endedAt` for spans, `timestamp` for everything\n * else), so the predicate has to be built per table rather than shared across\n * a UNION. Bounding on that exact column is what lets the planner prune\n * partitions/chunks instead of scanning all history.\n *\n * The interval is interpolated rather than bound to a parameter on purpose:\n * the UNION branches in `distinctAcrossTables` and `getTags` all reference the\n * same positional placeholders, so adding a per-branch parameter would break\n * `$N` numbering. Safety comes from coercing to a finite integer here — the\n * value originates from `DiscoveryConfig`, never from user input.\n */\nfunction lookbackPredicate(table: string, lookbackSeconds: number): string {\n  if (!Number.isFinite(lookbackSeconds) || lookbackSeconds <= 0) return '';\n  const seconds = Math.floor(lookbackSeconds);\n  const timeColumn = SIGNAL_TIME_COLUMN[table as keyof typeof SIGNAL_TIME_COLUMN];\n  if (!timeColumn) return '';\n  return `AND \"${timeColumn}\" >= NOW() - INTERVAL '${seconds} seconds'`;\n}\n\nasync function distinctAcrossTables(\n  client: DbClient,\n  schema: string,\n  column: string,\n  tables: readonly string[],\n  lookbackSeconds: number,\n  filterSql: string = '',\n  filterParams: unknown[] = [],\n): Promise<string[]> {\n  // Defense-in-depth: every current caller passes a hardcoded column name,\n  // but validating the identifier here makes the helper injection-safe by\n  // construction in case a future caller takes it from user input.\n  const safeColumn = parseSqlIdentifier(column, 'column name');\n  // Each subquery references the same $N placeholders; pg parameters are\n  // positional, so we pass `filterParams` exactly once.\n  const unions = tables\n    .map(\n      t =>\n        `SELECT DISTINCT \"${safeColumn}\" AS v FROM ${qualifiedTable(schema, t)} WHERE \"${safeColumn}\" IS NOT NULL AND \"${safeColumn}\" <> '' ${filterSql} ${lookbackPredicate(t, lookbackSeconds)}`,\n    )\n    .join(' UNION ');\n  const rows = await client.manyOrNone<{ v: string }>(`SELECT v FROM (${unions}) sub ORDER BY v`, filterParams);\n  return rows.map(r => r.v);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function getEntityTypes(\n  client: DbClient,\n  schema: string,\n  _args: GetEntityTypesArgs,\n  config: DiscoveryConfig,\n): Promise<GetEntityTypesResponse> {\n  const ttl = config.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n  const lookback = config.lookbackSeconds ?? DEFAULT_LOOKBACK_SECONDS;\n  const values = await readWithRefresh(\n    client,\n    schema,\n    'entity_types',\n    () => distinctAcrossTables(client, schema, 'entityType', ENTITY_DISCOVERY_TABLES, lookback),\n    ttl,\n    config.logger,\n  );\n  return { entityTypes: values as EntityType[] };\n}\n\nexport async function getEntityNames(\n  client: DbClient,\n  schema: string,\n  args: GetEntityNamesArgs,\n  config: DiscoveryConfig,\n): Promise<GetEntityNamesResponse> {\n  const ttl = config.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n  const lookback = config.lookbackSeconds ?? DEFAULT_LOOKBACK_SECONDS;\n  const cacheKey = args.entityType ? `entity_names:${args.entityType}` : 'entity_names';\n  const filterSql = args.entityType ? `AND \"entityType\" = $1` : '';\n  const filterParams = args.entityType ? [args.entityType] : [];\n  const values = await readWithRefresh(\n    client,\n    schema,\n    cacheKey,\n    () =>\n      distinctAcrossTables(client, schema, 'entityName', ENTITY_DISCOVERY_TABLES, lookback, filterSql, filterParams),\n    ttl,\n    config.logger,\n  );\n  return { names: values };\n}\n\nexport async function getServiceNames(\n  client: DbClient,\n  schema: string,\n  _args: GetServiceNamesArgs,\n  config: DiscoveryConfig,\n): Promise<GetServiceNamesResponse> {\n  const ttl = config.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n  const lookback = config.lookbackSeconds ?? DEFAULT_LOOKBACK_SECONDS;\n  const values = await readWithRefresh(\n    client,\n    schema,\n    'service_names',\n    () => distinctAcrossTables(client, schema, 'serviceName', SIGNAL_TABLES_WITH_CONTEXT, lookback),\n    ttl,\n    config.logger,\n  );\n  return { serviceNames: values };\n}\n\nexport async function getEnvironments(\n  client: DbClient,\n  schema: string,\n  _args: GetEnvironmentsArgs,\n  config: DiscoveryConfig,\n): Promise<GetEnvironmentsResponse> {\n  const ttl = config.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n  const lookback = config.lookbackSeconds ?? DEFAULT_LOOKBACK_SECONDS;\n  const values = await readWithRefresh(\n    client,\n    schema,\n    'environments',\n    () => distinctAcrossTables(client, schema, 'environment', SIGNAL_TABLES_WITH_CONTEXT, lookback),\n    ttl,\n    config.logger,\n  );\n  return { environments: values };\n}\n\nexport async function getTags(\n  client: DbClient,\n  schema: string,\n  args: GetTagsArgs,\n  config: DiscoveryConfig,\n): Promise<GetTagsResponse> {\n  const ttl = config.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n  const lookback = config.lookbackSeconds ?? DEFAULT_LOOKBACK_SECONDS;\n  const cacheKey = args.entityType ? `tags:${args.entityType}` : 'tags';\n\n  const refresh = async (): Promise<string[]> => {\n    const filter = args.entityType ? `AND \"entityType\" = $1` : '';\n    const params = args.entityType ? [args.entityType] : [];\n    const unions = ENTITY_DISCOVERY_TABLES.map(\n      t =>\n        `SELECT DISTINCT UNNEST(\"tags\") AS v FROM ${qualifiedTable(schema, t)} WHERE array_length(\"tags\", 1) > 0 ${filter} ${lookbackPredicate(t, lookback)}`,\n    ).join(' UNION ');\n    const rows = await client.manyOrNone<{ v: string }>(\n      `SELECT v FROM (${unions}) sub WHERE v IS NOT NULL AND v <> '' ORDER BY v`,\n      params,\n    );\n    return rows.map(r => r.v);\n  };\n\n  const values = await readWithRefresh(client, schema, cacheKey, refresh, ttl, config.logger);\n  return { tags: values };\n}\n\nexport async function getMetricNames(\n  client: DbClient,\n  schema: string,\n  args: GetMetricNamesArgs,\n  config: DiscoveryConfig,\n): Promise<GetMetricNamesResponse> {\n  const ttl = config.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n  const lookback = config.lookbackSeconds ?? DEFAULT_LOOKBACK_SECONDS;\n  const values = await readWithRefresh(\n    client,\n    schema,\n    'metric_names',\n    async () => {\n      const rows = await client.manyOrNone<{ v: string }>(\n        `SELECT DISTINCT \"name\" AS v FROM ${qualifiedTable(schema, TABLE_METRIC_EVENTS)}\n         WHERE \"name\" IS NOT NULL AND \"name\" <> '' ${lookbackPredicate(TABLE_METRIC_EVENTS, lookback)} ORDER BY \"name\"`,\n      );\n      return rows.map(r => r.v);\n    },\n    ttl,\n    config.logger,\n  );\n  let filtered = values;\n  if (args.prefix) filtered = filtered.filter(v => v.startsWith(args.prefix!));\n  if (args.limit) filtered = filtered.slice(0, args.limit);\n  return { names: filtered };\n}\n\nexport async function getMetricLabelKeys(\n  client: DbClient,\n  schema: string,\n  args: GetMetricLabelKeysArgs,\n  config: DiscoveryConfig,\n): Promise<GetMetricLabelKeysResponse> {\n  const ttl = config.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n  const lookback = config.lookbackSeconds ?? DEFAULT_LOOKBACK_SECONDS;\n  const cacheKey = `metric_label_keys:${args.metricName}`;\n  const values = await readWithRefresh(\n    client,\n    schema,\n    cacheKey,\n    async () => {\n      const rows = await client.manyOrNone<{ v: string }>(\n        `SELECT DISTINCT k AS v\n         FROM ${qualifiedTable(schema, TABLE_METRIC_EVENTS)}, jsonb_object_keys(\"labels\") k\n         WHERE \"name\" = $1 ${lookbackPredicate(TABLE_METRIC_EVENTS, lookback)} ORDER BY k`,\n        [args.metricName],\n      );\n      return rows.map(r => r.v);\n    },\n    ttl,\n    config.logger,\n  );\n  return { keys: values };\n}\n\nexport async function getMetricLabelValues(\n  client: DbClient,\n  schema: string,\n  args: GetMetricLabelValuesArgs,\n  config: DiscoveryConfig,\n): Promise<GetMetricLabelValuesResponse> {\n  const ttl = config.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n  const lookback = config.lookbackSeconds ?? DEFAULT_LOOKBACK_SECONDS;\n  const cacheKey = `metric_label_values:${args.metricName}:${args.labelKey}`;\n  const values = await readWithRefresh(\n    client,\n    schema,\n    cacheKey,\n    async () => {\n      const rows = await client.manyOrNone<{ v: string }>(\n        `SELECT DISTINCT \"labels\" ->> $2 AS v\n         FROM ${qualifiedTable(schema, TABLE_METRIC_EVENTS)}\n         WHERE \"name\" = $1 AND \"labels\" ? $2 ${lookbackPredicate(TABLE_METRIC_EVENTS, lookback)}\n         ORDER BY v`,\n        [args.metricName, args.labelKey],\n      );\n      return rows.map(r => r.v).filter(v => v != null && v !== '');\n    },\n    ttl,\n    config.logger,\n  );\n  let filtered = values;\n  if (args.prefix) filtered = filtered.filter(v => v.startsWith(args.prefix!));\n  if (args.limit) filtered = filtered.slice(0, args.limit);\n  return { values: filtered };\n}\n\n/**\n * Force-refresh the six unscoped discovery cache keys: `entity_types`,\n * `entity_names`, `service_names`, `environments`, `tags`, and\n * `metric_names`. Scoped keys (`entity_names:<entityType>`,\n * `tags:<entityType>`, `metric_label_keys:<metric>`,\n * `metric_label_values:<metric>:<key>`) are not touched here — they refresh\n * lazily on read against their own keys.\n *\n * Intended for the future `mastra observability discovery refresh` CLI\n * command.\n */\nexport async function refreshAllDiscoveryCaches(\n  client: DbClient,\n  schema: string,\n  config: DiscoveryConfig,\n): Promise<void> {\n  await Promise.all([\n    getEntityTypes(client, schema, {}, { ...config, ttlSeconds: 0 }),\n    getEntityNames(client, schema, {}, { ...config, ttlSeconds: 0 }),\n    getServiceNames(client, schema, {}, { ...config, ttlSeconds: 0 }),\n    getEnvironments(client, schema, {}, { ...config, ttlSeconds: 0 }),\n    getTags(client, schema, {}, { ...config, ttlSeconds: 0 }),\n    getMetricNames(client, schema, {}, { ...config, ttlSeconds: 0 }),\n  ]);\n}\n","/**\n * Shared WHERE-clause builder for the v-next Postgres observability domain.\n *\n * Translates the cross-signal `commonFilterFields` (defined in\n * @internal/core/storage/shared) into parameterized SQL conditions.\n * Signal-specific extensions (e.g. log `level`, metric `name`,\n * trace `status`) are added by the caller.\n */\n\nexport interface FilterAccumulator {\n  conditions: string[];\n  params: unknown[];\n  /** Next bind index. Mutates as conditions are pushed. */\n  next: number;\n}\n\nexport function newFilterAccumulator(startIndex = 1): FilterAccumulator {\n  return { conditions: [], params: [], next: startIndex };\n}\n\nfunction pushEq(acc: FilterAccumulator, column: string, value: unknown, prefix = ''): void {\n  if (value === undefined) return;\n  acc.conditions.push(`${prefix}\"${column}\" = $${acc.next++}`);\n  acc.params.push(value);\n}\n\nfunction pushIn(acc: FilterAccumulator, column: string, values: readonly unknown[], prefix = ''): void {\n  if (!values.length) return;\n  const placeholders = values.map(() => `$${acc.next++}`).join(', ');\n  acc.conditions.push(`${prefix}\"${column}\" IN (${placeholders})`);\n  acc.params.push(...values);\n}\n\n/**\n * Apply common filter fields (shared across logs / metrics / scores / feedback).\n * `timestampColumn` allows the caller to use a different time column name on\n * tables where the time column is not literally `timestamp` (the tracing\n * tables use `endedAt`).\n */\nexport function applyCommonFilters(\n  acc: FilterAccumulator,\n  filters: Record<string, any> | undefined,\n  options: { timestampColumn?: string; prefix?: string } = {},\n): void {\n  if (!filters) return;\n  const tsCol = options.timestampColumn ?? 'timestamp';\n  const prefix = options.prefix ?? '';\n\n  if (filters.timestamp?.start) {\n    const op = filters.timestamp.startExclusive ? '>' : '>=';\n    acc.conditions.push(`${prefix}\"${tsCol}\" ${op} $${acc.next++}`);\n    acc.params.push(filters.timestamp.start.toISOString());\n  }\n  if (filters.timestamp?.end) {\n    const op = filters.timestamp.endExclusive ? '<' : '<=';\n    acc.conditions.push(`${prefix}\"${tsCol}\" ${op} $${acc.next++}`);\n    acc.params.push(filters.timestamp.end.toISOString());\n  }\n  pushEq(acc, 'traceId', filters.traceId, prefix);\n  pushEq(acc, 'spanId', filters.spanId, prefix);\n  pushEq(acc, 'entityType', filters.entityType, prefix);\n  pushEq(acc, 'entityName', filters.entityName, prefix);\n  pushEq(acc, 'entityVersionId', filters.entityVersionId, prefix);\n  pushEq(acc, 'parentEntityType', filters.parentEntityType, prefix);\n  pushEq(acc, 'parentEntityName', filters.parentEntityName, prefix);\n  pushEq(acc, 'parentEntityVersionId', filters.parentEntityVersionId, prefix);\n  pushEq(acc, 'rootEntityType', filters.rootEntityType, prefix);\n  pushEq(acc, 'rootEntityName', filters.rootEntityName, prefix);\n  pushEq(acc, 'rootEntityVersionId', filters.rootEntityVersionId, prefix);\n  pushEq(acc, 'userId', filters.userId, prefix);\n  pushEq(acc, 'organizationId', filters.organizationId, prefix);\n  pushEq(acc, 'resourceId', filters.resourceId, prefix);\n  pushEq(acc, 'runId', filters.runId, prefix);\n  pushEq(acc, 'sessionId', filters.sessionId, prefix);\n  pushEq(acc, 'threadId', filters.threadId, prefix);\n  pushEq(acc, 'requestId', filters.requestId, prefix);\n  pushEq(acc, 'experimentId', filters.experimentId, prefix);\n  pushEq(acc, 'environment', filters.environment, prefix);\n  pushEq(acc, 'serviceName', filters.serviceName, prefix);\n  // `source` is the deprecated legacy field name across logs / metrics /\n  // scores / feedback. New code should set `executionSource`; we accept\n  // both at the storage layer so old callers keep working. `executionSource`\n  // wins when both are set.\n  pushEq(acc, 'executionSource', filters.executionSource ?? filters.source, prefix);\n\n  if (filters.tags != null && Array.isArray(filters.tags) && filters.tags.length > 0) {\n    acc.conditions.push(`${prefix}\"tags\" @> $${acc.next++}::text[]`);\n    acc.params.push(filters.tags);\n  }\n}\n\n/** Single-value or array-of-values equality filter (e.g. logs.level, metrics.name). */\nexport function applySingleOrArrayFilter(\n  acc: FilterAccumulator,\n  column: string,\n  value: string | string[] | undefined,\n  prefix = '',\n): void {\n  if (value === undefined) return;\n  if (Array.isArray(value)) {\n    pushIn(acc, column, value, prefix);\n  } else {\n    pushEq(acc, column, value, prefix);\n  }\n}\n\nexport function whereOrEmpty(acc: FilterAccumulator): string {\n  return acc.conditions.length ? `WHERE ${acc.conditions.join(' AND ')}` : '';\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { FeedbackReviewStatus, UpdateFeedbackReviewStatusArgs } from '@mastra/core/storage';\n\n// Local mirror of `feedbackReviewStatusSchema` / `updateFeedbackReviewStatusArgsSchema`\n// from `@mastra/core/storage`: this package's `@mastra/core` peer floor predates those\n// exports and the core-imports check forbids value imports newer than the floor.\n// Keep in sync with core.\nconst FEEDBACK_REVIEW_STATUSES: readonly FeedbackReviewStatus[] = ['needs-review', 'reviewed'];\n\nfunction isFeedbackReviewStatus(value: unknown): value is FeedbackReviewStatus {\n  return FEEDBACK_REVIEW_STATUSES.some(status => status === value);\n}\n\n/** Normalize a stored value to a review status, defaulting legacy/unknown values to `needs-review`. */\nexport function coerceFeedbackReviewStatus(value: unknown): FeedbackReviewStatus {\n  return isFeedbackReviewStatus(value) ? value : 'needs-review';\n}\n\nexport function parseUpdateFeedbackReviewStatusArgs(\n  args: UpdateFeedbackReviewStatusArgs,\n): UpdateFeedbackReviewStatusArgs {\n  const invalid = (text: string) =>\n    new MastraError({\n      id: 'OBSERVABILITY_UPDATE_FEEDBACK_REVIEW_STATUS_INVALID_ARGS',\n      domain: ErrorDomain.STORAGE,\n      category: ErrorCategory.USER,\n      text,\n    });\n  if (typeof args !== 'object' || args === null) {\n    throw invalid('args must be an object');\n  }\n  if (typeof args.feedbackId !== 'string' || args.feedbackId.length === 0) {\n    throw invalid('feedbackId is required');\n  }\n  if (!isFeedbackReviewStatus(args.reviewStatus)) {\n    throw invalid(`reviewStatus must be one of: ${FEEDBACK_REVIEW_STATUSES.join(', ')}`);\n  }\n  return { feedbackId: args.feedbackId, reviewStatus: args.reviewStatus };\n}\n","/**\n * Shared utilities for the Postgres v-next observability domain.\n *\n * Differences from the ClickHouse v-next helpers:\n *   - jsonb columns are passed through as native objects/arrays. No\n *     JSON.stringify on the way in or JSON.parse on the way out.\n *   - text[] columns are passed as native arrays.\n *   - Timestamps are sent as ISO strings; the pg driver coerces them.\n */\n\nimport type {\n  CreateFeedbackRecord,\n  CreateLogRecord,\n  CreateMetricRecord,\n  CreateScoreRecord,\n  CreateSpanRecord,\n  FeedbackRecord,\n  LightSpanRecord,\n  LogRecord,\n  MetricRecord,\n  ScoreRecord,\n  SpanRecord,\n} from '@mastra/core/storage';\nimport { EntityType } from '@mastra/core/storage';\nimport { coerceFeedbackReviewStatus } from './review-status';\n\nconst PROMOTED_KEYS = new Set([\n  'experimentId',\n  'entityType',\n  'entityId',\n  'entityName',\n  'entityVersionId',\n  'parentEntityVersionId',\n  'rootEntityVersionId',\n  'userId',\n  'organizationId',\n  'resourceId',\n  'runId',\n  'sessionId',\n  'threadId',\n  'requestId',\n  'environment',\n  'executionSource',\n  'serviceName',\n]);\n\nfunction nullableString(value: unknown): string | null {\n  if (typeof value === 'string') return value === '' ? null : value;\n  if (value == null) return null;\n  return String(value);\n}\n\nfunction nullableEntityType(value: unknown): EntityType | null {\n  const normalized = nullableString(value);\n  if (!normalized) return null;\n  return Object.values(EntityType).includes(normalized as EntityType) ? (normalized as EntityType) : null;\n}\n\nexport function normalizeTags(tags: unknown): string[] {\n  if (!Array.isArray(tags)) return [];\n  const seen = new Set<string>();\n  const result: string[] = [];\n  for (const t of tags) {\n    if (typeof t !== 'string') continue;\n    const trimmed = t.trim();\n    if (trimmed === '' || seen.has(trimmed)) continue;\n    seen.add(trimmed);\n    result.push(trimmed);\n  }\n  return result;\n}\n\nexport function normalizeLabels(labels: Record<string, unknown> | null | undefined): Record<string, string> {\n  if (labels == null || typeof labels !== 'object') return {};\n  const result: Record<string, string> = {};\n  for (const [k, v] of Object.entries(labels)) {\n    if (typeof v !== 'string') continue;\n    const trimmedK = k.trim();\n    const trimmedV = v.trim();\n    if (trimmedK === '' || trimmedV === '') continue;\n    result[trimmedK] = trimmedV;\n  }\n  return result;\n}\n\nexport function buildMetadataSearch(metadata: Record<string, unknown> | null | undefined): Record<string, string> {\n  if (metadata == null || typeof metadata !== 'object') return {};\n  const result: Record<string, string> = {};\n  for (const [k, v] of Object.entries(metadata)) {\n    if (PROMOTED_KEYS.has(k)) continue;\n    if (typeof v !== 'string') continue;\n    const trimmed = v.trim();\n    if (trimmed === '') continue;\n    result[k] = trimmed;\n  }\n  return result;\n}\n\nexport function toDate(value: unknown): Date {\n  if (value instanceof Date) return value;\n  if (value == null || value === '') throw new Error(`Invalid date: ${String(value)}`);\n  const d = new Date(value as string | number);\n  if (isNaN(d.getTime())) throw new Error(`Invalid date: ${String(value)}`);\n  return d;\n}\n\nexport function toDateOrNull(value: unknown): Date | null {\n  if (value == null || value === '') return null;\n  if (value instanceof Date) return value;\n  const d = new Date(value as string | number);\n  if (isNaN(d.getTime())) return null;\n  return d;\n}\n\nexport function toIsoOrDate(value: Date | number | string): Date | string {\n  if (value instanceof Date) return value;\n  if (typeof value === 'number') return new Date(value);\n  return value;\n}\n\n/** Pass-through for jsonb. Postgres driver does the encoding when given an object. */\nfunction jsonField(value: unknown): unknown {\n  if (value === undefined) return null;\n  return value;\n}\n\nfunction parsedJson(value: unknown): unknown {\n  // The pg driver decodes jsonb columns into native JS values (objects, arrays,\n  // strings, numbers, booleans). Every caller here reads a jsonb column, so the\n  // value is already final. Re-parsing a decoded string would drop plain strings\n  // (JSON.parse('hello') throws) and coerce JSON-looking strings ('123' -> 123),\n  // so return the value unchanged, normalizing null/undefined to undefined.\n  if (value == null) return undefined;\n  return value;\n}\n\n// ---------------------------------------------------------------------------\n// Common context — the ~23 identity / hierarchy / execution-context columns\n// every signal carries. Extracted so each per-signal converter stays focused\n// on its signal-specific fields.\n//\n// `traceId` / `spanId` are intentionally excluded: spans treat them as\n// non-null required, while scores / feedback have a legacy `string`-not-\n// nullable type even though the column is actually nullable. Both cases need\n// per-signal handling.\n//\n// Spans use `source` in the record but `executionSource` in the row. The\n// write helper accepts either; the read helper returns `executionSource` and\n// callers that need `source` (i.e. spans) destructure-and-rename.\n// ---------------------------------------------------------------------------\n\nfunction rowToCommonContext(row: Record<string, any>) {\n  return {\n    experimentId: nullableString(row.experimentId),\n    entityType: nullableEntityType(row.entityType),\n    entityId: nullableString(row.entityId),\n    entityName: nullableString(row.entityName),\n    entityVersionId: nullableString(row.entityVersionId),\n    parentEntityType: nullableEntityType(row.parentEntityType),\n    parentEntityId: nullableString(row.parentEntityId),\n    parentEntityName: nullableString(row.parentEntityName),\n    parentEntityVersionId: nullableString(row.parentEntityVersionId),\n    rootEntityType: nullableEntityType(row.rootEntityType),\n    rootEntityId: nullableString(row.rootEntityId),\n    rootEntityName: nullableString(row.rootEntityName),\n    rootEntityVersionId: nullableString(row.rootEntityVersionId),\n    userId: nullableString(row.userId),\n    organizationId: nullableString(row.organizationId),\n    resourceId: nullableString(row.resourceId),\n    runId: nullableString(row.runId),\n    sessionId: nullableString(row.sessionId),\n    threadId: nullableString(row.threadId),\n    requestId: nullableString(row.requestId),\n    environment: nullableString(row.environment),\n    executionSource: nullableString(row.executionSource),\n    serviceName: nullableString(row.serviceName),\n  };\n}\n\ninterface CommonContextWritable {\n  experimentId?: string | null;\n  entityType?: EntityType | null;\n  entityId?: string | null;\n  entityName?: string | null;\n  entityVersionId?: string | null;\n  parentEntityType?: EntityType | null;\n  parentEntityId?: string | null;\n  parentEntityName?: string | null;\n  parentEntityVersionId?: string | null;\n  rootEntityType?: EntityType | null;\n  rootEntityId?: string | null;\n  rootEntityName?: string | null;\n  rootEntityVersionId?: string | null;\n  userId?: string | null;\n  organizationId?: string | null;\n  resourceId?: string | null;\n  runId?: string | null;\n  sessionId?: string | null;\n  threadId?: string | null;\n  requestId?: string | null;\n  environment?: string | null;\n  /** Preferred field; the legacy `source` is accepted as a fallback (used by spans). */\n  executionSource?: string | null;\n  source?: string | null;\n  serviceName?: string | null;\n}\n\nfunction commonContextToRow(record: CommonContextWritable): Record<string, unknown> {\n  return {\n    experimentId: record.experimentId ?? null,\n    entityType: record.entityType ?? null,\n    entityId: record.entityId ?? null,\n    entityName: record.entityName ?? null,\n    entityVersionId: record.entityVersionId ?? null,\n    parentEntityType: record.parentEntityType ?? null,\n    parentEntityId: record.parentEntityId ?? null,\n    parentEntityName: record.parentEntityName ?? null,\n    parentEntityVersionId: record.parentEntityVersionId ?? null,\n    rootEntityType: record.rootEntityType ?? null,\n    rootEntityId: record.rootEntityId ?? null,\n    rootEntityName: record.rootEntityName ?? null,\n    rootEntityVersionId: record.rootEntityVersionId ?? null,\n    userId: record.userId ?? null,\n    organizationId: record.organizationId ?? null,\n    resourceId: record.resourceId ?? null,\n    runId: record.runId ?? null,\n    sessionId: record.sessionId ?? null,\n    threadId: record.threadId ?? null,\n    requestId: record.requestId ?? null,\n    environment: record.environment ?? null,\n    executionSource: record.executionSource ?? record.source ?? null,\n    serviceName: record.serviceName ?? null,\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Span ↔ row\n// ---------------------------------------------------------------------------\n\nexport function spanRecordToRow(span: CreateSpanRecord): Record<string, unknown> {\n  // `endedAt` is both a primary key and a partition key column, so a span that\n  // has started but not ended still needs a value there. Synthesize it from\n  // `startedAt` and record the real state in `isPending`, which the read path\n  // maps back to a null `endedAt`.\n  const isPending = !span.isEvent && span.endedAt == null;\n  const endedAt = span.isEvent ? span.startedAt : (span.endedAt ?? span.startedAt);\n  const metadata = span.metadata ?? null;\n  return {\n    ...commonContextToRow(span),\n    traceId: span.traceId,\n    spanId: span.spanId,\n    parentSpanId: span.parentSpanId ?? null,\n    name: span.name,\n    spanType: span.spanType,\n    isEvent: Boolean(span.isEvent),\n    isPending,\n    startedAt: toIsoOrDate(span.startedAt),\n    endedAt: toIsoOrDate(endedAt),\n    tags: normalizeTags(span.tags),\n    metadataSearch: buildMetadataSearch(metadata as Record<string, unknown> | null),\n    metadataRaw: jsonField(metadata),\n    scope: jsonField(span.scope),\n    attributes: jsonField(span.attributes),\n    links: jsonField(span.links),\n    input: jsonField(span.input),\n    output: jsonField(span.output),\n    error: jsonField(span.error),\n    requestContext: jsonField(span.requestContext),\n  };\n}\n\n/**\n * Recover a span's real `endedAt` from its row. A pending row carries a\n * synthesized `endedAt` (a copy of `startedAt`) because the column is part of\n * the primary key; callers must see null so the span reads as still running.\n */\nfunction spanRowEndedAt(row: Record<string, any>, startedAt: Date): Date | null {\n  if (row.isEvent) return startedAt;\n  if (row.isPending) return null;\n  return toDateOrNull(row.endedAt);\n}\n\nexport function rowToSpanRecord(row: Record<string, any>): SpanRecord {\n  const startedAt = toDate(row.startedAt);\n  const endedAt = spanRowEndedAt(row, startedAt);\n  const error = parsedJson(row.error);\n  // Spans expose the row's `executionSource` column as `source` on the record.\n  const { executionSource, ...ctx } = rowToCommonContext(row);\n  return {\n    ...ctx,\n    source: executionSource,\n    traceId: row.traceId,\n    spanId: row.spanId,\n    parentSpanId: nullableString(row.parentSpanId),\n    name: row.name,\n    spanType: row.spanType,\n    isEvent: Boolean(row.isEvent),\n    startedAt,\n    endedAt,\n    tags: normalizeTags(row.tags),\n    metadata: (parsedJson(row.metadataRaw) as Record<string, unknown> | null) ?? undefined,\n    scope: (parsedJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n    attributes: (parsedJson(row.attributes) as Record<string, unknown> | null) ?? undefined,\n    links: (parsedJson(row.links) as Record<string, unknown>[] | null) ?? undefined,\n    input: parsedJson(row.input) ?? undefined,\n    output: parsedJson(row.output) ?? undefined,\n    error: error ?? undefined,\n    requestContext: (parsedJson(row.requestContext) as Record<string, unknown> | null) ?? undefined,\n    createdAt: startedAt,\n    updatedAt: null,\n  };\n}\n\n/**\n * Build a {@link LightSpanRecord} from a row that projected only the light\n * column set (see `SPAN_LIGHT_SELECT_COLUMNS` in sql.ts). Used by\n * `getTraceLight` — the timeline view doesn't need the full span payload.\n */\nexport function rowToLightSpanRecord(row: Record<string, any>): LightSpanRecord {\n  const startedAt = toDate(row.startedAt);\n  const endedAt = spanRowEndedAt(row, startedAt);\n  return {\n    traceId: row.traceId,\n    spanId: row.spanId,\n    parentSpanId: row.parentSpanId == null || row.parentSpanId === '' ? null : String(row.parentSpanId),\n    name: row.name,\n    spanType: row.spanType,\n    isEvent: Boolean(row.isEvent),\n    startedAt,\n    endedAt,\n    entityType:\n      row.entityType == null || row.entityType === ''\n        ? null\n        : Object.values(EntityType).includes(row.entityType as EntityType)\n          ? (row.entityType as EntityType)\n          : null,\n    entityId: row.entityId == null || row.entityId === '' ? null : String(row.entityId),\n    entityName: row.entityName == null || row.entityName === '' ? null : String(row.entityName),\n    error: (parsedJson(row.error) as Record<string, unknown> | null) ?? undefined,\n    createdAt: startedAt,\n    updatedAt: null,\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Log ↔ row\n// ---------------------------------------------------------------------------\n\nexport function logRecordToRow(log: CreateLogRecord): Record<string, unknown> {\n  return {\n    ...commonContextToRow(log),\n    logId: log.logId,\n    timestamp: toIsoOrDate(log.timestamp),\n    level: log.level,\n    message: log.message,\n    data: jsonField(log.data),\n    traceId: log.traceId ?? null,\n    spanId: log.spanId ?? null,\n    tags: normalizeTags(log.tags),\n    metadata: jsonField(log.metadata),\n    scope: jsonField(log.scope),\n  };\n}\n\nexport function rowToLogRecord(row: Record<string, any>): LogRecord {\n  return {\n    ...rowToCommonContext(row),\n    logId: row.logId,\n    timestamp: toDate(row.timestamp),\n    level: row.level,\n    message: row.message,\n    data: (parsedJson(row.data) as Record<string, unknown> | null) ?? undefined,\n    traceId: nullableString(row.traceId),\n    spanId: nullableString(row.spanId),\n    tags: normalizeTags(row.tags),\n    metadata: (parsedJson(row.metadata) as Record<string, unknown> | null) ?? undefined,\n    scope: (parsedJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Metric ↔ row\n// ---------------------------------------------------------------------------\n\nexport function metricRecordToRow(metric: CreateMetricRecord): Record<string, unknown> {\n  return {\n    ...commonContextToRow(metric),\n    metricId: metric.metricId,\n    timestamp: toIsoOrDate(metric.timestamp),\n    name: metric.name,\n    value: metric.value,\n    traceId: metric.traceId ?? null,\n    spanId: metric.spanId ?? null,\n    provider: metric.provider ?? null,\n    model: metric.model ?? null,\n    estimatedCost: metric.estimatedCost ?? null,\n    costUnit: metric.costUnit ?? null,\n    tags: normalizeTags(metric.tags),\n    labels: normalizeLabels(metric.labels),\n    costMetadata: jsonField(metric.costMetadata),\n    metadata: jsonField(metric.metadata),\n    scope: jsonField(metric.scope),\n  };\n}\n\nexport function rowToMetricRecord(row: Record<string, any>): MetricRecord {\n  return {\n    ...rowToCommonContext(row),\n    metricId: row.metricId,\n    timestamp: toDate(row.timestamp),\n    name: row.name,\n    value: Number(row.value),\n    traceId: nullableString(row.traceId),\n    spanId: nullableString(row.spanId),\n    provider: nullableString(row.provider),\n    model: nullableString(row.model),\n    estimatedCost: row.estimatedCost == null ? undefined : Number(row.estimatedCost),\n    costUnit: nullableString(row.costUnit),\n    costMetadata: (parsedJson(row.costMetadata) as Record<string, unknown> | null) ?? undefined,\n    tags: normalizeTags(row.tags),\n    labels: normalizeLabels(row.labels as Record<string, unknown> | null | undefined),\n    metadata: (parsedJson(row.metadata) as Record<string, unknown> | null) ?? undefined,\n    scope: (parsedJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Score ↔ row\n// ---------------------------------------------------------------------------\n\nexport function scoreRecordToRow(score: CreateScoreRecord): Record<string, unknown> {\n  const metadata = score.metadata ?? null;\n  const scoreSource = score.scoreSource ?? score.source ?? null;\n  return {\n    ...commonContextToRow(score),\n    scoreId: score.scoreId,\n    timestamp: toIsoOrDate(score.timestamp),\n    traceId: score.traceId ?? null,\n    spanId: score.spanId ?? null,\n    scoreTraceId: score.scoreTraceId ?? null,\n    scorerId: score.scorerId,\n    scorerVersion: score.scorerVersion ?? null,\n    scoreSource,\n    score: score.score,\n    reason: score.reason ?? null,\n    tags: normalizeTags(score.tags),\n    metadata: jsonField(metadata),\n    scope: jsonField(score.scope),\n  };\n}\n\nexport function rowToScoreRecord(row: Record<string, any>): ScoreRecord {\n  return {\n    ...rowToCommonContext(row),\n    scoreId: row.scoreId,\n    timestamp: toDate(row.timestamp),\n    // Legacy schema types traceId as required string even though the column is nullable.\n    traceId: nullableString(row.traceId) as ScoreRecord['traceId'],\n    spanId: nullableString(row.spanId),\n    scoreTraceId: nullableString(row.scoreTraceId),\n    scorerId: row.scorerId,\n    scorerVersion: nullableString(row.scorerVersion),\n    scoreSource: nullableString(row.scoreSource),\n    score: Number(row.score),\n    reason: nullableString(row.reason),\n    tags: normalizeTags(row.tags),\n    metadata: (parsedJson(row.metadata) as Record<string, unknown> | null) ?? undefined,\n    scope: (parsedJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Feedback ↔ row\n// ---------------------------------------------------------------------------\n\nexport function feedbackRecordToRow(feedback: CreateFeedbackRecord): Record<string, unknown> {\n  const metadata = feedback.metadata ?? null;\n  const feedbackSource = feedback.feedbackSource ?? feedback.source ?? '';\n  // userId (app user, via commonContextToRow) and feedbackUserId (evaluator)\n  // are distinct fields on FeedbackRecord. Legacy `FeedbackInput.userId` →\n  // `feedbackUserId` aliasing is handled by `normalizeLegacyFeedbackActor`\n  // at the schema layer, so the helper writes each through unchanged.\n  return {\n    ...commonContextToRow(feedback),\n    feedbackId: feedback.feedbackId,\n    timestamp: toIsoOrDate(feedback.timestamp),\n    traceId: feedback.traceId ?? null,\n    spanId: feedback.spanId ?? null,\n    feedbackUserId: feedback.feedbackUserId ?? null,\n    sourceId: feedback.sourceId ?? null,\n    reviewStatus: feedback.reviewStatus ?? 'needs-review',\n    feedbackSource,\n    feedbackType: feedback.feedbackType,\n    valueString: typeof feedback.value === 'string' ? feedback.value : null,\n    valueNumber: typeof feedback.value === 'number' ? feedback.value : null,\n    comment: feedback.comment ?? null,\n    tags: normalizeTags(feedback.tags),\n    metadata: jsonField(metadata),\n    scope: jsonField(feedback.scope),\n  };\n}\n\nexport function rowToFeedbackRecord(row: Record<string, any>): FeedbackRecord {\n  const hasNumber = row.valueNumber != null;\n  const feedbackSource = nullableString(row.feedbackSource);\n  return {\n    ...rowToCommonContext(row),\n    feedbackId: row.feedbackId,\n    timestamp: toDate(row.timestamp),\n    // Legacy schema types traceId as required string even though the column is nullable.\n    traceId: nullableString(row.traceId) as FeedbackRecord['traceId'],\n    spanId: nullableString(row.spanId),\n    feedbackUserId: nullableString(row.feedbackUserId),\n    sourceId: nullableString(row.sourceId),\n    reviewStatus: coerceFeedbackReviewStatus(row.reviewStatus),\n    feedbackSource,\n    feedbackType: row.feedbackType,\n    value: hasNumber ? Number(row.valueNumber) : (nullableString(row.valueString) ?? ''),\n    comment: nullableString(row.comment),\n    tags: normalizeTags(row.tags),\n    metadata: (parsedJson(row.metadata) as Record<string, unknown> | null) ?? undefined,\n    scope: (parsedJson(row.scope) as Record<string, unknown> | null) ?? undefined,\n  };\n}\n","/**\n * Delta-polling helpers for the v-next Postgres observability domain.\n *\n * Cursor model\n * ------------\n * Each signal table stores both:\n *   - `xactId xid8 DEFAULT pg_current_xact_id()`\n *   - `cursorId bigserial`\n *\n * `bigserial` values are allocated before commit, so a later `cursorId` can\n * become visible before an earlier one. Delta reads therefore order by the\n * pair `(xactId, cursorId)` and cap reads at PostgreSQL's safe transaction\n * horizon: `pg_snapshot_xmin(pg_current_snapshot())`. Rows with `xactId`\n * below that horizon cannot still be in flight, so advancing the cursor there\n * cannot skip a late-committing row.\n */\n\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { coreFeatures } from '@mastra/core/features';\nimport type { DbClient } from '../../../client';\n\nexport const OBSERVABILITY_DELTA_POLLING_FEATURE = 'observability-delta-polling';\n\nexport function deltaPollingFeatureEnabled(): boolean {\n  return coreFeatures.has(OBSERVABILITY_DELTA_POLLING_FEATURE);\n}\n\nexport function assertDeltaPollingEnabled(): void {\n  if (deltaPollingFeatureEnabled()) return;\n  throw new MastraError({\n    id: 'OBSERVABILITY_DELTA_POLLING_NOT_SUPPORTED',\n    domain: ErrorDomain.MASTRA_OBSERVABILITY,\n    category: ErrorCategory.SYSTEM,\n    text: 'This storage provider does not support observability delta polling',\n  });\n}\n\n/**\n * Postgres `bigint` upper bound (2^63 - 1). The cursor goes into a\n * `$N::bigint` cast server-side; values above this overflow and fail with\n * \"value out of range\" before the query even runs.\n */\nconst PG_BIGINT_MAX = 9223372036854775807n;\n\nexport interface DeltaCursorParts {\n  xactId: string;\n  cursorId: string;\n}\n\nfunction invalidDeltaCursor(): never {\n  throw new MastraError({\n    id: 'OBSERVABILITY_INVALID_DELTA_CURSOR',\n    domain: ErrorDomain.MASTRA_OBSERVABILITY,\n    category: ErrorCategory.USER,\n    text: 'Invalid observability delta cursor',\n  });\n}\n\nfunction validatePgInteger(value: string): string {\n  if (!/^\\d+$/.test(value)) {\n    invalidDeltaCursor();\n  }\n  let parsed: bigint;\n  try {\n    parsed = BigInt(value);\n  } catch {\n    invalidDeltaCursor();\n  }\n  if (parsed < 0n || parsed > PG_BIGINT_MAX) {\n    invalidDeltaCursor();\n  }\n  return value;\n}\n\nexport function encodeDeltaCursor(xactId: unknown, cursorId: unknown = 0): string {\n  return `${validatePgInteger(String(xactId ?? 0))}:${validatePgInteger(String(cursorId ?? 0))}`;\n}\n\nexport function decodeDeltaCursor(cursor: string): DeltaCursorParts {\n  const parts = cursor.split(':');\n  if (parts.length !== 2) {\n    invalidDeltaCursor();\n  }\n  return {\n    xactId: validatePgInteger(parts[0]!),\n    cursorId: validatePgInteger(parts[1]!),\n  };\n}\n\nexport async function readSafeXactHorizon(client: DbClient): Promise<string> {\n  const row = await client.one<{ xactId: string }>(`SELECT pg_snapshot_xmin(pg_current_snapshot())::text AS \"xactId\"`);\n  return validatePgInteger(row.xactId);\n}\n","import { parseSqlIdentifier } from '@mastra/core/utils';\n\nimport type { DbClient } from '../../../client';\nimport type { FilterAccumulator } from './filters';\nimport { newFilterAccumulator, whereOrEmpty } from './filters';\nimport { decodeDeltaCursor, encodeDeltaCursor, readSafeXactHorizon } from './polling';\n\ntype SortDirection = 'ASC' | 'DESC';\n\ntype SignalItems<Key extends string, Item> = Record<Key, Item[]>;\n\ninterface SignalListConfig<Filters, Row extends { cursorId?: unknown; xactId?: unknown }, Item, Key extends string> {\n  client: DbClient;\n  table: string;\n  filters: Filters;\n  selectColumns: string;\n  responseKey: Key;\n  applyFilters: (acc: FilterAccumulator, filters: Filters) => void;\n  mapRow: (row: Row) => Item;\n}\n\nfunction responseItems<Key extends string, Item>(key: Key, items: Item[]): SignalItems<Key, Item> {\n  return { [key]: items } as SignalItems<Key, Item>;\n}\n\nexport async function readSignalStreamHeadCursor<Filters>({\n  client,\n  table,\n  filters,\n  applyFilters,\n}: Pick<\n  SignalListConfig<Filters, { cursorId?: unknown; xactId?: unknown }, unknown, string>,\n  'client' | 'table' | 'filters' | 'applyFilters'\n>): Promise<string> {\n  void table;\n  void filters;\n  void applyFilters;\n  return encodeDeltaCursor(await readSafeXactHorizon(client), 0);\n}\n\nexport async function listSignalPage<\n  Filters,\n  Row extends { cursorId?: unknown; xactId?: unknown },\n  Item,\n  Key extends string,\n>(\n  config: SignalListConfig<Filters, Row, Item, Key> & {\n    page: number;\n    perPage: number;\n    orderField: string;\n    orderDir: SortDirection;\n    includeDeltaCursor: boolean;\n  },\n): Promise<\n  {\n    pagination: { total: number; page: number; perPage: number; hasMore: boolean };\n    deltaCursor?: string;\n  } & SignalItems<Key, Item>\n> {\n  const {\n    client,\n    table,\n    filters,\n    selectColumns,\n    responseKey,\n    applyFilters,\n    mapRow,\n    page,\n    perPage,\n    orderField,\n    orderDir,\n  } = config;\n\n  const acc = newFilterAccumulator();\n  applyFilters(acc, filters);\n  const whereClause = whereOrEmpty(acc);\n\n  const countRow = await client.oneOrNone<{ count: string }>(\n    `SELECT COUNT(*)::text AS count FROM ${table} ${whereClause}`,\n    acc.params,\n  );\n  const total = Number(countRow?.count ?? 0);\n\n  let items: Item[] = [];\n  if (total > 0) {\n    const safeOrderField = parseSqlIdentifier(orderField, 'order field');\n    const rows = await client.manyOrNone<Row>(\n      `SELECT ${selectColumns}\n       FROM ${table}\n       ${whereClause}\n       ORDER BY \"${safeOrderField}\" ${orderDir}, \"cursorId\" ${orderDir}\n       LIMIT $${acc.next++} OFFSET $${acc.next++}`,\n      [...acc.params, perPage, page * perPage],\n    );\n    items = rows.map(mapRow);\n  }\n\n  const deltaCursor = config.includeDeltaCursor\n    ? await readSignalStreamHeadCursor({ client, table, filters, applyFilters })\n    : undefined;\n\n  return {\n    pagination: { total, page, perPage, hasMore: (page + 1) * perPage < total },\n    ...responseItems(responseKey, items),\n    ...(deltaCursor !== undefined ? { deltaCursor } : {}),\n  };\n}\n\nexport async function listSignalDelta<\n  Filters,\n  Row extends { cursorId?: unknown; xactId?: unknown },\n  Item,\n  Key extends string,\n>(\n  config: SignalListConfig<Filters, Row, Item, Key> & {\n    after: string | undefined;\n    limit: number;\n  },\n): Promise<\n  {\n    delta: { limit: number; hasMore: boolean };\n    deltaCursor: string;\n  } & SignalItems<Key, Item>\n> {\n  const { client, table, filters, selectColumns, responseKey, applyFilters, mapRow, after, limit } = config;\n\n  if (after === undefined) {\n    const deltaCursor = await readSignalStreamHeadCursor({ client, table, filters, applyFilters });\n    return { ...responseItems(responseKey, []), delta: { limit, hasMore: false }, deltaCursor };\n  }\n\n  const afterCursor = decodeDeltaCursor(after);\n  const safeHorizon = await readSafeXactHorizon(client);\n  const acc = newFilterAccumulator();\n  applyFilters(acc, filters);\n  acc.conditions.push(`(\"xactId\", \"cursorId\") > ($${acc.next++}::xid8, $${acc.next++}::bigint)`);\n  acc.params.push(afterCursor.xactId, afterCursor.cursorId);\n  acc.conditions.push(`\"xactId\" < $${acc.next++}::xid8`);\n  acc.params.push(safeHorizon);\n\n  const rows = await client.manyOrNone<Row>(\n    `SELECT ${selectColumns}\n     FROM ${table}\n     ${whereOrEmpty(acc)}\n     ORDER BY \"xactId\" ASC, \"cursorId\" ASC\n     LIMIT $${acc.next++}`,\n    [...acc.params, limit + 1],\n  );\n\n  const hasMore = rows.length > limit;\n  const visible = rows.slice(0, limit);\n  const deltaCursor =\n    visible.length > 0\n      ? encodeDeltaCursor(visible[visible.length - 1]!.xactId, visible[visible.length - 1]!.cursorId)\n      : encodeDeltaCursor(safeHorizon, 0);\n\n  return {\n    ...responseItems(responseKey, visible.map(mapRow)),\n    delta: { limit, hasMore },\n    deltaCursor,\n  };\n}\n","/**\n * Shared OLAP helpers for the v-next Postgres observability domain.\n *\n * Translates ClickHouse-flavored OLAP idioms (the v-next spec) into Postgres:\n *\n *   - `toStartOfInterval(ts, INTERVAL '5 MINUTE')` becomes a portable\n *     epoch-floor expression (`to_timestamp(floor(extract(epoch from ts) / N) * N)`)\n *     so arbitrary 1m / 5m / 15m / 1h / 1d buckets work without TimescaleDB.\n *     On a hypertable Postgres still uses chunk pruning over this expression.\n *   - `quantile(p)(value)` becomes `percentile_cont($p) WITHIN GROUP (ORDER BY value)`.\n *   - `argMax(value, ts)` (\"last\") becomes `(array_agg(value ORDER BY ts DESC))[1]`.\n *   - `sumIf` / `countDistinctIf` use SQL-standard `FILTER (WHERE …)` aggregates.\n *\n * GroupBy resolution mirrors the ClickHouse v-next behavior: typed columns\n * are quoted directly; unknown keys are treated as label / metadata keys and\n * accessed with `jsonb ->>`.\n */\n\nimport { METRIC_DISTINCT_COLUMNS } from '@mastra/core/storage';\nimport type { AggregationInterval, AggregationType, MetricDistinctColumn } from '@mastra/core/storage';\nimport { parseFieldKey } from '@mastra/core/utils';\n\nimport type { FilterAccumulator } from './filters';\n\n/** Subset of the ComparePeriod enum we react to. */\nexport type ComparePeriod = 'previous_period' | 'previous_day' | 'previous_week';\n\n/** Time range slice we reuse from filter args. */\nexport interface PgDateRange {\n  start?: Date;\n  end?: Date;\n  startExclusive?: boolean;\n  endExclusive?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Bucket / aggregation SQL\n// ---------------------------------------------------------------------------\n\nconst INTERVAL_SECONDS: Record<AggregationInterval, number> = {\n  '1m': 60,\n  '5m': 300,\n  '15m': 900,\n  '1h': 3_600,\n  '1d': 86_400,\n};\n\n/**\n * Returns a bucket expression that floors `column` to the start of the\n * requested interval. The expression is portable across Postgres versions\n * and works equally on a Timescale hypertable.\n *\n * Buckets are UTC-aligned (floor of Unix epoch). A `1d` bucket spans\n * `00:00:00Z` → `23:59:59Z`, not local midnight. Charts that need\n * local-day buckets should set the desired offset on the time-range filter\n * rather than expect this helper to honor a session timezone.\n */\nexport function bucketSql(column: string, interval: AggregationInterval): string {\n  const seconds = INTERVAL_SECONDS[interval] ?? 3_600;\n  // to_timestamp + floor of unix-epoch is exact for all intervals up to 1 day.\n  // The result is a timestamptz at UTC, which we render via the standard\n  // pg driver (Date object) and pass straight back to clients.\n  return `to_timestamp(floor(extract(epoch from ${column}) / ${seconds}) * ${seconds})`;\n}\n\nfunction resolveDistinctColumnSql(distinctColumn: MetricDistinctColumn | undefined): string {\n  if (!distinctColumn) {\n    throw new Error(`count_distinct aggregation requires a 'distinctColumn' argument`);\n  }\n  // Defense-in-depth: the schema enum already restricts this, but the value\n  // flows into raw SQL so we re-check against the system-level allowlist.\n  if (!(METRIC_DISTINCT_COLUMNS as readonly string[]).includes(distinctColumn)) {\n    throw new Error(`Invalid distinctColumn: ${distinctColumn}`);\n  }\n  return `\"${parseFieldKey(distinctColumn)}\"`;\n}\n\n/** SQL aggregate for metric queries, including metric-specific distinct counts. */\nexport function metricAggregationSql(\n  agg: AggregationType,\n  measure: string,\n  timestampColumn = 'timestamp',\n  distinctColumn?: MetricDistinctColumn,\n): string {\n  if (agg === 'count_distinct') {\n    return `COUNT(DISTINCT ${resolveDistinctColumnSql(distinctColumn)})::double precision`;\n  }\n  return aggregationSql(agg, measure, timestampColumn);\n}\n\n/** SQL aggregate for the standard agg types over a numeric column. */\nexport function aggregationSql(agg: AggregationType, measure: string, timestampColumn = 'timestamp'): string {\n  switch (agg) {\n    case 'sum':\n      return `SUM(${measure})`;\n    case 'avg':\n      return `AVG(${measure})`;\n    case 'min':\n      return `MIN(${measure})`;\n    case 'max':\n      return `MAX(${measure})`;\n    case 'count':\n      return `COUNT(${measure})::double precision`;\n    case 'last':\n      // Postgres has no `argMax`. Pull the latest non-null value via array_agg.\n      return `(array_agg(${measure} ORDER BY \"${timestampColumn}\" DESC))[1]`;\n    default:\n      return `SUM(${measure})`;\n  }\n}\n\n// ---------------------------------------------------------------------------\n// GroupBy resolution\n// ---------------------------------------------------------------------------\n\nexport interface ResolvedGroupBy {\n  /** The key the caller asked for. Echoed back in dimensions. */\n  requestedKey: string;\n  /** SQL alias used for the column in SELECT / GROUP BY. */\n  alias: string;\n  /** The select expression (e.g. `\"labels\" ->> $1 AS group_by_0`). */\n  selectSql: string;\n  /** The bare SQL value expression (used in WHERE for label-exclusion). */\n  valueSql: string;\n}\n\n/**\n * Resolves a list of groupBy keys against the set of typed columns for a\n * signal table. Unknown keys are treated as JSONB lookups against\n * `labelsColumn` (default `\"labels\"`) — used by metrics breakdowns.\n *\n * Throws when a key is structurally invalid (not SQL-safe) or matches an\n * excluded column type (jsonb / text[]).\n */\nexport function resolveGroupBy(\n  acc: FilterAccumulator,\n  groupBy: string[],\n  options: {\n    typedColumns: Set<string>;\n    excludedColumns?: Set<string>;\n    labelsColumn?: string;\n  },\n): ResolvedGroupBy[] {\n  const labelsColumn = options.labelsColumn ?? null;\n  const excluded = options.excludedColumns ?? new Set<string>();\n\n  return groupBy.map((key, index) => {\n    const alias = `group_by_${index}`;\n    if (options.typedColumns.has(key)) {\n      const parsed = parseFieldKey(key);\n      if (excluded.has(parsed)) {\n        throw new Error(`Invalid groupBy column(s): ${key}`);\n      }\n      return {\n        requestedKey: key,\n        alias,\n        selectSql: `\"${parsed}\" AS ${alias}`,\n        valueSql: `\"${parsed}\"`,\n      };\n    }\n    if (!labelsColumn) {\n      throw new Error(`Invalid groupBy column(s): ${key}`);\n    }\n    // Treat as a label / metadata key. Bind the key as a parameter; the\n    // returned value is text, which we coerce to nullable string in JS.\n    const valueSql = `\"${labelsColumn}\" ->> $${acc.next++}`;\n    acc.params.push(key);\n    return {\n      requestedKey: key,\n      alias,\n      selectSql: `${valueSql} AS ${alias}`,\n      valueSql,\n    };\n  });\n}\n\n/** Adds WHERE clauses that exclude rows missing a requested label key. */\nexport function pushLabelExclusions(acc: FilterAccumulator, resolved: ResolvedGroupBy[]): void {\n  for (const entry of resolved) {\n    if (entry.valueSql.includes('->>')) {\n      acc.conditions.push(`${entry.valueSql} IS NOT NULL`);\n      acc.conditions.push(`${entry.valueSql} <> ''`);\n    }\n  }\n}\n\nexport function dimensionsFromRow(\n  row: Record<string, unknown>,\n  resolved: ResolvedGroupBy[],\n): Record<string, string | null> {\n  const out: Record<string, string | null> = {};\n  for (const entry of resolved) {\n    const v = row[entry.alias];\n    out[entry.requestedKey] = v == null || v === '' ? null : String(v);\n  }\n  return out;\n}\n\nexport function seriesNameFromDimensions(values: unknown[]): string {\n  return values.map(v => (v == null || v === '' ? '' : String(v))).join('|');\n}\n\n// ---------------------------------------------------------------------------\n// Period-over-period helpers\n// ---------------------------------------------------------------------------\n\n/** Compute the previous-period date range based on the comparePeriod selection. */\nexport function shiftRange(range: PgDateRange, period: ComparePeriod): PgDateRange | null {\n  if (!range.start || !range.end) return null;\n  const start = range.start.getTime();\n  const end = range.end.getTime();\n  const duration = end - start;\n\n  let offset: number;\n  switch (period) {\n    case 'previous_day':\n      offset = 86_400_000;\n      break;\n    case 'previous_week':\n      offset = 7 * 86_400_000;\n      break;\n    case 'previous_period':\n    default:\n      offset = duration;\n  }\n  return {\n    start: new Date(start - offset),\n    end: new Date(end - offset),\n    startExclusive: range.startExclusive,\n    endExclusive: range.endExclusive,\n  };\n}\n\nexport function changePercent(current: number | null, previous: number | null): number | null {\n  if (current === null || previous === null || previous === 0) return null;\n  return ((current - previous) / Math.abs(previous)) * 100;\n}\n\nexport function bucketDate(value: unknown): Date {\n  return value instanceof Date ? value : new Date(String(value));\n}\n\nexport function validatePercentiles(percentiles: readonly number[]): void {\n  if (!percentiles.length) {\n    throw new Error('Percentiles must include at least one value between 0 and 1.');\n  }\n  for (const percentile of percentiles) {\n    if (!Number.isFinite(percentile) || percentile < 0 || percentile > 1) {\n      throw new Error(`Percentile value must be a finite number between 0 and 1, got ${percentile}`);\n    }\n  }\n}\n\nexport function percentileSelectSql(percentiles: readonly number[], measureSql: string): string {\n  return percentiles\n    .map((percentile, index) => `percentile_cont(${percentile}) WITHIN GROUP (ORDER BY ${measureSql}) AS p${index}`)\n    .join(', ');\n}\n\nexport function percentileSeriesFromRows(\n  rows: Record<string, unknown>[],\n  percentiles: readonly number[],\n): { percentile: number; points: { timestamp: Date; value: number }[] }[] {\n  return percentiles.map((percentile, index) => ({\n    percentile,\n    points: rows.map(row => ({\n      timestamp: bucketDate(row.bucket),\n      value: Number(row[`p${index}`] ?? 0),\n    })),\n  }));\n}\n\nexport function collectSeriesByDimensions<Row extends Record<string, unknown>, Entry>(\n  rows: Row[],\n  resolved: ResolvedGroupBy[],\n  createEntry: (dimensionValues: unknown[]) => Entry,\n  appendRow: (entry: Entry, row: Row, dimensionValues: unknown[]) => void,\n): Entry[] {\n  const seriesMap = new Map<string, Entry>();\n\n  for (const row of rows) {\n    const dimensionValues = resolved.map(entry => row[entry.alias]);\n    const seriesKey = JSON.stringify(dimensionValues);\n    let entry = seriesMap.get(seriesKey);\n    if (!entry) {\n      entry = createEntry(dimensionValues);\n      seriesMap.set(seriesKey, entry);\n    }\n    appendRow(entry, row, dimensionValues);\n  }\n\n  return Array.from(seriesMap.values());\n}\n\n// ---------------------------------------------------------------------------\n// Cost summary aggregates (used in metric OLAP responses)\n// ---------------------------------------------------------------------------\n\nexport interface CostSummary {\n  estimatedCost: number | null;\n  costUnit: string | null;\n}\n\n/** SQL for the (estimatedCost, costUnit) pair embedded in metric OLAP responses. */\nexport const COST_SUMMARY_SELECT = `\n  SUM(\"estimatedCost\") FILTER (WHERE \"estimatedCost\" IS NOT NULL) AS \"agg_estimatedCost\",\n  CASE\n    WHEN COUNT(DISTINCT \"costUnit\") FILTER (WHERE \"costUnit\" IS NOT NULL) = 1\n      THEN MIN(\"costUnit\") FILTER (WHERE \"costUnit\" IS NOT NULL)\n    ELSE NULL\n  END AS \"agg_costUnit\"\n`;\n\nexport function costSummaryFromRow(row: Record<string, unknown>): CostSummary {\n  return {\n    estimatedCost: row.agg_estimatedCost == null ? null : Number(row.agg_estimatedCost),\n    costUnit: row.agg_costUnit == null || row.agg_costUnit === '' ? null : String(row.agg_costUnit),\n  };\n}\n\nexport const COMPLEX_GROUP_BY_EXCLUDED = new Set([\n  'metadata',\n  'metadataRaw',\n  'metadataSearch',\n  'scope',\n  'attributes',\n  'links',\n  'input',\n  'output',\n  'error',\n  'data',\n  'labels',\n  'costMetadata',\n  'tags',\n  'requestContext',\n]);\n","/**\n * Sanitizes JSON string for PostgreSQL jsonb:\n * - Removes problematic Unicode sequences:\n *   - \\u0000 (null character) - causes error 22P05 \"unsupported Unicode escape sequence\"\n *   - \\uD800-\\uDFFF (unpaired surrogates) - causes \"Unicode low surrogate must follow a high surrogate\"\n *   - \\\\uD800 (escaped-backslash + surrogate, e.g. from JS regex literals like [^\\ud800-\\udfff]):\n *     removing just \\uXXXX would leave a dangling backslash that creates a new invalid escape (e.g. \\-)\n * - Escapes any remaining invalid JSON escape sequences (e.g. \\v, \\k, \\-)\n */\nexport function sanitizeJsonForPg(jsonString: string): string {\n  return (\n    jsonString\n      // Remove null char and surrogate escape sequences. The optional extra backslash (\\\\\\\\?)\n      // also handles the escaped-backslash variant (\\\\uXXXX), which would otherwise leave a\n      // dangling backslash and produce a new invalid escape sequence after removal.\n      .replace(/\\\\\\\\?u(0000|[Dd][89A-Fa-f][0-9A-Fa-f]{2})/g, '')\n      // Fix any remaining invalid JSON escape sequences safely without rewriting\n      // already-escaped backslashes. Running this AFTER surrogate removal ensures that\n      // characters newly exposed by the removal (e.g. a hyphen left after \\\\ud800-\\\\udfff)\n      // are also caught and escaped.\n      .replace(/(^|[^\\\\])(\\\\(?![\"\\\\/bfnrtu]))/g, '$1\\\\\\\\')\n  );\n}\n","/**\n * SQL helpers for the v-next Postgres observability domain.\n *\n * Provides a multi-row INSERT builder with a configurable conflict clause\n * (`ON CONFLICT DO NOTHING` by default, for retry idempotency), and explicit\n * jsonb / text[] casts so the pg driver doesn't have to guess column types.\n */\n\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { sanitizeJsonForPg } from '../../../db/sanitize-json';\nimport { qualifiedTable, TABLE_SPAN_EVENTS } from './ddl';\nimport {\n  buildNamedSelectColumns,\n  buildSelectColumns,\n  FEEDBACK_EVENT_COLUMNS,\n  JSONB_COLUMNS,\n  LOG_EVENT_COLUMNS,\n  METRIC_EVENT_COLUMNS,\n  SCORE_EVENT_COLUMNS,\n  SPAN_EVENT_COLUMNS,\n  SPAN_LIGHT_SELECT_COLUMN_NAMES,\n  TEXT_ARRAY_COLUMNS,\n} from './signal-schema';\n\n/**\n * Encode a JS value for a `$N::jsonb` cast. Always `JSON.stringify` so a\n * plain string like `\"hello\"` becomes `\"hello\"` (a valid JSON scalar) and\n * not the bare word `hello`, which Postgres rejects when cast to jsonb.\n *\n * The result is sanitized because Postgres rejects some sequences that are\n * legal in JSON: NUL (`\\u0000`) fails with 22P05 and unpaired UTF-16\n * surrogates fail with 22P02. Inserts here are batched into a single\n * multi-row statement, so one bad value would otherwise reject the whole\n * batch of observability events.\n */\nfunction encodeJsonb(value: unknown): string | null {\n  if (value === null || value === undefined) return null;\n  return sanitizeJsonForPg(JSON.stringify(value));\n}\n\n/**\n * Build a multi-row INSERT with explicit column types and ON CONFLICT DO NOTHING.\n *\n * @param schema     Schema name.\n * @param table      Table name.\n * @param records    Array of records (each is a column-name → value object).\n *                   All records must have identical key sets.\n * @returns          { text, values } ready to pass to `client.query`.\n */\nexport function buildInsert(\n  schema: string,\n  table: string,\n  records: Record<string, unknown>[],\n  onConflict = 'ON CONFLICT DO NOTHING',\n): { text: string; values: unknown[] } | null {\n  if (records.length === 0) return null;\n  const columns = Object.keys(records[0]!).map(c => parseSqlIdentifier(c, 'column name'));\n  const quotedColumns = columns.map(c => `\"${c}\"`).join(', ');\n\n  const values: unknown[] = [];\n  const rowPlaceholders: string[] = [];\n  let p = 1;\n\n  for (const record of records) {\n    const placeholders = columns.map(col => {\n      const raw = (record as Record<string, unknown>)[col];\n      if (JSONB_COLUMNS.has(col)) {\n        values.push(encodeJsonb(raw));\n        return `$${p++}::jsonb`;\n      }\n      if (TEXT_ARRAY_COLUMNS.has(col)) {\n        values.push(Array.isArray(raw) ? raw : []);\n        return `$${p++}::text[]`;\n      }\n      values.push(raw === undefined ? null : raw);\n      return `$${p++}`;\n    });\n    rowPlaceholders.push(`(${placeholders.join(', ')})`);\n  }\n\n  const text = `INSERT INTO ${qualifiedTable(schema, table)} (${quotedColumns})\nVALUES ${rowPlaceholders.join(', ')}\n${onConflict}`;\n\n  return { text, values };\n}\n\n/** Primary key of the span table; also the conflict target for span upserts. */\nconst SPAN_KEY_COLUMNS = ['traceId', 'spanId', 'endedAt'];\n\n/**\n * Conflict clause for span writes.\n *\n * A span is written twice under the event-sourced strategy: once when it starts\n * (`isPending = true`, `endedAt` synthesized from `startedAt`) and once when it\n * ends. Those two rows normally differ in `endedAt` and so coexist under the\n * primary key. A zero-duration span is the exception — its real `endedAt`\n * equals its `startedAt`, so the end row collides with the pending row. Letting\n * `DO NOTHING` win there would strand the span as permanently running, so the\n * end row overwrites the pending one instead.\n *\n * The `WHERE` guard keeps the clause a no-op for every other conflict, which\n * preserves insert-only retry idempotency: a replayed end row cannot clobber\n * the row it duplicates, and a late-arriving start row cannot revert an ended\n * span to pending.\n */\nexport function spanConflictClause(columns: readonly string[]): string {\n  const assignments = columns\n    .filter(column => !SPAN_KEY_COLUMNS.includes(column))\n    .map(column => `\"${column}\" = EXCLUDED.\"${column}\"`)\n    .join(', ');\n  return `ON CONFLICT (\"traceId\", \"spanId\", \"endedAt\") DO UPDATE SET ${assignments}\nWHERE ${TABLE_SPAN_EVENTS}.\"isPending\" AND NOT EXCLUDED.\"isPending\"`;\n}\n\n/**\n * Ordering that picks the winning row for a span under the event-sourced write\n * model. An ended row always beats a pending row for the same span; among rows\n * of the same kind the latest write wins, with `cursorId` breaking ties between\n * rows that share a timestamp. Combine with `DISTINCT ON` (or `LIMIT 1`) after\n * the grouping key to collapse a span's rows down to one.\n */\nexport const SPAN_COLLAPSE_ORDER = '\"isPending\" ASC, \"endedAt\" DESC, \"cursorId\" DESC';\n\n/**\n * Standard SELECT column list for tracing tables. The select projects every\n * column the row→record converters expect.\n */\nexport const SPAN_SELECT_COLUMNS = `\n${buildSelectColumns(SPAN_EVENT_COLUMNS)}`;\n\nexport const SPAN_LIGHT_SELECT_COLUMNS = `\n${buildNamedSelectColumns(SPAN_LIGHT_SELECT_COLUMN_NAMES)}`;\n\nexport const METRIC_SELECT_COLUMNS = `\n${buildSelectColumns(METRIC_EVENT_COLUMNS)}`;\n\nexport const LOG_SELECT_COLUMNS = `\n${buildSelectColumns(LOG_EVENT_COLUMNS)}`;\n\nexport const SCORE_SELECT_COLUMNS = `\n${buildSelectColumns(SCORE_EVENT_COLUMNS)}`;\n\nexport const FEEDBACK_SELECT_COLUMNS = `\n${buildSelectColumns(FEEDBACK_EVENT_COLUMNS)}`;\n","/**\n * Feedback operations for the v-next Postgres observability domain.\n *\n * Implements the full ObservabilityStorage feedback surface — write, list,\n * aggregate, breakdown, time series, and percentiles. OLAP aggregates run\n * over `valueNumber` only; string-valued feedback is excluded.\n */\n\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { listFeedbackArgsSchema } from '@mastra/core/storage';\nimport type {\n  BatchCreateFeedbackArgs,\n  CreateFeedbackArgs,\n  DeleteFeedbackArgs,\n  FeedbackRecord,\n  GetFeedbackAggregateArgs,\n  GetFeedbackAggregateResponse,\n  GetFeedbackBreakdownArgs,\n  GetFeedbackBreakdownResponse,\n  GetFeedbackPercentilesArgs,\n  GetFeedbackPercentilesResponse,\n  GetFeedbackTimeSeriesArgs,\n  GetFeedbackTimeSeriesResponse,\n  ListFeedbackArgs,\n  ListFeedbackResponse,\n  UpdateFeedbackReviewStatusArgs,\n} from '@mastra/core/storage';\n\nimport type { DbClient } from '../../../client';\nimport { qualifiedTable, TABLE_FEEDBACK_EVENTS } from './ddl';\nimport { applyCommonFilters, applySingleOrArrayFilter, newFilterAccumulator, whereOrEmpty } from './filters';\nimport { feedbackRecordToRow, rowToFeedbackRecord } from './helpers';\nimport { listSignalDelta, listSignalPage } from './listing';\nimport {\n  aggregationSql,\n  bucketDate,\n  bucketSql,\n  changePercent,\n  collectSeriesByDimensions,\n  COMPLEX_GROUP_BY_EXCLUDED,\n  dimensionsFromRow,\n  percentileSelectSql,\n  percentileSeriesFromRows,\n  resolveGroupBy,\n  seriesNameFromDimensions,\n  shiftRange,\n  validatePercentiles,\n} from './olap';\nimport { assertDeltaPollingEnabled, deltaPollingFeatureEnabled } from './polling';\nimport { parseUpdateFeedbackReviewStatusArgs } from './review-status';\nimport { FEEDBACK_EVENT_COLUMNS, FEEDBACK_TYPED_COLUMNS } from './signal-schema';\nimport { buildInsert, FEEDBACK_SELECT_COLUMNS } from './sql';\n\nconst FEEDBACK_CONFLICT_KEYS = new Set(['feedbackId', 'timestamp']);\nconst FEEDBACK_UPSERT_CLAUSE = `ON CONFLICT (\"feedbackId\", \"timestamp\") DO UPDATE SET ${FEEDBACK_EVENT_COLUMNS.map(\n  column => column.name,\n)\n  .filter(column => !FEEDBACK_CONFLICT_KEYS.has(column))\n  .map(column => `\"${column}\" = EXCLUDED.\"${column}\"`)\n  .join(', ')}`;\n\n// ---------------------------------------------------------------------------\n// Filter helpers specific to the feedback signal\n// ---------------------------------------------------------------------------\n\nfunction applyFeedbackFilters(\n  acc: ReturnType<typeof newFilterAccumulator>,\n  filters: Record<string, any> | undefined,\n): void {\n  applyCommonFilters(acc, filters);\n  applySingleOrArrayFilter(acc, 'feedbackType', filters?.feedbackType);\n  if (filters?.feedbackSource ?? filters?.source) {\n    acc.conditions.push(`\"feedbackSource\" = $${acc.next++}`);\n    acc.params.push(filters.feedbackSource ?? filters.source);\n  }\n  if (filters?.feedbackUserId) {\n    acc.conditions.push(`\"feedbackUserId\" = $${acc.next++}`);\n    acc.params.push(filters.feedbackUserId);\n  }\n  if (filters?.reviewStatus) {\n    acc.conditions.push(`\"reviewStatus\" = $${acc.next++}`);\n    acc.params.push(filters.reviewStatus);\n  }\n}\n\n/**\n * OLAP queries take an explicit feedbackType / feedbackSource pair as\n * identity. OLAP aggregates also restrict to rows that have a numeric value.\n */\nfunction pushFeedbackIdentity(\n  acc: ReturnType<typeof newFilterAccumulator>,\n  feedbackType: string,\n  feedbackSource: string | undefined,\n): void {\n  acc.conditions.push(`\"feedbackType\" = $${acc.next++}`);\n  acc.params.push(feedbackType);\n  if (feedbackSource !== undefined) {\n    acc.conditions.push(`\"feedbackSource\" = $${acc.next++}`);\n    acc.params.push(feedbackSource);\n  }\n  acc.conditions.push(`\"valueNumber\" IS NOT NULL`);\n}\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nexport async function createFeedback(client: DbClient, schema: string, args: CreateFeedbackArgs): Promise<void> {\n  const row = feedbackRecordToRow(args.feedback);\n  const insert = buildInsert(schema, TABLE_FEEDBACK_EVENTS, [row], FEEDBACK_UPSERT_CLAUSE);\n  if (insert) await client.query(insert.text, insert.values);\n}\n\nexport async function batchCreateFeedback(\n  client: DbClient,\n  schema: string,\n  args: BatchCreateFeedbackArgs,\n): Promise<void> {\n  if (args.feedbacks.length === 0) return;\n  const currentFeedback = new Map(args.feedbacks.map(feedback => [feedback.feedbackId, feedback]));\n  const rows = [...currentFeedback.values()].map(feedbackRecordToRow);\n  const insert = buildInsert(schema, TABLE_FEEDBACK_EVENTS, rows, FEEDBACK_UPSERT_CLAUSE);\n  if (insert) await client.query(insert.text, insert.values);\n}\n\nexport async function updateFeedbackReviewStatus(\n  client: DbClient,\n  schema: string,\n  args: UpdateFeedbackReviewStatusArgs,\n): Promise<FeedbackRecord> {\n  const { feedbackId, reviewStatus } = parseUpdateFeedbackReviewStatusArgs(args);\n  const row = await client.oneOrNone<Record<string, any>>(\n    `UPDATE ${qualifiedTable(schema, TABLE_FEEDBACK_EVENTS)}\n     SET \"reviewStatus\" = $2\n     WHERE \"feedbackId\" = $1\n     RETURNING ${FEEDBACK_SELECT_COLUMNS}`,\n    [feedbackId, reviewStatus],\n  );\n  if (!row) {\n    throw new MastraError({\n      id: 'OBSERVABILITY_UPDATE_FEEDBACK_REVIEW_STATUS_NOT_FOUND',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.USER,\n      text: 'Feedback record not found',\n      details: { feedbackId },\n    });\n  }\n  return rowToFeedbackRecord(row);\n}\n\n// ---------------------------------------------------------------------------\n// Deletes\n// ---------------------------------------------------------------------------\n\n/**\n * Delete feedback events by feedbackId. Optional `organizationId` and\n * `resourceId` values are ANDed into the predicate to restrict deletion to\n * records with matching scope fields.\n */\nexport async function deleteFeedback(client: DbClient, schema: string, args: DeleteFeedbackArgs): Promise<void> {\n  if (args.feedbackIds.length === 0) return;\n  const table = qualifiedTable(schema, TABLE_FEEDBACK_EVENTS);\n  const values: unknown[] = [...args.feedbackIds];\n  const placeholders = args.feedbackIds.map((_, i) => `$${i + 1}`).join(', ');\n  const conditions = [`\"feedbackId\" IN (${placeholders})`];\n  if (args.organizationId !== undefined) {\n    values.push(args.organizationId);\n    conditions.push(`\"organizationId\" = $${values.length}`);\n  }\n  if (args.resourceId !== undefined) {\n    values.push(args.resourceId);\n    conditions.push(`\"resourceId\" = $${values.length}`);\n  }\n  await client.query(`DELETE FROM ${table} WHERE ${conditions.join(' AND ')}`, values);\n}\n\n// ---------------------------------------------------------------------------\n// List\n// ---------------------------------------------------------------------------\n\nexport async function listFeedback(\n  client: DbClient,\n  schema: string,\n  args: ListFeedbackArgs,\n): Promise<ListFeedbackResponse> {\n  const { mode, filters, pagination, orderBy, after, limit } = listFeedbackArgsSchema.parse(args);\n  const table = qualifiedTable(schema, TABLE_FEEDBACK_EVENTS);\n\n  if (mode === 'delta') {\n    assertDeltaPollingEnabled();\n    return listFeedbackDelta(client, table, filters, after, limit);\n  }\n\n  return listFeedbackPage(\n    client,\n    table,\n    filters,\n    pagination.page,\n    pagination.perPage,\n    orderBy.field,\n    orderBy.direction,\n  );\n}\n\nasync function listFeedbackPage(\n  client: DbClient,\n  table: string,\n  filters: ListFeedbackArgs['filters'],\n  page: number,\n  perPage: number,\n  orderField: 'timestamp',\n  orderDir: 'ASC' | 'DESC',\n): Promise<ListFeedbackResponse> {\n  return listSignalPage({\n    client,\n    table,\n    filters: filters as Record<string, any> | undefined,\n    page,\n    perPage,\n    orderField,\n    orderDir,\n    includeDeltaCursor: deltaPollingFeatureEnabled(),\n    selectColumns: FEEDBACK_SELECT_COLUMNS,\n    responseKey: 'feedback',\n    applyFilters: applyFeedbackFilters,\n    mapRow: rowToFeedbackRecord,\n  });\n}\n\nasync function listFeedbackDelta(\n  client: DbClient,\n  table: string,\n  filters: ListFeedbackArgs['filters'],\n  after: string | undefined,\n  limit: number,\n): Promise<ListFeedbackResponse> {\n  return listSignalDelta({\n    client,\n    table,\n    filters: filters as Record<string, any> | undefined,\n    after,\n    limit,\n    selectColumns: FEEDBACK_SELECT_COLUMNS,\n    responseKey: 'feedback',\n    applyFilters: applyFeedbackFilters,\n    mapRow: rowToFeedbackRecord,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// OLAP — aggregate\n// ---------------------------------------------------------------------------\n\nasync function runFeedbackAggregateQuery(\n  client: DbClient,\n  schema: string,\n  args: Pick<GetFeedbackAggregateArgs, 'feedbackType' | 'feedbackSource' | 'aggregation'>,\n  filters: Record<string, any> | undefined,\n): Promise<number | null> {\n  const acc = newFilterAccumulator();\n  pushFeedbackIdentity(acc, args.feedbackType, args.feedbackSource);\n  applyFeedbackFilters(acc, filters);\n\n  const sql = `\n    SELECT ${aggregationSql(args.aggregation, '\"valueNumber\"')} AS \"value\"\n    FROM ${qualifiedTable(schema, TABLE_FEEDBACK_EVENTS)}\n    ${whereOrEmpty(acc)}\n  `;\n  const row = await client.oneOrNone<{ value: unknown }>(sql, acc.params);\n  return row?.value == null ? null : Number(row.value);\n}\n\nexport async function getFeedbackAggregate(\n  client: DbClient,\n  schema: string,\n  args: GetFeedbackAggregateArgs,\n): Promise<GetFeedbackAggregateResponse> {\n  const value = await runFeedbackAggregateQuery(client, schema, args, args.filters);\n\n  if (args.comparePeriod && args.filters?.timestamp) {\n    const prevRange = shiftRange(args.filters.timestamp, args.comparePeriod);\n    if (prevRange) {\n      const previousValue = await runFeedbackAggregateQuery(client, schema, args, {\n        ...(args.filters ?? {}),\n        timestamp: prevRange,\n      });\n      return {\n        value,\n        previousValue,\n        changePercent: changePercent(value, previousValue),\n      };\n    }\n  }\n  return { value };\n}\n\n// ---------------------------------------------------------------------------\n// OLAP — breakdown\n// ---------------------------------------------------------------------------\n\nexport async function getFeedbackBreakdown(\n  client: DbClient,\n  schema: string,\n  args: GetFeedbackBreakdownArgs,\n): Promise<GetFeedbackBreakdownResponse> {\n  const acc = newFilterAccumulator();\n  const resolved = resolveGroupBy(acc, args.groupBy, {\n    typedColumns: FEEDBACK_TYPED_COLUMNS,\n    excludedColumns: COMPLEX_GROUP_BY_EXCLUDED,\n  });\n  pushFeedbackIdentity(acc, args.feedbackType, args.feedbackSource);\n  applyFeedbackFilters(acc, args.filters);\n\n  const sql = `\n    SELECT ${resolved.map(e => e.selectSql).join(', ')},\n           ${aggregationSql(args.aggregation, '\"valueNumber\"')} AS \"value\"\n    FROM ${qualifiedTable(schema, TABLE_FEEDBACK_EVENTS)}\n    ${whereOrEmpty(acc)}\n    GROUP BY ${resolved.map(e => e.alias).join(', ')}\n    ORDER BY \"value\" DESC NULLS LAST\n  `;\n  const rows = await client.manyOrNone<Record<string, unknown>>(sql, acc.params);\n\n  return {\n    groups: rows.map(row => ({\n      dimensions: dimensionsFromRow(row, resolved),\n      value: Number(row.value ?? 0),\n    })),\n  };\n}\n\n// ---------------------------------------------------------------------------\n// OLAP — time series\n// ---------------------------------------------------------------------------\n\nexport async function getFeedbackTimeSeries(\n  client: DbClient,\n  schema: string,\n  args: GetFeedbackTimeSeriesArgs,\n): Promise<GetFeedbackTimeSeriesResponse> {\n  const bucket = bucketSql('\"timestamp\"', args.interval);\n\n  if (args.groupBy && args.groupBy.length > 0) {\n    const acc = newFilterAccumulator();\n    const resolved = resolveGroupBy(acc, args.groupBy, {\n      typedColumns: FEEDBACK_TYPED_COLUMNS,\n      excludedColumns: COMPLEX_GROUP_BY_EXCLUDED,\n    });\n    pushFeedbackIdentity(acc, args.feedbackType, args.feedbackSource);\n    applyFeedbackFilters(acc, args.filters);\n\n    const sql = `\n      SELECT ${bucket} AS bucket,\n             ${resolved.map(e => e.selectSql).join(', ')},\n             ${aggregationSql(args.aggregation, '\"valueNumber\"')} AS \"value\"\n      FROM ${qualifiedTable(schema, TABLE_FEEDBACK_EVENTS)}\n      ${whereOrEmpty(acc)}\n      GROUP BY bucket, ${resolved.map(e => e.alias).join(', ')}\n      ORDER BY bucket\n    `;\n    const rows = await client.manyOrNone<Record<string, unknown>>(sql, acc.params);\n\n    return {\n      series: collectSeriesByDimensions(\n        rows,\n        resolved,\n        dimValues => ({\n          name: seriesNameFromDimensions(dimValues),\n          points: [] as { timestamp: Date; value: number }[],\n        }),\n        (entry, row) => {\n          entry.points.push({\n            timestamp: bucketDate(row.bucket),\n            value: Number(row.value ?? 0),\n          });\n        },\n      ),\n    };\n  }\n\n  const acc = newFilterAccumulator();\n  pushFeedbackIdentity(acc, args.feedbackType, args.feedbackSource);\n  applyFeedbackFilters(acc, args.filters);\n\n  const sql = `\n    SELECT ${bucket} AS bucket,\n           ${aggregationSql(args.aggregation, '\"valueNumber\"')} AS \"value\"\n    FROM ${qualifiedTable(schema, TABLE_FEEDBACK_EVENTS)}\n    ${whereOrEmpty(acc)}\n    GROUP BY bucket\n    ORDER BY bucket\n  `;\n  const rows = await client.manyOrNone<Record<string, unknown>>(sql, acc.params);\n\n  const seriesName = args.feedbackSource ? `${args.feedbackType}|${args.feedbackSource}` : args.feedbackType;\n  return {\n    series: [\n      {\n        name: seriesName,\n        points: rows.map(row => ({\n          timestamp: bucketDate(row.bucket),\n          value: Number(row.value ?? 0),\n        })),\n      },\n    ],\n  };\n}\n\n// ---------------------------------------------------------------------------\n// OLAP — percentiles\n// ---------------------------------------------------------------------------\n\nexport async function getFeedbackPercentiles(\n  client: DbClient,\n  schema: string,\n  args: GetFeedbackPercentilesArgs,\n): Promise<GetFeedbackPercentilesResponse> {\n  validatePercentiles(args.percentiles);\n\n  const bucket = bucketSql('\"timestamp\"', args.interval);\n  const acc = newFilterAccumulator();\n  pushFeedbackIdentity(acc, args.feedbackType, args.feedbackSource);\n  applyFeedbackFilters(acc, args.filters);\n\n  const percentileSelect = percentileSelectSql(args.percentiles, '\"valueNumber\"');\n\n  const sql = `\n    SELECT ${bucket} AS bucket, ${percentileSelect}\n    FROM ${qualifiedTable(schema, TABLE_FEEDBACK_EVENTS)}\n    ${whereOrEmpty(acc)}\n    GROUP BY bucket\n    ORDER BY bucket\n  `;\n  const rows = await client.manyOrNone<Record<string, unknown>>(sql, acc.params);\n\n  return { series: percentileSeriesFromRows(rows, args.percentiles) };\n}\n","/**\n * Log operations for the v-next Postgres observability domain.\n */\n\nimport { listLogsArgsSchema } from '@mastra/core/storage';\nimport type { BatchCreateLogsArgs, ListLogsArgs, ListLogsResponse } from '@mastra/core/storage';\n\nimport type { DbClient } from '../../../client';\nimport { qualifiedTable, TABLE_LOG_EVENTS } from './ddl';\nimport { applyCommonFilters, applySingleOrArrayFilter } from './filters';\nimport type { FilterAccumulator } from './filters';\nimport { logRecordToRow, rowToLogRecord } from './helpers';\nimport { listSignalDelta, listSignalPage } from './listing';\nimport { assertDeltaPollingEnabled, deltaPollingFeatureEnabled } from './polling';\nimport { buildInsert, LOG_SELECT_COLUMNS } from './sql';\n\nfunction applyLogFilters(acc: FilterAccumulator, filters: ListLogsArgs['filters']): void {\n  applyCommonFilters(acc, filters);\n  applySingleOrArrayFilter(acc, 'level', filters?.level);\n}\n\nexport async function batchCreateLogs(client: DbClient, schema: string, args: BatchCreateLogsArgs): Promise<void> {\n  if (args.logs.length === 0) return;\n  const rows = args.logs.map(logRecordToRow);\n  const insert = buildInsert(schema, TABLE_LOG_EVENTS, rows);\n  if (insert) await client.query(insert.text, insert.values);\n}\n\nexport async function listLogs(client: DbClient, schema: string, args: ListLogsArgs): Promise<ListLogsResponse> {\n  const { mode, filters, pagination, orderBy, after, limit } = listLogsArgsSchema.parse(args);\n  const table = qualifiedTable(schema, TABLE_LOG_EVENTS);\n\n  if (mode === 'delta') {\n    assertDeltaPollingEnabled();\n    return listLogsDelta(client, table, filters, after, limit);\n  }\n\n  return listLogsPage(client, table, filters, pagination.page, pagination.perPage, orderBy.field, orderBy.direction);\n}\n\nasync function listLogsPage(\n  client: DbClient,\n  table: string,\n  filters: ListLogsArgs['filters'],\n  page: number,\n  perPage: number,\n  orderField: 'timestamp',\n  orderDir: 'ASC' | 'DESC',\n): Promise<ListLogsResponse> {\n  return listSignalPage({\n    client,\n    table,\n    filters,\n    page,\n    perPage,\n    orderField,\n    orderDir,\n    includeDeltaCursor: deltaPollingFeatureEnabled(),\n    selectColumns: LOG_SELECT_COLUMNS,\n    responseKey: 'logs',\n    applyFilters: applyLogFilters,\n    mapRow: rowToLogRecord,\n  });\n}\n\nasync function listLogsDelta(\n  client: DbClient,\n  table: string,\n  filters: ListLogsArgs['filters'],\n  after: string | undefined,\n  limit: number,\n): Promise<ListLogsResponse> {\n  return listSignalDelta({\n    client,\n    table,\n    filters,\n    after,\n    limit,\n    selectColumns: LOG_SELECT_COLUMNS,\n    responseKey: 'logs',\n    applyFilters: applyLogFilters,\n    mapRow: rowToLogRecord,\n  });\n}\n","/**\n * Metric operations for the v-next Postgres observability domain.\n *\n * Implements the full ObservabilityStorage metric surface — write, list,\n * aggregate, breakdown, time series, and percentiles. The OLAP queries\n * lean on standard Postgres aggregates (`SUM`, `AVG`, `percentile_cont`,\n * `FILTER (WHERE …)`) and a portable epoch-floor bucket expression so the\n * adapter works on vanilla Postgres and on a TimescaleDB hypertable\n * without query rewrites.\n */\n\nimport { listMetricsArgsSchema } from '@mastra/core/storage';\nimport type {\n  BatchCreateMetricsArgs,\n  GetMetricAggregateArgs,\n  GetMetricAggregateResponse,\n  GetMetricBreakdownArgs,\n  GetMetricBreakdownResponse,\n  GetMetricPercentilesArgs,\n  GetMetricPercentilesResponse,\n  GetMetricTimeSeriesArgs,\n  GetMetricTimeSeriesResponse,\n  ListMetricsArgs,\n  ListMetricsResponse,\n} from '@mastra/core/storage';\n\nimport type { DbClient } from '../../../client';\nimport { qualifiedTable, TABLE_METRIC_EVENTS } from './ddl';\nimport { applyCommonFilters, applySingleOrArrayFilter, newFilterAccumulator, whereOrEmpty } from './filters';\nimport { metricRecordToRow, rowToMetricRecord } from './helpers';\nimport { listSignalDelta, listSignalPage } from './listing';\nimport {\n  bucketDate,\n  bucketSql,\n  changePercent,\n  collectSeriesByDimensions,\n  COMPLEX_GROUP_BY_EXCLUDED,\n  COST_SUMMARY_SELECT,\n  costSummaryFromRow,\n  dimensionsFromRow,\n  metricAggregationSql,\n  percentileSelectSql,\n  percentileSeriesFromRows,\n  pushLabelExclusions,\n  resolveGroupBy,\n  seriesNameFromDimensions,\n  shiftRange,\n  validatePercentiles,\n} from './olap';\nimport { assertDeltaPollingEnabled, deltaPollingFeatureEnabled } from './polling';\nimport { METRIC_TYPED_COLUMNS } from './signal-schema';\nimport { buildInsert, METRIC_SELECT_COLUMNS } from './sql';\n\n// ---------------------------------------------------------------------------\n// Filter helpers specific to the metric signal\n// ---------------------------------------------------------------------------\n\nfunction applyMetricFilters(\n  acc: ReturnType<typeof newFilterAccumulator>,\n  filters: Record<string, any> | undefined,\n): void {\n  applyCommonFilters(acc, filters);\n  applySingleOrArrayFilter(acc, 'traceId', filters?.traceIds);\n  applySingleOrArrayFilter(acc, 'name', filters?.name);\n  applySingleOrArrayFilter(acc, 'provider', filters?.provider);\n  applySingleOrArrayFilter(acc, 'model', filters?.model);\n  applySingleOrArrayFilter(acc, 'costUnit', filters?.costUnit);\n  if (filters?.labels) {\n    acc.conditions.push(`\"labels\" @> $${acc.next++}::jsonb`);\n    acc.params.push(JSON.stringify(filters.labels));\n  }\n}\n\n/** Additional WHERE for metric-name restriction (OLAP queries take a `name` array). */\nfunction pushMetricNameFilter(acc: ReturnType<typeof newFilterAccumulator>, names: readonly string[]): void {\n  if (!names.length) return;\n  const placeholders = names.map(() => `$${acc.next++}`).join(', ');\n  acc.conditions.push(`\"name\" IN (${placeholders})`);\n  acc.params.push(...names);\n}\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nexport async function batchCreateMetrics(\n  client: DbClient,\n  schema: string,\n  args: BatchCreateMetricsArgs,\n): Promise<void> {\n  if (args.metrics.length === 0) return;\n  const rows = args.metrics.map(metricRecordToRow);\n  const insert = buildInsert(schema, TABLE_METRIC_EVENTS, rows);\n  if (insert) await client.query(insert.text, insert.values);\n}\n\n// ---------------------------------------------------------------------------\n// List\n// ---------------------------------------------------------------------------\n\nexport async function listMetrics(\n  client: DbClient,\n  schema: string,\n  args: ListMetricsArgs,\n): Promise<ListMetricsResponse> {\n  const { mode, filters, pagination, orderBy, after, limit } = listMetricsArgsSchema.parse(args);\n  const table = qualifiedTable(schema, TABLE_METRIC_EVENTS);\n\n  if (mode === 'delta') {\n    assertDeltaPollingEnabled();\n    return listMetricsDelta(client, table, filters, after, limit);\n  }\n\n  return listMetricsPage(client, table, filters, pagination.page, pagination.perPage, orderBy.field, orderBy.direction);\n}\n\nasync function listMetricsPage(\n  client: DbClient,\n  table: string,\n  filters: ListMetricsArgs['filters'],\n  page: number,\n  perPage: number,\n  orderField: 'timestamp',\n  orderDir: 'ASC' | 'DESC',\n): Promise<ListMetricsResponse> {\n  return listSignalPage({\n    client,\n    table,\n    filters,\n    page,\n    perPage,\n    orderField,\n    orderDir,\n    includeDeltaCursor: deltaPollingFeatureEnabled(),\n    selectColumns: METRIC_SELECT_COLUMNS,\n    responseKey: 'metrics',\n    applyFilters: applyMetricFilters,\n    mapRow: rowToMetricRecord,\n  });\n}\n\nasync function listMetricsDelta(\n  client: DbClient,\n  table: string,\n  filters: ListMetricsArgs['filters'],\n  after: string | undefined,\n  limit: number,\n): Promise<ListMetricsResponse> {\n  return listSignalDelta({\n    client,\n    table,\n    filters,\n    after,\n    limit,\n    selectColumns: METRIC_SELECT_COLUMNS,\n    responseKey: 'metrics',\n    applyFilters: applyMetricFilters,\n    mapRow: rowToMetricRecord,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// OLAP — aggregate\n// ---------------------------------------------------------------------------\n\nasync function runMetricAggregateQuery(\n  client: DbClient,\n  schema: string,\n  filters: Record<string, any> | undefined,\n  names: readonly string[],\n  aggregation: GetMetricAggregateArgs['aggregation'],\n  distinctColumn: GetMetricAggregateArgs['distinctColumn'],\n): Promise<{ value: number | null; cost: ReturnType<typeof costSummaryFromRow> }> {\n  const acc = newFilterAccumulator();\n  pushMetricNameFilter(acc, names);\n  applyMetricFilters(acc, filters);\n  const where = whereOrEmpty(acc);\n\n  const sql = `\n    SELECT ${metricAggregationSql(aggregation, '\"value\"', 'timestamp', distinctColumn)} AS \"value\",\n           ${COST_SUMMARY_SELECT}\n    FROM ${qualifiedTable(schema, TABLE_METRIC_EVENTS)}\n    ${where}\n  `;\n  const row = (await client.oneOrNone<Record<string, unknown>>(sql, acc.params)) ?? {};\n  return {\n    value: row.value == null ? null : Number(row.value),\n    cost: costSummaryFromRow(row),\n  };\n}\n\nexport async function getMetricAggregate(\n  client: DbClient,\n  schema: string,\n  args: GetMetricAggregateArgs,\n): Promise<GetMetricAggregateResponse> {\n  const { value, cost } = await runMetricAggregateQuery(\n    client,\n    schema,\n    args.filters,\n    args.name,\n    args.aggregation,\n    args.distinctColumn,\n  );\n\n  if (args.comparePeriod && args.filters?.timestamp) {\n    const prevRange = shiftRange(args.filters.timestamp, args.comparePeriod);\n    if (prevRange) {\n      const prevFilters = { ...(args.filters ?? {}), timestamp: prevRange };\n      const prev = await runMetricAggregateQuery(\n        client,\n        schema,\n        prevFilters,\n        args.name,\n        args.aggregation,\n        args.distinctColumn,\n      );\n      return {\n        value,\n        estimatedCost: cost.estimatedCost,\n        costUnit: cost.costUnit,\n        previousValue: prev.value,\n        previousEstimatedCost: prev.cost.estimatedCost,\n        changePercent: changePercent(value, prev.value),\n        costChangePercent: changePercent(cost.estimatedCost, prev.cost.estimatedCost),\n      };\n    }\n  }\n\n  return { value, estimatedCost: cost.estimatedCost, costUnit: cost.costUnit };\n}\n\n// ---------------------------------------------------------------------------\n// OLAP — breakdown\n// ---------------------------------------------------------------------------\n\nexport async function getMetricBreakdown(\n  client: DbClient,\n  schema: string,\n  args: GetMetricBreakdownArgs,\n): Promise<GetMetricBreakdownResponse> {\n  const acc = newFilterAccumulator();\n  // GroupBy may bind label-key parameters first, but later WHERE conditions\n  // also bind via the same accumulator. The resolution function pushes\n  // label-key params via `acc.next++` so positional indexes line up.\n  const resolved = resolveGroupBy(acc, args.groupBy, {\n    typedColumns: METRIC_TYPED_COLUMNS,\n    excludedColumns: COMPLEX_GROUP_BY_EXCLUDED,\n    labelsColumn: 'labels',\n  });\n  pushMetricNameFilter(acc, args.name);\n  applyMetricFilters(acc, args.filters);\n  pushLabelExclusions(acc, resolved);\n  const orderDirection = args.orderDirection === 'ASC' ? 'ASC' : 'DESC';\n  const limitClause = args.limit == null ? '' : `LIMIT $${acc.next++}`;\n  if (args.limit != null) acc.params.push(args.limit);\n\n  const sql = `\n    SELECT ${resolved.map(e => e.selectSql).join(', ')},\n           ${metricAggregationSql(args.aggregation, '\"value\"', 'timestamp', args.distinctColumn)} AS \"value\",\n           ${COST_SUMMARY_SELECT}\n    FROM ${qualifiedTable(schema, TABLE_METRIC_EVENTS)}\n    ${whereOrEmpty(acc)}\n    GROUP BY ${resolved.map(e => e.alias).join(', ')}\n    ORDER BY \"value\" ${orderDirection} NULLS LAST\n    ${limitClause}\n  `;\n\n  const rows = await client.manyOrNone<Record<string, unknown>>(sql, acc.params);\n\n  return {\n    groups: rows.map(row => {\n      const cs = costSummaryFromRow(row);\n      return {\n        dimensions: dimensionsFromRow(row, resolved),\n        value: Number(row.value ?? 0),\n        estimatedCost: cs.estimatedCost,\n        costUnit: cs.costUnit,\n      };\n    }),\n  };\n}\n\n// ---------------------------------------------------------------------------\n// OLAP — time series\n// ---------------------------------------------------------------------------\n\nexport async function getMetricTimeSeries(\n  client: DbClient,\n  schema: string,\n  args: GetMetricTimeSeriesArgs,\n): Promise<GetMetricTimeSeriesResponse> {\n  const bucket = bucketSql('\"timestamp\"', args.interval);\n\n  if (args.groupBy && args.groupBy.length > 0) {\n    const acc = newFilterAccumulator();\n    const resolved = resolveGroupBy(acc, args.groupBy, {\n      typedColumns: METRIC_TYPED_COLUMNS,\n      excludedColumns: COMPLEX_GROUP_BY_EXCLUDED,\n      labelsColumn: 'labels',\n    });\n    pushMetricNameFilter(acc, args.name);\n    applyMetricFilters(acc, args.filters);\n    pushLabelExclusions(acc, resolved);\n\n    const sql = `\n      SELECT ${bucket} AS bucket,\n             ${resolved.map(e => e.selectSql).join(', ')},\n             ${metricAggregationSql(args.aggregation, '\"value\"', 'timestamp', args.distinctColumn)} AS \"value\",\n             ${COST_SUMMARY_SELECT}\n      FROM ${qualifiedTable(schema, TABLE_METRIC_EVENTS)}\n      ${whereOrEmpty(acc)}\n      GROUP BY bucket, ${resolved.map(e => e.alias).join(', ')}\n      ORDER BY bucket\n    `;\n\n    const rows = await client.manyOrNone<Record<string, unknown>>(sql, acc.params);\n\n    const series = collectSeriesByDimensions(\n      rows,\n      resolved,\n      dimValues => ({\n        name: seriesNameFromDimensions(dimValues),\n        costUnits: new Set<string>(),\n        points: [] as { timestamp: Date; value: number; estimatedCost: number | null }[],\n      }),\n      (entry, row) => {\n        const cs = costSummaryFromRow(row);\n        if (cs.costUnit) entry.costUnits.add(cs.costUnit);\n        entry.points.push({\n          timestamp: bucketDate(row.bucket),\n          value: Number(row.value ?? 0),\n          estimatedCost: cs.estimatedCost,\n        });\n      },\n    ).map(s => ({\n      name: s.name,\n      costUnit: s.costUnits.size === 1 ? Array.from(s.costUnits)[0]! : null,\n      points: s.points,\n    }));\n\n    return { series };\n  }\n\n  // No groupBy — single series per metric name set\n  const acc = newFilterAccumulator();\n  pushMetricNameFilter(acc, args.name);\n  applyMetricFilters(acc, args.filters);\n\n  const sql = `\n    SELECT ${bucket} AS bucket,\n           ${metricAggregationSql(args.aggregation, '\"value\"', 'timestamp', args.distinctColumn)} AS \"value\",\n           ${COST_SUMMARY_SELECT}\n    FROM ${qualifiedTable(schema, TABLE_METRIC_EVENTS)}\n    ${whereOrEmpty(acc)}\n    GROUP BY bucket\n    ORDER BY bucket\n  `;\n  const rows = await client.manyOrNone<Record<string, unknown>>(sql, acc.params);\n\n  const overallCostUnits = new Set<string>();\n  for (const row of rows) {\n    const cs = costSummaryFromRow(row);\n    if (cs.costUnit) overallCostUnits.add(cs.costUnit);\n  }\n\n  return {\n    series: [\n      {\n        name: args.name.join('|'),\n        costUnit: overallCostUnits.size === 1 ? Array.from(overallCostUnits)[0]! : null,\n        points: rows.map(row => {\n          const cs = costSummaryFromRow(row);\n          return {\n            timestamp: bucketDate(row.bucket),\n            value: Number(row.value ?? 0),\n            estimatedCost: cs.estimatedCost,\n          };\n        }),\n      },\n    ],\n  };\n}\n\n// ---------------------------------------------------------------------------\n// OLAP — percentiles\n// ---------------------------------------------------------------------------\n\nexport async function getMetricPercentiles(\n  client: DbClient,\n  schema: string,\n  args: GetMetricPercentilesArgs,\n): Promise<GetMetricPercentilesResponse> {\n  validatePercentiles(args.percentiles);\n\n  const bucket = bucketSql('\"timestamp\"', args.interval);\n\n  // Compute all requested percentiles in a single query — Postgres allows\n  // multiple `percentile_cont` aggregates per row, which avoids re-scanning.\n  const acc = newFilterAccumulator();\n  pushMetricNameFilter(acc, [args.name]);\n  applyMetricFilters(acc, args.filters);\n\n  const percentileSelect = percentileSelectSql(args.percentiles, '\"value\"');\n\n  const sql = `\n    SELECT ${bucket} AS bucket, ${percentileSelect}\n    FROM ${qualifiedTable(schema, TABLE_METRIC_EVENTS)}\n    ${whereOrEmpty(acc)}\n    GROUP BY bucket\n    ORDER BY bucket\n  `;\n  const rows = await client.manyOrNone<Record<string, unknown>>(sql, acc.params);\n\n  return { series: percentileSeriesFromRows(rows, args.percentiles) };\n}\n","/**\n * Partition + extension management for the v-next Postgres observability domain.\n *\n * Three modes (auto-detected at init unless overridden by config):\n *\n *  1. TimescaleDB present  → call `create_hypertable()` for each signal table.\n *                            Chunks are created automatically; we never\n *                            pre-create partitions and never call pg_partman.\n *\n *  2. pg_partman present   → register each signal table as a daily-partitioned\n *                            parent and let partman maintain future partitions.\n *\n *  3. Neither extension    → pre-create a rolling window of daily partitions\n *                            (yesterday + today + N future days). Future\n *                            partitions can be extended by a separate Mastra\n *                            CLI command, which is also the surface that will\n *                            implement retention cleanup.\n *\n * This module deliberately does not implement retention deletes / drops.\n * The goal here is to leave the schema in a shape that a follow-up\n * `mastra retention` command can act on without further migrations.\n */\n\nimport type { DbClient } from '../../../client';\nimport { ALL_SIGNAL_TABLES, qualifiedName, qualifiedTable, SIGNAL_TIME_COLUMN } from './ddl';\nimport { isDuplicateRelationError } from './pg-errors';\n\nexport type PartitionMode = 'timescale' | 'partman' | 'native';\n\nexport interface PartitioningOptions {\n  /** Override auto-detection. */\n  mode?: PartitionMode | 'auto';\n  /**\n   * Number of future daily partitions to pre-create when running in 'native'\n   * mode. Default 14. Has no effect in timescale or partman modes.\n   */\n  futureDays?: number;\n  /**\n   * Whether to pre-create a partition for yesterday (covers small clock skew\n   * and late-arriving events). Default true.\n   */\n  includeYesterday?: boolean;\n}\n\nconst DEFAULT_FUTURE_DAYS = 14;\n\n// ---------------------------------------------------------------------------\n// Extension detection\n// ---------------------------------------------------------------------------\n\nexport async function detectTimescale(client: DbClient): Promise<boolean> {\n  const row = await client.oneOrNone<{ exists: boolean }>(\n    `SELECT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'timescaledb') AS \"exists\"`,\n  );\n  return Boolean(row?.exists);\n}\n\nexport async function detectPartman(client: DbClient): Promise<boolean> {\n  const row = await client.oneOrNone<{ exists: boolean }>(\n    `SELECT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'pg_partman') AS \"exists\"`,\n  );\n  return Boolean(row?.exists);\n}\n\nexport async function getPartmanVersion(client: DbClient): Promise<string | null> {\n  const row = await client.oneOrNone<{ extversion: string }>(\n    `SELECT extversion FROM pg_extension WHERE extname = 'pg_partman'`,\n  );\n  return row?.extversion ?? null;\n}\n\nfunction getPartmanMajor(version: string | null): number | null {\n  if (!version) return null;\n  const match = /^(\\d+)/.exec(version);\n  return match ? Number(match[1]) : null;\n}\n\nexport async function resolveMode(client: DbClient, options: PartitioningOptions = {}): Promise<PartitionMode> {\n  if (options.mode && options.mode !== 'auto') return options.mode;\n  if (await detectTimescale(client)) return 'timescale';\n  if (await detectPartman(client)) return 'partman';\n  return 'native';\n}\n\n// ---------------------------------------------------------------------------\n// Native daily partition helpers\n// ---------------------------------------------------------------------------\n\nfunction dayBounds(d: Date): { start: string; end: string; suffix: string } {\n  const year = d.getUTCFullYear();\n  const month = String(d.getUTCMonth() + 1).padStart(2, '0');\n  const day = String(d.getUTCDate()).padStart(2, '0');\n  const start = `${year}-${month}-${day} 00:00:00+00`;\n  const next = new Date(Date.UTC(year, d.getUTCMonth(), d.getUTCDate() + 1));\n  const ny = next.getUTCFullYear();\n  const nm = String(next.getUTCMonth() + 1).padStart(2, '0');\n  const nd = String(next.getUTCDate()).padStart(2, '0');\n  const end = `${ny}-${nm}-${nd} 00:00:00+00`;\n  return { start, end, suffix: `${year}${month}${day}` };\n}\n\nfunction partitionName(table: string, suffix: string): string {\n  return `${table}_p${suffix}`;\n}\n\n/**\n * Creates daily partition tables in [today - 1 day, today + futureDays].\n * Idempotent: uses CREATE TABLE IF NOT EXISTS.\n */\nexport async function ensureNativePartitions(\n  client: DbClient,\n  schema: string,\n  options: PartitioningOptions = {},\n): Promise<void> {\n  const futureDays = options.futureDays ?? DEFAULT_FUTURE_DAYS;\n  const includeYesterday = options.includeYesterday ?? true;\n  const start = includeYesterday ? -1 : 0;\n  // Freeze the base UTC day before the loop. If we recomputed `Date.now()`\n  // inside the loop, a run that crossed midnight UTC could skip one expected\n  // day for later tables and create an extra far-future partition for them.\n  const baseNowMs = Date.now();\n\n  for (const table of ALL_SIGNAL_TABLES) {\n    for (let i = start; i <= futureDays; i++) {\n      const d = new Date(baseNowMs + i * 86_400_000);\n      const { start: partStart, end: partEnd, suffix } = dayBounds(d);\n      const childName = partitionName(table, suffix);\n      const child = qualifiedName(schema, childName);\n      const parent = qualifiedTable(schema, table);\n      // Two-phase partition creation. `CREATE TABLE ... PARTITION OF` takes\n      // ACCESS EXCLUSIVE on the parent for the duration of the statement,\n      // which blocks every concurrent read and write against every other\n      // partition. Splitting into `CREATE TABLE (LIKE ...) + ALTER TABLE\n      // ATTACH PARTITION` keeps the parent lock at SHARE UPDATE EXCLUSIVE\n      // (since PG 12), which only blocks DDL and vacuum — concurrent\n      // inserts and reads against today's partition keep flowing.\n      //\n      // Postgres requires partition bounds in `FOR VALUES FROM (…) TO (…)`\n      // to be constant expressions at parse time — `$N` placeholders are\n      // resolved at execution and so are rejected here. `partStart` /\n      // `partEnd` are produced by `dayBounds()` (formatted from a JS Date)\n      // and never touch user input, so the template interpolation is safe.\n      try {\n        // `LIKE parent INCLUDING ALL` copies columns, defaults, NOT NULL,\n        // PRIMARY KEY, and indexes but not the parent's partition spec, so\n        // the child becomes a regular table that can later be attached as\n        // a partition. Index names are auto-generated per child and don't\n        // collide across days.\n        await client.none(`CREATE TABLE IF NOT EXISTS ${child} (LIKE ${parent} INCLUDING ALL)`);\n      } catch (error) {\n        // `CREATE TABLE IF NOT EXISTS` is not atomic under concurrency;\n        // a parallel init() can win the race between the existence check\n        // and the create. Treat the duplicate as success.\n        if (!isDuplicateRelationError(error)) throw error;\n      }\n\n      try {\n        // ATTACH PARTITION on an empty child is fast: there are no rows to\n        // scan against the partition constraint, and the parent lock is\n        // SHARE UPDATE EXCLUSIVE rather than ACCESS EXCLUSIVE.\n        await client.none(\n          `ALTER TABLE ${parent} ATTACH PARTITION ${child}\n           FOR VALUES FROM ('${partStart}') TO ('${partEnd}')`,\n        );\n      } catch (error) {\n        // The child can already be attached from a previous init() or from\n        // a concurrent caller that won the race between our CREATE and\n        // ATTACH. Either way, treat \"already a partition of this parent\"\n        // as success.\n        if (!isAlreadyAttachedError(error)) throw error;\n      }\n    }\n  }\n}\n\n/**\n * `ALTER TABLE ATTACH PARTITION` fails with `42P17 invalid_object_definition`\n * when the target table is already a partition of *any* parent (including\n * the one we want). On older PG it can also surface as 42710 or a generic\n * message. We err on the side of treating any \"already a partition\" wording\n * as success so concurrent inits converge cleanly.\n */\nfunction isAlreadyAttachedError(error: unknown): boolean {\n  const code = (error as { code?: string } | undefined)?.code;\n  const message = (error as { message?: string } | undefined)?.message ?? '';\n  if (code === '42P17' || code === '42710') {\n    return /is already a partition/i.test(message) || /already a partition/i.test(message);\n  }\n  return /is already a partition/i.test(message);\n}\n\n/**\n * Lists existing daily partitions for a signal table. Used by tests and the\n * future `mastra retention` CLI command.\n */\nexport async function listPartitions(client: DbClient, schema: string, table: string): Promise<string[]> {\n  // Resolve the parent oid via pg_class/pg_namespace rather than casting a\n  // hand-built string to regclass — regclass casts go through search_path\n  // and throw on identifiers that don't resolve, even when the schema is\n  // valid. The join is exact match on (nspname, relname) and works for any\n  // schema regardless of search_path.\n  const rows = await client.manyOrNone<{ partition: string }>(\n    `SELECT inhrelid::regclass::text AS partition\n     FROM pg_inherits\n     WHERE inhparent = (\n       SELECT c.oid\n       FROM pg_class c\n       JOIN pg_namespace n ON n.oid = c.relnamespace\n       WHERE n.nspname = $1 AND c.relname = $2\n     )\n     ORDER BY 1`,\n    [schema, table],\n  );\n  return rows.map(r => r.partition);\n}\n\n// ---------------------------------------------------------------------------\n// Timescale hypertable setup\n// ---------------------------------------------------------------------------\n\n/**\n * Calls `create_hypertable()` for each signal table.\n *\n * Postgres declarative partitioning and Timescale hypertables are mutually\n * exclusive, so the base DDL must have been generated with TableDDLMode\n * 'timescale' (no `PARTITION BY` clause). `if_not_exists` makes this\n * idempotent across re-inits.\n */\nexport async function ensureTimescaleHypertables(client: DbClient, schema: string): Promise<void> {\n  for (const table of ALL_SIGNAL_TABLES) {\n    const tableExpr = qualifiedTable(schema, table);\n    // SIGNAL_TIME_COLUMN values are hardcoded constants (`endedAt` /\n    // `timestamp`). Inline them as string literals so `create_hypertable()`\n    // receives a column name, not a SQL identifier from the surrounding\n    // SELECT. Parameterizing this via `$N::name` has also been flaky on some\n    // Timescale versions.\n    const timeColumn = SIGNAL_TIME_COLUMN[table].replace(/'/g, \"''\");\n\n    await client.none(\n      `SELECT create_hypertable($1::regclass, '${timeColumn}', chunk_time_interval => INTERVAL '1 day', if_not_exists => true)`,\n      [tableExpr],\n    );\n  }\n}\n\n// ---------------------------------------------------------------------------\n// pg_partman setup\n// ---------------------------------------------------------------------------\n\n/**\n * Registers each signal table with pg_partman as a daily-interval parent and\n * lets partman create the child partitions.\n *\n * Retention is intentionally NOT configured here — it stays opt-in via the\n * future Mastra CLI surface.\n *\n * Prefers the pg_partman 5.x+ declarative API (`p_type := 'range'`) and keeps\n * a 4.x fallback (`p_type := 'native'`) for older installs. That lets the\n * adapter run against current arm64-friendly images without breaking existing\n * 4.x deployments.\n */\nexport async function ensurePartmanHypertables(client: DbClient, schema: string): Promise<void> {\n  const partmanMajor = getPartmanMajor(await getPartmanVersion(client));\n\n  for (const table of ALL_SIGNAL_TABLES) {\n    const exists = await client.oneOrNone<{ exists: boolean }>(\n      `SELECT EXISTS (\n         SELECT 1 FROM partman.part_config\n         WHERE parent_table = format('%I.%I', $1::text, $2::text)\n       ) AS \"exists\"`,\n      [schema, table],\n    );\n    if (exists?.exists) continue;\n\n    // Race: between the EXISTS check above and the `create_parent` call\n    // below, a concurrent init in another process can register the parent\n    // first. pg_partman doesn't have an `IF NOT EXISTS`-style guard, and on\n    // 5.x it can also deadlock one of the callers while racing on its\n    // template table. Retry once or accept success if another caller already\n    // installed the parent row.\n    for (let attempt = 0; attempt < 3; attempt++) {\n      try {\n        if (partmanMajor != null && partmanMajor >= 5) {\n          await client.none(\n            `SELECT partman.create_parent(\n               p_parent_table := format('%I.%I', $1::text, $2::text),\n               p_control := $3,\n               p_interval := '1 day',\n               p_type := 'range'\n             )`,\n            [schema, table, SIGNAL_TIME_COLUMN[table]],\n          );\n        } else {\n          await client.none(\n            `SELECT partman.create_parent(\n               p_parent_table := format('%I.%I', $1::text, $2::text),\n               p_control := $3,\n               p_type := 'native',\n               p_interval := '1 day'\n             )`,\n            [schema, table, SIGNAL_TIME_COLUMN[table]],\n          );\n        }\n        break;\n      } catch (error) {\n        const message = (error as { message?: string } | undefined)?.message ?? '';\n        const code = (error as { code?: string } | undefined)?.code;\n        const isDuplicate =\n          code === '23505' ||\n          /already managed by pg_partman/i.test(message) ||\n          /relation .* already exists/i.test(message);\n        if (isDuplicate) break;\n\n        const isDeadlock = /deadlock detected/i.test(message);\n        if (!isDeadlock) throw error;\n\n        const registered = await client.oneOrNone<{ exists: boolean }>(\n          `SELECT EXISTS (\n             SELECT 1 FROM partman.part_config\n             WHERE parent_table = format('%I.%I', $1::text, $2::text)\n           ) AS \"exists\"`,\n          [schema, table],\n        );\n        if (registered?.exists) break;\n        if (attempt === 2) throw error;\n        await new Promise(resolve => setTimeout(resolve, 25));\n      }\n    }\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Top-level dispatcher\n// ---------------------------------------------------------------------------\n\nexport async function setupPartitioning(\n  client: DbClient,\n  schema: string,\n  options: PartitioningOptions = {},\n): Promise<PartitionMode> {\n  const mode = await resolveMode(client, options);\n\n  switch (mode) {\n    case 'timescale':\n      await ensureTimescaleHypertables(client, schema);\n      return 'timescale';\n    case 'partman':\n      await ensurePartmanHypertables(client, schema);\n      return 'partman';\n    case 'native':\n      await ensureNativePartitions(client, schema, options);\n      return 'native';\n  }\n}\n","/**\n * Age-based retention for the v-next Postgres observability domain.\n *\n * The signal tables are insert-only and day-partitioned (native declarative\n * partitions, pg_partman-managed partitions, or Timescale chunks), so\n * retention here is NOT the row-level batched `DELETE` used by the other\n * domains — it expires data the way the partition skeleton was designed for:\n *\n *  - native / partman: `DETACH PARTITION` + `DROP TABLE` for every child\n *    partition whose upper bound is at or before the cutoff. Detach-then-drop\n *    keeps the parent lock window short, and dropping a whole day of events\n *    is O(1) — no dead tuples, no WAL churn, no vacuum debt.\n *  - timescale: `drop_chunks(older_than => cutoff)`, the Timescale-native\n *    equivalent (only chunks wholly older than the cutoff are dropped).\n *\n * Because only *whole* partitions/chunks are dropped, the effective\n * granularity is one day: rows stay until the full day they belong to has\n * aged past `maxAge`. Empty future partitions (pre-created for routing) have\n * upper bounds in the future and are never touched.\n *\n * `PruneOptions` map onto partition drops: each dropped partition counts as\n * one batch (`maxBatches` caps partitions dropped per table per call),\n * `maxRows` stops before a drop that would exceed the row budget, and the\n * abort signal is checked between drops. `deleted` reports the number of\n * rows in the dropped partitions/chunks.\n */\n\nimport { parseDuration } from '@mastra/core/storage';\nimport type { PruneOptions, TableRetentionPolicy } from '@mastra/core/storage';\n\nimport type { DbClient } from '../../../client';\nimport { qualifiedName, qualifiedTable } from './ddl';\n\nexport interface PartitionPruneOutcome {\n  deleted: number;\n  done: boolean;\n}\n\n/** A child partition of a signal table, with its parsed upper time bound. */\ninterface ChildPartition {\n  name: string;\n  upperBound: Date;\n}\n\n/** Convert a policy's `maxAge` into a cutoff `Date`. */\nexport function retentionCutoff(policy: TableRetentionPolicy, now = Date.now()): Date {\n  return new Date(now - parseDuration(policy.maxAge));\n}\n\n/**\n * Lists the child partitions of `table` along with their upper range bound,\n * parsed from `pg_get_expr(relpartbound)`. Children without a parseable\n * range bound (e.g. a DEFAULT partition) are skipped — we can't prove all\n * their rows are old, so they are never dropped.\n */\nasync function listChildPartitions(client: DbClient, schema: string, table: string): Promise<ChildPartition[]> {\n  const rows = await client.manyOrNone<{ name: string; bound: string | null }>(\n    `SELECT c.relname AS \"name\", pg_get_expr(c.relpartbound, c.oid) AS \"bound\"\n     FROM pg_inherits i\n     JOIN pg_class c ON c.oid = i.inhrelid\n     JOIN pg_class p ON p.oid = i.inhparent\n     JOIN pg_namespace n ON n.oid = p.relnamespace\n     WHERE n.nspname = $1 AND p.relname = $2`,\n    [schema, table],\n  );\n\n  const partitions: ChildPartition[] = [];\n  for (const row of rows ?? []) {\n    // Bound expression looks like: FOR VALUES FROM ('2026-07-01 00:00:00+00') TO ('2026-07-02 00:00:00+00')\n    const match = /TO \\('([^']+)'\\)/.exec(row.bound ?? '');\n    if (!match?.[1]) continue;\n    const upperBound = new Date(match[1]);\n    if (Number.isNaN(upperBound.getTime())) continue;\n    partitions.push({ name: row.name, upperBound });\n  }\n  return partitions.sort((a, b) => a.upperBound.getTime() - b.upperBound.getTime());\n}\n\n/**\n * Drops every child partition of `table` whose upper bound is at or before\n * `cutoff` (i.e. every row in it is provably older than the cutoff).\n * Detaches first so the parent's ACCESS EXCLUSIVE window is a fast catalog\n * change, then drops the detached table. Used for both native and\n * pg_partman-managed partitions (partman children are ordinary declarative\n * partitions; partman's own retention does the same detach+drop).\n */\nexport async function prunePartitionedTable({\n  client,\n  schema,\n  table,\n  cutoff,\n  options,\n}: {\n  client: DbClient;\n  schema: string;\n  table: string;\n  cutoff: Date;\n  options?: PruneOptions;\n}): Promise<PartitionPruneOutcome> {\n  const partitions = await listChildPartitions(client, schema, table);\n  const droppable = partitions.filter(p => p.upperBound.getTime() <= cutoff.getTime());\n\n  let deleted = 0;\n  let batches = 0;\n\n  for (const partition of droppable) {\n    if (options?.signal?.aborted) return { deleted, done: false };\n    if (options?.maxBatches !== undefined && batches >= options.maxBatches) return { deleted, done: false };\n    if (options?.maxRows !== undefined && deleted >= options.maxRows) return { deleted, done: false };\n\n    const child = qualifiedName(schema, partition.name);\n    const parent = qualifiedTable(schema, table);\n\n    const row = await client.one<{ n: number }>(`SELECT count(*)::int AS \"n\" FROM ${child}`);\n\n    // Detach first: a fast catalog-only lock on the parent, after which the\n    // child is a plain table that can be dropped without touching the parent.\n    await client.none(`ALTER TABLE ${parent} DETACH PARTITION ${child}`);\n    await client.none(`DROP TABLE IF EXISTS ${child}`);\n\n    deleted += row.n;\n    batches += 1;\n  }\n\n  return { deleted, done: true };\n}\n\n/**\n * Drops every Timescale chunk of `table` wholly older than `cutoff` via\n * `drop_chunks()`. Row counts are taken from the eligible chunks (reported by\n * `show_chunks()`) before the drop. The whole `drop_chunks()` call is a\n * single batch: it either runs or is skipped when `maxBatches` is 0 or the\n * signal is already aborted.\n */\nexport async function pruneTimescaleTable({\n  client,\n  schema,\n  table,\n  cutoff,\n  options,\n}: {\n  client: DbClient;\n  schema: string;\n  table: string;\n  cutoff: Date;\n  options?: PruneOptions;\n}): Promise<PartitionPruneOutcome> {\n  if (options?.signal?.aborted || options?.maxBatches === 0) return { deleted: 0, done: false };\n\n  const tableExpr = qualifiedTable(schema, table);\n\n  const chunks = await client.manyOrNone<{ chunk: string }>(\n    `SELECT show_chunks($1::regclass, older_than => $2::timestamptz)::text AS \"chunk\"`,\n    [tableExpr, cutoff.toISOString()],\n  );\n\n  let deleted = 0;\n  for (const { chunk } of chunks ?? []) {\n    // Chunk names come from show_chunks() as already-qualified regclass text.\n    const row = await client.one<{ n: number }>(`SELECT count(*)::int AS \"n\" FROM ${chunk}`);\n    deleted += row.n;\n  }\n\n  await client.none(`SELECT drop_chunks($1::regclass, older_than => $2::timestamptz)`, [\n    tableExpr,\n    cutoff.toISOString(),\n  ]);\n\n  return { deleted, done: true };\n}\n","/**\n * Score operations for the v-next Postgres observability domain.\n *\n * Implements the full ObservabilityStorage score surface — write, list,\n * aggregate, breakdown, time series, and percentiles.\n */\n\nimport { listScoresArgsSchema } from '@mastra/core/storage';\nimport type {\n  BatchCreateScoresArgs,\n  CreateScoreArgs,\n  DeleteScoresArgs,\n  GetScoreAggregateArgs,\n  GetScoreAggregateResponse,\n  GetScoreBreakdownArgs,\n  GetScoreBreakdownResponse,\n  GetScorePercentilesArgs,\n  GetScorePercentilesResponse,\n  GetScoreTimeSeriesArgs,\n  GetScoreTimeSeriesResponse,\n  ListScoresArgs,\n  ListScoresResponse,\n  ScoreRecord,\n} from '@mastra/core/storage';\n\nimport type { DbClient } from '../../../client';\nimport { qualifiedTable, TABLE_SCORE_EVENTS } from './ddl';\nimport { applyCommonFilters, applySingleOrArrayFilter, newFilterAccumulator, whereOrEmpty } from './filters';\nimport { rowToScoreRecord, scoreRecordToRow } from './helpers';\nimport { listSignalDelta, listSignalPage } from './listing';\nimport {\n  aggregationSql,\n  bucketDate,\n  bucketSql,\n  changePercent,\n  collectSeriesByDimensions,\n  COMPLEX_GROUP_BY_EXCLUDED,\n  dimensionsFromRow,\n  percentileSelectSql,\n  percentileSeriesFromRows,\n  resolveGroupBy,\n  seriesNameFromDimensions,\n  shiftRange,\n  validatePercentiles,\n} from './olap';\nimport { assertDeltaPollingEnabled, deltaPollingFeatureEnabled } from './polling';\nimport { SCORE_TYPED_COLUMNS } from './signal-schema';\nimport { buildInsert, SCORE_SELECT_COLUMNS } from './sql';\n\n// ---------------------------------------------------------------------------\n// Filter helpers specific to the score signal\n// ---------------------------------------------------------------------------\n\nfunction applyScoreFilters(\n  acc: ReturnType<typeof newFilterAccumulator>,\n  filters: Record<string, any> | undefined,\n): void {\n  applyCommonFilters(acc, filters);\n  applySingleOrArrayFilter(acc, 'scorerId', filters?.scorerId);\n  if (filters?.scoreSource ?? filters?.source) {\n    acc.conditions.push(`\"scoreSource\" = $${acc.next++}`);\n    acc.params.push(filters.scoreSource ?? filters.source);\n  }\n  if (filters?.metadata && Object.keys(filters.metadata).length > 0) {\n    // Per-top-level-key exact equality (jsonb `=` normalizes formatting), matching in-memory semantics\n    for (const [key, value] of Object.entries(filters.metadata)) {\n      acc.conditions.push(`\"metadata\"->($${acc.next++}::text) = $${acc.next++}::jsonb`);\n      acc.params.push(key, JSON.stringify(value ?? null));\n    }\n  }\n}\n\n/** OLAP queries take an explicit scorerId / scoreSource pair as identity. */\nfunction pushScoreIdentity(\n  acc: ReturnType<typeof newFilterAccumulator>,\n  scorerId: string,\n  scoreSource: string | undefined,\n): void {\n  acc.conditions.push(`\"scorerId\" = $${acc.next++}`);\n  acc.params.push(scorerId);\n  if (scoreSource !== undefined) {\n    acc.conditions.push(`\"scoreSource\" = $${acc.next++}`);\n    acc.params.push(scoreSource);\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nexport async function createScore(client: DbClient, schema: string, args: CreateScoreArgs): Promise<void> {\n  const row = scoreRecordToRow(args.score);\n  const insert = buildInsert(schema, TABLE_SCORE_EVENTS, [row]);\n  if (insert) await client.query(insert.text, insert.values);\n}\n\nexport async function batchCreateScores(client: DbClient, schema: string, args: BatchCreateScoresArgs): Promise<void> {\n  if (args.scores.length === 0) return;\n  const rows = args.scores.map(scoreRecordToRow);\n  const insert = buildInsert(schema, TABLE_SCORE_EVENTS, rows);\n  if (insert) await client.query(insert.text, insert.values);\n}\n\n// ---------------------------------------------------------------------------\n// Deletes\n// ---------------------------------------------------------------------------\n\n/**\n * Delete score events by scoreId. Optional `organizationId` and `resourceId`\n * values are ANDed into the predicate to restrict deletion to records with\n * matching scope fields.\n */\nexport async function deleteScores(client: DbClient, schema: string, args: DeleteScoresArgs): Promise<void> {\n  if (args.scoreIds.length === 0) return;\n  const table = qualifiedTable(schema, TABLE_SCORE_EVENTS);\n  const values: unknown[] = [...args.scoreIds];\n  const placeholders = args.scoreIds.map((_, i) => `$${i + 1}`).join(', ');\n  const conditions = [`\"scoreId\" IN (${placeholders})`];\n  if (args.organizationId !== undefined) {\n    values.push(args.organizationId);\n    conditions.push(`\"organizationId\" = $${values.length}`);\n  }\n  if (args.resourceId !== undefined) {\n    values.push(args.resourceId);\n    conditions.push(`\"resourceId\" = $${values.length}`);\n  }\n  await client.query(`DELETE FROM ${table} WHERE ${conditions.join(' AND ')}`, values);\n}\n\n// ---------------------------------------------------------------------------\n// List\n// ---------------------------------------------------------------------------\n\nexport async function listScores(client: DbClient, schema: string, args: ListScoresArgs): Promise<ListScoresResponse> {\n  const { mode, filters, pagination, orderBy, after, limit } = listScoresArgsSchema.parse(args);\n  const table = qualifiedTable(schema, TABLE_SCORE_EVENTS);\n\n  if (mode === 'delta') {\n    assertDeltaPollingEnabled();\n    return listScoresDelta(client, table, filters, after, limit);\n  }\n\n  return listScoresPage(client, table, filters, pagination.page, pagination.perPage, orderBy.field, orderBy.direction);\n}\n\nexport async function getScoreById(client: DbClient, schema: string, scoreId: string): Promise<ScoreRecord | null> {\n  const row = await client.oneOrNone<Record<string, any>>(\n    `SELECT ${SCORE_SELECT_COLUMNS}\n     FROM ${qualifiedTable(schema, TABLE_SCORE_EVENTS)}\n     WHERE \"scoreId\" = $1\n     ORDER BY \"timestamp\" DESC\n     LIMIT 1`,\n    [scoreId],\n  );\n  return row ? rowToScoreRecord(row) : null;\n}\n\nasync function listScoresPage(\n  client: DbClient,\n  table: string,\n  filters: ListScoresArgs['filters'],\n  page: number,\n  perPage: number,\n  orderField: 'timestamp' | 'score',\n  orderDir: 'ASC' | 'DESC',\n): Promise<ListScoresResponse> {\n  return listSignalPage({\n    client,\n    table,\n    filters,\n    page,\n    perPage,\n    orderField,\n    orderDir,\n    includeDeltaCursor: deltaPollingFeatureEnabled(),\n    selectColumns: SCORE_SELECT_COLUMNS,\n    responseKey: 'scores',\n    applyFilters: applyScoreFilters,\n    mapRow: rowToScoreRecord,\n  });\n}\n\nasync function listScoresDelta(\n  client: DbClient,\n  table: string,\n  filters: ListScoresArgs['filters'],\n  after: string | undefined,\n  limit: number,\n): Promise<ListScoresResponse> {\n  return listSignalDelta({\n    client,\n    table,\n    filters,\n    after,\n    limit,\n    selectColumns: SCORE_SELECT_COLUMNS,\n    responseKey: 'scores',\n    applyFilters: applyScoreFilters,\n    mapRow: rowToScoreRecord,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// OLAP — aggregate\n// ---------------------------------------------------------------------------\n\nasync function runScoreAggregateQuery(\n  client: DbClient,\n  schema: string,\n  args: Pick<GetScoreAggregateArgs, 'scorerId' | 'scoreSource' | 'aggregation'>,\n  filters: Record<string, any> | undefined,\n): Promise<number | null> {\n  const acc = newFilterAccumulator();\n  pushScoreIdentity(acc, args.scorerId, args.scoreSource);\n  applyScoreFilters(acc, filters);\n\n  const sql = `\n    SELECT ${aggregationSql(args.aggregation, '\"score\"')} AS \"value\"\n    FROM ${qualifiedTable(schema, TABLE_SCORE_EVENTS)}\n    ${whereOrEmpty(acc)}\n  `;\n  const row = await client.oneOrNone<{ value: unknown }>(sql, acc.params);\n  return row?.value == null ? null : Number(row.value);\n}\n\nexport async function getScoreAggregate(\n  client: DbClient,\n  schema: string,\n  args: GetScoreAggregateArgs,\n): Promise<GetScoreAggregateResponse> {\n  const value = await runScoreAggregateQuery(client, schema, args, args.filters);\n\n  if (args.comparePeriod && args.filters?.timestamp) {\n    const prevRange = shiftRange(args.filters.timestamp, args.comparePeriod);\n    if (prevRange) {\n      const previousValue = await runScoreAggregateQuery(client, schema, args, {\n        ...(args.filters ?? {}),\n        timestamp: prevRange,\n      });\n      return {\n        value,\n        previousValue,\n        changePercent: changePercent(value, previousValue),\n      };\n    }\n  }\n  return { value };\n}\n\n// ---------------------------------------------------------------------------\n// OLAP — breakdown\n// ---------------------------------------------------------------------------\n\nexport async function getScoreBreakdown(\n  client: DbClient,\n  schema: string,\n  args: GetScoreBreakdownArgs,\n): Promise<GetScoreBreakdownResponse> {\n  const acc = newFilterAccumulator();\n  // Score breakdowns only support typed columns (no jsonb labels).\n  const resolved = resolveGroupBy(acc, args.groupBy, {\n    typedColumns: SCORE_TYPED_COLUMNS,\n    excludedColumns: COMPLEX_GROUP_BY_EXCLUDED,\n  });\n  pushScoreIdentity(acc, args.scorerId, args.scoreSource);\n  applyScoreFilters(acc, args.filters);\n\n  const sql = `\n    SELECT ${resolved.map(e => e.selectSql).join(', ')},\n           ${aggregationSql(args.aggregation, '\"score\"')} AS \"value\"\n    FROM ${qualifiedTable(schema, TABLE_SCORE_EVENTS)}\n    ${whereOrEmpty(acc)}\n    GROUP BY ${resolved.map(e => e.alias).join(', ')}\n    ORDER BY \"value\" DESC NULLS LAST\n  `;\n  const rows = await client.manyOrNone<Record<string, unknown>>(sql, acc.params);\n\n  return {\n    groups: rows.map(row => ({\n      dimensions: dimensionsFromRow(row, resolved),\n      value: Number(row.value ?? 0),\n    })),\n  };\n}\n\n// ---------------------------------------------------------------------------\n// OLAP — time series\n// ---------------------------------------------------------------------------\n\nexport async function getScoreTimeSeries(\n  client: DbClient,\n  schema: string,\n  args: GetScoreTimeSeriesArgs,\n): Promise<GetScoreTimeSeriesResponse> {\n  const bucket = bucketSql('\"timestamp\"', args.interval);\n\n  if (args.groupBy && args.groupBy.length > 0) {\n    const acc = newFilterAccumulator();\n    const resolved = resolveGroupBy(acc, args.groupBy, {\n      typedColumns: SCORE_TYPED_COLUMNS,\n      excludedColumns: COMPLEX_GROUP_BY_EXCLUDED,\n    });\n    pushScoreIdentity(acc, args.scorerId, args.scoreSource);\n    applyScoreFilters(acc, args.filters);\n\n    const sql = `\n      SELECT ${bucket} AS bucket,\n             ${resolved.map(e => e.selectSql).join(', ')},\n             ${aggregationSql(args.aggregation, '\"score\"')} AS \"value\"\n      FROM ${qualifiedTable(schema, TABLE_SCORE_EVENTS)}\n      ${whereOrEmpty(acc)}\n      GROUP BY bucket, ${resolved.map(e => e.alias).join(', ')}\n      ORDER BY bucket\n    `;\n    const rows = await client.manyOrNone<Record<string, unknown>>(sql, acc.params);\n\n    return {\n      series: collectSeriesByDimensions(\n        rows,\n        resolved,\n        dimValues => ({\n          name: seriesNameFromDimensions(dimValues),\n          points: [] as { timestamp: Date; value: number }[],\n        }),\n        (entry, row) => {\n          entry.points.push({\n            timestamp: bucketDate(row.bucket),\n            value: Number(row.value ?? 0),\n          });\n        },\n      ),\n    };\n  }\n\n  const acc = newFilterAccumulator();\n  pushScoreIdentity(acc, args.scorerId, args.scoreSource);\n  applyScoreFilters(acc, args.filters);\n\n  const sql = `\n    SELECT ${bucket} AS bucket,\n           ${aggregationSql(args.aggregation, '\"score\"')} AS \"value\"\n    FROM ${qualifiedTable(schema, TABLE_SCORE_EVENTS)}\n    ${whereOrEmpty(acc)}\n    GROUP BY bucket\n    ORDER BY bucket\n  `;\n  const rows = await client.manyOrNone<Record<string, unknown>>(sql, acc.params);\n\n  const seriesName = args.scoreSource ? `${args.scorerId}|${args.scoreSource}` : args.scorerId;\n  return {\n    series: [\n      {\n        name: seriesName,\n        points: rows.map(row => ({\n          timestamp: bucketDate(row.bucket),\n          value: Number(row.value ?? 0),\n        })),\n      },\n    ],\n  };\n}\n\n// ---------------------------------------------------------------------------\n// OLAP — percentiles\n// ---------------------------------------------------------------------------\n\nexport async function getScorePercentiles(\n  client: DbClient,\n  schema: string,\n  args: GetScorePercentilesArgs,\n): Promise<GetScorePercentilesResponse> {\n  validatePercentiles(args.percentiles);\n\n  const bucket = bucketSql('\"timestamp\"', args.interval);\n  const acc = newFilterAccumulator();\n  pushScoreIdentity(acc, args.scorerId, args.scoreSource);\n  applyScoreFilters(acc, args.filters);\n\n  const percentileSelect = percentileSelectSql(args.percentiles, '\"score\"');\n\n  const sql = `\n    SELECT ${bucket} AS bucket, ${percentileSelect}\n    FROM ${qualifiedTable(schema, TABLE_SCORE_EVENTS)}\n    ${whereOrEmpty(acc)}\n    GROUP BY bucket\n    ORDER BY bucket\n  `;\n  const rows = await client.manyOrNone<Record<string, unknown>>(sql, acc.params);\n\n  return { series: percentileSeriesFromRows(rows, args.percentiles) };\n}\n","import * as coreStorage from '@mastra/core/storage';\nimport type {\n  QueryThreadsResult,\n  TraceQueryCanonicalField,\n  TraceQueryFeedbackField,\n  TraceQueryField,\n  TraceQueryPredicateField,\n  TraceQueryResponse,\n  TraceQueryScoreField,\n  TraceQuerySpanField,\n  TrustedThreadPredicate,\n  TrustedThreadQueryPlan,\n  TrustedTraceQueryPlan,\n  TrustedTraceQueryPredicate,\n  TrustedTraceQueryScalarPredicate,\n} from '@mastra/core/storage';\n\nimport type { DbClient, TxClient } from '../../../client';\nimport { qualifiedTable, TABLE_FEEDBACK_EVENTS, TABLE_SCORE_EVENTS, TABLE_SPAN_EVENTS } from './ddl';\n\ntype SqlFragment = { sql: string; values: unknown[] };\ntype FieldRegistry<TField extends string> = Record<TField, string>;\ntype RelatedCollection = 'spans' | 'scores' | 'feedback';\ntype TraceSelection = {\n  timeRange: { from: string; to: string };\n  where?: TrustedTraceQueryPredicate;\n};\n\nconst TRACE_STATUS_SQL = `CASE WHEN r.\"error\" IS NOT NULL THEN 'error' ELSE 'success' END`;\n\nconst TRACE_FIELDS = {\n  traceId: 'r.\"traceId\"',\n  threadId: 'r.\"threadId\"',\n  resourceId: 'r.\"resourceId\"',\n  startedAt: 'r.\"startedAt\"',\n  endedAt: 'r.\"endedAt\"',\n  entityName: 'r.\"entityName\"',\n  entityType: 'r.\"entityType\"',\n  environment: 'r.\"environment\"',\n  status: TRACE_STATUS_SQL,\n} satisfies FieldRegistry<TraceQueryField>;\n\nconst SPAN_FIELDS = {\n  name: 's.\"name\"',\n  spanType: 's.\"spanType\"',\n  model: 's.\"model\"',\n  provider: 's.\"provider\"',\n  startedAt: 's.\"startedAt\"',\n  endedAt: 's.\"endedAt\"',\n  durationMs: 's.\"durationMs\"',\n  status: 's.\"status\"',\n  error: 's.\"error\"',\n  entityType: 's.\"entityType\"',\n  entityId: 's.\"entityId\"',\n  entityName: 's.\"entityName\"',\n  entityVersionId: 's.\"entityVersionId\"',\n  parentEntityVersionId: 's.\"parentEntityVersionId\"',\n  rootEntityVersionId: 's.\"rootEntityVersionId\"',\n} satisfies FieldRegistry<TraceQuerySpanField>;\n\nconst SCORE_FIELDS = {\n  scorerId: 's.\"scorerId\"',\n  scorerVersion: 's.\"scorerVersion\"',\n  scoreSource: 's.\"scoreSource\"',\n  score: 's.\"score\"',\n  timestamp: 's.\"timestamp\"',\n  spanId: 's.\"spanId\"',\n  entityVersionId: 's.\"entityVersionId\"',\n  parentEntityVersionId: 's.\"parentEntityVersionId\"',\n  rootEntityVersionId: 's.\"rootEntityVersionId\"',\n} satisfies FieldRegistry<TraceQueryScoreField>;\n\nconst FEEDBACK_FIELDS = {\n  feedbackType: 's.\"feedbackType\"',\n  feedbackSource: 's.\"feedbackSource\"',\n  feedbackUserId: 's.\"feedbackUserId\"',\n  sourceId: 's.\"sourceId\"',\n  entityVersionId: 's.\"entityVersionId\"',\n  parentEntityVersionId: 's.\"parentEntityVersionId\"',\n  rootEntityVersionId: 's.\"rootEntityVersionId\"',\n  timestamp: 's.\"timestamp\"',\n  comment: 's.\"comment\"',\n} satisfies FieldRegistry<Exclude<TraceQueryFeedbackField, 'value'>>;\n\nconst TRACE_SELECT = `\n  r.\"traceId\" AS \"traceId\",\n  r.\"spanId\" AS \"rootSpanId\",\n  r.\"threadId\" AS \"threadId\",\n  r.\"resourceId\" AS \"resourceId\",\n  r.\"startedAt\" AS \"startedAt\",\n  r.\"endedAt\" AS \"endedAt\",\n  r.\"entityName\" AS \"entityName\",\n  r.\"entityType\" AS \"entityType\",\n  r.\"environment\" AS \"environment\",\n  ${TRACE_STATUS_SQL} AS \"status\"`;\n\nfunction fieldSql<TField extends string>(\n  registry: Partial<FieldRegistry<TField>>,\n  field: TraceQueryCanonicalField,\n): string {\n  const sql = registry[field as TField];\n  if (sql === undefined) throw new Error(`Unsupported trusted trace-query field: ${field}`);\n  return sql;\n}\n\nfunction isMetadataField(field: TraceQueryPredicateField): field is `metadata.${string}` {\n  return field.startsWith('metadata.');\n}\n\nfunction placeholders(values: readonly unknown[], offset: number): string {\n  return values.map((_, index) => `$${offset + index}`).join(', ');\n}\n\nfunction compileScalarPredicate<TField extends string>(\n  predicate: TrustedTraceQueryScalarPredicate,\n  registry: Partial<FieldRegistry<TField>>,\n  parameterOffset: number,\n  allowMetadata = false,\n): SqlFragment {\n  if (predicate.type === 'boolean') {\n    const values: unknown[] = [];\n    const parts = predicate.args.map(arg => {\n      const compiled = compileScalarPredicate(arg, registry, parameterOffset + values.length, allowMetadata);\n      values.push(...compiled.values);\n      return `(${compiled.sql})`;\n    });\n    return { sql: parts.join(predicate.operator === 'and' ? ' AND ' : ' OR '), values };\n  }\n\n  if (predicate.type === 'not') {\n    const compiled = compileScalarPredicate(predicate.arg, registry, parameterOffset, allowMetadata);\n    return { sql: `NOT (${compiled.sql})`, values: compiled.values };\n  }\n\n  let field: string;\n  let fieldValues: unknown[] = [];\n  if (isMetadataField(predicate.field)) {\n    if (!allowMetadata) throw new Error(`Unsupported trusted trace-query field: ${predicate.field}`);\n    const keyParameter = `$${parameterOffset++}`;\n    field = `COALESCE(\n      CASE WHEN jsonb_typeof(r.\"metadataSearch\" -> ${keyParameter}) = 'string' THEN r.\"metadataSearch\" ->> ${keyParameter} END,\n      CASE WHEN jsonb_typeof(r.\"metadataRaw\" -> ${keyParameter}) = 'string' THEN NULLIF(btrim(r.\"metadataRaw\" ->> ${keyParameter}), '') END\n    )`;\n    fieldValues = [predicate.field.slice('metadata.'.length)];\n  } else {\n    field = fieldSql(registry, predicate.field);\n  }\n\n  if (predicate.type === 'presence') {\n    return {\n      sql: `${field} IS ${predicate.operator === 'exists' ? 'NOT ' : ''}NULL`,\n      values: fieldValues,\n    };\n  }\n\n  if (predicate.type === 'membership') {\n    const list = placeholders(predicate.values, parameterOffset);\n    if (predicate.operator === 'in') {\n      return { sql: `${field} IS NOT NULL AND ${field} IN (${list})`, values: [...fieldValues, ...predicate.values] };\n    }\n    return { sql: `${field} IS NULL OR ${field} NOT IN (${list})`, values: [...fieldValues, ...predicate.values] };\n  }\n\n  const parameter = `$${parameterOffset}`;\n  const operators = { lt: '<', lte: '<=', gt: '>', gte: '>=' } as const;\n  if (predicate.operator === 'eq') {\n    return { sql: `${field} IS NOT DISTINCT FROM ${parameter}`, values: [...fieldValues, predicate.value] };\n  }\n  if (predicate.operator === 'ne') {\n    return { sql: `${field} IS DISTINCT FROM ${parameter}`, values: [...fieldValues, predicate.value] };\n  }\n  const operator = operators[predicate.operator];\n  if (operator === undefined) throw new Error(`Unsupported trusted trace-query operator: ${predicate.operator}`);\n  return {\n    sql: `${field} IS NOT NULL AND ${field} ${operator} ${parameter}`,\n    values: [...fieldValues, predicate.value],\n  };\n}\n\nfunction compileFeedbackScalarPredicate(\n  predicate: TrustedTraceQueryScalarPredicate,\n  parameterOffset: number,\n): SqlFragment {\n  if (predicate.type === 'boolean') {\n    const values: unknown[] = [];\n    const parts = predicate.args.map(arg => {\n      const compiled = compileFeedbackScalarPredicate(arg, parameterOffset + values.length);\n      values.push(...compiled.values);\n      return `(${compiled.sql})`;\n    });\n    return { sql: parts.join(predicate.operator === 'and' ? ' AND ' : ' OR '), values };\n  }\n  if (predicate.type === 'not') {\n    const compiled = compileFeedbackScalarPredicate(predicate.arg, parameterOffset);\n    return { sql: `NOT (${compiled.sql})`, values: compiled.values };\n  }\n  if (predicate.field !== 'value') {\n    return compileScalarPredicate(predicate, FEEDBACK_FIELDS, parameterOffset);\n  }\n  if (predicate.type === 'presence') {\n    const present = `(s.\"valueString\" IS NOT NULL OR s.\"valueNumber\" IS NOT NULL)`;\n    return { sql: predicate.operator === 'exists' ? present : `NOT ${present}`, values: [] };\n  }\n  const sample = predicate.type === 'membership' ? predicate.values[0] : predicate.value;\n  const field = typeof sample === 'number' ? 's.\"valueNumber\"' : 's.\"valueString\"';\n  return compileScalarPredicate(predicate, { value: field }, parameterOffset);\n}\n\nfunction latestRootPredicate(spanTable: string): string {\n  return `NOT EXISTS (\n    SELECT 1 FROM ${spanTable} newer\n    WHERE newer.\"traceId\" = r.\"traceId\"\n      AND newer.\"parentSpanId\" IS NULL\n      AND newer.\"cursorId\" > r.\"cursorId\"\n  )`;\n}\n\nfunction latestSpanPredicate(spanTable: string): string {\n  return `NOT EXISTS (\n    SELECT 1 FROM ${spanTable} newer\n    WHERE newer.\"traceId\" = s.\"traceId\"\n      AND newer.\"spanId\" = s.\"spanId\"\n      AND (newer.\"isPending\" < s.\"isPending\" OR (newer.\"isPending\" = s.\"isPending\" AND newer.\"cursorId\" > s.\"cursorId\"))\n  )`;\n}\n\nfunction latestScorePredicate(scoreTable: string): string {\n  return `NOT EXISTS (\n    SELECT 1 FROM ${scoreTable} newer\n    WHERE newer.\"scoreId\" = s.\"scoreId\"\n      AND newer.\"cursorId\" > s.\"cursorId\"\n  )`;\n}\n\nfunction latestFeedbackPredicate(feedbackTable: string): string {\n  return `NOT EXISTS (\n    SELECT 1 FROM ${feedbackTable} newer\n    WHERE newer.\"feedbackId\" = s.\"feedbackId\"\n      AND newer.\"cursorId\" > s.\"cursorId\"\n  )`;\n}\n\nfunction collectRelationCollections(\n  predicate: TrustedTraceQueryPredicate | undefined,\n  collections = new Set<RelatedCollection>(),\n): Set<RelatedCollection> {\n  if (!predicate) return collections;\n  if (predicate.type === 'relation') {\n    collections.add(predicate.collection);\n  } else if (predicate.type === 'boolean') {\n    for (const arg of predicate.args) collectRelationCollections(arg, collections);\n  } else if (predicate.type === 'not') {\n    collectRelationCollections(predicate.arg, collections);\n  }\n  return collections;\n}\n\nfunction collectThreadRelationCollections(\n  predicate: TrustedThreadPredicate | undefined,\n  collections: Set<RelatedCollection>,\n): Set<RelatedCollection> {\n  if (!predicate) return collections;\n  if (predicate.type === 'relation') {\n    collectRelationCollections(predicate.predicate, collections);\n  } else if (predicate.type === 'boolean') {\n    for (const arg of predicate.args) collectThreadRelationCollections(arg, collections);\n  } else {\n    collectThreadRelationCollections(predicate.arg, collections);\n  }\n  return collections;\n}\n\nfunction compilePredicate(predicate: TrustedTraceQueryPredicate, parameterOffset: number): SqlFragment {\n  if (predicate.type === 'relation') {\n    const compiled =\n      predicate.collection === 'feedback'\n        ? compileFeedbackScalarPredicate(predicate.predicate, parameterOffset)\n        : compileScalarPredicate(\n            predicate.predicate,\n            predicate.collection === 'spans' ? SPAN_FIELDS : SCORE_FIELDS,\n            parameterOffset,\n          );\n    const table =\n      predicate.collection === 'spans'\n        ? 'current_spans'\n        : predicate.collection === 'scores'\n          ? 'current_scores'\n          : 'current_feedback';\n    const existence = `EXISTS (\n      SELECT 1 FROM ${table} s\n      WHERE s.\"traceId\" IS NOT NULL\n        AND s.\"traceId\" = r.\"traceId\"\n        AND (${compiled.sql})\n    )`;\n    return {\n      sql: predicate.quantifier === 'some' ? existence : `NOT ${existence}`,\n      values: compiled.values,\n    };\n  }\n\n  if (predicate.type === 'boolean') {\n    const values: unknown[] = [];\n    const parts = predicate.args.map(arg => {\n      const compiled = compilePredicate(arg, parameterOffset + values.length);\n      values.push(...compiled.values);\n      return `(${compiled.sql})`;\n    });\n    return { sql: parts.join(predicate.operator === 'and' ? ' AND ' : ' OR '), values };\n  }\n\n  if (predicate.type === 'not') {\n    const compiled = compilePredicate(predicate.arg, parameterOffset);\n    return { sql: `NOT (${compiled.sql})`, values: compiled.values };\n  }\n\n  return compileScalarPredicate(predicate, TRACE_FIELDS, parameterOffset, true);\n}\n\nfunction compileThreadPredicate(predicate: TrustedThreadPredicate, parameterOffset: number): SqlFragment {\n  if (predicate.type === 'relation') {\n    const compiled = compilePredicate(predicate.predicate, parameterOffset);\n    const existence = `EXISTS (\n      SELECT 1 FROM eligible_roots r\n      WHERE r.\"threadId\" = t.\"threadId\"\n        AND (${compiled.sql})\n    )`;\n    return {\n      sql: predicate.quantifier === 'some' ? existence : `NOT ${existence}`,\n      values: compiled.values,\n    };\n  }\n\n  if (predicate.type === 'boolean') {\n    const values: unknown[] = [];\n    const parts = predicate.args.map(arg => {\n      const compiled = compileThreadPredicate(arg, parameterOffset + values.length);\n      values.push(...compiled.values);\n      return `(${compiled.sql})`;\n    });\n    return { sql: parts.join(predicate.operator === 'and' ? ' AND ' : ' OR '), values };\n  }\n\n  const compiled = compileThreadPredicate(predicate.arg, parameterOffset);\n  return { sql: `NOT (${compiled.sql})`, values: compiled.values };\n}\n\nexport interface CompiledPostgresTraceQuery {\n  text: string;\n  values: unknown[];\n}\n\nfunction compilePostgresTraceScope(\n  schema: string,\n  selection: TraceSelection,\n  relationCollections: Set<RelatedCollection>,\n): { ctes: string[]; values: unknown[] } {\n  const spanTable = qualifiedTable(schema, TABLE_SPAN_EVENTS);\n  const scoreTable = qualifiedTable(schema, TABLE_SCORE_EVENTS);\n  const feedbackTable = qualifiedTable(schema, TABLE_FEEDBACK_EVENTS);\n  const values: unknown[] = [selection.timeRange.from, selection.timeRange.to];\n  const rootConditions = [\n    `r.\"parentSpanId\" IS NULL`,\n    latestRootPredicate(spanTable),\n    `NOT r.\"isPending\"`,\n    `r.\"endedAt\" IS NOT NULL`,\n    `r.\"startedAt\" >= $1`,\n    `r.\"startedAt\" < $2`,\n  ];\n  const ctes = [\n    `root_scope AS MATERIALIZED (\n    SELECT *\n    FROM ${spanTable} r\n    WHERE ${rootConditions.join('\\n      AND ')}\n  )`,\n  ];\n\n  if (relationCollections.has('spans')) {\n    ctes.push(`current_spans AS MATERIALIZED (\n    SELECT\n      s.\"traceId\",\n      s.\"name\",\n      s.\"spanType\",\n      CASE WHEN jsonb_typeof(s.\"attributes\" -> 'model') = 'string' THEN s.\"attributes\" ->> 'model' END AS \"model\",\n      CASE WHEN jsonb_typeof(s.\"attributes\" -> 'provider') = 'string' THEN s.\"attributes\" ->> 'provider' END AS \"provider\",\n      s.\"startedAt\",\n      CASE WHEN s.\"isPending\" THEN NULL ELSE s.\"endedAt\" END AS \"endedAt\",\n      CASE\n        WHEN s.\"isPending\" THEN NULL\n        ELSE EXTRACT(EPOCH FROM (s.\"endedAt\" - s.\"startedAt\")) * 1000\n      END AS \"durationMs\",\n      CASE WHEN s.\"error\" IS NOT NULL THEN 'error' ELSE 'success' END AS \"status\",\n      s.\"error\",\n      s.\"entityType\",\n      s.\"entityId\",\n      s.\"entityName\",\n      s.\"entityVersionId\",\n      s.\"parentEntityVersionId\",\n      s.\"rootEntityVersionId\"\n    FROM ${spanTable} s\n    WHERE s.\"traceId\" IS NOT NULL\n      AND s.\"traceId\" IN (SELECT \"traceId\" FROM root_scope)\n      AND ${latestSpanPredicate(spanTable)}\n  )`);\n  }\n  if (relationCollections.has('scores')) {\n    ctes.push(`current_scores AS MATERIALIZED (\n    SELECT\n      s.\"traceId\",\n      s.\"spanId\",\n      s.\"timestamp\",\n      s.\"scorerId\",\n      s.\"scorerVersion\",\n      s.\"scoreSource\",\n      s.\"score\",\n      s.\"entityVersionId\",\n      s.\"parentEntityVersionId\",\n      s.\"rootEntityVersionId\"\n    FROM ${scoreTable} s\n    WHERE s.\"traceId\" IS NOT NULL\n      AND s.\"traceId\" IN (SELECT \"traceId\" FROM root_scope)\n      AND ${latestScorePredicate(scoreTable)}\n  )`);\n  }\n  if (relationCollections.has('feedback')) {\n    ctes.push(`current_feedback AS MATERIALIZED (\n    SELECT\n      s.\"traceId\",\n      s.\"feedbackType\",\n      s.\"feedbackSource\",\n      s.\"feedbackUserId\",\n      s.\"sourceId\",\n      s.\"valueString\",\n      s.\"valueNumber\",\n      s.\"comment\",\n      s.\"timestamp\",\n      s.\"entityVersionId\",\n      s.\"parentEntityVersionId\",\n      s.\"rootEntityVersionId\"\n    FROM ${feedbackTable} s\n    WHERE s.\"traceId\" IS NOT NULL\n      AND s.\"traceId\" IN (SELECT \"traceId\" FROM root_scope)\n      AND ${latestFeedbackPredicate(feedbackTable)}\n  )`);\n  }\n\n  return { ctes, values };\n}\n\nexport function compilePostgresTraceQuery(schema: string, plan: TrustedTraceQueryPlan): CompiledPostgresTraceQuery {\n  const relationCollections = collectRelationCollections(plan.where);\n  const { ctes, values } = compilePostgresTraceScope(schema, plan, relationCollections);\n\n  let predicateSql = 'TRUE';\n  if (plan.where) {\n    const predicate = compilePredicate(plan.where, values.length + 1);\n    predicateSql = predicate.sql;\n    values.push(...predicate.values);\n  }\n  ctes.push(`candidates AS (\n    SELECT ${TRACE_SELECT}\n    FROM root_scope r\n    WHERE ${predicateSql}\n  )`);\n  const candidates = `WITH ${ctes.join(',\\n')}`;\n\n  if (plan.result === 'groups') {\n    const pageCondition = plan.cursor ? `AND \"threadId\" > $${values.length + 1}` : '';\n    if (plan.cursor) values.push(plan.cursor.threadId);\n    values.push(plan.limit + 1);\n    return {\n      text: `${candidates}\nSELECT \"threadId\"\nFROM candidates\nWHERE \"threadId\" IS NOT NULL ${pageCondition}\nGROUP BY \"threadId\"\nORDER BY \"threadId\" ASC\nLIMIT $${values.length}`,\n      values,\n    };\n  }\n\n  const orderField = plan.orderBy.field === 'startedAt' ? '\"startedAt\"' : '\"endedAt\"';\n  const direction = plan.orderBy.direction === 'asc' ? 'ASC' : 'DESC';\n  let pageCondition = '';\n  if (plan.cursor) {\n    const comparison = plan.orderBy.direction === 'asc' ? '>' : '<';\n    const sortParameter = `$${values.length + 1}`;\n    const idParameter = `$${values.length + 2}`;\n    pageCondition = `WHERE (${orderField} ${comparison} ${sortParameter} OR (${orderField} = ${sortParameter} AND \"traceId\" > ${idParameter}))`;\n    values.push(plan.cursor.sortValue, plan.cursor.traceId);\n  }\n  values.push(plan.limit + 1);\n\n  return {\n    text: `${candidates}\nSELECT *\nFROM candidates\n${pageCondition}\nORDER BY ${orderField} ${direction}, \"traceId\" ASC\nLIMIT $${values.length}`,\n    values,\n  };\n}\n\nexport function compilePostgresThreadQuery(schema: string, plan: TrustedThreadQueryPlan): CompiledPostgresTraceQuery {\n  const relationCollections = collectRelationCollections(plan.traces.where);\n  collectThreadRelationCollections(plan.where, relationCollections);\n  const { ctes, values } = compilePostgresTraceScope(schema, plan.traces, relationCollections);\n\n  let eligibilitySql = 'TRUE';\n  if (plan.traces.where) {\n    const eligibility = compilePredicate(plan.traces.where, values.length + 1);\n    eligibilitySql = eligibility.sql;\n    values.push(...eligibility.values);\n  }\n  ctes.push(`eligible_roots AS MATERIALIZED (\n    SELECT *\n    FROM root_scope r\n    WHERE ${eligibilitySql}\n  )`);\n  ctes.push(`thread_ids AS (\n    SELECT \"threadId\" COLLATE \"C\" AS \"threadId\"\n    FROM eligible_roots\n    WHERE \"threadId\" IS NOT NULL\n    GROUP BY \"threadId\" COLLATE \"C\"\n  )`);\n\n  let threadPredicateSql = 'TRUE';\n  if (plan.where) {\n    const predicate = compileThreadPredicate(plan.where, values.length + 1);\n    threadPredicateSql = predicate.sql;\n    values.push(...predicate.values);\n  }\n  ctes.push(`qualified_threads AS (\n    SELECT t.\"threadId\"\n    FROM thread_ids t\n    WHERE ${threadPredicateSql}\n  )`);\n\n  const pageCondition = plan.cursor ? `WHERE \"threadId\" > $${values.length + 1}` : '';\n  if (plan.cursor) values.push(plan.cursor.threadId);\n  values.push(plan.limit + 1);\n\n  return {\n    text: `WITH ${ctes.join(',\\n')}\nSELECT \"threadId\"\nFROM qualified_threads\n${pageCondition}\nORDER BY \"threadId\" ASC\nLIMIT $${values.length}`,\n    values,\n  };\n}\n\nfunction asIsoTimestamp(value: unknown): string {\n  if (value === null || value === undefined) throw new Error('Trace query returned a null timestamp');\n  return value instanceof Date ? value.toISOString() : new Date(value as string | number).toISOString();\n}\n\nfunction isPostgresStatementTimeout(error: unknown): boolean {\n  if (!error || typeof error !== 'object') return false;\n  const candidate = error as { code?: unknown; message?: unknown };\n  return candidate.code === '57014' && String(candidate.message ?? '').includes('statement timeout');\n}\n\nexport async function runWithPostgresTraceQueryTimeout<T>(\n  client: DbClient,\n  timeoutMs: number,\n  execute: (transaction: TxClient) => Promise<T>,\n): Promise<T> {\n  const resolvedTimeoutMs = coreStorage.resolveTraceQueryTimeoutMs(timeoutMs);\n  try {\n    return await client.tx(async transaction => {\n      await transaction.query(`SELECT set_config('statement_timeout', $1, true)`, [`${resolvedTimeoutMs}ms`]);\n      return execute(transaction);\n    });\n  } catch (error) {\n    if (isPostgresStatementTimeout(error)) throw new coreStorage.TraceQueryExecutionError();\n    throw error;\n  }\n}\n\nexport async function queryTraces(\n  client: DbClient,\n  schema: string,\n  plan: TrustedTraceQueryPlan,\n  timeoutMs: number,\n): Promise<TraceQueryResponse> {\n  const query = compilePostgresTraceQuery(schema, plan);\n  const rows = await runWithPostgresTraceQueryTimeout(client, timeoutMs, transaction =>\n    transaction.any<Record<string, unknown>>(query.text, query.values),\n  );\n  const visibleRows = rows.slice(0, plan.limit);\n\n  if (plan.result === 'groups') {\n    const groups = visibleRows.map(row => ({ threadId: String(row.threadId) }));\n    const last = groups.at(-1);\n    return coreStorage.traceQueryResponseSchema.parse({\n      groups,\n      page: {\n        next:\n          rows.length > plan.limit && last\n            ? coreStorage.encodeTraceQueryCursor(plan, { result: 'groups', threadId: last.threadId })\n            : null,\n      },\n    });\n  }\n\n  const traces = visibleRows.map(row => ({\n    traceId: String(row.traceId),\n    rootSpanId: String(row.rootSpanId),\n    threadId: row.threadId == null ? null : String(row.threadId),\n    resourceId: row.resourceId == null ? null : String(row.resourceId),\n    startedAt: asIsoTimestamp(row.startedAt),\n    endedAt: asIsoTimestamp(row.endedAt),\n    entityName: row.entityName == null ? null : String(row.entityName),\n    entityType: row.entityType == null ? null : String(row.entityType),\n    environment: row.environment == null ? null : String(row.environment),\n    status: row.status,\n  }));\n  const last = traces.at(-1);\n  return coreStorage.traceQueryResponseSchema.parse({\n    traces,\n    page: {\n      next:\n        rows.length > plan.limit && last\n          ? coreStorage.encodeTraceQueryCursor(plan, {\n              result: 'traces',\n              sortValue: last[plan.orderBy.field],\n              traceId: last.traceId,\n            })\n          : null,\n    },\n  });\n}\n\nexport async function queryThreads(\n  client: DbClient,\n  schema: string,\n  plan: TrustedThreadQueryPlan,\n  timeoutMs: number,\n): Promise<QueryThreadsResult> {\n  const query = compilePostgresThreadQuery(schema, plan);\n  const rows = await runWithPostgresTraceQueryTimeout(client, timeoutMs, transaction =>\n    transaction.any<Record<string, unknown>>(query.text, query.values),\n  );\n  const threads = rows.slice(0, plan.limit).map(row => ({ threadId: String(row.threadId) }));\n  const last = threads.at(-1);\n  return coreStorage.queryThreadsResultSchema.parse({\n    threads,\n    page: {\n      next:\n        rows.length > plan.limit && last\n          ? coreStorage.encodeTraceQueryCursor(plan, { result: 'threads', threadId: last.threadId })\n          : null,\n    },\n  });\n}\n","/**\n * Trace / branch list reads for the v-next Postgres observability domain.\n *\n * - `listTraces` / `getRootSpan` filter by `parentSpanId IS NULL`. The partial\n *   indexes declared in ddl.ts make this predicate selective enough to act as\n *   the root-span projection without a separate table.\n * - `listBranches` filters by `spanType IN (BRANCH_SPAN_TYPES)` (or the\n *   user-supplied spanType when it's a branch type). Branches include nested\n *   anchors as well as root spans of the listed types.\n */\n\nimport {\n  BRANCH_SPAN_TYPES,\n  listBranchesArgsSchema,\n  listTracesArgsSchema,\n  TraceStatus,\n  toTraceSpans,\n} from '@mastra/core/storage';\nimport type {\n  GetRootSpanArgs,\n  GetRootSpanResponse,\n  ListBranchesArgs,\n  ListBranchesResponse,\n  ListTracesArgs,\n  ListTracesResponse,\n  SpanRecord,\n} from '@mastra/core/storage';\n\nimport type { DbClient } from '../../../client';\nimport { qualifiedTable, TABLE_SPAN_EVENTS } from './ddl';\nimport { rowToSpanRecord } from './helpers';\nimport {\n  assertDeltaPollingEnabled,\n  decodeDeltaCursor,\n  deltaPollingFeatureEnabled,\n  encodeDeltaCursor,\n  readSafeXactHorizon,\n} from './polling';\nimport { SPAN_SELECT_COLUMNS } from './sql';\n\nfunction asIsoTimestamp(value: unknown): string {\n  return value instanceof Date ? value.toISOString() : new Date(value as string | number).toISOString();\n}\n\n/**\n * Ordering that picks the row representing a trace's current root.\n *\n * A trace can hold more than one root row. A span is written once when it\n * starts and again when it ends, and a durable run that suspends ends its root\n * span and opens a fresh one on resume. In both cases the newest row is the one\n * that describes the trace right now, and `cursorId` — a sequence assigned at\n * insert — is what \"newest\" means here. It also orders correctly where\n * timestamps cannot: a zero-duration span has `startedAt = endedAt`, and a\n * resumed root starts after the suspended root ended.\n */\nconst ROOT_COLLAPSE_ORDER = '\"cursorId\" DESC';\n\n/**\n * Predicate that keeps only the winning row for each span — the ended row when\n * one exists, the newest row otherwise. Mirrors `SPAN_COLLAPSE_ORDER` as an\n * anti-join, for the same reason as {@link latestRootPredicate}.\n */\nfunction latestSpanPredicate(spanTable: string): string {\n  return `NOT EXISTS (\n    SELECT 1 FROM ${spanTable} newer\n    WHERE newer.\"traceId\" = r.\"traceId\"\n      AND newer.\"spanId\" = r.\"spanId\"\n      AND (newer.\"isPending\" < r.\"isPending\" OR (newer.\"isPending\" = r.\"isPending\" AND newer.\"cursorId\" > r.\"cursorId\"))\n  )`;\n}\n\n/**\n * Predicate that keeps only a trace's current root row, as an anti-join rather\n * than a `DISTINCT ON`. Written this way so the outer query still scans the\n * partial root indexes and streams rows in `LIMIT`-order; grouping first would\n * force every root in the table to be read before the first page came back.\n */\nfunction latestRootPredicate(spanTable: string): string {\n  return `NOT EXISTS (\n    SELECT 1 FROM ${spanTable} newer\n    WHERE newer.\"traceId\" = r.\"traceId\"\n      AND newer.\"parentSpanId\" IS NULL\n      AND newer.\"cursorId\" > r.\"cursorId\"\n  )`;\n}\n\nexport async function getRootSpan(\n  client: DbClient,\n  schema: string,\n  args: GetRootSpanArgs,\n): Promise<GetRootSpanResponse | null> {\n  const table = qualifiedTable(schema, TABLE_SPAN_EVENTS);\n  const row = await client.oneOrNone<Record<string, any>>(\n    `SELECT ${SPAN_SELECT_COLUMNS}\n     FROM ${table}\n     WHERE \"traceId\" = $1 AND \"parentSpanId\" IS NULL\n     ORDER BY ${ROOT_COLLAPSE_ORDER}\n     LIMIT 1`,\n    [args.traceId],\n  );\n  if (!row) return null;\n  return { span: rowToSpanRecord(row) };\n}\n\n/**\n * Build the WHERE conditions and bind params for a listTraces query against\n * `mastra_span_events r`. Always prepends the root-span predicate so the\n * partial root indexes (and the partial cursor index) get picked up by the\n * planner. Starts numbering from `nextParamIdx`.\n */\nfunction buildListTracesFilters(\n  filters: ListTracesArgs['filters'],\n  spanTable: string,\n  nextParamIdx: number,\n): { conditions: string[]; params: unknown[]; nextParamIdx: number } {\n  const conditions: string[] = [`r.\"parentSpanId\" IS NULL`, latestRootPredicate(spanTable)];\n  const params: unknown[] = [];\n  let i = nextParamIdx;\n\n  if (!filters) {\n    return { conditions, params, nextParamIdx: i };\n  }\n\n  if (filters.startedAt?.start) {\n    conditions.push(`r.\"startedAt\" ${filters.startedAt.startExclusive ? '>' : '>='} $${i++}`);\n    params.push(asIsoTimestamp(filters.startedAt.start));\n  }\n  if (filters.startedAt?.end) {\n    conditions.push(`r.\"startedAt\" ${filters.startedAt.endExclusive ? '<' : '<='} $${i++}`);\n    params.push(asIsoTimestamp(filters.startedAt.end));\n  }\n  // A pending row stores a placeholder `endedAt`, so an endedAt range filter\n  // has to exclude it: a span that has not ended has no end time to match.\n  if (filters.endedAt?.start) {\n    conditions.push(`(NOT r.\"isPending\" AND r.\"endedAt\" ${filters.endedAt.startExclusive ? '>' : '>='} $${i++})`);\n    params.push(asIsoTimestamp(filters.endedAt.start));\n  }\n  if (filters.endedAt?.end) {\n    conditions.push(`(NOT r.\"isPending\" AND r.\"endedAt\" ${filters.endedAt.endExclusive ? '<' : '<='} $${i++})`);\n    params.push(asIsoTimestamp(filters.endedAt.end));\n  }\n  if (filters.spanType !== undefined) {\n    conditions.push(`r.\"spanType\" = $${i++}`);\n    params.push(filters.spanType);\n  }\n  if (filters.entityType !== undefined) {\n    conditions.push(`r.\"entityType\" = $${i++}`);\n    params.push(filters.entityType);\n  }\n  if (filters.entityId !== undefined) {\n    conditions.push(`r.\"entityId\" = $${i++}`);\n    params.push(filters.entityId);\n  }\n  if (filters.entityName !== undefined) {\n    conditions.push(`r.\"entityName\" = $${i++}`);\n    params.push(filters.entityName);\n  }\n  if (filters.userId !== undefined) {\n    conditions.push(`r.\"userId\" = $${i++}`);\n    params.push(filters.userId);\n  }\n  if (filters.organizationId !== undefined) {\n    conditions.push(`r.\"organizationId\" = $${i++}`);\n    params.push(filters.organizationId);\n  }\n  if (filters.resourceId !== undefined) {\n    conditions.push(`r.\"resourceId\" = $${i++}`);\n    params.push(filters.resourceId);\n  }\n  if (filters.runId !== undefined) {\n    conditions.push(`r.\"runId\" = $${i++}`);\n    params.push(filters.runId);\n  }\n  if (filters.sessionId !== undefined) {\n    conditions.push(`r.\"sessionId\" = $${i++}`);\n    params.push(filters.sessionId);\n  }\n  if (filters.threadId !== undefined) {\n    conditions.push(`r.\"threadId\" = $${i++}`);\n    params.push(filters.threadId);\n  }\n  if (filters.requestId !== undefined) {\n    conditions.push(`r.\"requestId\" = $${i++}`);\n    params.push(filters.requestId);\n  }\n  if (filters.environment !== undefined) {\n    conditions.push(`r.\"environment\" = $${i++}`);\n    params.push(filters.environment);\n  }\n  if (filters.source !== undefined) {\n    conditions.push(`r.\"executionSource\" = $${i++}`);\n    params.push(filters.source);\n  }\n  if (filters.serviceName !== undefined) {\n    conditions.push(`r.\"serviceName\" = $${i++}`);\n    params.push(filters.serviceName);\n  }\n  if (filters.metadata != null) {\n    conditions.push(`r.\"metadataSearch\" @> $${i++}::jsonb`);\n    params.push(JSON.stringify(filters.metadata));\n  }\n  if (filters.tags != null && filters.tags.length > 0) {\n    conditions.push(`r.\"tags\" @> $${i++}::text[]`);\n    params.push(filters.tags);\n  }\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.\"isPending\"`);\n        break;\n      case TraceStatus.SUCCESS:\n        conditions.push(`r.\"error\" IS NULL AND NOT r.\"isPending\"`);\n        break;\n    }\n  }\n  if (filters.hasChildError !== undefined) {\n    const sub = `EXISTS (\n      SELECT 1 FROM ${spanTable} c\n      WHERE c.\"traceId\" = r.\"traceId\" AND c.\"spanId\" <> r.\"spanId\" AND c.\"error\" IS NOT NULL\n    )`;\n    conditions.push(filters.hasChildError ? sub : `NOT ${sub}`);\n  }\n\n  return { conditions, params, nextParamIdx: i };\n}\n\n/**\n * Project the standard span columns with the `r.` alias prefix.\n *\n * Built by string-munging `SPAN_SELECT_COLUMNS` (a constant in sql.ts) at\n * module load. This works because every entry in that list is a bare\n * column name like `\"traceId\"` — no expressions, no functions. If anyone\n * ever adds something like `COALESCE(...)` to `SPAN_SELECT_COLUMNS`, the\n * naive split-on-comma breaks. Keep both lists shaped as plain column\n * names; if you need computed columns, switch to a structured\n * array-of-strings representation here.\n */\nconst SPAN_SELECT_COLUMNS_ALIASED = SPAN_SELECT_COLUMNS.replace(/\\n/g, ' ')\n  .split(',')\n  .map(c => `r.${c.trim()}`)\n  .join(', ');\n\nexport async function listTraces(client: DbClient, schema: string, args: ListTracesArgs): Promise<ListTracesResponse> {\n  const { mode, filters, pagination, orderBy, after, limit } = listTracesArgsSchema.parse(args);\n  const span = qualifiedTable(schema, TABLE_SPAN_EVENTS);\n\n  if (mode === 'delta') {\n    assertDeltaPollingEnabled();\n    return listTracesDelta(client, span, filters, after, limit);\n  }\n\n  return listTracesPage(client, span, filters, pagination.page, pagination.perPage, orderBy.field, orderBy.direction);\n}\n\nasync function listTracesPage(\n  client: DbClient,\n  span: string,\n  filters: ListTracesArgs['filters'],\n  page: number,\n  perPage: number,\n  orderField: 'startedAt' | 'endedAt',\n  orderDir: 'ASC' | 'DESC',\n): Promise<ListTracesResponse> {\n  const { conditions, params, nextParamIdx } = buildListTracesFilters(filters, span, 1);\n  let i = nextParamIdx;\n  const whereClause = `WHERE ${conditions.join(' AND ')}`;\n  const orderClause =\n    orderField === 'endedAt'\n      ? `ORDER BY r.\"endedAt\" ${orderDir} NULLS ${orderDir === 'DESC' ? 'FIRST' : 'LAST'}, r.\"cursorId\" ${orderDir}`\n      : `ORDER BY r.\"${orderField}\" ${orderDir}, r.\"cursorId\" ${orderDir}`;\n\n  const countRow = await client.oneOrNone<{ count: string }>(\n    `SELECT COUNT(*)::text AS count FROM ${span} r ${whereClause}`,\n    params,\n  );\n  const count = Number(countRow?.count ?? 0);\n\n  let spans: SpanRecord[] = [];\n  if (count > 0) {\n    const rows = await client.manyOrNone<Record<string, any>>(\n      `SELECT ${SPAN_SELECT_COLUMNS_ALIASED}\n       FROM ${span} r\n       ${whereClause}\n       ${orderClause}\n       LIMIT $${i++} OFFSET $${i++}`,\n      [...params, perPage, page * perPage],\n    );\n    spans = rows.map(rowToSpanRecord);\n  }\n\n  const deltaCursor = deltaPollingFeatureEnabled()\n    ? await readTracesStreamHeadCursor(client, span, filters)\n    : undefined;\n\n  return {\n    pagination: { total: count, page, perPage, hasMore: (page + 1) * perPage < count },\n    spans: toTraceSpans(spans),\n    ...(deltaCursor !== undefined ? { deltaCursor } : {}),\n  };\n}\n\nasync function listTracesDelta(\n  client: DbClient,\n  span: string,\n  filters: ListTracesArgs['filters'],\n  after: string | undefined,\n  limit: number,\n): Promise<ListTracesResponse> {\n  if (after === undefined) {\n    const deltaCursor = await readTracesStreamHeadCursor(client, span, filters);\n    return { spans: [], delta: { limit, hasMore: false }, deltaCursor };\n  }\n\n  const afterCursor = decodeDeltaCursor(after);\n  const safeHorizon = await readSafeXactHorizon(client);\n  const { conditions, params, nextParamIdx } = buildListTracesFilters(filters, span, 1);\n  let i = nextParamIdx;\n  conditions.push(`(r.\"xactId\", r.\"cursorId\") > ($${i++}::xid8, $${i++}::bigint)`);\n  params.push(afterCursor.xactId, afterCursor.cursorId);\n  conditions.push(`r.\"xactId\" < $${i++}::xid8`);\n  params.push(safeHorizon);\n\n  const rows = await client.manyOrNone<Record<string, any>>(\n    `SELECT ${SPAN_SELECT_COLUMNS_ALIASED}\n     FROM ${span} r\n     WHERE ${conditions.join(' AND ')}\n     ORDER BY r.\"xactId\" ASC, r.\"cursorId\" ASC\n     LIMIT $${i++}`,\n    [...params, limit + 1],\n  );\n\n  const hasMore = rows.length > limit;\n  const visible = rows.slice(0, limit);\n  const deltaCursor =\n    visible.length > 0\n      ? encodeDeltaCursor(visible[visible.length - 1]!.xactId, visible[visible.length - 1]!.cursorId)\n      : encodeDeltaCursor(safeHorizon, 0);\n\n  return {\n    spans: toTraceSpans(visible.map(rowToSpanRecord)),\n    delta: { limit, hasMore },\n    deltaCursor,\n  };\n}\n\nasync function readTracesStreamHeadCursor(\n  client: DbClient,\n  span: string,\n  filters: ListTracesArgs['filters'],\n): Promise<string> {\n  void span;\n  void filters;\n  return encodeDeltaCursor(await readSafeXactHorizon(client), 0);\n}\n\n// ---------------------------------------------------------------------------\n// listBranches\n// ---------------------------------------------------------------------------\n\nconst BRANCH_SPAN_TYPE_SET = new Set<string>(BRANCH_SPAN_TYPES);\n\n/**\n * Build the spanType predicate for a branch query. If the caller supplied a\n * specific branch type, narrow to that one; otherwise match the full\n * BRANCH_SPAN_TYPES set. Pushes the bind params onto `params` and returns the\n * SQL fragment plus the next param index.\n */\nfunction buildBranchSpanTypeClause(\n  userSpanType: string | undefined,\n  params: unknown[],\n  startIdx: number,\n): { clause: string; nextIdx: number } | null {\n  if (userSpanType !== undefined) {\n    if (!BRANCH_SPAN_TYPE_SET.has(userSpanType)) {\n      // Caller asked for a non-branch spanType — intersection is empty.\n      return null;\n    }\n    params.push(userSpanType);\n    return { clause: `r.\"spanType\" = $${startIdx}`, nextIdx: startIdx + 1 };\n  }\n  const placeholders: string[] = [];\n  for (const t of BRANCH_SPAN_TYPES) {\n    placeholders.push(`$${startIdx + placeholders.length}`);\n    params.push(t);\n  }\n  return { clause: `r.\"spanType\" IN (${placeholders.join(', ')})`, nextIdx: startIdx + placeholders.length };\n}\n\n/**\n * Apply branch filters (spanType + the shared context surface). Branches do\n * NOT have a `parentSpanId IS NULL` predicate — branches can be nested under\n * other spans. Returns the bound params and the next param index.\n */\nfunction buildListBranchesFilters(\n  filters: ListBranchesArgs['filters'],\n  spanType: string | undefined,\n  spanTable: string,\n  nextParamIdx: number,\n): { conditions: string[]; params: unknown[]; nextParamIdx: number } | null {\n  const conditions: string[] = [latestSpanPredicate(spanTable)];\n  const params: unknown[] = [];\n  let i = nextParamIdx;\n\n  const spanTypeClause = buildBranchSpanTypeClause(spanType, params, i);\n  if (!spanTypeClause) return null;\n  conditions.push(spanTypeClause.clause);\n  i = spanTypeClause.nextIdx;\n\n  if (!filters) return { conditions, params, nextParamIdx: i };\n\n  if (filters.startedAt?.start) {\n    conditions.push(`r.\"startedAt\" ${filters.startedAt.startExclusive ? '>' : '>='} $${i++}`);\n    params.push(asIsoTimestamp(filters.startedAt.start));\n  }\n  if (filters.startedAt?.end) {\n    conditions.push(`r.\"startedAt\" ${filters.startedAt.endExclusive ? '<' : '<='} $${i++}`);\n    params.push(asIsoTimestamp(filters.startedAt.end));\n  }\n  // A pending row stores a placeholder `endedAt`, so an endedAt range filter\n  // has to exclude it: a span that has not ended has no end time to match.\n  if (filters.endedAt?.start) {\n    conditions.push(`(NOT r.\"isPending\" AND r.\"endedAt\" ${filters.endedAt.startExclusive ? '>' : '>='} $${i++})`);\n    params.push(asIsoTimestamp(filters.endedAt.start));\n  }\n  if (filters.endedAt?.end) {\n    conditions.push(`(NOT r.\"isPending\" AND r.\"endedAt\" ${filters.endedAt.endExclusive ? '<' : '<='} $${i++})`);\n    params.push(asIsoTimestamp(filters.endedAt.end));\n  }\n  if (filters.traceId !== undefined) {\n    conditions.push(`r.\"traceId\" = $${i++}`);\n    params.push(filters.traceId);\n  }\n  if (filters.entityType !== undefined) {\n    conditions.push(`r.\"entityType\" = $${i++}`);\n    params.push(filters.entityType);\n  }\n  if (filters.entityId !== undefined) {\n    conditions.push(`r.\"entityId\" = $${i++}`);\n    params.push(filters.entityId);\n  }\n  if (filters.entityName !== undefined) {\n    conditions.push(`r.\"entityName\" = $${i++}`);\n    params.push(filters.entityName);\n  }\n  if (filters.entityVersionId !== undefined) {\n    conditions.push(`r.\"entityVersionId\" = $${i++}`);\n    params.push(filters.entityVersionId);\n  }\n  if (filters.parentEntityType !== undefined) {\n    conditions.push(`r.\"parentEntityType\" = $${i++}`);\n    params.push(filters.parentEntityType);\n  }\n  if (filters.parentEntityId !== undefined) {\n    conditions.push(`r.\"parentEntityId\" = $${i++}`);\n    params.push(filters.parentEntityId);\n  }\n  if (filters.parentEntityName !== undefined) {\n    conditions.push(`r.\"parentEntityName\" = $${i++}`);\n    params.push(filters.parentEntityName);\n  }\n  if (filters.parentEntityVersionId !== undefined) {\n    conditions.push(`r.\"parentEntityVersionId\" = $${i++}`);\n    params.push(filters.parentEntityVersionId);\n  }\n  if (filters.rootEntityType !== undefined) {\n    conditions.push(`r.\"rootEntityType\" = $${i++}`);\n    params.push(filters.rootEntityType);\n  }\n  if (filters.rootEntityId !== undefined) {\n    conditions.push(`r.\"rootEntityId\" = $${i++}`);\n    params.push(filters.rootEntityId);\n  }\n  if (filters.rootEntityName !== undefined) {\n    conditions.push(`r.\"rootEntityName\" = $${i++}`);\n    params.push(filters.rootEntityName);\n  }\n  if (filters.rootEntityVersionId !== undefined) {\n    conditions.push(`r.\"rootEntityVersionId\" = $${i++}`);\n    params.push(filters.rootEntityVersionId);\n  }\n  if (filters.userId !== undefined) {\n    conditions.push(`r.\"userId\" = $${i++}`);\n    params.push(filters.userId);\n  }\n  if (filters.organizationId !== undefined) {\n    conditions.push(`r.\"organizationId\" = $${i++}`);\n    params.push(filters.organizationId);\n  }\n  if (filters.resourceId !== undefined) {\n    conditions.push(`r.\"resourceId\" = $${i++}`);\n    params.push(filters.resourceId);\n  }\n  if (filters.runId !== undefined) {\n    conditions.push(`r.\"runId\" = $${i++}`);\n    params.push(filters.runId);\n  }\n  if (filters.sessionId !== undefined) {\n    conditions.push(`r.\"sessionId\" = $${i++}`);\n    params.push(filters.sessionId);\n  }\n  if (filters.threadId !== undefined) {\n    conditions.push(`r.\"threadId\" = $${i++}`);\n    params.push(filters.threadId);\n  }\n  if (filters.requestId !== undefined) {\n    conditions.push(`r.\"requestId\" = $${i++}`);\n    params.push(filters.requestId);\n  }\n  if (filters.experimentId !== undefined) {\n    conditions.push(`r.\"experimentId\" = $${i++}`);\n    params.push(filters.experimentId);\n  }\n  if (filters.environment !== undefined) {\n    conditions.push(`r.\"environment\" = $${i++}`);\n    params.push(filters.environment);\n  }\n  if (filters.serviceName !== undefined) {\n    conditions.push(`r.\"serviceName\" = $${i++}`);\n    params.push(filters.serviceName);\n  }\n  if (filters.source !== undefined) {\n    conditions.push(`r.\"executionSource\" = $${i++}`);\n    params.push(filters.source);\n  }\n  if (filters.metadata != null) {\n    conditions.push(`r.\"metadataSearch\" @> $${i++}::jsonb`);\n    params.push(JSON.stringify(filters.metadata));\n  }\n  if (filters.tags != null && filters.tags.length > 0) {\n    conditions.push(`r.\"tags\" @> $${i++}::text[]`);\n    params.push(filters.tags);\n  }\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.\"isPending\"`);\n        break;\n      case TraceStatus.SUCCESS:\n        conditions.push(`r.\"error\" IS NULL AND NOT r.\"isPending\"`);\n        break;\n    }\n  }\n\n  return { conditions, params, nextParamIdx: i };\n}\n\nexport async function listBranches(\n  client: DbClient,\n  schema: string,\n  args: ListBranchesArgs,\n): Promise<ListBranchesResponse> {\n  const { mode, filters, pagination, orderBy, after, limit } = listBranchesArgsSchema.parse(args);\n  const span = qualifiedTable(schema, TABLE_SPAN_EVENTS);\n\n  if (mode === 'delta') {\n    assertDeltaPollingEnabled();\n    return listBranchesDelta(client, span, filters, after, limit);\n  }\n\n  return listBranchesPage(client, span, filters, pagination.page, pagination.perPage, orderBy.field, orderBy.direction);\n}\n\nasync function listBranchesPage(\n  client: DbClient,\n  span: string,\n  filters: ListBranchesArgs['filters'],\n  page: number,\n  perPage: number,\n  orderField: 'startedAt' | 'endedAt',\n  orderDir: 'ASC' | 'DESC',\n): Promise<ListBranchesResponse> {\n  const built = buildListBranchesFilters(filters, filters?.spanType, span, 1);\n  if (!built) {\n    // Caller asked for a non-branch spanType — nothing matches by definition.\n    const deltaCursor = deltaPollingFeatureEnabled()\n      ? await readBranchesStreamHeadCursor(client, span, filters)\n      : undefined;\n    return {\n      pagination: { total: 0, page, perPage, hasMore: false },\n      branches: [],\n      ...(deltaCursor !== undefined ? { deltaCursor } : {}),\n    };\n  }\n\n  const { conditions, params, nextParamIdx } = built;\n  let i = nextParamIdx;\n  const whereClause = `WHERE ${conditions.join(' AND ')}`;\n  const orderClause =\n    orderField === 'endedAt'\n      ? `ORDER BY r.\"endedAt\" ${orderDir} NULLS ${orderDir === 'DESC' ? 'FIRST' : 'LAST'}, r.\"cursorId\" ${orderDir}`\n      : `ORDER BY r.\"${orderField}\" ${orderDir}, r.\"cursorId\" ${orderDir}`;\n\n  const countRow = await client.oneOrNone<{ count: string }>(\n    `SELECT COUNT(*)::text AS count FROM ${span} r ${whereClause}`,\n    params,\n  );\n  const count = Number(countRow?.count ?? 0);\n\n  let spans: SpanRecord[] = [];\n  if (count > 0) {\n    const rows = await client.manyOrNone<Record<string, any>>(\n      `SELECT ${SPAN_SELECT_COLUMNS_ALIASED}\n       FROM ${span} r\n       ${whereClause}\n       ${orderClause}\n       LIMIT $${i++} OFFSET $${i++}`,\n      [...params, perPage, page * perPage],\n    );\n    spans = rows.map(rowToSpanRecord);\n  }\n\n  const deltaCursor = deltaPollingFeatureEnabled()\n    ? await readBranchesStreamHeadCursor(client, span, filters)\n    : undefined;\n\n  return {\n    pagination: { total: count, page, perPage, hasMore: (page + 1) * perPage < count },\n    branches: toTraceSpans(spans),\n    ...(deltaCursor !== undefined ? { deltaCursor } : {}),\n  };\n}\n\nasync function listBranchesDelta(\n  client: DbClient,\n  span: string,\n  filters: ListBranchesArgs['filters'],\n  after: string | undefined,\n  limit: number,\n): Promise<ListBranchesResponse> {\n  if (after === undefined) {\n    const deltaCursor = await readBranchesStreamHeadCursor(client, span, filters);\n    return { branches: [], delta: { limit, hasMore: false }, deltaCursor };\n  }\n\n  const built = buildListBranchesFilters(filters, filters?.spanType, span, 1);\n  if (!built) {\n    return {\n      branches: [],\n      delta: { limit, hasMore: false },\n      deltaCursor: await readBranchesStreamHeadCursor(client, span, filters),\n    };\n  }\n\n  const { conditions, params, nextParamIdx } = built;\n  let i = nextParamIdx;\n  const afterCursor = decodeDeltaCursor(after);\n  const safeHorizon = await readSafeXactHorizon(client);\n  conditions.push(`(r.\"xactId\", r.\"cursorId\") > ($${i++}::xid8, $${i++}::bigint)`);\n  params.push(afterCursor.xactId, afterCursor.cursorId);\n  conditions.push(`r.\"xactId\" < $${i++}::xid8`);\n  params.push(safeHorizon);\n\n  const rows = await client.manyOrNone<Record<string, any>>(\n    `SELECT ${SPAN_SELECT_COLUMNS_ALIASED}\n     FROM ${span} r\n     WHERE ${conditions.join(' AND ')}\n     ORDER BY r.\"xactId\" ASC, r.\"cursorId\" ASC\n     LIMIT $${i++}`,\n    [...params, limit + 1],\n  );\n\n  const hasMore = rows.length > limit;\n  const visible = rows.slice(0, limit);\n  const deltaCursor =\n    visible.length > 0\n      ? encodeDeltaCursor(visible[visible.length - 1]!.xactId, visible[visible.length - 1]!.cursorId)\n      : encodeDeltaCursor(safeHorizon, 0);\n\n  return {\n    branches: toTraceSpans(visible.map(rowToSpanRecord)),\n    delta: { limit, hasMore },\n    deltaCursor,\n  };\n}\n\n/**\n * Branch bootstrap cursor. It points at the safe transaction horizon, not at\n * the current max cursorId, so a late-committing branch cannot be skipped.\n */\nasync function readBranchesStreamHeadCursor(\n  client: DbClient,\n  span: string,\n  filters: ListBranchesArgs['filters'],\n): Promise<string> {\n  void span;\n  void filters;\n  return encodeDeltaCursor(await readSafeXactHorizon(client), 0);\n}\n","/**\n * Tracing operations for the v-next Postgres observability domain.\n *\n * Event-sourced: a span is written when it starts and again when it ends, so a\n * running span is visible before its result exists. The two rows differ in\n * `endedAt` (part of the primary key), so they coexist; reads collapse them\n * back to one span per `(traceId, spanId)`.\n */\n\nimport type {\n  BatchCreateSpansArgs,\n  BatchDeleteTracesArgs,\n  CreateSpanArgs,\n  GetSpansArgs,\n  GetSpansResponse,\n  GetSpanArgs,\n  GetSpanResponse,\n  GetTraceArgs,\n  GetTraceResponse,\n  GetTraceLightResponse,\n} from '@mastra/core/storage';\n\nimport type { DbClient } from '../../../client';\nimport {\n  qualifiedTable,\n  TABLE_FEEDBACK_EVENTS,\n  TABLE_LOG_EVENTS,\n  TABLE_METRIC_EVENTS,\n  TABLE_SCORE_EVENTS,\n  TABLE_SPAN_EVENTS,\n} from './ddl';\nimport { rowToLightSpanRecord, rowToSpanRecord, spanRecordToRow } from './helpers';\nimport {\n  buildInsert,\n  spanConflictClause,\n  SPAN_COLLAPSE_ORDER,\n  SPAN_LIGHT_SELECT_COLUMNS,\n  SPAN_SELECT_COLUMNS,\n} from './sql';\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nasync function writeSpanRows(client: DbClient, schema: string, rows: Record<string, unknown>[]): Promise<void> {\n  const deduped = dedupeSpanRows(rows);\n  const insert = buildInsert(schema, TABLE_SPAN_EVENTS, deduped, spanConflictClause(Object.keys(deduped[0] ?? {})));\n  if (insert) await client.query(insert.text, insert.values);\n}\n\n/**\n * Collapse rows that share a primary key within a single batch. Postgres\n * rejects an `ON CONFLICT DO UPDATE` statement whose VALUES list would touch\n * the same row twice, which a batch containing both the start and the end of a\n * zero-duration span would do. The ended row wins, matching what the conflict\n * clause would have done across two separate statements.\n */\nfunction dedupeSpanRows(rows: Record<string, unknown>[]): Record<string, unknown>[] {\n  if (rows.length < 2) return rows;\n  const byKey = new Map<string, Record<string, unknown>>();\n  for (const row of rows) {\n    const key = `${row.traceId}\\u0000${row.spanId}\\u0000${String(row.endedAt)}`;\n    const existing = byKey.get(key);\n    if (existing && !existing.isPending) continue;\n    byKey.set(key, row);\n  }\n  return [...byKey.values()];\n}\n\nexport async function createSpan(client: DbClient, schema: string, args: CreateSpanArgs): Promise<void> {\n  await writeSpanRows(client, schema, [spanRecordToRow(args.span)]);\n}\n\nexport async function batchCreateSpans(client: DbClient, schema: string, args: BatchCreateSpansArgs): Promise<void> {\n  if (args.records.length === 0) return;\n  await writeSpanRows(client, schema, args.records.map(spanRecordToRow));\n}\n\n// ---------------------------------------------------------------------------\n// Reads\n// ---------------------------------------------------------------------------\n\nexport async function getSpans(client: DbClient, schema: string, args: GetSpansArgs): Promise<GetSpansResponse> {\n  if (args.spanIds.length === 0) {\n    return { traceId: args.traceId, spans: [] };\n  }\n\n  const table = qualifiedTable(schema, TABLE_SPAN_EVENTS);\n  const rows = await client.manyOrNone<Record<string, any>>(\n    `SELECT * FROM (\n       SELECT DISTINCT ON (\"spanId\") ${SPAN_SELECT_COLUMNS}\n       FROM ${table}\n       WHERE \"traceId\" = $1\n         AND \"spanId\" = ANY($2::text[])\n       ORDER BY \"spanId\", ${SPAN_COLLAPSE_ORDER}\n     ) collapsed\n     ORDER BY \"startedAt\" ASC`,\n    [args.traceId, args.spanIds],\n  );\n\n  return { traceId: args.traceId, spans: rows.map(rowToSpanRecord) };\n}\n\nexport async function getSpan(client: DbClient, schema: string, args: GetSpanArgs): Promise<GetSpanResponse | null> {\n  const table = qualifiedTable(schema, TABLE_SPAN_EVENTS);\n  const row = await client.oneOrNone<Record<string, any>>(\n    `SELECT ${SPAN_SELECT_COLUMNS}\n     FROM ${table}\n     WHERE \"traceId\" = $1 AND \"spanId\" = $2\n     ORDER BY ${SPAN_COLLAPSE_ORDER}\n     LIMIT 1`,\n    [args.traceId, args.spanId],\n  );\n  if (!row) return null;\n  return { span: rowToSpanRecord(row) };\n}\n\nexport async function getTrace(client: DbClient, schema: string, args: GetTraceArgs): Promise<GetTraceResponse | null> {\n  const table = qualifiedTable(schema, TABLE_SPAN_EVENTS);\n  const rows = await client.manyOrNone<Record<string, any>>(\n    `SELECT * FROM (\n       SELECT DISTINCT ON (\"spanId\") ${SPAN_SELECT_COLUMNS}\n       FROM ${table}\n       WHERE \"traceId\" = $1\n       ORDER BY \"spanId\", ${SPAN_COLLAPSE_ORDER}\n     ) collapsed\n     ORDER BY \"startedAt\" ASC`,\n    [args.traceId],\n  );\n  if (!rows.length) return null;\n  return { traceId: args.traceId, spans: rows.map(rowToSpanRecord) };\n}\n\nexport async function getTraceLight(\n  client: DbClient,\n  schema: string,\n  args: GetTraceArgs,\n): Promise<GetTraceLightResponse | null> {\n  const table = qualifiedTable(schema, TABLE_SPAN_EVENTS);\n  const rows = await client.manyOrNone<Record<string, any>>(\n    `SELECT * FROM (\n       SELECT DISTINCT ON (\"spanId\") ${SPAN_LIGHT_SELECT_COLUMNS}\n       FROM ${table}\n       WHERE \"traceId\" = $1\n       ORDER BY \"spanId\", ${SPAN_COLLAPSE_ORDER}\n     ) collapsed\n     ORDER BY \"startedAt\" ASC`,\n    [args.traceId],\n  );\n  if (!rows.length) return null;\n  return {\n    traceId: args.traceId,\n    spans: rows.map(rowToLightSpanRecord),\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Deletes\n// ---------------------------------------------------------------------------\n\n/**\n * Delete traces by traceId, cascading to trace-linked signal events\n * (metrics, logs, scores, feedback). Signal rows with a NULL traceId are\n * never affected. When the optional tenant scope (`organizationId` /\n * `resourceId`) is set, every DELETE additionally requires the row's tenant\n * columns to match.\n */\nexport async function batchDeleteTraces(client: DbClient, schema: string, args: BatchDeleteTracesArgs): Promise<void> {\n  if (args.traceIds.length === 0) return;\n\n  const params: unknown[] = [...args.traceIds];\n  const placeholders = args.traceIds.map((_, i) => `$${i + 1}`).join(', ');\n\n  let scopeCondition = '';\n  if (args.organizationId !== undefined) {\n    params.push(args.organizationId);\n    scopeCondition += ` AND \"organizationId\" = $${params.length}`;\n  }\n  if (args.resourceId !== undefined) {\n    params.push(args.resourceId);\n    scopeCondition += ` AND \"resourceId\" = $${params.length}`;\n  }\n\n  const tables = [TABLE_SPAN_EVENTS, TABLE_METRIC_EVENTS, TABLE_LOG_EVENTS, TABLE_SCORE_EVENTS, TABLE_FEEDBACK_EVENTS];\n  await client.tx(async t => {\n    for (const tableName of tables) {\n      const table = qualifiedTable(schema, tableName);\n      await t.query(`DELETE FROM ${table} WHERE \"traceId\" IN (${placeholders})${scopeCondition}`, params);\n    }\n  });\n}\n\n/** Truncate the span_events table. */\nexport async function dangerouslyClearTracing(client: DbClient, schema: string): Promise<void> {\n  const span = qualifiedTable(schema, TABLE_SPAN_EVENTS);\n  // RESTART IDENTITY resets the owned `cursorId` bigserial sequence so tests\n  // that clear and then exercise delta polling start from a known cursor.\n  await client.none(`TRUNCATE TABLE ${span} RESTART IDENTITY`);\n}\n","/**\n * Postgres v-next observability storage domain.\n *\n * Insert-only model. Mirrors the ClickHouse v-next layout but adapted for\n * Postgres semantics:\n *   - per-signal partitioned tables (or Timescale hypertables when the\n *     extension is detected)\n *   - retry idempotency via `ON CONFLICT DO NOTHING` on the partition-aware\n *     primary key (the ClickHouse design uses ReplacingMergeTree dedupeKey)\n *   - root-span reads served by partial indexes on the span events table\n *   - discovery values cached in a Postgres table with stale-while-revalidate\n *     semantics, so cache state survives serverless restarts and works\n *     across multiple frontends pointing at the same DB\n *\n * IMPORTANT: this domain is intended for **low-volume production** workloads\n * only. Customers running more than ~100 calls/sec sustained should use the\n * ClickHouse adapter. See `observability/postgres-design/recommendation.md`\n * for the volume math behind this guidance.\n *\n * The adapter should NOT share a database with the customer's primary\n * application database — observability writes will degrade app performance.\n * Use it through `MastraCompositeStore` with a dedicated Postgres connection.\n */\n\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport * as coreStorage from '@mastra/core/storage';\nimport { createStorageErrorId, ObservabilityStorage } from '@mastra/core/storage';\nimport type {\n  BatchCreateFeedbackArgs,\n  BatchCreateLogsArgs,\n  BatchCreateMetricsArgs,\n  BatchCreateScoresArgs,\n  BatchCreateSpansArgs,\n  BatchDeleteTracesArgs,\n  CreateFeedbackArgs,\n  CreateScoreArgs,\n  DeleteFeedbackArgs,\n  DeleteScoresArgs,\n  CreateSpanArgs,\n  GetEntityNamesArgs,\n  GetEntityNamesResponse,\n  GetEntityTypesArgs,\n  GetEntityTypesResponse,\n  GetEnvironmentsArgs,\n  GetEnvironmentsResponse,\n  GetFeedbackAggregateArgs,\n  GetFeedbackAggregateResponse,\n  GetFeedbackBreakdownArgs,\n  GetFeedbackBreakdownResponse,\n  GetFeedbackPercentilesArgs,\n  GetFeedbackPercentilesResponse,\n  GetFeedbackTimeSeriesArgs,\n  GetFeedbackTimeSeriesResponse,\n  GetMetricAggregateArgs,\n  GetMetricAggregateResponse,\n  GetMetricBreakdownArgs,\n  GetMetricBreakdownResponse,\n  GetMetricLabelKeysArgs,\n  GetMetricLabelKeysResponse,\n  GetMetricLabelValuesArgs,\n  GetMetricLabelValuesResponse,\n  GetMetricNamesArgs,\n  GetMetricNamesResponse,\n  GetMetricPercentilesArgs,\n  GetMetricPercentilesResponse,\n  GetMetricTimeSeriesArgs,\n  GetMetricTimeSeriesResponse,\n  GetRootSpanArgs,\n  GetRootSpanResponse,\n  GetSpansArgs,\n  GetSpansResponse,\n  GetScoreAggregateArgs,\n  GetScoreAggregateResponse,\n  GetScoreBreakdownArgs,\n  GetScoreBreakdownResponse,\n  GetScorePercentilesArgs,\n  GetScorePercentilesResponse,\n  GetScoreTimeSeriesArgs,\n  GetScoreTimeSeriesResponse,\n  GetServiceNamesArgs,\n  GetServiceNamesResponse,\n  GetSpanArgs,\n  GetSpanResponse,\n  GetTagsArgs,\n  GetTagsResponse,\n  GetTraceArgs,\n  GetTraceLightResponse,\n  GetTraceResponse,\n  ListBranchesArgs,\n  ListBranchesResponse,\n  ListFeedbackArgs,\n  ListFeedbackResponse,\n  FeedbackRecord,\n  UpdateFeedbackReviewStatusArgs,\n  ListLogsArgs,\n  ListLogsResponse,\n  ListMetricsArgs,\n  ListMetricsResponse,\n  ListScoresArgs,\n  ListScoresResponse,\n  ListTracesArgs,\n  ListTracesResponse,\n  ObservabilityStorageStrategy,\n  PruneOptions,\n  PruneResult,\n  RetentionTablesDescriptor,\n  QueryThreadsResult,\n  ScoreRecord,\n  TableRetentionPolicy,\n  TraceQueryResponse,\n  TrustedThreadQueryPlan,\n  TrustedTraceQueryPlan,\n} from '@mastra/core/storage';\n\nimport type { DbClient } from '../../../client';\nimport { resolvePgConfig } from '../../../db';\nimport type { PgDomainConfig } from '../../../db';\nimport {\n  ALL_SIGNAL_TABLES,\n  additiveColumns,\n  allIndexDDL,\n  allTableDDL,\n  columnExistsSQL,\n  qualifiedTable,\n  schemaDDL,\n  TABLE_DISCOVERY,\n  TABLE_FEEDBACK_EVENTS,\n  TABLE_LOG_EVENTS,\n  TABLE_METRIC_EVENTS,\n  TABLE_SCORE_EVENTS,\n  TABLE_SPAN_EVENTS,\n} from './ddl';\nimport * as discoveryOps from './discovery';\nimport type { DiscoveryConfig } from './discovery';\nimport * as feedbackOps from './feedback';\nimport * as logsOps from './logs';\nimport * as metricsOps from './metrics';\nimport { detectPartman, detectTimescale, resolveMode, setupPartitioning } from './partitioning';\nimport type { PartitioningOptions, PartitionMode } from './partitioning';\nimport { isDuplicateRelationError, isDuplicateSchemaError } from './pg-errors';\nimport { deltaPollingFeatureEnabled } from './polling';\nimport { prunePartitionedTable, pruneTimescaleTable, retentionCutoff } from './retention';\nimport * as scoresOps from './scores';\nimport * as traceQueryOps from './trace-query';\nimport * as tracesOps from './traces';\nimport * as tracingOps from './tracing';\n\nexport type { PartitionMode, PartitioningOptions } from './partitioning';\nexport type { DiscoveryConfig } from './discovery';\n\n/** Configuration for the v-next Postgres observability domain. */\nexport type VNextPostgresObservabilityConfig = PgDomainConfig & {\n  /** Daily-partition / Timescale hypertable behavior. Default 'auto'. */\n  partitioning?: PartitioningOptions;\n  /** Discovery cache configuration. */\n  discovery?: DiscoveryConfig;\n  /** Maximum execution time for one advanced trace query. Default 15 seconds. */\n  traceQueryTimeoutMs?: number;\n};\n\nfunction wrapError(op: string, error: unknown, details?: Record<string, unknown>): never {\n  if (error instanceof MastraError || error instanceof coreStorage.TraceQueryExecutionError) throw error;\n  throw new MastraError(\n    {\n      id: createStorageErrorId('PG', op, 'FAILED'),\n      domain: ErrorDomain.STORAGE,\n      category: ErrorCategory.THIRD_PARTY,\n      details: details as Record<string, any>,\n    },\n    error,\n  );\n}\n\nexport class ObservabilityStoragePostgresVNext extends ObservabilityStorage {\n  readonly #client: DbClient;\n  /** Reader-backed client for standalone reads; writes, DDL, and discovery-cache refresh stay on #client. */\n  readonly #readClient: DbClient;\n  readonly #schema: string;\n  readonly #partitioning: PartitioningOptions;\n  readonly #discoveryConfig: DiscoveryConfig;\n  readonly #traceQueryTimeoutMs: number;\n  #partitionMode?: PartitionMode;\n\n  constructor(config: VNextPostgresObservabilityConfig) {\n    super();\n    const { client, readClient, schemaName } = resolvePgConfig(config);\n    this.#client = client;\n    this.#readClient = readClient;\n    this.#schema = schemaName ?? 'public';\n    this.#partitioning = config.partitioning ?? {};\n    this.#discoveryConfig = config.discovery ?? {};\n    this.#traceQueryTimeoutMs = coreStorage.resolveTraceQueryTimeoutMs(config.traceQueryTimeoutMs);\n  }\n\n  /**\n   * Build the discovery config used at each call site, with the framework\n   * logger injected so background refresh failures land in the same log\n   * stream as the rest of the store. Reads `this.logger` lazily so\n   * `__setLogger()` calls (e.g. when the domain is mounted under a Mastra\n   * instance) propagate without rebuilding the domain.\n   */\n  get #discovery(): DiscoveryConfig {\n    return { ...this.#discoveryConfig, logger: this.logger };\n  }\n\n  // -------------------------------------------------------------------------\n  // Initialization\n  // -------------------------------------------------------------------------\n\n  /**\n   * Create the signal tables, indexes, and (if Timescale / pg_partman is\n   * present) hypertable / partman registrations.\n   *\n   * Not transactional: each `CREATE TABLE IF NOT EXISTS`, `CREATE INDEX IF\n   * NOT EXISTS`, and `create_hypertable()` / `create_parent()` runs in its\n   * own implicit transaction. Re-running `init()` after a failure is safe\n   * (every statement is idempotent), but a failure partway through against\n   * Timescale can leave some signal tables as hypertables and others as\n   * plain tables. If that happens, fix the underlying error and call\n   * `init()` again — the partially-converted state is recoverable.\n   */\n  async init(): Promise<void> {\n    try {\n      const explicit = this.#partitioning.mode;\n      let mode: PartitionMode;\n      if (explicit && explicit !== 'auto') {\n        mode = explicit;\n      } else if (await detectTimescale(this.#client)) {\n        mode = 'timescale';\n      } else if (await detectPartman(this.#client)) {\n        mode = 'partman';\n      } else {\n        mode = 'native';\n      }\n\n      const ddlMode = mode === 'timescale' ? 'timescale' : 'partitioned';\n\n      try {\n        await this.#client.none(schemaDDL(this.#schema));\n      } catch (error) {\n        // `CREATE SCHEMA IF NOT EXISTS` is not atomic; two concurrent\n        // init() calls against a fresh schema can both pass the\n        // existence probe and one will surface 42P06 or a 23505 on\n        // pg_namespace_nspname_index. Treat it as success.\n        if (!isDuplicateSchemaError(error)) throw error;\n      }\n\n      for (const ddl of allTableDDL(this.#schema, ddlMode)) {\n        try {\n          await this.#client.none(ddl);\n        } catch (error) {\n          if (!isDuplicateRelationError(error)) throw error;\n        }\n      }\n      // Additive column migrations for tables created by an older version of\n      // this schema. Runs before index creation so indexes can reference new\n      // columns. The ALTER is skipped unless the column is actually missing —\n      // it locks the partitioned parent, and init() runs on every boot.\n      for (const { table, column, ddl } of additiveColumns(this.#schema)) {\n        const present = await this.#client.oneOrNone(columnExistsSQL, [this.#schema, table, column]);\n        if (!present) {\n          await this.#client.none(ddl);\n        }\n      }\n      for (const ddl of allIndexDDL(this.#schema)) {\n        try {\n          await this.#client.none(ddl);\n        } catch (error) {\n          if (!isDuplicateRelationError(error)) throw error;\n        }\n      }\n\n      this.#partitionMode = await setupPartitioning(this.#client, this.#schema, {\n        ...this.#partitioning,\n        mode,\n      });\n    } catch (error) {\n      wrapError('VNEXT_INIT', error);\n    }\n  }\n\n  /** Resolved partition mode after init(). Useful for tests and diagnostics. */\n  get partitionMode(): PartitionMode | undefined {\n    return this.#partitionMode;\n  }\n\n  // -------------------------------------------------------------------------\n  // Retention\n  // -------------------------------------------------------------------------\n\n  /**\n   * All five signal tables are insert-only growth tables. The anchor column is\n   * each table's partition / chunk key, so age-based expiry drops whole day\n   * partitions instead of deleting rows (see `./retention.ts`). `indexed: true`\n   * reflects that expiry never scans — it acts on partition bounds.\n   */\n  static override readonly retentionTables: RetentionTablesDescriptor = {\n    spans: { table: TABLE_SPAN_EVENTS, column: 'endedAt', indexed: true },\n    metrics: { table: TABLE_METRIC_EVENTS, column: 'timestamp', indexed: true },\n    logs: { table: TABLE_LOG_EVENTS, column: 'timestamp', indexed: true },\n    scores: { table: TABLE_SCORE_EVENTS, column: 'timestamp', indexed: true },\n    feedback: { table: TABLE_FEEDBACK_EVENTS, column: 'timestamp', indexed: true },\n  };\n\n  /**\n   * Expire signal events older than each table's `maxAge` by dropping whole\n   * day partitions (native / pg_partman) or chunks (Timescale). Only\n   * partitions wholly older than the cutoff are dropped, so the effective\n   * granularity is one day. Each partition drop counts as one batch for\n   * `maxBatches` / `maxRows` / abort-signal purposes; `deleted` reports the\n   * row count of the dropped partitions.\n   */\n  override async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n    return this.#run('VNEXT_PRUNE', async () => {\n      // Resolve lazily so prune() works on a domain that was constructed but\n      // not init()-ed in this process (e.g. a dedicated cron worker).\n      const mode = (this.#partitionMode ??= await resolveMode(this.#client, this.#partitioning));\n\n      const results: PruneResult[] = [];\n      const now = Date.now();\n\n      for (const [key, entry] of Object.entries(ObservabilityStoragePostgresVNext.retentionTables)) {\n        const policy = policies[key];\n        if (!policy) continue;\n\n        if (options?.signal?.aborted) {\n          results.push({ domain: 'observability', table: entry.table, deleted: 0, done: false });\n          continue;\n        }\n\n        const cutoff = retentionCutoff(policy, now);\n        const args = { client: this.#client, schema: this.#schema, table: entry.table, cutoff, options };\n        const outcome = mode === 'timescale' ? await pruneTimescaleTable(args) : await prunePartitionedTable(args);\n\n        results.push({ domain: 'observability', table: entry.table, deleted: outcome.deleted, done: outcome.done });\n      }\n\n      return results;\n    });\n  }\n\n  public override get observabilityStrategy(): {\n    preferred: ObservabilityStorageStrategy;\n    supported: ObservabilityStorageStrategy[];\n  } {\n    // Event-sourced rather than insert-only: the exporter also emits a row when\n    // a span starts, which is what makes a run visible in Studio while it is\n    // still executing. Reads collapse a span's rows back to one record.\n    return { preferred: 'event-sourced', supported: ['event-sourced'] };\n  }\n\n  override getFeatures() {\n    if (!deltaPollingFeatureEnabled()) return ['metrics', 'logs', 'trace-query', 'thread-query'] as const;\n    return ['metrics', 'logs', 'delta-polling', 'trace-query', 'thread-query'] as const;\n  }\n\n  async #run<T>(op: string, fn: () => Promise<T>, details?: Record<string, unknown>): Promise<T> {\n    try {\n      return await fn();\n    } catch (error) {\n      wrapError(op, error, details);\n    }\n  }\n\n  // -------------------------------------------------------------------------\n  // Tracing — writes\n  // -------------------------------------------------------------------------\n\n  override async createSpan(args: CreateSpanArgs): Promise<void> {\n    await this.#run('CREATE_SPAN', () => tracingOps.createSpan(this.#client, this.#schema, args), {\n      traceId: args.span.traceId,\n      spanId: args.span.spanId,\n    });\n  }\n\n  override async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n    await this.#run('BATCH_CREATE_SPANS', () => tracingOps.batchCreateSpans(this.#client, this.#schema, args), {\n      count: args.records.length,\n    });\n  }\n\n  // -------------------------------------------------------------------------\n  // Tracing — reads\n  // -------------------------------------------------------------------------\n\n  override async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n    return this.#run('GET_SPAN', () => tracingOps.getSpan(this.#readClient, this.#schema, args), {\n      traceId: args.traceId,\n      spanId: args.spanId,\n    });\n  }\n\n  override async getSpans(args: GetSpansArgs): Promise<GetSpansResponse> {\n    return this.#run('GET_SPANS', () => tracingOps.getSpans(this.#readClient, this.#schema, args), {\n      traceId: args.traceId,\n      count: args.spanIds.length,\n    });\n  }\n\n  override async getRootSpan(args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n    return this.#run('GET_ROOT_SPAN', () => tracesOps.getRootSpan(this.#readClient, this.#schema, args), {\n      traceId: args.traceId,\n    });\n  }\n\n  override async getTrace(args: GetTraceArgs): Promise<GetTraceResponse | null> {\n    return this.#run('GET_TRACE', () => tracingOps.getTrace(this.#readClient, this.#schema, args), {\n      traceId: args.traceId,\n    });\n  }\n\n  override async getTraceLight(args: GetTraceArgs): Promise<GetTraceLightResponse | null> {\n    return this.#run('GET_TRACE_LIGHT', () => tracingOps.getTraceLight(this.#readClient, this.#schema, args), {\n      traceId: args.traceId,\n    });\n  }\n\n  override async listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n    return this.#run('LIST_TRACES', () => tracesOps.listTraces(this.#readClient, this.#schema, args));\n  }\n\n  override async queryTraces(plan: TrustedTraceQueryPlan): Promise<TraceQueryResponse> {\n    return this.#run('QUERY_TRACES', () =>\n      traceQueryOps.queryTraces(this.#readClient, this.#schema, plan, this.#traceQueryTimeoutMs),\n    );\n  }\n\n  override async queryThreads(plan: TrustedThreadQueryPlan): Promise<QueryThreadsResult> {\n    return this.#run('QUERY_THREADS', () =>\n      traceQueryOps.queryThreads(this.#readClient, this.#schema, plan, this.#traceQueryTimeoutMs),\n    );\n  }\n\n  override async listBranches(args: ListBranchesArgs): Promise<ListBranchesResponse> {\n    return this.#run('LIST_BRANCHES', () => tracesOps.listBranches(this.#readClient, this.#schema, args));\n  }\n\n  // -------------------------------------------------------------------------\n  // Logs / metrics / scores / feedback — writes\n  // -------------------------------------------------------------------------\n\n  override async batchCreateLogs(args: BatchCreateLogsArgs): Promise<void> {\n    await this.#run('BATCH_CREATE_LOGS', () => logsOps.batchCreateLogs(this.#client, this.#schema, args), {\n      count: args.logs.length,\n    });\n  }\n\n  override async batchCreateMetrics(args: BatchCreateMetricsArgs): Promise<void> {\n    await this.#run('BATCH_CREATE_METRICS', () => metricsOps.batchCreateMetrics(this.#client, this.#schema, args), {\n      count: args.metrics.length,\n    });\n  }\n\n  override async createScore(args: CreateScoreArgs): Promise<void> {\n    await this.#run('CREATE_SCORE', () => scoresOps.createScore(this.#client, this.#schema, args));\n  }\n\n  override async batchCreateScores(args: BatchCreateScoresArgs): Promise<void> {\n    await this.#run('BATCH_CREATE_SCORES', () => scoresOps.batchCreateScores(this.#client, this.#schema, args), {\n      count: args.scores.length,\n    });\n  }\n\n  override async createFeedback(args: CreateFeedbackArgs): Promise<void> {\n    await this.#run('CREATE_FEEDBACK', () => feedbackOps.createFeedback(this.#client, this.#schema, args));\n  }\n\n  override async batchCreateFeedback(args: BatchCreateFeedbackArgs): Promise<void> {\n    await this.#run('BATCH_CREATE_FEEDBACK', () => feedbackOps.batchCreateFeedback(this.#client, this.#schema, args), {\n      count: args.feedbacks.length,\n    });\n  }\n\n  // -------------------------------------------------------------------------\n  // Scores / feedback — deletes\n  // -------------------------------------------------------------------------\n\n  override async deleteScores(args: DeleteScoresArgs): Promise<void> {\n    await this.#run('DELETE_SCORES', () => scoresOps.deleteScores(this.#client, this.#schema, args), {\n      count: args.scoreIds.length,\n    });\n  }\n\n  override async deleteFeedback(args: DeleteFeedbackArgs): Promise<void> {\n    await this.#run('DELETE_FEEDBACK', () => feedbackOps.deleteFeedback(this.#client, this.#schema, args), {\n      count: args.feedbackIds.length,\n    });\n  }\n\n  // -------------------------------------------------------------------------\n  // Logs / metrics / scores / feedback — list reads\n  // -------------------------------------------------------------------------\n\n  override async listLogs(args: ListLogsArgs): Promise<ListLogsResponse> {\n    return this.#run('LIST_LOGS', () => logsOps.listLogs(this.#readClient, this.#schema, args));\n  }\n\n  override async listMetrics(args: ListMetricsArgs): Promise<ListMetricsResponse> {\n    return this.#run('LIST_METRICS', () => metricsOps.listMetrics(this.#readClient, this.#schema, args));\n  }\n\n  override async listScores(args: ListScoresArgs): Promise<ListScoresResponse> {\n    return this.#run('LIST_SCORES', () => scoresOps.listScores(this.#readClient, this.#schema, args));\n  }\n\n  override async getScoreById(scoreId: string): Promise<ScoreRecord | null> {\n    return this.#run('GET_SCORE_BY_ID', () => scoresOps.getScoreById(this.#readClient, this.#schema, scoreId), {\n      scoreId,\n    });\n  }\n\n  override async listFeedback(args: ListFeedbackArgs): Promise<ListFeedbackResponse> {\n    return this.#run('LIST_FEEDBACK', () => feedbackOps.listFeedback(this.#readClient, this.#schema, args));\n  }\n\n  override async updateFeedbackReviewStatus(args: UpdateFeedbackReviewStatusArgs): Promise<FeedbackRecord> {\n    return this.#run(\n      'UPDATE_FEEDBACK_REVIEW_STATUS',\n      () => feedbackOps.updateFeedbackReviewStatus(this.#client, this.#schema, args),\n      { feedbackId: args.feedbackId },\n    );\n  }\n\n  // -------------------------------------------------------------------------\n  // OLAP — metrics\n  // -------------------------------------------------------------------------\n\n  override async getMetricAggregate(args: GetMetricAggregateArgs): Promise<GetMetricAggregateResponse> {\n    return this.#run('GET_METRIC_AGGREGATE', () => metricsOps.getMetricAggregate(this.#readClient, this.#schema, args));\n  }\n\n  override async getMetricBreakdown(args: GetMetricBreakdownArgs): Promise<GetMetricBreakdownResponse> {\n    return this.#run('GET_METRIC_BREAKDOWN', () => metricsOps.getMetricBreakdown(this.#readClient, this.#schema, args));\n  }\n\n  override async getMetricTimeSeries(args: GetMetricTimeSeriesArgs): Promise<GetMetricTimeSeriesResponse> {\n    return this.#run('GET_METRIC_TIME_SERIES', () =>\n      metricsOps.getMetricTimeSeries(this.#readClient, this.#schema, args),\n    );\n  }\n\n  override async getMetricPercentiles(args: GetMetricPercentilesArgs): Promise<GetMetricPercentilesResponse> {\n    return this.#run('GET_METRIC_PERCENTILES', () =>\n      metricsOps.getMetricPercentiles(this.#readClient, this.#schema, args),\n    );\n  }\n\n  // -------------------------------------------------------------------------\n  // OLAP — scores\n  // -------------------------------------------------------------------------\n\n  override async getScoreAggregate(args: GetScoreAggregateArgs): Promise<GetScoreAggregateResponse> {\n    return this.#run('GET_SCORE_AGGREGATE', () => scoresOps.getScoreAggregate(this.#readClient, this.#schema, args));\n  }\n\n  override async getScoreBreakdown(args: GetScoreBreakdownArgs): Promise<GetScoreBreakdownResponse> {\n    return this.#run('GET_SCORE_BREAKDOWN', () => scoresOps.getScoreBreakdown(this.#readClient, this.#schema, args));\n  }\n\n  override async getScoreTimeSeries(args: GetScoreTimeSeriesArgs): Promise<GetScoreTimeSeriesResponse> {\n    return this.#run('GET_SCORE_TIME_SERIES', () => scoresOps.getScoreTimeSeries(this.#readClient, this.#schema, args));\n  }\n\n  override async getScorePercentiles(args: GetScorePercentilesArgs): Promise<GetScorePercentilesResponse> {\n    return this.#run('GET_SCORE_PERCENTILES', () =>\n      scoresOps.getScorePercentiles(this.#readClient, this.#schema, args),\n    );\n  }\n\n  // -------------------------------------------------------------------------\n  // OLAP — feedback\n  // -------------------------------------------------------------------------\n\n  override async getFeedbackAggregate(args: GetFeedbackAggregateArgs): Promise<GetFeedbackAggregateResponse> {\n    return this.#run('GET_FEEDBACK_AGGREGATE', () =>\n      feedbackOps.getFeedbackAggregate(this.#readClient, this.#schema, args),\n    );\n  }\n\n  override async getFeedbackBreakdown(args: GetFeedbackBreakdownArgs): Promise<GetFeedbackBreakdownResponse> {\n    return this.#run('GET_FEEDBACK_BREAKDOWN', () =>\n      feedbackOps.getFeedbackBreakdown(this.#readClient, this.#schema, args),\n    );\n  }\n\n  override async getFeedbackTimeSeries(args: GetFeedbackTimeSeriesArgs): Promise<GetFeedbackTimeSeriesResponse> {\n    return this.#run('GET_FEEDBACK_TIME_SERIES', () =>\n      feedbackOps.getFeedbackTimeSeries(this.#readClient, this.#schema, args),\n    );\n  }\n\n  override async getFeedbackPercentiles(args: GetFeedbackPercentilesArgs): Promise<GetFeedbackPercentilesResponse> {\n    return this.#run('GET_FEEDBACK_PERCENTILES', () =>\n      feedbackOps.getFeedbackPercentiles(this.#readClient, this.#schema, args),\n    );\n  }\n\n  // -------------------------------------------------------------------------\n  // Discovery\n  // -------------------------------------------------------------------------\n\n  override async getEntityTypes(args: GetEntityTypesArgs): Promise<GetEntityTypesResponse> {\n    return this.#run('GET_ENTITY_TYPES', () =>\n      discoveryOps.getEntityTypes(this.#client, this.#schema, args, this.#discovery),\n    );\n  }\n\n  override async getEntityNames(args: GetEntityNamesArgs): Promise<GetEntityNamesResponse> {\n    return this.#run('GET_ENTITY_NAMES', () =>\n      discoveryOps.getEntityNames(this.#client, this.#schema, args, this.#discovery),\n    );\n  }\n\n  override async getServiceNames(args: GetServiceNamesArgs): Promise<GetServiceNamesResponse> {\n    return this.#run('GET_SERVICE_NAMES', () =>\n      discoveryOps.getServiceNames(this.#client, this.#schema, args, this.#discovery),\n    );\n  }\n\n  override async getEnvironments(args: GetEnvironmentsArgs): Promise<GetEnvironmentsResponse> {\n    return this.#run('GET_ENVIRONMENTS', () =>\n      discoveryOps.getEnvironments(this.#client, this.#schema, args, this.#discovery),\n    );\n  }\n\n  override async getTags(args: GetTagsArgs): Promise<GetTagsResponse> {\n    return this.#run('GET_TAGS', () => discoveryOps.getTags(this.#client, this.#schema, args, this.#discovery));\n  }\n\n  override async getMetricNames(args: GetMetricNamesArgs): Promise<GetMetricNamesResponse> {\n    return this.#run('GET_METRIC_NAMES', () =>\n      discoveryOps.getMetricNames(this.#client, this.#schema, args, this.#discovery),\n    );\n  }\n\n  override async getMetricLabelKeys(args: GetMetricLabelKeysArgs): Promise<GetMetricLabelKeysResponse> {\n    return this.#run('GET_METRIC_LABEL_KEYS', () =>\n      discoveryOps.getMetricLabelKeys(this.#client, this.#schema, args, this.#discovery),\n    );\n  }\n\n  override async getMetricLabelValues(args: GetMetricLabelValuesArgs): Promise<GetMetricLabelValuesResponse> {\n    return this.#run('GET_METRIC_LABEL_VALUES', () =>\n      discoveryOps.getMetricLabelValues(this.#client, this.#schema, args, this.#discovery),\n    );\n  }\n\n  // -------------------------------------------------------------------------\n  // Tracing — deletes / clear\n  // -------------------------------------------------------------------------\n\n  override async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n    await this.#run('BATCH_DELETE_TRACES', () => tracingOps.batchDeleteTraces(this.#client, this.#schema, args), {\n      count: args.traceIds.length,\n    });\n  }\n\n  override async dangerouslyClearAll(): Promise<void> {\n    try {\n      // Iterate ALL_SIGNAL_TABLES so a future signal added to the constant\n      // is truncated automatically. Tracing has its own helper that runs the\n      // span TRUNCATE; we skip it here to avoid running it twice.\n      //\n      // `RESTART IDENTITY` resets every owned sequence (notably `cursorId`\n      // bigserials) so tests that clear between cases and then exercise\n      // delta polling don't see surprising high-water-mark cursors. Without\n      // it, sequences continue from where they left off across clears.\n      await tracingOps.dangerouslyClearTracing(this.#client, this.#schema);\n      for (const t of ALL_SIGNAL_TABLES) {\n        if (t === TABLE_SPAN_EVENTS) continue;\n        await this.#client.none(`TRUNCATE TABLE ${qualifiedTable(this.#schema, t)} RESTART IDENTITY`);\n      }\n      await this.#client.none(`TRUNCATE TABLE ${qualifiedTable(this.#schema, TABLE_DISCOVERY)} RESTART IDENTITY`);\n    } catch (error) {\n      wrapError('DANGEROUSLY_CLEAR_ALL', error);\n    }\n  }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n  PromptBlocksStorage,\n  createStorageErrorId,\n  normalizePerPage,\n  calculatePagination,\n  TABLE_PROMPT_BLOCKS,\n  TABLE_PROMPT_BLOCK_VERSIONS,\n  TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n  StoragePromptBlockType,\n  StorageCreatePromptBlockInput,\n  StorageUpdatePromptBlockInput,\n  StorageListPromptBlocksInput,\n  StorageListPromptBlocksOutput,\n  CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type {\n  PromptBlockVersion,\n  CreatePromptBlockVersionInput,\n  ListPromptBlockVersionsInput,\n  ListPromptBlockVersionsOutput,\n} from '@mastra/core/storage/domains/prompt-blocks';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { DbClient, PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName, parseJsonResilient } from '../utils';\n\nconst SNAPSHOT_FIELDS = ['name', 'description', 'content', 'rules', 'requestContextSchema'] as const;\n\nexport class PromptBlocksPG extends PromptBlocksStorage {\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  static readonly MANAGED_TABLES = [TABLE_PROMPT_BLOCKS, TABLE_PROMPT_BLOCK_VERSIONS] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    this.#indexes = indexes?.filter(idx => (PromptBlocksPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n  }\n\n  /**\n   * Returns default index definitions for the prompt blocks domain tables.\n   * @param schemaPrefix - Prefix for index names (e.g. \"my_schema_\" or \"\")\n   */\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}idx_prompt_block_versions_block_version`,\n        table: TABLE_PROMPT_BLOCK_VERSIONS,\n        columns: ['blockId', 'versionNumber'],\n        unique: true,\n      },\n    ];\n  }\n\n  /**\n   * Returns all DDL statements for this domain: tables and indexes.\n   * Used by exportSchemas to produce a complete, reproducible schema export.\n   */\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n    // Tables\n    for (const tableName of PromptBlocksPG.MANAGED_TABLES) {\n      statements.push(\n        generateTableSQL({\n          tableName,\n          schema: TABLE_SCHEMAS[tableName],\n          schemaName,\n          includeAllConstraints: true,\n        }),\n      );\n    }\n\n    // Indexes\n    for (const idx of PromptBlocksPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    return statements;\n  }\n\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return PromptBlocksPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) {\n      return;\n    }\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch {\n        // Indexes are performance optimizations, continue on failure\n      }\n    }\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({ tableName: TABLE_PROMPT_BLOCKS, schema: TABLE_SCHEMAS[TABLE_PROMPT_BLOCKS] });\n    await this.#db.createTable({\n      tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n      schema: TABLE_SCHEMAS[TABLE_PROMPT_BLOCK_VERSIONS],\n    });\n    await this.#db.alterTable({\n      tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n      schema: TABLE_SCHEMAS[TABLE_PROMPT_BLOCK_VERSIONS],\n      ifNotExists: ['requestContextSchema'],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) {\n      return;\n    }\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_PROMPT_BLOCK_VERSIONS });\n    await this.#db.clearTable({ tableName: TABLE_PROMPT_BLOCKS });\n  }\n\n  // ==========================================================================\n  // Prompt Block CRUD Methods\n  // ==========================================================================\n\n  async getById(id: string): Promise<StoragePromptBlockType | null> {\n    return this.#getById(this.#db.readClient, id);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #getById(client: DbClient, id: string): Promise<StoragePromptBlockType | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n      const result = await client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseBlockRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_PROMPT_BLOCK_BY_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { blockId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async create(input: { promptBlock: StorageCreatePromptBlockInput }): Promise<StoragePromptBlockType> {\n    const { promptBlock } = input;\n    try {\n      const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      // 1. Create the thin block record\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, status, \"activeVersionId\", \"authorId\", metadata,\n          \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,\n        [\n          promptBlock.id,\n          'draft',\n          null,\n          promptBlock.authorId ?? null,\n          promptBlock.metadata ? JSON.stringify(promptBlock.metadata) : null,\n          nowIso,\n          nowIso,\n          nowIso,\n          nowIso,\n        ],\n      );\n\n      // 2. Extract snapshot fields and create version 1\n      const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = promptBlock;\n      const versionId = crypto.randomUUID();\n      await this.createVersion({\n        id: versionId,\n        blockId: promptBlock.id,\n        versionNumber: 1,\n        ...snapshotConfig,\n        changedFields: [...SNAPSHOT_FIELDS],\n        changeMessage: 'Initial version',\n      });\n\n      return {\n        id: promptBlock.id,\n        status: 'draft',\n        activeVersionId: undefined,\n        authorId: promptBlock.authorId,\n        metadata: promptBlock.metadata,\n        createdAt: now,\n        updatedAt: now,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      // Best-effort cleanup\n      try {\n        const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n        await this.#db.client.none(\n          `DELETE FROM ${tableName} WHERE id = $1 AND status = 'draft' AND \"activeVersionId\" IS NULL`,\n          [promptBlock.id],\n        );\n      } catch {\n        // Ignore cleanup errors\n      }\n\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_PROMPT_BLOCK', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { blockId: promptBlock.id },\n        },\n        error,\n      );\n    }\n  }\n\n  async update(input: StorageUpdatePromptBlockInput): Promise<StoragePromptBlockType> {\n    const { id, ...updates } = input;\n    try {\n      const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n\n      const existingBlock = await this.#getById(this.#db.client, id);\n      if (!existingBlock) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_PROMPT_BLOCK', 'NOT_FOUND'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          text: `Prompt block ${id} not found`,\n          details: { blockId: id },\n        });\n      }\n\n      const { authorId, activeVersionId, metadata, status } = updates;\n\n      // Update metadata fields on the block record\n      const setClauses: string[] = [];\n      const values: any[] = [];\n      let paramIndex = 1;\n\n      if (authorId !== undefined) {\n        setClauses.push(`\"authorId\" = $${paramIndex++}`);\n        values.push(authorId);\n      }\n\n      if (activeVersionId !== undefined) {\n        setClauses.push(`\"activeVersionId\" = $${paramIndex++}`);\n        values.push(activeVersionId);\n      }\n\n      if (status !== undefined) {\n        setClauses.push(`status = $${paramIndex++}`);\n        values.push(status);\n      }\n\n      if (metadata !== undefined) {\n        const mergedMetadata = { ...(existingBlock.metadata || {}), ...metadata };\n        setClauses.push(`metadata = $${paramIndex++}`);\n        values.push(JSON.stringify(mergedMetadata));\n      }\n\n      // Always update timestamps\n      const now = new Date().toISOString();\n      setClauses.push(`\"updatedAt\" = $${paramIndex++}`);\n      values.push(now);\n      setClauses.push(`\"updatedAtZ\" = $${paramIndex++}`);\n      values.push(now);\n\n      values.push(id);\n\n      // Always update the record (at minimum updatedAt/updatedAtZ are set)\n      await this.#db.client.none(`UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`, values);\n\n      const updatedBlock = await this.#getById(this.#db.client, id);\n      if (!updatedBlock) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_PROMPT_BLOCK', 'NOT_FOUND_AFTER_UPDATE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.SYSTEM,\n          text: `Prompt block ${id} not found after update`,\n          details: { blockId: id },\n        });\n      }\n      return updatedBlock;\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_PROMPT_BLOCK', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { blockId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async delete(id: string): Promise<void> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n      await this.deleteVersionsByParentId(id);\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_PROMPT_BLOCK', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { blockId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async list(args?: StorageListPromptBlocksInput): Promise<StorageListPromptBlocksOutput> {\n    const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {};\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    if (page < 0) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_PROMPT_BLOCKS', 'INVALID_PAGE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { page },\n        },\n        new Error('page must be >= 0'),\n      );\n    }\n\n    const perPage = normalizePerPage(perPageInput, 100);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    try {\n      const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n\n      // Build WHERE conditions\n      const conditions: string[] = [];\n      const queryParams: any[] = [];\n      let paramIdx = 1;\n\n      if (status) {\n        conditions.push(`status = $${paramIdx++}`);\n        queryParams.push(status);\n      }\n\n      if (authorId !== undefined) {\n        conditions.push(`\"authorId\" = $${paramIdx++}`);\n        queryParams.push(authorId);\n      }\n\n      if (metadata && Object.keys(metadata).length > 0) {\n        conditions.push(`metadata @> $${paramIdx++}::jsonb`);\n        queryParams.push(JSON.stringify(metadata));\n      }\n\n      const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n      // Get total count\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n        queryParams,\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return {\n          promptBlocks: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      const limitValue = perPageInput === false ? total : perPage;\n      const dataResult = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"${field}\" ${direction} LIMIT $${paramIdx++} OFFSET $${paramIdx++}`,\n        [...queryParams, limitValue, offset],\n      );\n\n      const promptBlocks = (dataResult || []).flatMap(row => {\n        try {\n          return [this.parseBlockRow(row)];\n        } catch (err) {\n          this.logger?.warn?.('[PG] Failed to map prompt block row, skipping', { id: row?.id, error: err });\n          return [];\n        }\n      });\n\n      return {\n        promptBlocks,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_PROMPT_BLOCKS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  // ==========================================================================\n  // Prompt Block Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreatePromptBlockVersionInput): Promise<PromptBlockVersion> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, \"blockId\", \"versionNumber\",\n          name, description, content, rules, \"requestContextSchema\",\n          \"changedFields\", \"changeMessage\",\n          \"createdAt\", \"createdAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`,\n        [\n          input.id,\n          input.blockId,\n          input.versionNumber,\n          input.name,\n          input.description ?? null,\n          input.content,\n          input.rules ? JSON.stringify(input.rules) : null,\n          input.requestContextSchema ? JSON.stringify(input.requestContextSchema) : null,\n          input.changedFields ? JSON.stringify(input.changedFields) : null,\n          input.changeMessage ?? null,\n          nowIso,\n          nowIso,\n        ],\n      );\n\n      return {\n        ...input,\n        createdAt: now,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_PROMPT_BLOCK_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: input.id, blockId: input.blockId },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersion(id: string): Promise<PromptBlockVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_PROMPT_BLOCK_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersionByNumber(blockId: string, versionNumber: number): Promise<PromptBlockVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"blockId\" = $1 AND \"versionNumber\" = $2`,\n        [blockId, versionNumber],\n      );\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_PROMPT_BLOCK_VERSION_BY_NUMBER', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { blockId, versionNumber },\n        },\n        error,\n      );\n    }\n  }\n\n  async getLatestVersion(blockId: string): Promise<PromptBlockVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"blockId\" = $1 ORDER BY \"versionNumber\" DESC LIMIT 1`,\n        [blockId],\n      );\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_LATEST_PROMPT_BLOCK_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { blockId },\n        },\n        error,\n      );\n    }\n  }\n\n  async listVersions(input: ListPromptBlockVersionsInput): Promise<ListPromptBlockVersionsOutput> {\n    const { blockId, page = 0, perPage: perPageInput, orderBy } = input;\n\n    if (page < 0) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_PROMPT_BLOCK_VERSIONS', 'INVALID_PAGE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { page },\n        },\n        new Error('page must be >= 0'),\n      );\n    }\n\n    const perPage = normalizePerPage(perPageInput, 20);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    try {\n      const { field, direction } = this.parseVersionOrderBy(orderBy);\n      const tableName = getTableName({\n        indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} WHERE \"blockId\" = $1`,\n        [blockId],\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return {\n          versions: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      const limitValue = perPageInput === false ? total : perPage;\n      const dataResult = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} WHERE \"blockId\" = $1 ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`,\n        [blockId, limitValue, offset],\n      );\n\n      const versions = (dataResult || []).flatMap(row => {\n        try {\n          return [this.parseVersionRow(row)];\n        } catch (err) {\n          this.logger?.warn?.('[PG] Failed to map prompt block version row, skipping', { id: row?.id, error: err });\n          return [];\n        }\n      });\n\n      return {\n        versions,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_PROMPT_BLOCK_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { blockId },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_PROMPT_BLOCK_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"blockId\" = $1`, [entityId]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_PROMPT_BLOCK_VERSIONS_BY_BLOCK_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { blockId: entityId },\n        },\n        error,\n      );\n    }\n  }\n\n  async countVersions(blockId: string): Promise<number> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.one(`SELECT COUNT(*) as count FROM ${tableName} WHERE \"blockId\" = $1`, [\n        blockId,\n      ]);\n      return parseInt(result.count, 10);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'COUNT_PROMPT_BLOCK_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { blockId },\n        },\n        error,\n      );\n    }\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  private parseBlockRow(row: any): StoragePromptBlockType {\n    return {\n      id: row.id as string,\n      status: row.status as StoragePromptBlockType['status'],\n      activeVersionId: row.activeVersionId as string | undefined,\n      authorId: row.authorId as string | undefined,\n      metadata: parseJsonResilient(row.metadata, 'metadata'),\n      createdAt: new Date(row.createdAtZ || row.createdAt),\n      updatedAt: new Date(row.updatedAtZ || row.updatedAt),\n    };\n  }\n\n  private parseVersionRow(row: any): PromptBlockVersion {\n    return {\n      id: row.id as string,\n      blockId: row.blockId as string,\n      versionNumber: row.versionNumber as number,\n      name: row.name as string,\n      description: row.description as string | undefined,\n      content: row.content as string,\n      rules: parseJsonResilient(row.rules, 'rules'),\n      requestContextSchema: parseJsonResilient(row.requestContextSchema, 'requestContextSchema'),\n      changedFields: parseJsonResilient(row.changedFields, 'changedFields'),\n      changeMessage: row.changeMessage as string | undefined,\n      createdAt: new Date(row.createdAtZ || row.createdAt),\n    };\n  }\n}\n","import type {\n  Schedule,\n  ScheduleFilter,\n  ScheduleStatus,\n  ScheduleTarget,\n  ScheduleTrigger,\n  ScheduleTriggerListOptions,\n  ScheduleUpdate,\n  CreateIndexOptions,\n  TABLE_NAMES,\n  PruneOptions,\n  PruneResult,\n  RetentionTablesDescriptor,\n  TableRetentionPolicy,\n} from '@mastra/core/storage';\nimport {\n  normalizeScheduleTarget,\n  SchedulesStorage,\n  TABLE_SCHEDULES,\n  TABLE_SCHEDULE_TRIGGERS,\n  TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport type { DbClient } from '../../client';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { resolveTargets, runPrune } from '../../retention';\n\nfunction getSchemaName(schema?: string) {\n  return schema ? `\"${schema}\"` : '\"public\"';\n}\n\nfunction getTableName(table: string, schema?: string) {\n  const quoted = `\"${table}\"`;\n  return schema ? `${schema}.${quoted}` : quoted;\n}\n\nfunction parseJson<T = unknown>(val: unknown): T | undefined {\n  if (val == null) return undefined;\n  if (typeof val === 'string') {\n    try {\n      return JSON.parse(val) as T;\n    } catch {\n      return val as T;\n    }\n  }\n  return val as T;\n}\n\nfunction toNumber(val: unknown): number {\n  if (typeof val === 'bigint') return Number(val);\n  return Number(val);\n}\n\nfunction rowToSchedule(row: Record<string, any>): Schedule {\n  const target = parseJson<ScheduleTarget>(row.target);\n  if (!target) {\n    throw new Error(`Schedule row ${row.id} has invalid target`);\n  }\n  const schedule: Schedule = {\n    id: String(row.id),\n    target: normalizeScheduleTarget(target),\n    cron: String(row.cron),\n    status: String(row.status) as ScheduleStatus,\n    nextFireAt: toNumber(row.next_fire_at),\n    createdAt: toNumber(row.created_at),\n    updatedAt: toNumber(row.updated_at),\n  };\n  if (row.timezone != null) schedule.timezone = String(row.timezone);\n  if (row.last_fire_at != null) schedule.lastFireAt = toNumber(row.last_fire_at);\n  if (row.last_run_id != null) schedule.lastRunId = String(row.last_run_id);\n  const metadata = parseJson<Record<string, unknown>>(row.metadata);\n  if (metadata !== undefined) schedule.metadata = metadata;\n  if (row.owner_type != null) schedule.ownerType = String(row.owner_type) as Schedule['ownerType'];\n  if (row.owner_id != null) schedule.ownerId = String(row.owner_id);\n  return schedule;\n}\n\nfunction rowToTrigger(row: Record<string, any>): ScheduleTrigger {\n  const trigger: ScheduleTrigger = {\n    id: row.id != null ? String(row.id) : undefined,\n    scheduleId: String(row.schedule_id),\n    runId: row.run_id != null ? String(row.run_id) : null,\n    scheduledFireAt: toNumber(row.scheduled_fire_at),\n    actualFireAt: toNumber(row.actual_fire_at),\n    outcome: String(row.outcome) as ScheduleTrigger['outcome'],\n    triggerKind:\n      row.trigger_kind != null ? (String(row.trigger_kind) as ScheduleTrigger['triggerKind']) : 'schedule-fire',\n  };\n  if (row.error != null) trigger.error = String(row.error);\n  if (row.parent_trigger_id != null) trigger.parentTriggerId = String(row.parent_trigger_id);\n  const metadata = parseJson<Record<string, unknown>>(row.metadata);\n  if (metadata !== undefined) trigger.metadata = metadata;\n  return trigger;\n}\n\nexport class SchedulesPG extends SchedulesStorage {\n  #db: PgDB;\n  #client: DbClient;\n  #readClient: DbClient;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  /** Tables managed by this domain */\n  static readonly MANAGED_TABLES = [TABLE_SCHEDULES, TABLE_SCHEDULE_TRIGGERS] as const;\n\n  /**\n   * The fire/run history (`schedule_triggers`, one row per fire) is the growth\n   * table; schedule definitions are config and excluded. Anchored on\n   * `actual_fire_at`, a bigint epoch-ms column (numeric comparison, not\n   * timestamptz).\n   */\n  static override readonly retentionTables: RetentionTablesDescriptor = {\n    triggers: { table: TABLE_SCHEDULE_TRIGGERS, column: 'actual_fire_at', indexed: true, anchorType: 'epoch-ms' },\n  };\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#client = client;\n    this.#readClient = readClient;\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    this.#indexes = indexes?.filter(idx => (SchedulesPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({\n      tableName: TABLE_SCHEDULES,\n      schema: TABLE_SCHEMAS[TABLE_SCHEDULES],\n    });\n    await this.#db.createTable({\n      tableName: TABLE_SCHEDULE_TRIGGERS,\n      schema: TABLE_SCHEMAS[TABLE_SCHEDULE_TRIGGERS],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  /**\n   * Lazily ensures a btree index exists on each configured policy's retention\n   * anchor column so age-based `prune()` deletes stay fast. The default\n   * composite index leads with `schedule_id`, so a bare `actual_fire_at` range\n   * scan can't use it. Called from the prune path (not init) so only\n   * deployments that configure retention pay the index's write/disk overhead.\n   * Created even with `skipDefaultIndexes` — retention is an explicit opt-in,\n   * so its supporting index is not part of the default index set.\n   */\n  private async ensureRetentionIndexes(policies: Record<string, TableRetentionPolicy>): Promise<void> {\n    const prefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    for (const [key, entry] of Object.entries(SchedulesPG.retentionTables)) {\n      if (!entry.indexed || !policies[key]) continue;\n      try {\n        await this.#db.ensureIndex({\n          indexName: `${prefix}mastra_${key}_retention_idx`,\n          tableName: entry.table as TABLE_NAMES,\n          column: entry.column,\n        });\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create retention index for ${entry.table}:`, error);\n      }\n    }\n  }\n\n  /**\n   * Delete trigger (fire history) rows whose `actual_fire_at` is older than the\n   * `triggers` policy's `maxAge`, batched. Schedule definitions are never pruned.\n   */\n  async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n    await this.ensureRetentionIndexes(policies);\n    const targets = resolveTargets({\n      policies,\n      descriptor: SchedulesPG.retentionTables,\n      order: ['triggers'],\n    });\n    return runPrune({ db: this.#db, domain: 'schedules', targets, options });\n  }\n\n  /**\n   * Returns default index definitions for the schedules domain.\n   * @param schemaPrefix - Prefix for index names (e.g. \"my_schema_\" or \"\")\n   */\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}idx_mastra_schedules_status_next_fire`,\n        table: TABLE_SCHEDULES,\n        columns: ['status', 'next_fire_at'],\n      },\n      {\n        name: `${schemaPrefix}idx_mastra_schedule_triggers_schedule_fire`,\n        table: TABLE_SCHEDULE_TRIGGERS,\n        columns: ['schedule_id', 'actual_fire_at DESC'],\n      },\n    ];\n  }\n\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return SchedulesPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) {\n      return;\n    }\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) {\n      return;\n    }\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n    statements.push(\n      generateTableSQL({\n        tableName: TABLE_SCHEDULES,\n        schema: TABLE_SCHEMAS[TABLE_SCHEDULES],\n        schemaName,\n        includeAllConstraints: true,\n      }),\n    );\n    statements.push(\n      generateTableSQL({\n        tableName: TABLE_SCHEDULE_TRIGGERS,\n        schema: TABLE_SCHEMAS[TABLE_SCHEDULE_TRIGGERS],\n        schemaName,\n        includeAllConstraints: true,\n      }),\n    );\n\n    for (const idx of SchedulesPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    return statements;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_SCHEDULE_TRIGGERS });\n    await this.#db.clearTable({ tableName: TABLE_SCHEDULES });\n  }\n\n  #table(tableName: typeof TABLE_SCHEDULES | typeof TABLE_SCHEDULE_TRIGGERS): string {\n    const schema = parseSqlIdentifier(this.#schema, 'schema name');\n    return getTableName(tableName, getSchemaName(schema));\n  }\n\n  async createSchedule(schedule: Schedule): Promise<Schedule> {\n    const existing = await this.#getSchedule(this.#client, schedule.id);\n    if (existing) {\n      throw new Error(`Schedule with id \"${schedule.id}\" already exists`);\n    }\n    await this.#db.insert({\n      tableName: TABLE_SCHEDULES,\n      record: {\n        id: schedule.id,\n        target: schedule.target,\n        cron: schedule.cron,\n        timezone: schedule.timezone ?? null,\n        status: schedule.status,\n        next_fire_at: schedule.nextFireAt,\n        last_fire_at: schedule.lastFireAt ?? null,\n        last_run_id: schedule.lastRunId ?? null,\n        created_at: schedule.createdAt,\n        updated_at: schedule.updatedAt,\n        metadata: schedule.metadata ?? null,\n        owner_type: schedule.ownerType ?? null,\n        owner_id: schedule.ownerId ?? null,\n      },\n    });\n    return schedule;\n  }\n\n  async getSchedule(id: string): Promise<Schedule | null> {\n    return this.#getSchedule(this.#readClient, id);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #getSchedule(client: DbClient, id: string): Promise<Schedule | null> {\n    const row = await client.oneOrNone<Record<string, any>>(\n      `SELECT * FROM ${this.#table(TABLE_SCHEDULES)} WHERE id = $1`,\n      [id],\n    );\n    return row ? rowToSchedule(row) : null;\n  }\n\n  async listSchedules(filter?: ScheduleFilter): Promise<Schedule[]> {\n    const conditions: string[] = [];\n    const params: unknown[] = [];\n\n    if (filter?.status) {\n      params.push(filter.status);\n      conditions.push(`status = $${params.length}`);\n    }\n    if (filter?.workflowId) {\n      // target is jsonb; ->> extracts a text field.\n      params.push(filter.workflowId);\n      conditions.push(`target->>'workflowId' = $${params.length}`);\n    }\n    if (filter?.ownerType !== undefined) {\n      if (filter.ownerType === null) {\n        conditions.push('owner_type IS NULL');\n      } else {\n        params.push(filter.ownerType);\n        conditions.push(`owner_type = $${params.length}`);\n      }\n    }\n    if (filter?.ownerId !== undefined) {\n      if (filter.ownerId === null) {\n        conditions.push('owner_id IS NULL');\n      } else {\n        params.push(filter.ownerId);\n        conditions.push(`owner_id = $${params.length}`);\n      }\n    }\n\n    const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n    const rows = await this.#readClient.manyOrNone<Record<string, any>>(\n      `SELECT * FROM ${this.#table(TABLE_SCHEDULES)} ${where} ORDER BY created_at ASC`,\n      params,\n    );\n    return rows.map(rowToSchedule);\n  }\n\n  async listDueSchedules(now: number, limit?: number): Promise<Schedule[]> {\n    const cap = limit ?? 100;\n    const rows = await this.#client.manyOrNone<Record<string, any>>(\n      `SELECT * FROM ${this.#table(TABLE_SCHEDULES)}\n       WHERE status = $1 AND next_fire_at <= $2\n       ORDER BY next_fire_at ASC\n       LIMIT $3`,\n      ['active', now, cap],\n    );\n    return rows.map(rowToSchedule);\n  }\n\n  async updateSchedule(id: string, patch: ScheduleUpdate): Promise<Schedule> {\n    const setClauses: string[] = [];\n    const params: unknown[] = [];\n\n    const push = (frag: string, value: unknown) => {\n      params.push(value);\n      setClauses.push(frag.replace('?', `$${params.length}`));\n    };\n\n    if ('cron' in patch && patch.cron !== undefined) push('cron = ?', patch.cron);\n    if ('timezone' in patch) push('timezone = ?', patch.timezone ?? null);\n    if ('status' in patch && patch.status !== undefined) push('status = ?', patch.status);\n    if ('nextFireAt' in patch && patch.nextFireAt !== undefined) push('next_fire_at = ?', patch.nextFireAt);\n    if ('target' in patch && patch.target !== undefined) {\n      push('target = ?::jsonb', JSON.stringify(patch.target));\n    }\n    if ('metadata' in patch) {\n      push('metadata = ?::jsonb', patch.metadata != null ? JSON.stringify(patch.metadata) : null);\n    }\n    if ('ownerType' in patch) push('owner_type = ?', (patch.ownerType as string | undefined) ?? null);\n    if ('ownerId' in patch) push('owner_id = ?', (patch.ownerId as string | undefined) ?? null);\n\n    push('updated_at = ?', Date.now());\n\n    if (setClauses.length === 1) {\n      // Only updated_at — nothing meaningful to patch\n      const existing = await this.#getSchedule(this.#client, id);\n      if (!existing) throw new Error(`Schedule ${id} not found`);\n      return existing;\n    }\n\n    params.push(id);\n    await this.#client.none(\n      `UPDATE ${this.#table(TABLE_SCHEDULES)} SET ${setClauses.join(', ')} WHERE id = $${params.length}`,\n      params,\n    );\n\n    const updated = await this.#getSchedule(this.#client, id);\n    if (!updated) throw new Error(`Schedule ${id} not found`);\n    return updated;\n  }\n\n  async updateScheduleNextFire(\n    id: string,\n    expectedNextFireAt: number,\n    newNextFireAt: number,\n    lastFireAt: number,\n    lastRunId: string,\n  ): Promise<boolean> {\n    const result = await this.#client.query(\n      `UPDATE ${this.#table(TABLE_SCHEDULES)}\n       SET next_fire_at = $1, last_fire_at = $2, last_run_id = $3, updated_at = $4\n       WHERE id = $5 AND next_fire_at = $6 AND status = $7`,\n      [newNextFireAt, lastFireAt, lastRunId, Date.now(), id, expectedNextFireAt, 'active'],\n    );\n    return (result.rowCount ?? 0) > 0;\n  }\n\n  async deleteSchedule(id: string): Promise<void> {\n    await this.#client.none(`DELETE FROM ${this.#table(TABLE_SCHEDULE_TRIGGERS)} WHERE schedule_id = $1`, [id]);\n    await this.#client.none(`DELETE FROM ${this.#table(TABLE_SCHEDULES)} WHERE id = $1`, [id]);\n  }\n\n  async recordTrigger(trigger: ScheduleTrigger): Promise<void> {\n    const id = trigger.id ?? crypto.randomUUID();\n    await this.#db.insert({\n      tableName: TABLE_SCHEDULE_TRIGGERS,\n      record: {\n        id,\n        schedule_id: trigger.scheduleId,\n        run_id: trigger.runId,\n        scheduled_fire_at: trigger.scheduledFireAt,\n        actual_fire_at: trigger.actualFireAt,\n        outcome: trigger.outcome,\n        error: trigger.error ?? null,\n        trigger_kind: trigger.triggerKind ?? 'schedule-fire',\n        parent_trigger_id: trigger.parentTriggerId ?? null,\n        metadata: trigger.metadata ?? null,\n      },\n    });\n  }\n\n  async listTriggers(scheduleId: string, opts?: ScheduleTriggerListOptions): Promise<ScheduleTrigger[]> {\n    const conditions: string[] = [];\n    const params: unknown[] = [];\n\n    params.push(scheduleId);\n    conditions.push(`schedule_id = $${params.length}`);\n\n    if (opts?.fromActualFireAt != null) {\n      params.push(opts.fromActualFireAt);\n      conditions.push(`actual_fire_at >= $${params.length}`);\n    }\n    if (opts?.toActualFireAt != null) {\n      params.push(opts.toActualFireAt);\n      conditions.push(`actual_fire_at < $${params.length}`);\n    }\n\n    let limitClause = '';\n    if (opts?.limit != null) {\n      params.push(Math.floor(opts.limit));\n      limitClause = `LIMIT $${params.length}`;\n    }\n\n    const rows = await this.#readClient.manyOrNone<Record<string, any>>(\n      `SELECT * FROM ${this.#table(TABLE_SCHEDULE_TRIGGERS)}\n       WHERE ${conditions.join(' AND ')}\n       ORDER BY actual_fire_at DESC\n       ${limitClause}`,\n      params,\n    );\n    return rows.map(rowToTrigger);\n  }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n  ScorerDefinitionsStorage,\n  createStorageErrorId,\n  normalizePerPage,\n  calculatePagination,\n  TABLE_SCORER_DEFINITIONS,\n  TABLE_SCORER_DEFINITION_VERSIONS,\n  TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n  StorageScorerDefinitionType,\n  StorageCreateScorerDefinitionInput,\n  StorageUpdateScorerDefinitionInput,\n  StorageListScorerDefinitionsInput,\n  StorageListScorerDefinitionsOutput,\n  CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type {\n  ScorerDefinitionVersion,\n  CreateScorerDefinitionVersionInput,\n  ListScorerDefinitionVersionsInput,\n  ListScorerDefinitionVersionsOutput,\n} from '@mastra/core/storage/domains/scorer-definitions';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { DbClient, PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName, parseJsonResilient } from '../utils';\n\nconst SNAPSHOT_FIELDS = [\n  'name',\n  'description',\n  'type',\n  'model',\n  'instructions',\n  'scoreRange',\n  'presetConfig',\n  'defaultSampling',\n] as const;\n\nexport class ScorerDefinitionsPG extends ScorerDefinitionsStorage {\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  static readonly MANAGED_TABLES = [TABLE_SCORER_DEFINITIONS, TABLE_SCORER_DEFINITION_VERSIONS] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    this.#indexes = indexes?.filter(idx =>\n      (ScorerDefinitionsPG.MANAGED_TABLES as readonly string[]).includes(idx.table),\n    );\n  }\n\n  /**\n   * Returns default index definitions for the scorer definitions domain tables.\n   * @param schemaPrefix - Prefix for index names (e.g. \"my_schema_\" or \"\")\n   */\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}idx_scorer_definition_versions_def_version`,\n        table: TABLE_SCORER_DEFINITION_VERSIONS,\n        columns: ['scorerDefinitionId', 'versionNumber'],\n        unique: true,\n      },\n    ];\n  }\n\n  /**\n   * Returns all DDL statements for this domain: tables and indexes.\n   * Used by exportSchemas to produce a complete, reproducible schema export.\n   */\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n    // Tables\n    for (const tableName of ScorerDefinitionsPG.MANAGED_TABLES) {\n      statements.push(\n        generateTableSQL({\n          tableName,\n          schema: TABLE_SCHEMAS[tableName],\n          schemaName,\n          includeAllConstraints: true,\n        }),\n      );\n    }\n\n    // Indexes\n    for (const idx of ScorerDefinitionsPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    return statements;\n  }\n\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return ScorerDefinitionsPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) {\n      return;\n    }\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch {\n        // Indexes are performance optimizations, continue on failure\n      }\n    }\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({\n      tableName: TABLE_SCORER_DEFINITIONS,\n      schema: TABLE_SCHEMAS[TABLE_SCORER_DEFINITIONS],\n    });\n    // Add tenancy columns for backwards compatibility (pre-tenancy installs)\n    await this.#db.alterTable({\n      tableName: TABLE_SCORER_DEFINITIONS,\n      schema: TABLE_SCHEMAS[TABLE_SCORER_DEFINITIONS],\n      ifNotExists: ['organizationId', 'projectId'],\n    });\n    await this.#db.createTable({\n      tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n      schema: TABLE_SCHEMAS[TABLE_SCORER_DEFINITION_VERSIONS],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) {\n      return;\n    }\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_SCORER_DEFINITION_VERSIONS });\n    await this.#db.clearTable({ tableName: TABLE_SCORER_DEFINITIONS });\n  }\n\n  // ==========================================================================\n  // Scorer Definition CRUD Methods\n  // ==========================================================================\n\n  async getById(id: string): Promise<StorageScorerDefinitionType | null> {\n    return this.#getById(this.#db.readClient, id);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #getById(client: DbClient, id: string): Promise<StorageScorerDefinitionType | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n      const result = await client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseScorerRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_SCORER_DEFINITION_BY_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { scorerDefinitionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async create(input: { scorerDefinition: StorageCreateScorerDefinitionInput }): Promise<StorageScorerDefinitionType> {\n    const { scorerDefinition } = input;\n    try {\n      const tableName = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      // 1. Create the thin scorer definition record\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, status, \"activeVersionId\", \"authorId\", \"organizationId\", \"projectId\", metadata,\n          \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`,\n        [\n          scorerDefinition.id,\n          'draft',\n          null,\n          scorerDefinition.authorId ?? null,\n          scorerDefinition.organizationId ?? null,\n          scorerDefinition.projectId ?? null,\n          scorerDefinition.metadata ? JSON.stringify(scorerDefinition.metadata) : null,\n          nowIso,\n          nowIso,\n          nowIso,\n          nowIso,\n        ],\n      );\n\n      // 2. Extract snapshot fields and create version 1\n      const {\n        id: _id,\n        authorId: _authorId,\n        organizationId: _organizationId,\n        projectId: _projectId,\n        metadata: _metadata,\n        ...snapshotConfig\n      } = scorerDefinition;\n      const versionId = crypto.randomUUID();\n      await this.createVersion({\n        id: versionId,\n        scorerDefinitionId: scorerDefinition.id,\n        versionNumber: 1,\n        ...snapshotConfig,\n        changedFields: [...SNAPSHOT_FIELDS],\n        changeMessage: 'Initial version',\n      });\n\n      return {\n        id: scorerDefinition.id,\n        status: 'draft',\n        activeVersionId: undefined,\n        authorId: scorerDefinition.authorId,\n        organizationId: scorerDefinition.organizationId,\n        projectId: scorerDefinition.projectId,\n        metadata: scorerDefinition.metadata,\n        createdAt: now,\n        updatedAt: now,\n      };\n    } catch (error) {\n      // Best-effort cleanup\n      try {\n        const tableName = getTableName({\n          indexName: TABLE_SCORER_DEFINITIONS,\n          schemaName: getSchemaName(this.#schema),\n        });\n        await this.#db.client.none(\n          `DELETE FROM ${tableName} WHERE id = $1 AND status = 'draft' AND \"activeVersionId\" IS NULL`,\n          [scorerDefinition.id],\n        );\n      } catch {\n        // Ignore cleanup errors\n      }\n\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_SCORER_DEFINITION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { scorerDefinitionId: scorerDefinition.id },\n        },\n        error,\n      );\n    }\n  }\n\n  async update(input: StorageUpdateScorerDefinitionInput): Promise<StorageScorerDefinitionType> {\n    const { id, ...updates } = input;\n    try {\n      const tableName = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n\n      const existingScorer = await this.#getById(this.#db.client, id);\n      if (!existingScorer) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_SCORER_DEFINITION', 'NOT_FOUND'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          text: `Scorer definition ${id} not found`,\n          details: { scorerDefinitionId: id },\n        });\n      }\n\n      const { authorId, activeVersionId, metadata, status } = updates;\n\n      // Update metadata fields on the scorer definition record\n      const setClauses: string[] = [];\n      const values: any[] = [];\n      let paramIndex = 1;\n\n      if (authorId !== undefined) {\n        setClauses.push(`\"authorId\" = $${paramIndex++}`);\n        values.push(authorId);\n      }\n\n      if (activeVersionId !== undefined) {\n        setClauses.push(`\"activeVersionId\" = $${paramIndex++}`);\n        values.push(activeVersionId);\n      }\n\n      if (status !== undefined) {\n        setClauses.push(`status = $${paramIndex++}`);\n        values.push(status);\n      }\n\n      if (metadata !== undefined) {\n        const mergedMetadata = { ...(existingScorer.metadata || {}), ...metadata };\n        setClauses.push(`metadata = $${paramIndex++}`);\n        values.push(JSON.stringify(mergedMetadata));\n      }\n\n      // Always update timestamps\n      const now = new Date().toISOString();\n      setClauses.push(`\"updatedAt\" = $${paramIndex++}`);\n      values.push(now);\n      setClauses.push(`\"updatedAtZ\" = $${paramIndex++}`);\n      values.push(now);\n\n      values.push(id);\n\n      // Always update the record (at minimum updatedAt/updatedAtZ are set)\n      await this.#db.client.none(`UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`, values);\n\n      const updatedScorer = await this.#getById(this.#db.client, id);\n      if (!updatedScorer) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_SCORER_DEFINITION', 'NOT_FOUND_AFTER_UPDATE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.SYSTEM,\n          text: `Scorer definition ${id} not found after update`,\n          details: { scorerDefinitionId: id },\n        });\n      }\n      return updatedScorer;\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_SCORER_DEFINITION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { scorerDefinitionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async delete(id: string): Promise<void> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n      await this.deleteVersionsByParentId(id);\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_SCORER_DEFINITION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { scorerDefinitionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async list(args?: StorageListScorerDefinitionsInput): Promise<StorageListScorerDefinitionsOutput> {\n    const {\n      page = 0,\n      perPage: perPageInput,\n      orderBy,\n      authorId,\n      organizationId,\n      projectId,\n      metadata,\n      status,\n    } = args || {};\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    if (page < 0) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_SCORER_DEFINITIONS', 'INVALID_PAGE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { page },\n        },\n        new Error('page must be >= 0'),\n      );\n    }\n\n    const perPage = normalizePerPage(perPageInput, 100);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    try {\n      const tableName = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n\n      // Build WHERE conditions\n      const conditions: string[] = [];\n      const queryParams: any[] = [];\n      let paramIdx = 1;\n\n      if (status) {\n        conditions.push(`status = $${paramIdx++}`);\n        queryParams.push(status);\n      }\n\n      if (authorId !== undefined) {\n        conditions.push(`\"authorId\" = $${paramIdx++}`);\n        queryParams.push(authorId);\n      }\n\n      if (organizationId !== undefined) {\n        conditions.push(`\"organizationId\" = $${paramIdx++}`);\n        queryParams.push(organizationId);\n      }\n\n      if (projectId !== undefined) {\n        conditions.push(`\"projectId\" = $${paramIdx++}`);\n        queryParams.push(projectId);\n      }\n\n      if (metadata && Object.keys(metadata).length > 0) {\n        conditions.push(`metadata @> $${paramIdx++}::jsonb`);\n        queryParams.push(JSON.stringify(metadata));\n      }\n\n      const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n      // Get total count\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n        queryParams,\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return {\n          scorerDefinitions: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      const limitValue = perPageInput === false ? total : perPage;\n      const dataResult = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"${field}\" ${direction} LIMIT $${paramIdx++} OFFSET $${paramIdx++}`,\n        [...queryParams, limitValue, offset],\n      );\n\n      const scorerDefinitions = (dataResult || []).flatMap(row => {\n        try {\n          return [this.parseScorerRow(row)];\n        } catch (err) {\n          this.logger?.warn?.('[PG] Failed to map scorer definition row, skipping', { id: row?.id, error: err });\n          return [];\n        }\n      });\n\n      return {\n        scorerDefinitions,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_SCORER_DEFINITIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  // ==========================================================================\n  // Scorer Definition Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateScorerDefinitionVersionInput): Promise<ScorerDefinitionVersion> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, \"scorerDefinitionId\", \"versionNumber\",\n          name, description, type, model, instructions, \"scoreRange\", \"presetConfig\", \"defaultSampling\",\n          \"changedFields\", \"changeMessage\",\n          \"createdAt\", \"createdAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)`,\n        [\n          input.id,\n          input.scorerDefinitionId,\n          input.versionNumber,\n          input.name,\n          input.description ?? null,\n          input.type,\n          input.model ? JSON.stringify(input.model) : null,\n          input.instructions ?? null,\n          input.scoreRange ? JSON.stringify(input.scoreRange) : null,\n          input.presetConfig ? JSON.stringify(input.presetConfig) : null,\n          input.defaultSampling ? JSON.stringify(input.defaultSampling) : null,\n          input.changedFields ? JSON.stringify(input.changedFields) : null,\n          input.changeMessage ?? null,\n          nowIso,\n          nowIso,\n        ],\n      );\n\n      return {\n        ...input,\n        createdAt: now,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_SCORER_DEFINITION_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: input.id, scorerDefinitionId: input.scorerDefinitionId },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersion(id: string): Promise<ScorerDefinitionVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_SCORER_DEFINITION_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersionByNumber(scorerDefinitionId: string, versionNumber: number): Promise<ScorerDefinitionVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"scorerDefinitionId\" = $1 AND \"versionNumber\" = $2`,\n        [scorerDefinitionId, versionNumber],\n      );\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_SCORER_DEFINITION_VERSION_BY_NUMBER', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { scorerDefinitionId, versionNumber },\n        },\n        error,\n      );\n    }\n  }\n\n  async getLatestVersion(scorerDefinitionId: string): Promise<ScorerDefinitionVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"scorerDefinitionId\" = $1 ORDER BY \"versionNumber\" DESC LIMIT 1`,\n        [scorerDefinitionId],\n      );\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_LATEST_SCORER_DEFINITION_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { scorerDefinitionId },\n        },\n        error,\n      );\n    }\n  }\n\n  async listVersions(input: ListScorerDefinitionVersionsInput): Promise<ListScorerDefinitionVersionsOutput> {\n    const { scorerDefinitionId, page = 0, perPage: perPageInput, orderBy } = input;\n\n    if (page < 0) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_SCORER_DEFINITION_VERSIONS', 'INVALID_PAGE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { page },\n        },\n        new Error('page must be >= 0'),\n      );\n    }\n\n    const perPage = normalizePerPage(perPageInput, 20);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    try {\n      const { field, direction } = this.parseVersionOrderBy(orderBy);\n      const tableName = getTableName({\n        indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} WHERE \"scorerDefinitionId\" = $1`,\n        [scorerDefinitionId],\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return {\n          versions: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      const limitValue = perPageInput === false ? total : perPage;\n      const dataResult = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} WHERE \"scorerDefinitionId\" = $1 ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`,\n        [scorerDefinitionId, limitValue, offset],\n      );\n\n      const versions = (dataResult || []).flatMap(row => {\n        try {\n          return [this.parseVersionRow(row)];\n        } catch (err) {\n          this.logger?.warn?.('[PG] Failed to map scorer definition version row, skipping', {\n            id: row?.id,\n            error: err,\n          });\n          return [];\n        }\n      });\n\n      return {\n        versions,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_SCORER_DEFINITION_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { scorerDefinitionId },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_SCORER_DEFINITION_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"scorerDefinitionId\" = $1`, [entityId]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_SCORER_DEFINITION_VERSIONS_BY_SCORER_DEFINITION_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { scorerDefinitionId: entityId },\n        },\n        error,\n      );\n    }\n  }\n\n  async countVersions(scorerDefinitionId: string): Promise<number> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} WHERE \"scorerDefinitionId\" = $1`,\n        [scorerDefinitionId],\n      );\n      return parseInt(result.count, 10);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'COUNT_SCORER_DEFINITION_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { scorerDefinitionId },\n        },\n        error,\n      );\n    }\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  private parseScorerRow(row: any): StorageScorerDefinitionType {\n    return {\n      id: row.id as string,\n      status: row.status as StorageScorerDefinitionType['status'],\n      activeVersionId: row.activeVersionId as string | undefined,\n      authorId: row.authorId as string | undefined,\n      organizationId: row.organizationId as string | undefined,\n      projectId: row.projectId as string | undefined,\n      metadata: parseJsonResilient(row.metadata, 'metadata'),\n      createdAt: new Date(row.createdAtZ || row.createdAt),\n      updatedAt: new Date(row.updatedAtZ || row.updatedAt),\n    };\n  }\n\n  private parseVersionRow(row: any): ScorerDefinitionVersion {\n    return {\n      id: row.id as string,\n      scorerDefinitionId: row.scorerDefinitionId as string,\n      versionNumber: row.versionNumber as number,\n      name: row.name as string,\n      description: row.description as string | undefined,\n      type: row.type as ScorerDefinitionVersion['type'],\n      model: parseJsonResilient(row.model, 'model'),\n      instructions: row.instructions as string | undefined,\n      scoreRange: parseJsonResilient(row.scoreRange, 'scoreRange'),\n      presetConfig: parseJsonResilient(row.presetConfig, 'presetConfig'),\n      defaultSampling: parseJsonResilient(row.defaultSampling, 'defaultSampling'),\n      changedFields: parseJsonResilient(row.changedFields, 'changedFields'),\n      changeMessage: row.changeMessage as string | undefined,\n      createdAt: new Date(row.createdAtZ || row.createdAt),\n    };\n  }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport type {\n  CreateIndexOptions,\n  PruneOptions,\n  PruneResult,\n  RetentionTablesDescriptor,\n  ScoreTenancyFilters,\n  StoragePagination,\n  TABLE_NAMES,\n  TableRetentionPolicy,\n} from '@mastra/core/storage';\nimport {\n  calculatePagination,\n  createStorageErrorId,\n  normalizePerPage,\n  ScoresStorage,\n  TABLE_SCORERS,\n  TABLE_SCHEMAS,\n  transformScoreRow as coreTransformScoreRow,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { runPrune, resolveTargets } from '../../retention';\n\n/**\n * Appends multi-tenant scope conditions to a query. Mutates `conditions`/`queryParams`.\n * Returns the next positional parameter index.\n */\nfunction applyTenancyFilters(\n  conditions: string[],\n  queryParams: any[],\n  startIndex: number,\n  filters?: ScoreTenancyFilters,\n): number {\n  let paramIndex = startIndex;\n  if (filters?.organizationId !== undefined) {\n    conditions.push(`\"organizationId\" = $${paramIndex++}`);\n    queryParams.push(filters.organizationId);\n  }\n  if (filters?.projectId !== undefined) {\n    conditions.push(`\"projectId\" = $${paramIndex++}`);\n    queryParams.push(filters.projectId);\n  }\n  return paramIndex;\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 * 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  /**\n   * Scorer results accumulate as evals run. Single table, anchored on the\n   * timezone-aware `createdAtZ` mirror column (kept in sync by triggers).\n   */\n  static override readonly retentionTables: RetentionTablesDescriptor = {\n    scorers: { table: TABLE_SCORERS, column: 'createdAtZ', indexed: true },\n  };\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    // Filter indexes to only those for tables managed by this domain\n    this.#indexes = indexes?.filter(idx => (ScoresPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({ tableName: TABLE_SCORERS, schema: TABLE_SCHEMAS[TABLE_SCORERS] });\n    // Add columns for backwards compatibility (v0.x to v1 migration)\n    await this.#db.alterTable({\n      tableName: TABLE_SCORERS,\n      schema: TABLE_SCHEMAS[TABLE_SCORERS],\n      ifNotExists: ['spanId', 'requestContext', 'organizationId', 'projectId', 'batchId', 'datasetId', 'datasetItemId'],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  /**\n   * Lazily ensures a btree index exists on each configured policy's retention\n   * anchor column so age-based `prune()` deletes stay fast on large tables.\n   * Called from the prune path (not init) so only deployments that configure\n   * retention pay the index's write/disk overhead. Best-effort: failures are\n   * logged and pruning proceeds (correct, just slower).\n   * Created even with `skipDefaultIndexes` — retention is an explicit opt-in,\n   * so its supporting index is not part of the default index set.\n   */\n  private async ensureRetentionIndexes(policies: Record<string, TableRetentionPolicy>): Promise<void> {\n    const prefix = this.#schema && this.#schema !== 'public' ? `${this.#schema}_` : '';\n    for (const [key, entry] of Object.entries(ScoresPG.retentionTables)) {\n      if (!entry.indexed || !policies[key]) continue;\n      try {\n        await this.#db.ensureIndex({\n          indexName: `${prefix}mastra_${key}_retention_idx`,\n          tableName: entry.table as TABLE_NAMES,\n          column: entry.column,\n        });\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create retention index for ${entry.table}:`, error);\n      }\n    }\n  }\n\n  /**\n   * Returns default index definitions for the scores domain tables.\n   * @param schemaPrefix - Prefix for index names (e.g. \"my_schema_\" or \"\")\n   */\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}mastra_scores_trace_id_span_id_created_at_idx`,\n        table: TABLE_SCORERS,\n        columns: ['traceId', 'spanId', 'createdAt DESC'],\n      },\n    ];\n  }\n\n  /**\n   * Returns all DDL statements for this domain: table and indexes.\n   * Used by exportSchemas to produce a complete, reproducible schema export.\n   */\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n    // Table\n    statements.push(\n      generateTableSQL({\n        tableName: TABLE_SCORERS,\n        schema: TABLE_SCHEMAS[TABLE_SCORERS],\n        schemaName,\n        includeAllConstraints: true,\n      }),\n    );\n\n    // Indexes\n    for (const idx of ScoresPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    return statements;\n  }\n\n  /**\n   * Returns default index definitions for this instance's schema.\n   */\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return ScoresPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  /**\n   * Creates default indexes for optimal query performance.\n   */\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) {\n      return;\n    }\n\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        // Log but continue - indexes are performance optimizations\n        this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  /**\n   * Creates custom user-defined indexes for this domain's tables.\n   */\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) {\n      return;\n    }\n\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        // Log but continue - indexes are performance optimizations\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_SCORERS });\n  }\n\n  /** Delete scorer results older than the `scorers` policy's `maxAge`, batched. */\n  async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n    await this.ensureRetentionIndexes(policies);\n    const targets = resolveTargets({\n      policies,\n      descriptor: ScoresPG.retentionTables,\n      order: ['scorers'],\n    });\n    return runPrune({ db: this.#db, domain: 'scores', targets, options });\n  }\n\n  async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n    try {\n      const result = await this.#db.readClient.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    filters,\n  }: {\n    scorerId: string;\n    pagination: StoragePagination;\n    entityId?: string;\n    entityType?: string;\n    source?: ScoringSource;\n    filters?: ScoreTenancyFilters;\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      paramIndex = applyTenancyFilters(conditions, queryParams, paramIndex, filters);\n\n      const whereClause = conditions.join(' AND ');\n\n      const total = await this.#db.readClient.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.readClient.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      // Caller-supplied ids give scores a stable identity: retried writes for\n      // the same id replace the previous row (latest wins) instead of\n      // accumulating duplicates.\n      const suppliedId = parsedScore.id;\n      const id = suppliedId ?? crypto.randomUUID();\n      const now = new Date();\n\n      const {\n        id: _suppliedId,\n        scorer,\n        preprocessStepResult,\n        analyzeStepResult,\n        metadata,\n        input,\n        output,\n        additionalContext,\n        requestContext,\n        entity,\n        ...rest\n      } = parsedScore;\n\n      if (suppliedId) {\n        await this.#db.client.none(\n          `DELETE FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE id = $1`,\n          [suppliedId],\n        );\n      }\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    filters,\n  }: {\n    runId: string;\n    pagination: StoragePagination;\n    filters?: ScoreTenancyFilters;\n  }): Promise<ListScoresResponse> {\n    try {\n      const conditions: string[] = [`\"runId\" = $1`];\n      const queryParams: any[] = [runId];\n      let paramIndex = applyTenancyFilters(conditions, queryParams, 2, filters);\n      const whereClause = conditions.join(' AND ');\n\n      const total = await this.#db.readClient.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\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.readClient.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      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  async listScoresByEntityId({\n    entityId,\n    entityType,\n    pagination,\n    filters,\n  }: {\n    pagination: StoragePagination;\n    entityId: string;\n    entityType: string;\n    filters?: ScoreTenancyFilters;\n  }): Promise<ListScoresResponse> {\n    try {\n      const conditions: string[] = [`\"entityId\" = $1`, `\"entityType\" = $2`];\n      const queryParams: any[] = [entityId, entityType];\n      let paramIndex = applyTenancyFilters(conditions, queryParams, 3, filters);\n      const whereClause = conditions.join(' AND ');\n\n      const total = await this.#db.readClient.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\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.readClient.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      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    filters,\n  }: {\n    traceId: string;\n    spanId: string;\n    pagination: StoragePagination;\n    filters?: ScoreTenancyFilters;\n  }): Promise<ListScoresResponse> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) });\n      const conditions: string[] = [`\"traceId\" = $1`, `\"spanId\" = $2`];\n      const queryParams: any[] = [traceId, spanId];\n      let paramIndex = applyTenancyFilters(conditions, queryParams, 3, filters);\n      const whereClause = conditions.join(' AND ');\n\n      const countSQLResult = await this.#db.readClient.oneOrNone<{ count: string }>(\n        `SELECT COUNT(*) as count FROM ${tableName} WHERE ${whereClause}`,\n        queryParams,\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.readClient.manyOrNone<ScoreRowData>(\n        `SELECT * FROM ${tableName} WHERE ${whereClause} ORDER BY \"createdAt\" DESC LIMIT $${paramIndex++} OFFSET $${paramIndex++}`,\n        [...queryParams, 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  SkillsStorage,\n  createStorageErrorId,\n  normalizePerPage,\n  calculatePagination,\n  TABLE_SKILLS,\n  TABLE_SKILL_VERSIONS,\n  TABLE_SCHEMAS,\n  TABLE_FAVORITES,\n} from '@mastra/core/storage';\nimport type {\n  StorageSkillType,\n  StorageCreateSkillInput,\n  StorageUpdateSkillInput,\n  StorageListSkillsInput,\n  StorageListSkillsOutput,\n  CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type {\n  SkillVersion,\n  CreateSkillVersionInput,\n  ListSkillVersionsInput,\n  ListSkillVersionsOutput,\n} from '@mastra/core/storage/domains/skills';\nimport { skillSnapshotFieldValuesEqual } from '@mastra/core/storage/domains/skills';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { DbClient, PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName, parseJsonResilient } from '../utils';\n\nconst SNAPSHOT_FIELDS = [\n  'name',\n  'description',\n  'instructions',\n  'license',\n  'compatibility',\n  'source',\n  'references',\n  'scripts',\n  'assets',\n  'files',\n  'metadata',\n  'tree',\n] as const;\n\nexport class SkillsPG extends SkillsStorage {\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  static readonly MANAGED_TABLES = [TABLE_SKILLS, TABLE_SKILL_VERSIONS] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    this.#indexes = indexes?.filter(idx => (SkillsPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n  }\n\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}idx_skill_versions_skill_version`,\n        table: TABLE_SKILL_VERSIONS,\n        columns: ['skillId', 'versionNumber'],\n        unique: true,\n      },\n    ];\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n    for (const tableName of SkillsPG.MANAGED_TABLES) {\n      statements.push(\n        generateTableSQL({\n          tableName,\n          schema: TABLE_SCHEMAS[tableName],\n          schemaName,\n          includeAllConstraints: true,\n        }),\n      );\n    }\n\n    for (const idx of SkillsPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    return statements;\n  }\n\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return SkillsPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) {\n      return;\n    }\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch {\n        // Indexes are performance optimizations, continue on failure\n      }\n    }\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({\n      tableName: TABLE_SKILLS,\n      schema: TABLE_SCHEMAS[TABLE_SKILLS],\n    });\n    await this.#db.createTable({\n      tableName: TABLE_SKILL_VERSIONS,\n      schema: TABLE_SCHEMAS[TABLE_SKILL_VERSIONS],\n    });\n    // Add new columns for backwards compatibility with intermediate schema versions\n    await this.#db.alterTable({\n      tableName: TABLE_SKILLS,\n      schema: TABLE_SCHEMAS[TABLE_SKILLS],\n      ifNotExists: ['visibility', 'favoriteCount'],\n    });\n    await this.#db.alterTable({\n      tableName: TABLE_SKILL_VERSIONS,\n      schema: TABLE_SCHEMAS[TABLE_SKILL_VERSIONS],\n      ifNotExists: ['files'],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) {\n      return;\n    }\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_SKILL_VERSIONS });\n    await this.#db.clearTable({ tableName: TABLE_SKILLS });\n  }\n\n  // ==========================================================================\n  // Skill CRUD Methods\n  // ==========================================================================\n\n  async getById(id: string): Promise<StorageSkillType | null> {\n    return this.#getById(this.#db.readClient, id);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #getById(client: DbClient, id: string): Promise<StorageSkillType | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_SKILLS, schemaName: getSchemaName(this.#schema) });\n      const result = await client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseSkillRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_SKILL_BY_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { skillId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async create(input: { skill: StorageCreateSkillInput }): Promise<StorageSkillType> {\n    const { skill } = input;\n    try {\n      const tableName = getTableName({ indexName: TABLE_SKILLS, schemaName: getSchemaName(this.#schema) });\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      const visibility = skill.visibility ?? (skill.authorId ? 'private' : undefined);\n\n      // 1. Create the thin skill record (no metadata on entity)\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, status, \"activeVersionId\", \"authorId\", visibility, \"favoriteCount\",\n          \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`,\n        [skill.id, 'draft', null, skill.authorId ?? null, visibility ?? null, 0, nowIso, nowIso, nowIso, nowIso],\n      );\n\n      // 2. Extract snapshot fields and create version 1\n      const { id: _id, authorId: _authorId, visibility: _visibility, ...snapshotConfig } = skill;\n      const versionId = crypto.randomUUID();\n      await this.createVersion({\n        id: versionId,\n        skillId: skill.id,\n        versionNumber: 1,\n        ...snapshotConfig,\n        changedFields: [...SNAPSHOT_FIELDS],\n        changeMessage: 'Initial version',\n      });\n\n      return {\n        id: skill.id,\n        status: 'draft',\n        activeVersionId: undefined,\n        authorId: skill.authorId,\n        visibility,\n        favoriteCount: 0,\n        createdAt: now,\n        updatedAt: now,\n      };\n    } catch (error) {\n      // Best-effort cleanup\n      try {\n        const tableName = getTableName({\n          indexName: TABLE_SKILLS,\n          schemaName: getSchemaName(this.#schema),\n        });\n        await this.#db.client.none(\n          `DELETE FROM ${tableName} WHERE id = $1 AND status = 'draft' AND \"activeVersionId\" IS NULL`,\n          [skill.id],\n        );\n      } catch {\n        // Ignore cleanup errors\n      }\n\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_SKILL', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { skillId: skill.id },\n        },\n        error,\n      );\n    }\n  }\n\n  async update(input: StorageUpdateSkillInput): Promise<StorageSkillType> {\n    const { id, ...updates } = input;\n    try {\n      const tableName = getTableName({ indexName: TABLE_SKILLS, schemaName: getSchemaName(this.#schema) });\n\n      const existingSkill = await this.#getById(this.#db.client, id);\n      if (!existingSkill) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_SKILL', 'NOT_FOUND'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          text: `Skill ${id} not found`,\n          details: { skillId: id },\n        });\n      }\n\n      const { authorId, visibility, activeVersionId, status, ...rawConfigFields } = updates;\n      let versionCreated = false;\n\n      // Filter out undefined keys: callers may spread partial snapshots into\n      // update() and rely on \"omit = no change\" semantics. Forwarding\n      // undefined would overwrite populated columns with undefined and trip\n      // pg-promise's \"undefined cannot be passed as argument\" guard.\n      const configFields: Record<string, unknown> = {};\n      for (const [key, value] of Object.entries(rawConfigFields)) {\n        if (value !== undefined) configFields[key] = value;\n      }\n\n      // Check if any snapshot config fields are present\n      const hasConfigUpdate = SNAPSHOT_FIELDS.some(field => field in configFields);\n\n      if (hasConfigUpdate) {\n        const latestVersion = await this.#getLatestVersion(this.#db.client, id);\n        if (!latestVersion) {\n          throw new MastraError({\n            id: createStorageErrorId('PG', 'UPDATE_SKILL', 'NO_VERSIONS'),\n            domain: ErrorDomain.STORAGE,\n            category: ErrorCategory.SYSTEM,\n            text: `No versions found for skill ${id}`,\n            details: { skillId: id },\n          });\n        }\n\n        const {\n          id: _versionId,\n          skillId: _skillId,\n          versionNumber: _versionNumber,\n          changedFields: _changedFields,\n          changeMessage: _changeMessage,\n          createdAt: _createdAt,\n          ...latestConfig\n        } = latestVersion;\n\n        const newConfig = { ...latestConfig, ...configFields };\n        const changedFields = SNAPSHOT_FIELDS.filter(\n          field =>\n            field in configFields &&\n            !skillSnapshotFieldValuesEqual(\n              configFields[field as keyof typeof configFields],\n              latestConfig[field as keyof typeof latestConfig],\n            ),\n        );\n\n        if (changedFields.length > 0) {\n          versionCreated = true;\n          const newVersionId = crypto.randomUUID();\n          await this.createVersion({\n            id: newVersionId,\n            skillId: id,\n            versionNumber: latestVersion.versionNumber + 1,\n            ...newConfig,\n            changedFields: [...changedFields],\n            changeMessage: `Updated ${changedFields.join(', ')}`,\n          });\n        }\n      }\n\n      // Update metadata fields on the skill record (no metadata column on entity)\n      const setClauses: string[] = [];\n      const values: any[] = [];\n      let paramIndex = 1;\n\n      if (authorId !== undefined) {\n        setClauses.push(`\"authorId\" = $${paramIndex++}`);\n        values.push(authorId);\n      }\n\n      if (visibility !== undefined) {\n        setClauses.push(`visibility = $${paramIndex++}`);\n        values.push(visibility);\n      }\n\n      if (activeVersionId !== undefined) {\n        setClauses.push(`\"activeVersionId\" = $${paramIndex++}`);\n        values.push(activeVersionId);\n        // Auto-set status to 'published' when activeVersionId is set, consistent with InMemory and LibSQL\n        if (status === undefined) {\n          setClauses.push(`status = $${paramIndex++}`);\n          values.push('published');\n        }\n      }\n\n      if (status !== undefined) {\n        setClauses.push(`status = $${paramIndex++}`);\n        values.push(status);\n      }\n\n      // Always update timestamps\n      const now = new Date().toISOString();\n      setClauses.push(`\"updatedAt\" = $${paramIndex++}`);\n      values.push(now);\n      setClauses.push(`\"updatedAtZ\" = $${paramIndex++}`);\n      values.push(now);\n\n      values.push(id);\n\n      if (setClauses.length > 2 || versionCreated) {\n        // More than just updatedAt and updatedAtZ, or a new version was created\n        await this.#db.client.none(\n          `UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`,\n          values,\n        );\n      }\n\n      const updatedSkill = await this.#getById(this.#db.client, id);\n      if (!updatedSkill) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_SKILL', 'NOT_FOUND_AFTER_UPDATE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.SYSTEM,\n          text: `Skill ${id} not found after update`,\n          details: { skillId: id },\n        });\n      }\n      return updatedSkill;\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_SKILL', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { skillId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async delete(id: string): Promise<void> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_SKILLS, schemaName: getSchemaName(this.#schema) });\n      await this.deleteVersionsByParentId(id);\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_SKILL', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { skillId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async list(args?: StorageListSkillsInput): Promise<StorageListSkillsOutput> {\n    const {\n      page = 0,\n      perPage: perPageInput,\n      orderBy,\n      authorId,\n      visibility,\n      status,\n      entityIds,\n      pinFavoritedFor,\n      favoritedOnly,\n    } = args || {};\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    if (page < 0) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_SKILLS', 'INVALID_PAGE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { page },\n        },\n        new Error('page must be >= 0'),\n      );\n    }\n\n    const perPage = normalizePerPage(perPageInput, 100);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    try {\n      // Empty entityIds is short-circuit: no rows possible.\n      if (entityIds && entityIds.length === 0) {\n        return {\n          skills: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      const tableName = getTableName({ indexName: TABLE_SKILLS, schemaName: getSchemaName(this.#schema) });\n      const favoritesTable = getTableName({ indexName: TABLE_FAVORITES, schemaName: getSchemaName(this.#schema) });\n\n      // Build WHERE conditions (referenced via alias `s` for skills, `sr` for favorites).\n      const conditions: string[] = [];\n      const queryParams: any[] = [];\n      let paramIdx = 1;\n\n      const joinUserId = pinFavoritedFor;\n      const useJoin = Boolean(joinUserId);\n      let joinSqlIdx: number | null = null;\n      if (useJoin) {\n        joinSqlIdx = paramIdx++;\n      }\n\n      if (status) {\n        conditions.push(`s.status = $${paramIdx++}`);\n        queryParams.push(status);\n      }\n\n      if (authorId !== undefined) {\n        conditions.push(`s.\"authorId\" = $${paramIdx++}`);\n        queryParams.push(authorId);\n      }\n\n      if (visibility !== undefined) {\n        conditions.push(`s.visibility = $${paramIdx++}`);\n        queryParams.push(visibility);\n      }\n\n      if (entityIds && entityIds.length > 0) {\n        const placeholders = entityIds.map(() => `$${paramIdx++}`).join(', ');\n        conditions.push(`s.id IN (${placeholders})`);\n        queryParams.push(...entityIds);\n      }\n\n      if (useJoin && favoritedOnly) {\n        conditions.push('sr.\"userId\" IS NOT NULL');\n      } else if (favoritedOnly) {\n        // Defensive: favoritedOnly with no userId can never match a real row.\n        conditions.push('1=0');\n      }\n\n      const joinClause =\n        useJoin && joinSqlIdx !== null\n          ? `LEFT JOIN ${favoritesTable} sr ON sr.\"entityType\" = 'skill' AND sr.\"entityId\" = s.id AND sr.\"userId\" = $${joinSqlIdx}`\n          : '';\n      const joinParams: any[] = useJoin && joinUserId ? [joinUserId] : [];\n\n      const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n      // Get total count (mirrors join + where, no ORDER BY / LIMIT).\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} s ${joinClause} ${whereClause}`,\n        [...joinParams, ...queryParams],\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return {\n          skills: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      // Compose ORDER BY: favorited-first when JOIN active, then existing field, then id ASC tie-break.\n      const orderByParts: string[] = [];\n      if (useJoin) {\n        orderByParts.push(`(sr.\"userId\" IS NOT NULL) DESC`);\n      }\n      orderByParts.push(`s.\"${field}\" ${direction}`);\n      orderByParts.push(`s.\"id\" ASC`);\n      const orderByClause = `ORDER BY ${orderByParts.join(', ')}`;\n\n      const limitValue = perPageInput === false ? total : perPage;\n      const limitIdx = paramIdx++;\n      const offsetIdx = paramIdx++;\n      const dataResult = await this.#db.readClient.manyOrNone(\n        `SELECT s.* FROM ${tableName} s ${joinClause} ${whereClause} ${orderByClause} LIMIT $${limitIdx} OFFSET $${offsetIdx}`,\n        [...joinParams, ...queryParams, limitValue, offset],\n      );\n\n      const skills = (dataResult || []).flatMap(row => {\n        try {\n          return [this.parseSkillRow(row)];\n        } catch (err) {\n          this.logger?.warn?.('[PG] Failed to map skill row, skipping', { id: row?.id, error: err });\n          return [];\n        }\n      });\n\n      return {\n        skills,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_SKILLS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  // ==========================================================================\n  // Skill Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateSkillVersionInput): Promise<SkillVersion> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SKILL_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, \"skillId\", \"versionNumber\",\n          name, description, instructions, license, compatibility,\n          source, \"references\", scripts, assets, files, metadata, tree,\n          \"changedFields\", \"changeMessage\",\n          \"createdAt\", \"createdAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19)`,\n        [\n          input.id,\n          input.skillId,\n          input.versionNumber,\n          input.name,\n          input.description ?? null,\n          input.instructions ?? null,\n          input.license ?? null,\n          input.compatibility ? JSON.stringify(input.compatibility) : null,\n          input.source ? JSON.stringify(input.source) : null,\n          input.references ? JSON.stringify(input.references) : null,\n          input.scripts ? JSON.stringify(input.scripts) : null,\n          input.assets ? JSON.stringify(input.assets) : null,\n          input.files ? JSON.stringify(input.files) : null,\n          input.metadata ? JSON.stringify(input.metadata) : null,\n          input.tree ? JSON.stringify(input.tree) : null,\n          input.changedFields ? JSON.stringify(input.changedFields) : null,\n          input.changeMessage ?? null,\n          nowIso,\n          nowIso,\n        ],\n      );\n\n      return {\n        ...input,\n        createdAt: now,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_SKILL_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: input.id, skillId: input.skillId },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersion(id: string): Promise<SkillVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SKILL_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_SKILL_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersions(ids: string[]): Promise<SkillVersion[]> {\n    if (ids.length === 0) {\n      return [];\n    }\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SKILL_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const placeholders = ids.map((_, i) => `$${i + 1}`).join(', ');\n      const rows = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} WHERE id IN (${placeholders})`,\n        ids,\n      );\n      return rows.map(row => this.parseVersionRow(row));\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_SKILL_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { count: ids.length },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersionByNumber(skillId: string, versionNumber: number): Promise<SkillVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SKILL_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"skillId\" = $1 AND \"versionNumber\" = $2`,\n        [skillId, versionNumber],\n      );\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_SKILL_VERSION_BY_NUMBER', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { skillId, versionNumber },\n        },\n        error,\n      );\n    }\n  }\n\n  async getLatestVersion(skillId: string): Promise<SkillVersion | null> {\n    return this.#getLatestVersion(this.#db.readClient, skillId);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #getLatestVersion(client: DbClient, skillId: string): Promise<SkillVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SKILL_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await client.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"skillId\" = $1 ORDER BY \"versionNumber\" DESC LIMIT 1`,\n        [skillId],\n      );\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_LATEST_SKILL_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { skillId },\n        },\n        error,\n      );\n    }\n  }\n\n  async listVersions(input: ListSkillVersionsInput): Promise<ListSkillVersionsOutput> {\n    const { skillId, page = 0, perPage: perPageInput, orderBy } = input;\n\n    if (page < 0) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_SKILL_VERSIONS', 'INVALID_PAGE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { page },\n        },\n        new Error('page must be >= 0'),\n      );\n    }\n\n    const perPage = normalizePerPage(perPageInput, 20);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    try {\n      const { field, direction } = this.parseVersionOrderBy(orderBy);\n      const tableName = getTableName({\n        indexName: TABLE_SKILL_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} WHERE \"skillId\" = $1`,\n        [skillId],\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return {\n          versions: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      const limitValue = perPageInput === false ? total : perPage;\n      const dataResult = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} WHERE \"skillId\" = $1 ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`,\n        [skillId, limitValue, offset],\n      );\n\n      const versions = (dataResult || []).flatMap(row => {\n        try {\n          return [this.parseVersionRow(row)];\n        } catch (err) {\n          this.logger?.warn?.('[PG] Failed to map skill version row, skipping', { id: row?.id, error: err });\n          return [];\n        }\n      });\n\n      return {\n        versions,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_SKILL_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { skillId },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SKILL_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_SKILL_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SKILL_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"skillId\" = $1`, [entityId]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_SKILL_VERSIONS_BY_SKILL_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { skillId: entityId },\n        },\n        error,\n      );\n    }\n  }\n\n  async countVersions(skillId: string): Promise<number> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_SKILL_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.one(`SELECT COUNT(*) as count FROM ${tableName} WHERE \"skillId\" = $1`, [\n        skillId,\n      ]);\n      return parseInt(result.count, 10);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'COUNT_SKILL_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { skillId },\n        },\n        error,\n      );\n    }\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  private parseSkillRow(row: any): StorageSkillType {\n    return {\n      id: row.id as string,\n      status: row.status as StorageSkillType['status'],\n      activeVersionId: row.activeVersionId as string | undefined,\n      authorId: row.authorId as string | undefined,\n      visibility: row.visibility as StorageSkillType['visibility'],\n      favoriteCount: row.favoriteCount === null || row.favoriteCount === undefined ? 0 : Number(row.favoriteCount),\n      createdAt: new Date(row.createdAtZ || row.createdAt),\n      updatedAt: new Date(row.updatedAtZ || row.updatedAt),\n    };\n  }\n\n  private parseVersionRow(row: any): SkillVersion {\n    return {\n      id: row.id as string,\n      skillId: row.skillId as string,\n      versionNumber: row.versionNumber as number,\n      name: row.name as string,\n      description: row.description as string,\n      instructions: row.instructions as string,\n      license: row.license as string | undefined,\n      compatibility: parseJsonResilient(row.compatibility, 'compatibility'),\n      source: parseJsonResilient(row.source, 'source'),\n      references: parseJsonResilient(row.references, 'references'),\n      scripts: parseJsonResilient(row.scripts, 'scripts'),\n      assets: parseJsonResilient(row.assets, 'assets'),\n      files: parseJsonResilient(row.files, 'files'),\n      metadata: parseJsonResilient(row.metadata, 'metadata'),\n      tree: parseJsonResilient(row.tree, 'tree'),\n      changedFields: parseJsonResilient(row.changedFields, 'changedFields'),\n      changeMessage: row.changeMessage as string | undefined,\n      createdAt: new Date(row.createdAtZ || row.createdAt),\n    };\n  }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { ThreadStateStorage, createStorageErrorId, TABLE_THREAD_STATE, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type {\n  PruneOptions,\n  PruneResult,\n  RetentionTablesDescriptor,\n  TableRetentionPolicy,\n  TABLE_NAMES,\n} from '@mastra/core/storage';\n\nimport { PgDB, resolvePgConfig, generateTableSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { runPrune, resolveTargets } from '../../retention';\nimport { getSchemaName, getTableName } from '../utils';\n\nconst COMPOSITE_PRIMARY_KEY = ['threadId', 'type'];\n\n/**\n * PostgreSQL implementation of {@link ThreadStateStorage}.\n *\n * Stores per-thread, per-type state in `mastra_thread_state`, keyed by the\n * composite primary key `(threadId, type)`. The `value` column is `jsonb`, so\n * payloads (the task list for `type = 'task'`, the goal objective for\n * `type = 'goal'`) come back already parsed.\n */\nexport class ThreadStatePG extends ThreadStateStorage {\n  #db: PgDB;\n  #schema: string;\n\n  static readonly MANAGED_TABLES = [TABLE_THREAD_STATE] as const;\n\n  /**\n   * `thread_state` grows as a side effect of thread activity (one row per\n   * thread per state type). It anchors on `updatedAtZ` (last activity), so\n   * state for a thread that is still being written to is not pruned by\n   * creation age.\n   */\n  static override readonly retentionTables: RetentionTablesDescriptor = {\n    threadState: { table: TABLE_THREAD_STATE, column: 'updatedAtZ', indexed: true },\n  };\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    return [\n      generateTableSQL({\n        tableName: TABLE_THREAD_STATE,\n        schema: TABLE_SCHEMAS[TABLE_THREAD_STATE],\n        schemaName,\n        compositePrimaryKey: COMPOSITE_PRIMARY_KEY,\n        includeAllConstraints: true,\n      }),\n    ];\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({\n      tableName: TABLE_THREAD_STATE,\n      schema: TABLE_SCHEMAS[TABLE_THREAD_STATE],\n      compositePrimaryKey: COMPOSITE_PRIMARY_KEY,\n    });\n  }\n\n  get #table(): string {\n    return getTableName({ indexName: TABLE_THREAD_STATE, schemaName: getSchemaName(this.#schema) });\n  }\n\n  /**\n   * Create the retention index on demand, mirroring the other PG domains: only\n   * deployments that configure retention pay for the extra index. Best-effort —\n   * a failure here leaves pruning correct, just slower.\n   */\n  async #ensureRetentionIndexes(policies: Record<string, TableRetentionPolicy>): Promise<void> {\n    const prefix = this.#schema && this.#schema !== 'public' ? `${this.#schema}_` : '';\n    for (const [key, entry] of Object.entries(ThreadStatePG.retentionTables)) {\n      if (!entry.indexed || !policies[key]) continue;\n      try {\n        await this.#db.ensureIndex({\n          indexName: `${prefix}mastra_${key}_retention_idx`,\n          tableName: entry.table as TABLE_NAMES,\n          column: entry.column,\n        });\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create retention index for ${entry.table}:`, error);\n      }\n    }\n  }\n\n  /** Delete thread state older than the `threadState` policy's `maxAge`, batched. */\n  async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n    await this.#ensureRetentionIndexes(policies);\n    const targets = resolveTargets({\n      policies,\n      descriptor: ThreadStatePG.retentionTables,\n      order: ['threadState'],\n    });\n    return runPrune({ db: this.#db, domain: 'threadState', targets, options });\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    try {\n      await this.#db.client.none(`DELETE FROM ${this.#table}`);\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'THREAD_STATE_CLEAR_ALL', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  async getState<T = unknown>({ threadId, type }: { threadId: string; type: string }): Promise<T | undefined> {\n    try {\n      const row = await this.#db.client.oneOrNone<{ value: unknown }>(\n        `SELECT \"value\" FROM ${this.#table} WHERE \"threadId\" = $1 AND \"type\" = $2 LIMIT 1`,\n        [threadId, type],\n      );\n      if (!row || row.value === null || row.value === undefined) return undefined;\n      // jsonb comes back parsed; a string column (or a driver that hands back\n      // raw text) still needs a parse.\n      return (typeof row.value === 'string' ? JSON.parse(row.value) : row.value) as T;\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'THREAD_STATE_GET', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { threadId, type },\n        },\n        error,\n      );\n    }\n  }\n\n  async setState<T = unknown>({ threadId, type, value }: { threadId: string; type: string; value: T }): Promise<void> {\n    const now = new Date().toISOString();\n    const serialized = JSON.stringify(value ?? null);\n    try {\n      // Single-statement upsert: concurrent writers to the same slot resolve on\n      // the primary key rather than racing a read-then-write. `createdAt` is\n      // left untouched on conflict so it keeps meaning \"first written\".\n      await this.#db.client.none(\n        `INSERT INTO ${this.#table} (\"threadId\", \"type\", \"value\", \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\")\n         VALUES ($1, $2, $3::jsonb, $4::timestamp, $5::timestamptz, $4::timestamp, $5::timestamptz)\n         ON CONFLICT (\"threadId\", \"type\")\n         DO UPDATE SET \"value\" = EXCLUDED.\"value\",\n                       \"updatedAt\" = EXCLUDED.\"updatedAt\",\n                       \"updatedAtZ\" = EXCLUDED.\"updatedAtZ\"`,\n        // `now` is bound twice because the naive and timezone-aware mirror\n        // columns deduce different parameter types from a shared placeholder.\n        [threadId, type, serialized, now, now],\n      );\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'THREAD_STATE_SET', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { threadId, type },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteState({ threadId, type }: { threadId: string; type: string }): Promise<void> {\n    try {\n      await this.#db.client.none(`DELETE FROM ${this.#table} WHERE \"threadId\" = $1 AND \"type\" = $2`, [threadId, type]);\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'THREAD_STATE_DELETE', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { threadId, type },\n        },\n        error,\n      );\n    }\n  }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n  ToolProviderConnectionsStorage,\n  createStorageErrorId,\n  TABLE_TOOL_PROVIDER_CONNECTIONS,\n  TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n  CreateIndexOptions,\n  StorageDeleteToolProviderConnectionInput,\n  StorageListToolProviderConnectionsInput,\n  StorageToolProviderConnection,\n  StorageToolProviderConnectionKey,\n  StorageToolProviderConnectionScope,\n  StorageUpsertToolProviderConnectionInput,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName } from '../utils';\n\nfunction normaliseScope(raw: unknown): StorageToolProviderConnectionScope {\n  const value = raw == null ? 'per-author' : String(raw);\n  if (value === 'shared') return 'shared';\n  if (value === 'caller-supplied') return 'caller-supplied';\n  return 'per-author';\n}\n\nfunction rowToToolProviderConnection(row: Record<string, unknown>): StorageToolProviderConnection {\n  return {\n    authorId: String(row.authorId),\n    providerId: String(row.providerId),\n    toolkit: String(row.toolkit),\n    connectionId: String(row.connectionId),\n    label: row.label == null ? null : String(row.label),\n    scope: normaliseScope(row.scope),\n    createdAt: new Date(String(row.createdAtZ ?? row.createdAt)),\n    updatedAt: new Date(String(row.updatedAtZ ?? row.updatedAt)),\n  };\n}\n\nexport class ToolProviderConnectionsPG extends ToolProviderConnectionsStorage {\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  static readonly MANAGED_TABLES = [TABLE_TOOL_PROVIDER_CONNECTIONS] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    this.#indexes = indexes?.filter(idx =>\n      (ToolProviderConnectionsPG.MANAGED_TABLES as readonly string[]).includes(idx.table),\n    );\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({\n      tableName: TABLE_TOOL_PROVIDER_CONNECTIONS,\n      schema: TABLE_SCHEMAS[TABLE_TOOL_PROVIDER_CONNECTIONS],\n      compositePrimaryKey: ['authorId', 'providerId', 'connectionId'],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}idx_tool_provider_connections_author`,\n        table: TABLE_TOOL_PROVIDER_CONNECTIONS,\n        columns: ['authorId', 'providerId', 'toolkit'],\n      },\n    ];\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n    statements.push(\n      generateTableSQL({\n        tableName: TABLE_TOOL_PROVIDER_CONNECTIONS,\n        schema: TABLE_SCHEMAS[TABLE_TOOL_PROVIDER_CONNECTIONS],\n        schemaName,\n        compositePrimaryKey: ['authorId', 'providerId', 'connectionId'],\n        includeAllConstraints: true,\n      }),\n    );\n\n    for (const idx of ToolProviderConnectionsPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    return statements;\n  }\n\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return ToolProviderConnectionsPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) return;\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) return;\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_TOOL_PROVIDER_CONNECTIONS });\n  }\n\n  async getConnectionById({\n    authorId,\n    providerId,\n    connectionId,\n  }: StorageToolProviderConnectionKey): Promise<StorageToolProviderConnection | null> {\n    const tableName = getTableName({\n      indexName: TABLE_TOOL_PROVIDER_CONNECTIONS,\n      schemaName: getSchemaName(this.#schema),\n    });\n\n    try {\n      const row = await this.#db.readClient.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"authorId\" = $1 AND \"providerId\" = $2 AND \"connectionId\" = $3 LIMIT 1`,\n        [authorId, providerId, connectionId],\n      );\n      return row ? rowToToolProviderConnection(row) : null;\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'TOOL_PROVIDER_CONNECTION_GET', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { authorId, providerId, connectionId },\n        },\n        error,\n      );\n    }\n  }\n\n  async upsertConnection(input: StorageUpsertToolProviderConnectionInput): Promise<StorageToolProviderConnection> {\n    const { authorId, providerId, toolkit, connectionId, label } = input;\n    const tableName = getTableName({\n      indexName: TABLE_TOOL_PROVIDER_CONNECTIONS,\n      schemaName: getSchemaName(this.#schema),\n    });\n    const now = new Date();\n    const nowIso = now.toISOString();\n    const labelValue = label == null ? null : label;\n\n    try {\n      return await this.#db.client.tx(async t => {\n        const existing = await t.oneOrNone(\n          `SELECT \"createdAt\", \"createdAtZ\", scope FROM ${tableName} WHERE \"authorId\" = $1 AND \"providerId\" = $2 AND \"connectionId\" = $3 LIMIT 1`,\n          [authorId, providerId, connectionId],\n        );\n        const existingCreatedAt = existing ? (existing.createdAtZ ?? existing.createdAt) : null;\n        const createdAt =\n          existingCreatedAt != null ? new Date(existingCreatedAt as string | Date).toISOString() : nowIso;\n        const existingScope = existing && existing.scope != null ? normaliseScope(existing.scope) : undefined;\n        const scope: StorageToolProviderConnectionScope = input.scope ?? existingScope ?? 'per-author';\n\n        await t.none(\n          `INSERT INTO ${tableName} (\"authorId\", \"providerId\", toolkit, \"connectionId\", label, scope, \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\")\n           VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)\n           ON CONFLICT (\"authorId\", \"providerId\", \"connectionId\") DO UPDATE SET\n             toolkit = EXCLUDED.toolkit,\n             label = EXCLUDED.label,\n             scope = EXCLUDED.scope,\n             \"updatedAt\" = EXCLUDED.\"updatedAt\",\n             \"updatedAtZ\" = EXCLUDED.\"updatedAtZ\"`,\n          [authorId, providerId, toolkit, connectionId, labelValue, scope, createdAt, createdAt, nowIso, nowIso],\n        );\n\n        return {\n          authorId,\n          providerId,\n          toolkit,\n          connectionId,\n          label: labelValue,\n          scope,\n          createdAt: new Date(createdAt),\n          updatedAt: now,\n        };\n      });\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'TOOL_PROVIDER_CONNECTION_UPSERT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { authorId, providerId, connectionId },\n        },\n        error,\n      );\n    }\n  }\n\n  async listConnectionsByAuthor({\n    authorId,\n    providerId,\n    toolkit,\n    scope,\n  }: StorageListToolProviderConnectionsInput): Promise<StorageToolProviderConnection[]> {\n    const tableName = getTableName({\n      indexName: TABLE_TOOL_PROVIDER_CONNECTIONS,\n      schemaName: getSchemaName(this.#schema),\n    });\n\n    try {\n      const clauses: string[] = [];\n      const args: string[] = [];\n      if (authorId !== undefined) {\n        args.push(authorId);\n        clauses.push(`\"authorId\" = $${args.length}`);\n      }\n      if (providerId) {\n        args.push(providerId);\n        clauses.push(`\"providerId\" = $${args.length}`);\n      }\n      if (toolkit) {\n        args.push(toolkit);\n        clauses.push(`toolkit = $${args.length}`);\n      }\n      if (scope) {\n        args.push(scope);\n        clauses.push(`scope = $${args.length}`);\n      }\n      const whereClause = clauses.length > 0 ? ` WHERE ${clauses.join(' AND ')}` : '';\n      const rows = await this.#db.readClient.manyOrNone(`SELECT * FROM ${tableName}${whereClause}`, args);\n      return rows.map(row => rowToToolProviderConnection(row));\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'TOOL_PROVIDER_CONNECTION_LIST', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { authorId: authorId ?? '', providerId: providerId ?? '', toolkit: toolkit ?? '' },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteConnection({\n    authorId,\n    providerId,\n    connectionId,\n  }: StorageDeleteToolProviderConnectionInput): Promise<void> {\n    const tableName = getTableName({\n      indexName: TABLE_TOOL_PROVIDER_CONNECTIONS,\n      schemaName: getSchemaName(this.#schema),\n    });\n\n    try {\n      await this.#db.client.none(\n        `DELETE FROM ${tableName} WHERE \"authorId\" = $1 AND \"providerId\" = $2 AND \"connectionId\" = $3`,\n        [authorId, providerId, connectionId],\n      );\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'TOOL_PROVIDER_CONNECTION_DELETE', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { authorId, providerId, connectionId },\n        },\n        error,\n      );\n    }\n  }\n}\n","import { TABLE_SCHEMAS, TABLE_WORKFLOW_DEFINITIONS, WorkflowDefinitionsStorage } from '@mastra/core/storage';\nimport type {\n  CreateIndexOptions,\n  CreateWorkflowDefinitionInput,\n  ListWorkflowDefinitionsInput,\n  ListWorkflowDefinitionsOutput,\n  UpdateWorkflowDefinitionInput,\n  WorkflowDefinition,\n} from '@mastra/core/storage';\n\nimport { PgDB, resolvePgConfig, generateTableSQL } from '../../db';\nimport type { DbClient, PgDomainConfig } from '../../db';\nimport { getSchemaName, getTableName, parseJsonResilient } from '../utils';\n\nfunction rowToDefinition(row: Record<string, unknown>): WorkflowDefinition {\n  const inputSchema = parseJsonResilient(row.inputSchema);\n  const outputSchema = parseJsonResilient(row.outputSchema);\n  const graph = parseJsonResilient(row.graph);\n  if (inputSchema === undefined || outputSchema === undefined || graph === undefined) {\n    throw new Error(`Workflow definition row \"${String(row.id)}\" is missing required JSON columns.`);\n  }\n  const def: WorkflowDefinition = {\n    id: String(row.id),\n    inputSchema,\n    outputSchema,\n    graph: graph as WorkflowDefinition['graph'],\n    status: String(row.status) as WorkflowDefinition['status'],\n    source: String(row.source) as WorkflowDefinition['source'],\n    createdAt: new Date((row.createdAtZ ?? row.createdAt) as string | number | Date),\n    updatedAt: new Date((row.updatedAtZ ?? row.updatedAt) as string | number | Date),\n  };\n  if (row.description != null) def.description = String(row.description);\n  const metadata = parseJsonResilient(row.metadata);\n  if (metadata !== undefined && metadata !== null) def.metadata = metadata as Record<string, unknown>;\n  const stateSchema = parseJsonResilient(row.stateSchema);\n  if (stateSchema !== undefined && stateSchema !== null) def.stateSchema = stateSchema;\n  const requestContextSchema = parseJsonResilient(row.requestContextSchema);\n  if (requestContextSchema !== undefined && requestContextSchema !== null) {\n    def.requestContextSchema = requestContextSchema;\n  }\n  const schedule = parseJsonResilient(row.schedule);\n  if (schedule !== undefined && schedule !== null) def.schedule = schedule as WorkflowDefinition['schedule'];\n  if (row.authorId != null) def.authorId = String(row.authorId);\n  return def;\n}\n\nexport class WorkflowDefinitionsPG extends WorkflowDefinitionsStorage {\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  static readonly MANAGED_TABLES = [TABLE_WORKFLOW_DEFINITIONS] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    this.#indexes = indexes?.filter(idx =>\n      (WorkflowDefinitionsPG.MANAGED_TABLES as readonly string[]).includes(idx.table),\n    );\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    return [\n      generateTableSQL({\n        tableName: TABLE_WORKFLOW_DEFINITIONS,\n        schema: TABLE_SCHEMAS[TABLE_WORKFLOW_DEFINITIONS],\n        schemaName,\n        includeAllConstraints: true,\n      }),\n    ];\n  }\n\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return [\n      {\n        name: `${schemaPrefix}idx_workflow_definitions_status`,\n        table: TABLE_WORKFLOW_DEFINITIONS,\n        columns: ['status'],\n      },\n    ];\n  }\n\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) return;\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) return;\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({\n      tableName: TABLE_WORKFLOW_DEFINITIONS,\n      schema: TABLE_SCHEMAS[TABLE_WORKFLOW_DEFINITIONS],\n    });\n    await this.#db.alterTable({\n      tableName: TABLE_WORKFLOW_DEFINITIONS,\n      schema: TABLE_SCHEMAS[TABLE_WORKFLOW_DEFINITIONS],\n      ifNotExists: ['schedule'],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_WORKFLOW_DEFINITIONS });\n  }\n\n  async upsert(input: CreateWorkflowDefinitionInput | UpdateWorkflowDefinitionInput): Promise<WorkflowDefinition> {\n    const now = new Date();\n    const existing = await this.#get(this.#db.client, input.id);\n\n    if (!existing) {\n      if (!('inputSchema' in input) || !input.inputSchema)\n        throw new Error(`Cannot create workflow definition \"${input.id}\": inputSchema is required.`);\n      if (!('outputSchema' in input) || !input.outputSchema)\n        throw new Error(`Cannot create workflow definition \"${input.id}\": outputSchema is required.`);\n      if (!('graph' in input) || !input.graph)\n        throw new Error(`Cannot create workflow definition \"${input.id}\": graph is required.`);\n\n      const record: Record<string, any> = {\n        id: input.id,\n        description: input.description ?? null,\n        metadata: input.metadata ?? null,\n        inputSchema: input.inputSchema,\n        outputSchema: input.outputSchema,\n        stateSchema: input.stateSchema ?? null,\n        requestContextSchema: input.requestContextSchema ?? null,\n        graph: input.graph,\n        schedule: 'schedule' in input ? (input.schedule ?? null) : null,\n        status: 'active',\n        source: 'storage',\n        authorId: 'authorId' in input ? (input.authorId ?? null) : null,\n        createdAt: now,\n        updatedAt: now,\n      };\n      try {\n        await this.#db.insert({ tableName: TABLE_WORKFLOW_DEFINITIONS, record });\n      } catch (error) {\n        // A concurrent upsert may have created the row after our existence\n        // check; fall back to updating it so the upsert stays idempotent.\n        if (!(await this.#get(this.#db.client, input.id))) throw error;\n        return this.applyUpdate(input, now);\n      }\n      const created = await this.#get(this.#db.client, input.id);\n      if (!created) throw new Error(`Failed to persist workflow definition \"${input.id}\".`);\n      return created;\n    }\n\n    return this.applyUpdate(input, now);\n  }\n\n  private async applyUpdate(\n    input: CreateWorkflowDefinitionInput | UpdateWorkflowDefinitionInput,\n    now: Date,\n  ): Promise<WorkflowDefinition> {\n    const data: Record<string, any> = { updatedAt: now };\n    if ('description' in input && input.description !== undefined) data.description = input.description;\n    if ('metadata' in input && input.metadata !== undefined) data.metadata = input.metadata;\n    if ('inputSchema' in input && input.inputSchema !== undefined) data.inputSchema = input.inputSchema;\n    if ('outputSchema' in input && input.outputSchema !== undefined) data.outputSchema = input.outputSchema;\n    if ('stateSchema' in input && input.stateSchema !== undefined) data.stateSchema = input.stateSchema;\n    if ('requestContextSchema' in input && input.requestContextSchema !== undefined)\n      data.requestContextSchema = input.requestContextSchema;\n    if ('graph' in input && input.graph !== undefined) data.graph = input.graph;\n    if ('schedule' in input && input.schedule !== undefined) data.schedule = input.schedule;\n    if ('status' in input && input.status !== undefined) data.status = input.status;\n    if ('authorId' in input && input.authorId !== undefined) data.authorId = input.authorId;\n\n    await this.#db.update({ tableName: TABLE_WORKFLOW_DEFINITIONS, keys: { id: input.id }, data });\n    const updated = await this.#get(this.#db.client, input.id);\n    if (!updated) throw new Error(`Failed to update workflow definition \"${input.id}\".`);\n    return updated;\n  }\n\n  async get(id: string): Promise<WorkflowDefinition | null> {\n    return this.#get(this.#db.readClient, id);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #get(client: DbClient, id: string): Promise<WorkflowDefinition | null> {\n    const tableName = getTableName({\n      indexName: TABLE_WORKFLOW_DEFINITIONS,\n      schemaName: getSchemaName(this.#schema),\n    });\n    const row = await client.oneOrNone(`SELECT * FROM ${tableName} WHERE \"id\" = $1`, [id]);\n    return row ? rowToDefinition(row as Record<string, unknown>) : null;\n  }\n\n  async list(args?: ListWorkflowDefinitionsInput): Promise<ListWorkflowDefinitionsOutput> {\n    const tableName = getTableName({\n      indexName: TABLE_WORKFLOW_DEFINITIONS,\n      schemaName: getSchemaName(this.#schema),\n    });\n    const conditions: string[] = [];\n    const params: unknown[] = [];\n    if (args?.status) {\n      params.push(args.status);\n      conditions.push(`\"status\" = $${params.length}`);\n    }\n    if (args?.authorId !== undefined) {\n      params.push(args.authorId);\n      conditions.push(`\"authorId\" = $${params.length}`);\n    }\n    const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n    const rows = await this.#db.readClient.manyOrNone(\n      `SELECT * FROM ${tableName} ${where} ORDER BY \"updatedAt\" DESC`,\n      params,\n    );\n    const definitions = rows.map(row => rowToDefinition(row as Record<string, unknown>));\n    return { definitions, total: definitions.length };\n  }\n\n  async delete(id: string): Promise<void> {\n    const tableName = getTableName({\n      indexName: TABLE_WORKFLOW_DEFINITIONS,\n      schemaName: getSchemaName(this.#schema),\n    });\n    await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"id\" = $1`, [id]);\n  }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n  mergeWorkflowStepResult,\n  normalizePerPage,\n  TABLE_WORKFLOW_SNAPSHOT,\n  TABLE_SCHEMAS,\n  matchesExpectedWorkflowStatus,\n  WorkflowsStorage,\n  createStorageErrorId,\n} from '@mastra/core/storage';\nimport type {\n  UpdateWorkflowStateOptions,\n  StorageListWorkflowRunsInput,\n  WorkflowRun,\n  WorkflowRuns,\n  CreateIndexOptions,\n  TABLE_NAMES,\n  PruneOptions,\n  PruneResult,\n  RetentionTablesDescriptor,\n  TableRetentionPolicy,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { buildConstraintName } from '../../db/constraint-utils';\nimport { sanitizeJsonForPg } from '../../db/sanitize-json';\nimport { runPrune, resolveTargets } from '../../retention';\n\nexport { sanitizeJsonForPg };\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/** Base name (before any schema prefix) of the expression index backing the status filter. */\nconst WORKFLOW_SNAPSHOT_STATUS_INDEX = 'mastra_workflow_snapshot_name_status_createdat_idx';\n\n/**\n * Schema-prefixed name of the status index, lowercased and truncated the same way Postgres\n * stores it, so the init snapshot's index set answers \"does it exist?\" without a probe or a\n * no-op `CREATE INDEX` (schema-prefixed names routinely exceed the 63-byte limit).\n */\nfunction workflowSnapshotStatusIndexName(schemaName?: string): string {\n  return buildConstraintName({\n    baseName: WORKFLOW_SNAPSHOT_STATUS_INDEX,\n    schemaName: schemaName && schemaName !== 'public' ? schemaName : undefined,\n  });\n}\n\n/**\n * Expression index on `(workflow_name, snapshot->>'status', \"createdAt\" DESC)` so\n * listWorkflowRuns() status filters can use an index instead of scanning every snapshot.\n */\nfunction workflowSnapshotStatusIndexSQL(indexName: string, schemaName?: string): string {\n  const tableName = getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(schemaName) });\n  return `CREATE INDEX IF NOT EXISTS \"${indexName}\" ON ${tableName} (workflow_name, (snapshot ->> 'status'), \"createdAt\" DESC)`;\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  /**\n   * Workflow run snapshots accumulate as runs execute. Anchored on the\n   * timezone-aware `updatedAtZ` mirror column (last activity) so suspended or\n   * long-running runs are not pruned by start age.\n   */\n  static override readonly retentionTables: RetentionTablesDescriptor = {\n    workflowSnapshot: { table: TABLE_WORKFLOW_SNAPSHOT, column: 'updatedAtZ', indexed: true },\n  };\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, 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  supportsConcurrentUpdates(): boolean {\n    return true;\n  }\n\n  private parseWorkflowRun(row: Record<string, any>): WorkflowRun {\n    let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\n    if (typeof parsedSnapshot === 'string') {\n      try {\n        parsedSnapshot = JSON.parse(row.snapshot as string) as WorkflowRunState;\n      } catch (e) {\n        this.logger.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n      }\n    }\n    return {\n      workflowName: row.workflow_name as string,\n      runId: row.run_id as string,\n      snapshot: parsedSnapshot,\n      resourceId: row.resourceId as string,\n      createdAt: new Date(row.createdAtZ || (row.createdAt as string)),\n      updatedAt: new Date(row.updatedAtZ || (row.updatedAt as string)),\n    };\n  }\n\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}mastra_workflow_snapshot_name_createdat_idx`,\n        table: TABLE_WORKFLOW_SNAPSHOT,\n        columns: ['workflow_name', 'createdAt DESC'],\n      },\n    ];\n  }\n\n  /**\n   * Returns all DDL statements for this domain: table with unique constraint.\n   * Used by exportSchemas to produce a complete, reproducible schema export.\n   */\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n    // Table (includes the UNIQUE constraint on workflow_name, run_id via generateTableSQL)\n    statements.push(\n      generateTableSQL({\n        tableName: TABLE_WORKFLOW_SNAPSHOT,\n        schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT],\n        schemaName,\n        includeAllConstraints: true,\n      }),\n    );\n\n    for (const idx of WorkflowsPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    statements.push(`${workflowSnapshotStatusIndexSQL(workflowSnapshotStatusIndexName(parsedSchema), schemaName)};`);\n\n    return statements;\n  }\n\n  /**\n   * Returns default index definitions for the workflows domain tables.\n   */\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return WorkflowsPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  /**\n   * Creates default indexes for optimal query performance.\n   */\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) return;\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n      }\n    }\n\n    // Expression index backing the status filter in listWorkflowRuns(). Only valid on jsonb\n    // columns — legacy json/text snapshot columns still go through the sanitizing regexp,\n    // which cannot use an index anyway.\n    const snapshotType = await this.#db.getColumnType(TABLE_WORKFLOW_SNAPSHOT, 'snapshot');\n    if (snapshotType !== 'jsonb') return;\n\n    const indexName = workflowSnapshotStatusIndexName(this.#schema);\n    try {\n      await this.#db.createIndexFromStatement(indexName, workflowSnapshotStatusIndexSQL(indexName, this.#schema));\n    } catch (error) {\n      this.logger?.warn?.(`Failed to create index ${indexName}:`, error);\n    }\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   * Lazily ensures a btree index exists on each configured policy's retention\n   * anchor column so age-based `prune()` deletes stay fast on large tables.\n   * Called from the prune path (not init) so only deployments that configure\n   * retention pay the index's write/disk overhead. Best-effort: failures are\n   * logged and pruning proceeds (correct, just slower).\n   * Created even with `skipDefaultIndexes` — retention is an explicit opt-in,\n   * so its supporting index is not part of the default index set.\n   */\n  private async ensureRetentionIndexes(policies: Record<string, TableRetentionPolicy>): Promise<void> {\n    const prefix = this.#schema && this.#schema !== 'public' ? `${this.#schema}_` : '';\n    for (const [key, entry] of Object.entries(WorkflowsPG.retentionTables)) {\n      if (!entry.indexed || !policies[key]) continue;\n      try {\n        await this.#db.ensureIndex({\n          indexName: `${prefix}mastra_${key}_retention_idx`,\n          tableName: entry.table as TABLE_NAMES,\n          column: entry.column,\n        });\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create retention index for ${entry.table}:`, error);\n      }\n    }\n  }\n\n  /** Delete workflow run snapshots older than the `workflowSnapshot` policy's `maxAge`, batched. */\n  async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n    await this.ensureRetentionIndexes(policies);\n    const targets = resolveTargets({\n      policies,\n      descriptor: WorkflowsPG.retentionTables,\n      order: ['workflowSnapshot'],\n    });\n    return runPrune({ db: this.#db, domain: 'workflows', targets, options });\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  async updateWorkflowResults({\n    workflowName,\n    runId,\n    stepId,\n    result,\n    requestContext,\n  }: {\n    workflowName: string;\n    runId: string;\n    stepId: string;\n    result: StepResult<any, any, any, any>;\n    requestContext: Record<string, any>;\n  }): Promise<Record<string, StepResult<any, any, any, any>>> {\n    try {\n      // Use a transaction with row-level locking to ensure atomicity\n      return await this.#db.client.tx(async t => {\n        const tableName = getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(this.#schema) });\n\n        // Load existing snapshot within transaction with FOR UPDATE to lock the row\n        // This prevents concurrent updates from reading stale data\n        const existingSnapshotResult = await t.oneOrNone<{ snapshot: WorkflowRunState }>(\n          `SELECT snapshot FROM ${tableName} WHERE workflow_name = $1 AND run_id = $2 FOR UPDATE`,\n          [workflowName, runId],\n        );\n\n        let snapshot: WorkflowRunState;\n        if (!existingSnapshotResult) {\n          // Create new snapshot if none exists\n          snapshot = {\n            context: {},\n            activePaths: [],\n            timestamp: Date.now(),\n            suspendedPaths: {},\n            activeStepsPath: {},\n            resumeLabels: {},\n            serializedStepGraph: [],\n            status: 'pending',\n            value: {},\n            waitingPaths: {},\n            runId: runId,\n            requestContext: {},\n          } as WorkflowRunState;\n        } else {\n          // Parse existing snapshot\n          const existingSnapshot = existingSnapshotResult.snapshot;\n          snapshot = typeof existingSnapshot === 'string' ? JSON.parse(existingSnapshot) : existingSnapshot;\n        }\n\n        // Merge the new step result using element-wise array merging\n        // (critical for concurrent foreach iteration results)\n        mergeWorkflowStepResult({ snapshot, stepId, result, requestContext });\n\n        // Upsert the snapshot within the same transaction\n        const now = new Date();\n        const sanitizedSnapshot = sanitizeJsonForPg(JSON.stringify(snapshot));\n        await t.none(\n          `INSERT INTO ${tableName}\n           (workflow_name, run_id, snapshot, \"createdAt\", \"updatedAt\", \"createdAtZ\", \"updatedAtZ\")\n           VALUES ($1, $2, $3, $4, $5, $6, $7)\n           ON CONFLICT (workflow_name, run_id) DO UPDATE\n           SET snapshot = $3, \"updatedAt\" = $5, \"updatedAtZ\" = $7`,\n          [workflowName, runId, sanitizedSnapshot, now, now, now, now],\n        );\n\n        return snapshot.context;\n      });\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_WORKFLOW_RESULTS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            workflowName,\n            runId,\n            stepId,\n          },\n        },\n        error,\n      );\n    }\n  }\n  async updateWorkflowState({\n    workflowName,\n    runId,\n    opts,\n  }: {\n    workflowName: string;\n    runId: string;\n    opts: UpdateWorkflowStateOptions;\n  }): Promise<WorkflowRunState | undefined> {\n    try {\n      // Use a transaction with row-level locking to ensure atomicity\n      return await this.#db.client.tx(async t => {\n        const tableName = getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(this.#schema) });\n\n        // Load existing snapshot within transaction with FOR UPDATE to lock the row\n        // This prevents concurrent updates from reading stale data\n        const existingSnapshotResult = await t.oneOrNone<{ snapshot: WorkflowRunState }>(\n          `SELECT snapshot FROM ${tableName} WHERE workflow_name = $1 AND run_id = $2 FOR UPDATE`,\n          [workflowName, runId],\n        );\n\n        if (!existingSnapshotResult) {\n          return undefined;\n        }\n\n        // Parse existing snapshot\n        const existingSnapshot = existingSnapshotResult.snapshot;\n        const snapshot = typeof existingSnapshot === 'string' ? JSON.parse(existingSnapshot) : existingSnapshot;\n\n        if (!snapshot || !snapshot?.context) {\n          throw new Error(`Snapshot not found for runId ${runId}`);\n        }\n\n        // `expectedStatus` is a compare-and-set guard, not state. It is checked here, inside the\n        // row lock, and stripped so it can never be merged into the persisted snapshot.\n        const { expectedStatus, ...state } = opts;\n        if (!matchesExpectedWorkflowStatus(snapshot.status, expectedStatus)) {\n          return undefined;\n        }\n\n        // Merge the new options with the existing snapshot\n        const updatedSnapshot = { ...snapshot, ...state };\n\n        // Update the snapshot within the same transaction\n        const sanitizedSnapshot = sanitizeJsonForPg(JSON.stringify(updatedSnapshot));\n        const now = new Date();\n        await t.none(\n          `UPDATE ${tableName}\n           SET snapshot = $1, \"updatedAt\" = $2, \"updatedAtZ\" = $3\n           WHERE workflow_name = $4 AND run_id = $5`,\n          [sanitizedSnapshot, now, now, workflowName, runId],\n        );\n\n        return updatedSnapshot;\n      });\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_WORKFLOW_STATE', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            workflowName,\n            runId,\n          },\n        },\n        error,\n      );\n    }\n  }\n\n  async persistWorkflowSnapshot({\n    workflowName,\n    runId,\n    resourceId,\n    snapshot,\n    createdAt,\n    updatedAt,\n  }: {\n    workflowName: string;\n    runId: string;\n    resourceId?: string;\n    snapshot: WorkflowRunState;\n    createdAt?: Date;\n    updatedAt?: Date;\n  }): Promise<void> {\n    try {\n      const now = new Date();\n      const createdAtValue = createdAt ? createdAt : now;\n      const updatedAtValue = updatedAt ? updatedAt : now;\n      // Sanitize the snapshot JSON to remove problematic Unicode sequences\n      const sanitizedSnapshot = sanitizeJsonForPg(JSON.stringify(snapshot));\n      await this.#db.client.none(\n        `INSERT INTO ${getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(this.#schema) })} AS t\n                 (workflow_name, run_id, \"resourceId\", snapshot, \"createdAt\", \"updatedAt\", \"createdAtZ\", \"updatedAtZ\")\n                 VALUES ($1, $2, $3, $4, $5, $6, $7, $8)\n                 ON CONFLICT (workflow_name, run_id) DO UPDATE\n                 SET \"resourceId\" = COALESCE($3, t.\"resourceId\"), snapshot = $4, \"updatedAt\" = $6, \"updatedAtZ\" = $8`,\n        [\n          workflowName,\n          runId,\n          resourceId,\n          sanitizedSnapshot,\n          createdAtValue,\n          updatedAtValue,\n          createdAtValue,\n          updatedAtValue,\n        ],\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.readClient.oneOrNone(query, queryValues);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseWorkflowRun(result);\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_WORKFLOW_RUN_BY_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            runId,\n            workflowName: workflowName || '',\n          },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n    try {\n      await this.#db.client.none(\n        `DELETE FROM ${getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(this.#schema) })} WHERE run_id = $1 AND workflow_name = $2`,\n        [runId, workflowName],\n      );\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_WORKFLOW_RUN_BY_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            runId,\n            workflowName,\n          },\n        },\n        error,\n      );\n    }\n  }\n\n  async listWorkflowRuns({\n    workflowName,\n    fromDate,\n    toDate,\n    perPage,\n    page,\n    resourceId,\n    status,\n  }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n    try {\n      const conditions: string[] = [];\n      const values: any[] = [];\n      let paramIndex = 1;\n\n      if (workflowName) {\n        conditions.push(`workflow_name = $${paramIndex}`);\n        values.push(workflowName);\n        paramIndex++;\n      }\n\n      if (status) {\n        // On jsonb columns PostgreSQL already rejects problematic Unicode escape sequences at\n        // insert time, so the sanitizing regexp is a no-op there — and it prevents the planner\n        // from using any index on the status field, forcing a sequential scan.\n        // Legacy tables whose snapshot column is still json/text can contain those sequences,\n        // so they keep the regexp_replace path:\n        // - \\u0000 (null character) fails the jsonb cast with 22P05 \"unsupported Unicode escape sequence\"\n        // - \\uD800-\\uDFFF (unpaired surrogates) fail with \"Unicode low surrogate must follow a high surrogate\"\n        // See: https://github.com/mastra-ai/mastra/issues/11563\n        const snapshotType = await this.#db.getColumnType(TABLE_WORKFLOW_SNAPSHOT, 'snapshot');\n        const statusExpr =\n          snapshotType === 'jsonb'\n            ? `snapshot ->> 'status'`\n            : `regexp_replace(snapshot::text, '\\\\\\\\u(0000|[Dd][89A-Fa-f][0-9A-Fa-f]{2})', '', 'g')::jsonb ->> 'status'`;\n        conditions.push(`${statusExpr} = $${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 this.parseWorkflowRun(row);\n      });\n\n      return { runs, total: total || runs.length };\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_WORKFLOW_RUNS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            workflowName: workflowName || 'all',\n          },\n        },\n        error,\n      );\n    }\n  }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n  WorkspacesStorage,\n  createStorageErrorId,\n  normalizePerPage,\n  calculatePagination,\n  TABLE_WORKSPACES,\n  TABLE_WORKSPACE_VERSIONS,\n  TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n  StorageWorkspaceType,\n  StorageCreateWorkspaceInput,\n  StorageUpdateWorkspaceInput,\n  StorageListWorkspacesInput,\n  StorageListWorkspacesOutput,\n  CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type {\n  WorkspaceVersion,\n  CreateWorkspaceVersionInput,\n  ListWorkspaceVersionsInput,\n  ListWorkspaceVersionsOutput,\n} from '@mastra/core/storage/domains/workspaces';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { DbClient, PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName, parseJsonResilient } from '../utils';\n\nconst SNAPSHOT_FIELDS = [\n  'name',\n  'description',\n  'filesystem',\n  'sandbox',\n  'mounts',\n  'search',\n  'skills',\n  'tools',\n  'autoSync',\n  'operationTimeout',\n] as const;\n\nexport class WorkspacesPG extends WorkspacesStorage {\n  #db: PgDB;\n  #schema: string;\n  #skipDefaultIndexes?: boolean;\n  #indexes?: CreateIndexOptions[];\n\n  static readonly MANAGED_TABLES = [TABLE_WORKSPACES, TABLE_WORKSPACE_VERSIONS] as const;\n\n  constructor(config: PgDomainConfig) {\n    super();\n    const { client, readClient, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n    this.#db = new PgDB({ client, readClient, schemaName, skipDefaultIndexes });\n    this.#schema = schemaName || 'public';\n    this.#skipDefaultIndexes = skipDefaultIndexes;\n    this.#indexes = indexes?.filter(idx => (WorkspacesPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n  }\n\n  static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n    return [\n      {\n        name: `${schemaPrefix}idx_workspace_versions_workspace_version`,\n        table: TABLE_WORKSPACE_VERSIONS,\n        columns: ['workspaceId', 'versionNumber'],\n        unique: true,\n      },\n    ];\n  }\n\n  static getExportDDL(schemaName?: string): string[] {\n    const statements: string[] = [];\n    const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n    const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n    for (const tableName of WorkspacesPG.MANAGED_TABLES) {\n      statements.push(\n        generateTableSQL({\n          tableName,\n          schema: TABLE_SCHEMAS[tableName],\n          schemaName,\n          includeAllConstraints: true,\n        }),\n      );\n    }\n\n    for (const idx of WorkspacesPG.getDefaultIndexDefs(schemaPrefix)) {\n      statements.push(generateIndexSQL(idx, schemaName));\n    }\n\n    return statements;\n  }\n\n  getDefaultIndexDefinitions(): CreateIndexOptions[] {\n    const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n    return WorkspacesPG.getDefaultIndexDefs(schemaPrefix);\n  }\n\n  async createDefaultIndexes(): Promise<void> {\n    if (this.#skipDefaultIndexes) {\n      return;\n    }\n    for (const indexDef of this.getDefaultIndexDefinitions()) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch {\n        // Indexes are performance optimizations, continue on failure\n      }\n    }\n  }\n\n  async init(): Promise<void> {\n    await this.#db.createTable({\n      tableName: TABLE_WORKSPACES,\n      schema: TABLE_SCHEMAS[TABLE_WORKSPACES],\n    });\n    await this.#db.createTable({\n      tableName: TABLE_WORKSPACE_VERSIONS,\n      schema: TABLE_SCHEMAS[TABLE_WORKSPACE_VERSIONS],\n    });\n    await this.createDefaultIndexes();\n    await this.createCustomIndexes();\n  }\n\n  async createCustomIndexes(): Promise<void> {\n    if (!this.#indexes || this.#indexes.length === 0) {\n      return;\n    }\n    for (const indexDef of this.#indexes) {\n      try {\n        await this.#db.createIndex(indexDef);\n      } catch (error) {\n        this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n      }\n    }\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.#db.clearTable({ tableName: TABLE_WORKSPACE_VERSIONS });\n    await this.#db.clearTable({ tableName: TABLE_WORKSPACES });\n  }\n\n  // ==========================================================================\n  // Workspace CRUD Methods\n  // ==========================================================================\n\n  async getById(id: string): Promise<StorageWorkspaceType | null> {\n    return this.#getById(this.#db.readClient, id);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #getById(client: DbClient, id: string): Promise<StorageWorkspaceType | null> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_WORKSPACES, schemaName: getSchemaName(this.#schema) });\n      const result = await client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseWorkspaceRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_WORKSPACE_BY_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { workspaceId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async create(input: { workspace: StorageCreateWorkspaceInput }): Promise<StorageWorkspaceType> {\n    const { workspace } = input;\n    try {\n      const tableName = getTableName({ indexName: TABLE_WORKSPACES, schemaName: getSchemaName(this.#schema) });\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      // 1. Create the thin workspace record\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, status, \"activeVersionId\", \"authorId\", metadata,\n          \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,\n        [\n          workspace.id,\n          'draft',\n          null,\n          workspace.authorId ?? null,\n          workspace.metadata ? JSON.stringify(workspace.metadata) : null,\n          nowIso,\n          nowIso,\n          nowIso,\n          nowIso,\n        ],\n      );\n\n      // 2. Extract snapshot fields and create version 1\n      const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = workspace;\n      const versionId = crypto.randomUUID();\n      await this.createVersion({\n        id: versionId,\n        workspaceId: workspace.id,\n        versionNumber: 1,\n        ...snapshotConfig,\n        changedFields: [...SNAPSHOT_FIELDS],\n        changeMessage: 'Initial version',\n      });\n\n      return {\n        id: workspace.id,\n        status: 'draft',\n        activeVersionId: undefined,\n        authorId: workspace.authorId,\n        metadata: workspace.metadata,\n        createdAt: now,\n        updatedAt: now,\n      };\n    } catch (error) {\n      // Best-effort cleanup\n      try {\n        const tableName = getTableName({\n          indexName: TABLE_WORKSPACES,\n          schemaName: getSchemaName(this.#schema),\n        });\n        await this.#db.client.none(\n          `DELETE FROM ${tableName} WHERE id = $1 AND status = 'draft' AND \"activeVersionId\" IS NULL`,\n          [workspace.id],\n        );\n      } catch {\n        // Ignore cleanup errors\n      }\n\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_WORKSPACE', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { workspaceId: workspace.id },\n        },\n        error,\n      );\n    }\n  }\n\n  async update(input: StorageUpdateWorkspaceInput): Promise<StorageWorkspaceType> {\n    const { id, ...updates } = input;\n    try {\n      const tableName = getTableName({ indexName: TABLE_WORKSPACES, schemaName: getSchemaName(this.#schema) });\n\n      const existingWorkspace = await this.#getById(this.#db.client, id);\n      if (!existingWorkspace) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_WORKSPACE', 'NOT_FOUND'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          text: `Workspace ${id} not found`,\n          details: { workspaceId: id },\n        });\n      }\n\n      const { authorId, activeVersionId, metadata, status, ...rawConfigFields } = updates;\n      let versionCreated = false;\n\n      // Strip undefined keys so omitted PATCH fields don't overwrite persisted values\n      const configFields: Record<string, unknown> = {};\n      for (const [key, value] of Object.entries(rawConfigFields)) {\n        if (value !== undefined) configFields[key] = value;\n      }\n\n      // Check if any snapshot config fields are present\n      const hasConfigUpdate = SNAPSHOT_FIELDS.some(field => field in configFields);\n\n      if (hasConfigUpdate) {\n        const latestVersion = await this.#getLatestVersion(this.#db.client, id);\n        if (!latestVersion) {\n          throw new MastraError({\n            id: createStorageErrorId('PG', 'UPDATE_WORKSPACE', 'NO_VERSIONS'),\n            domain: ErrorDomain.STORAGE,\n            category: ErrorCategory.SYSTEM,\n            text: `No versions found for workspace ${id}`,\n            details: { workspaceId: id },\n          });\n        }\n\n        const {\n          id: _versionId,\n          workspaceId: _workspaceId,\n          versionNumber: _versionNumber,\n          changedFields: _changedFields,\n          changeMessage: _changeMessage,\n          createdAt: _createdAt,\n          ...latestConfig\n        } = latestVersion;\n\n        const newConfig = { ...latestConfig, ...configFields };\n        const changedFields = SNAPSHOT_FIELDS.filter(\n          field =>\n            field in configFields &&\n            JSON.stringify(configFields[field as keyof typeof configFields]) !==\n              JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n        );\n\n        if (changedFields.length > 0) {\n          versionCreated = true;\n          const newVersionId = crypto.randomUUID();\n          await this.createVersion({\n            id: newVersionId,\n            workspaceId: id,\n            versionNumber: latestVersion.versionNumber + 1,\n            ...newConfig,\n            changedFields: [...changedFields],\n            changeMessage: `Updated ${changedFields.join(', ')}`,\n          });\n        }\n      }\n\n      // Update metadata fields on the workspace record\n      const setClauses: string[] = [];\n      const values: any[] = [];\n      let paramIndex = 1;\n\n      if (authorId !== undefined) {\n        setClauses.push(`\"authorId\" = $${paramIndex++}`);\n        values.push(authorId);\n      }\n\n      if (activeVersionId !== undefined) {\n        setClauses.push(`\"activeVersionId\" = $${paramIndex++}`);\n        values.push(activeVersionId);\n        // Auto-set status to 'published' when activeVersionId is set, consistent with InMemory and LibSQL\n        if (status === undefined) {\n          setClauses.push(`status = $${paramIndex++}`);\n          values.push('published');\n        }\n      }\n\n      if (status !== undefined) {\n        setClauses.push(`status = $${paramIndex++}`);\n        values.push(status);\n      }\n\n      if (metadata !== undefined) {\n        const mergedMetadata = { ...(existingWorkspace.metadata || {}), ...metadata };\n        setClauses.push(`metadata = $${paramIndex++}`);\n        values.push(JSON.stringify(mergedMetadata));\n      }\n\n      // Always update timestamps\n      const now = new Date().toISOString();\n      setClauses.push(`\"updatedAt\" = $${paramIndex++}`);\n      values.push(now);\n      setClauses.push(`\"updatedAtZ\" = $${paramIndex++}`);\n      values.push(now);\n\n      values.push(id);\n\n      if (setClauses.length > 2 || versionCreated) {\n        // More than just updatedAt and updatedAtZ, or a new version was created\n        await this.#db.client.none(\n          `UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`,\n          values,\n        );\n      }\n\n      const updatedWorkspace = await this.#getById(this.#db.client, id);\n      if (!updatedWorkspace) {\n        throw new MastraError({\n          id: createStorageErrorId('PG', 'UPDATE_WORKSPACE', 'NOT_FOUND_AFTER_UPDATE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.SYSTEM,\n          text: `Workspace ${id} not found after update`,\n          details: { workspaceId: id },\n        });\n      }\n      return updatedWorkspace;\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'UPDATE_WORKSPACE', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { workspaceId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async delete(id: string): Promise<void> {\n    try {\n      const tableName = getTableName({ indexName: TABLE_WORKSPACES, schemaName: getSchemaName(this.#schema) });\n      await this.deleteVersionsByParentId(id);\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_WORKSPACE', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { workspaceId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async list(args?: StorageListWorkspacesInput): Promise<StorageListWorkspacesOutput> {\n    const { page = 0, perPage: perPageInput, orderBy, authorId, metadata } = args || {};\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    if (page < 0) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_WORKSPACES', 'INVALID_PAGE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { page },\n        },\n        new Error('page must be >= 0'),\n      );\n    }\n\n    const perPage = normalizePerPage(perPageInput, 100);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    try {\n      const tableName = getTableName({ indexName: TABLE_WORKSPACES, schemaName: getSchemaName(this.#schema) });\n\n      // Build WHERE conditions\n      const conditions: string[] = [];\n      const queryParams: any[] = [];\n      let paramIdx = 1;\n\n      if (authorId !== undefined) {\n        conditions.push(`\"authorId\" = $${paramIdx++}`);\n        queryParams.push(authorId);\n      }\n\n      if (metadata && Object.keys(metadata).length > 0) {\n        conditions.push(`metadata @> $${paramIdx++}::jsonb`);\n        queryParams.push(JSON.stringify(metadata));\n      }\n\n      const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n      // Get total count\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n        queryParams,\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return {\n          workspaces: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      const limitValue = perPageInput === false ? total : perPage;\n      const dataResult = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"${field}\" ${direction} LIMIT $${paramIdx++} OFFSET $${paramIdx++}`,\n        [...queryParams, limitValue, offset],\n      );\n\n      const workspaces = (dataResult || []).flatMap(row => {\n        try {\n          return [this.parseWorkspaceRow(row)];\n        } catch (err) {\n          this.logger?.warn?.('[PG] Failed to map workspace row, skipping', { id: row?.id, error: err });\n          return [];\n        }\n      });\n\n      return {\n        workspaces,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_WORKSPACES', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  // ==========================================================================\n  // Workspace Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateWorkspaceVersionInput): Promise<WorkspaceVersion> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_WORKSPACE_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const now = new Date();\n      const nowIso = now.toISOString();\n\n      await this.#db.client.none(\n        `INSERT INTO ${tableName} (\n          id, \"workspaceId\", \"versionNumber\",\n          name, description, filesystem, sandbox, mounts, search, skills, tools,\n          \"autoSync\", \"operationTimeout\",\n          \"changedFields\", \"changeMessage\",\n          \"createdAt\", \"createdAtZ\"\n        ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17)`,\n        [\n          input.id,\n          input.workspaceId,\n          input.versionNumber,\n          input.name,\n          input.description ?? null,\n          input.filesystem ? JSON.stringify(input.filesystem) : null,\n          input.sandbox ? JSON.stringify(input.sandbox) : null,\n          input.mounts ? JSON.stringify(input.mounts) : null,\n          input.search ? JSON.stringify(input.search) : null,\n          input.skills ? JSON.stringify(input.skills) : null,\n          input.tools ? JSON.stringify(input.tools) : null,\n          input.autoSync ?? false,\n          input.operationTimeout ?? null,\n          input.changedFields ? JSON.stringify(input.changedFields) : null,\n          input.changeMessage ?? null,\n          nowIso,\n          nowIso,\n        ],\n      );\n\n      return {\n        ...input,\n        createdAt: now,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'CREATE_WORKSPACE_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: input.id, workspaceId: input.workspaceId },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersion(id: string): Promise<WorkspaceVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_WORKSPACE_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_WORKSPACE_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async getVersionByNumber(workspaceId: string, versionNumber: number): Promise<WorkspaceVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_WORKSPACE_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"workspaceId\" = $1 AND \"versionNumber\" = $2`,\n        [workspaceId, versionNumber],\n      );\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_WORKSPACE_VERSION_BY_NUMBER', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { workspaceId, versionNumber },\n        },\n        error,\n      );\n    }\n  }\n\n  async getLatestVersion(workspaceId: string): Promise<WorkspaceVersion | null> {\n    return this.#getLatestVersion(this.#db.readClient, workspaceId);\n  }\n\n  /**\n   * Same lookup against an explicit client. Mutation paths pass the writer so a\n   * lagging read replica cannot yield stale or missing rows mid-update.\n   */\n  async #getLatestVersion(client: DbClient, workspaceId: string): Promise<WorkspaceVersion | null> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_WORKSPACE_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await client.oneOrNone(\n        `SELECT * FROM ${tableName} WHERE \"workspaceId\" = $1 ORDER BY \"versionNumber\" DESC LIMIT 1`,\n        [workspaceId],\n      );\n\n      if (!result) {\n        return null;\n      }\n\n      return this.parseVersionRow(result);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'GET_LATEST_WORKSPACE_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { workspaceId },\n        },\n        error,\n      );\n    }\n  }\n\n  async listVersions(input: ListWorkspaceVersionsInput): Promise<ListWorkspaceVersionsOutput> {\n    const { workspaceId, page = 0, perPage: perPageInput, orderBy } = input;\n\n    if (page < 0) {\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_WORKSPACE_VERSIONS', 'INVALID_PAGE'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: { page },\n        },\n        new Error('page must be >= 0'),\n      );\n    }\n\n    const perPage = normalizePerPage(perPageInput, 20);\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    try {\n      const { field, direction } = this.parseVersionOrderBy(orderBy);\n      const tableName = getTableName({\n        indexName: TABLE_WORKSPACE_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n\n      const countResult = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} WHERE \"workspaceId\" = $1`,\n        [workspaceId],\n      );\n      const total = parseInt(countResult.count, 10);\n\n      if (total === 0) {\n        return {\n          versions: [],\n          total: 0,\n          page,\n          perPage: perPageForResponse,\n          hasMore: false,\n        };\n      }\n\n      const limitValue = perPageInput === false ? total : perPage;\n      const dataResult = await this.#db.readClient.manyOrNone(\n        `SELECT * FROM ${tableName} WHERE \"workspaceId\" = $1 ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`,\n        [workspaceId, limitValue, offset],\n      );\n\n      const versions = (dataResult || []).flatMap(row => {\n        try {\n          return [this.parseVersionRow(row)];\n        } catch (err) {\n          this.logger?.warn?.('[PG] Failed to map workspace version row, skipping', { id: row?.id, error: err });\n          return [];\n        }\n      });\n\n      return {\n        versions,\n        total,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : offset + perPage < total,\n      };\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'LIST_WORKSPACE_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { workspaceId },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_WORKSPACE_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_WORKSPACE_VERSION', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { versionId: id },\n        },\n        error,\n      );\n    }\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_WORKSPACE_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"workspaceId\" = $1`, [entityId]);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'DELETE_WORKSPACE_VERSIONS_BY_WORKSPACE_ID', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { workspaceId: entityId },\n        },\n        error,\n      );\n    }\n  }\n\n  async countVersions(workspaceId: string): Promise<number> {\n    try {\n      const tableName = getTableName({\n        indexName: TABLE_WORKSPACE_VERSIONS,\n        schemaName: getSchemaName(this.#schema),\n      });\n      const result = await this.#db.readClient.one(\n        `SELECT COUNT(*) as count FROM ${tableName} WHERE \"workspaceId\" = $1`,\n        [workspaceId],\n      );\n      return parseInt(result.count, 10);\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'COUNT_WORKSPACE_VERSIONS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { workspaceId },\n        },\n        error,\n      );\n    }\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  private parseWorkspaceRow(row: any): StorageWorkspaceType {\n    return {\n      id: row.id as string,\n      status: row.status as StorageWorkspaceType['status'],\n      activeVersionId: row.activeVersionId as string | undefined,\n      authorId: row.authorId as string | undefined,\n      metadata: parseJsonResilient(row.metadata, 'metadata'),\n      createdAt: new Date(row.createdAtZ || row.createdAt),\n      updatedAt: new Date(row.updatedAtZ || row.updatedAt),\n    };\n  }\n\n  private parseVersionRow(row: any): WorkspaceVersion {\n    return {\n      id: row.id as string,\n      workspaceId: row.workspaceId as string,\n      versionNumber: row.versionNumber as number,\n      name: row.name as string,\n      description: row.description as string | undefined,\n      filesystem: parseJsonResilient(row.filesystem, 'filesystem'),\n      sandbox: parseJsonResilient(row.sandbox, 'sandbox'),\n      mounts: parseJsonResilient(row.mounts, 'mounts'),\n      search: parseJsonResilient(row.search, 'search'),\n      skills: parseJsonResilient(row.skills, 'skills'),\n      tools: parseJsonResilient(row.tools, 'tools'),\n      autoSync: Boolean(row.autoSync),\n      operationTimeout: row.operationTimeout != null ? Number(row.operationTimeout) : undefined,\n      changedFields: parseJsonResilient(row.changedFields, 'changedFields'),\n      changeMessage: row.changeMessage as string | undefined,\n      createdAt: new Date(row.createdAtZ || row.createdAt),\n    };\n  }\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { FactoryStorage, UniqueViolationError } from '@mastra/core/storage';\nimport type {\n  CollectionColumnSpec,\n  CollectionListOptions,\n  CollectionSchema,\n  CollectionValue,\n  CollectionWhere,\n  FactoryAuthDatabase,\n  FactoryStorageOps,\n  MastraCompositeStore,\n  RetentionConfig,\n} from '@mastra/core/storage';\nimport pg from 'pg';\nimport type { Pool, PoolClient } from 'pg';\n\nimport { PostgresStore } from './index';\n\nexport type PgFactoryStorageConfig =\n  | {\n      connectionString: string;\n      /** Identifier for the wrapped agent-state store. @default 'pg-factory' */\n      id?: string;\n      /** Retention config forwarded to the wrapped {@link PostgresStore}. */\n      retention?: RetentionConfig;\n    }\n  | {\n      /** Wrap an existing store; its pool is shared for app-table ops. */\n      store: PostgresStore;\n    };\n\nconst IDENTIFIER_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst PG_UNIQUE_VIOLATION = '23505';\n\nconst COLUMN_DDL: Record<CollectionColumnSpec['type'], string> = {\n  text: 'TEXT',\n  bigint: 'BIGINT',\n  integer: 'INTEGER',\n  boolean: 'BOOLEAN',\n  json: 'JSONB',\n  timestamp: 'TIMESTAMPTZ',\n  'uuid-pk': 'UUID',\n};\n\nfunction assertIdentifier(kind: string, name: string): void {\n  if (!IDENTIFIER_RE.test(name)) {\n    throw new Error(`PgFactoryStorage: invalid ${kind} identifier '${name}'`);\n  }\n}\n\nfunction isUniqueViolation(error: unknown): boolean {\n  return typeof error === 'object' && error !== null && (error as { code?: string }).code === PG_UNIQUE_VIOLATION;\n}\n\nfunction primaryKeyOf(schema: CollectionSchema): string {\n  const pks = Object.entries(schema.columns).filter(([, spec]) => spec.type === 'uuid-pk' || spec.primaryKey);\n  if (pks.length !== 1) {\n    throw new Error(\n      `PgFactoryStorage: collection '${schema.name}' must declare exactly one primary key (found ${pks.length})`,\n    );\n  }\n  return pks[0]![0];\n}\n\nfunction assertUpsertConflict(schema: CollectionSchema, conflictKeys: string[], row: Record<string, unknown>): void {\n  const keys = new Set(conflictKeys);\n  if (keys.size !== conflictKeys.length || conflictKeys.some(key => row[key] === undefined)) {\n    throw new Error(\n      `PgFactoryStorage: upsert conflict keys for '${schema.name}' must be unique and present in the row`,\n    );\n  }\n\n  const primaryKey = primaryKeyOf(schema);\n  const candidates = [{ columns: [primaryKey] }, ...(schema.uniqueIndexes ?? [])];\n  const matches = candidates.some(candidate => {\n    if (candidate.columns.length !== keys.size || candidate.columns.some(column => !keys.has(column))) return false;\n    if ('whereNotNull' in candidate && candidate.whereNotNull && row[candidate.whereNotNull] == null) return false;\n    if ('whereNull' in candidate && candidate.whereNull && row[candidate.whereNull] != null) return false;\n    return true;\n  });\n  if (!matches) {\n    throw new Error(\n      `PgFactoryStorage: upsert conflict keys [${conflictKeys.join(', ')}] do not match an applicable primary key or unique index on '${schema.name}'`,\n    );\n  }\n}\n\nfunction serializeDefault(value: string | number | boolean): string {\n  if (typeof value === 'string') return `'${value.replace(/'/g, \"''\")}'`;\n  return String(value);\n}\n\ntype Queryable = Pick<Pool, 'query'> | Pick<PoolClient, 'query'>;\n\nclass PgFactoryStorageOps implements FactoryStorageOps {\n  readonly #queryable: Queryable;\n  readonly #transactionClient?: PoolClient;\n  readonly #schemas: Map<string, CollectionSchema>;\n\n  constructor(queryable: Queryable, schemas: Map<string, CollectionSchema>, transactionClient?: PoolClient) {\n    this.#queryable = queryable;\n    this.#transactionClient = transactionClient;\n    this.#schemas = schemas;\n  }\n\n  #schema(collection: string): CollectionSchema {\n    const schema = this.#schemas.get(collection);\n    if (!schema) {\n      throw new Error(\n        `PgFactoryStorage: unknown collection '${collection}' — register it via ensureCollections() first`,\n      );\n    }\n    return schema;\n  }\n\n  #column(schema: CollectionSchema, column: string): CollectionColumnSpec {\n    const spec = schema.columns[column];\n    if (!spec) {\n      throw new Error(`PgFactoryStorage: unknown column '${column}' on collection '${schema.name}'`);\n    }\n    return spec;\n  }\n\n  #serialize(spec: CollectionColumnSpec, value: unknown): unknown {\n    if (value === null || value === undefined) return null;\n    switch (spec.type) {\n      case 'timestamp':\n        return value instanceof Date ? value : new Date(String(value));\n      case 'boolean':\n        return Boolean(value);\n      case 'json':\n        // Explicit stringify: node-pg would otherwise turn JS arrays into pg arrays.\n        return JSON.stringify(value);\n      case 'bigint':\n      case 'integer':\n        return Number(value);\n      default:\n        return String(value);\n    }\n  }\n\n  #deserializeRow<T extends Record<string, unknown>>(schema: CollectionSchema, raw: Record<string, unknown>): T {\n    const row: Record<string, unknown> = {};\n    for (const [name, spec] of Object.entries(schema.columns)) {\n      const value = raw[name];\n      if (value === null || value === undefined) {\n        row[name] = null;\n        continue;\n      }\n      switch (spec.type) {\n        case 'timestamp':\n          row[name] = value instanceof Date ? value : new Date(String(value));\n          break;\n        case 'boolean':\n          row[name] = Boolean(value);\n          break;\n        case 'json':\n          // node-pg parses JSONB through its type parsers, so `value` is\n          // already the stored JSON value. Parsing again would throw on a JSON\n          // string scalar (the whole column reads back as a JS string).\n          row[name] = value;\n          break;\n        case 'bigint':\n        case 'integer':\n          row[name] = Number(value); // node-pg returns BIGINT as string\n          break;\n        default:\n          row[name] = String(value);\n      }\n    }\n    return row as T;\n  }\n\n  /** Builds `WHERE` SQL (without the keyword). `{}` yields a match-all clause. */\n  #buildWhere(\n    schema: CollectionSchema,\n    where: CollectionWhere,\n    startIndex = 1,\n  ): { sql: string; args: unknown[]; nextIndex: number } {\n    const clauses: string[] = [];\n    const args: unknown[] = [];\n    let index = startIndex;\n    for (const [column, condition] of Object.entries(where)) {\n      const spec = this.#column(schema, column);\n      if (condition !== null && typeof condition === 'object' && !(condition instanceof Date) && 'in' in condition) {\n        if (condition.in.length === 0) {\n          clauses.push('FALSE');\n          continue;\n        }\n        const nonNull = condition.in.filter(value => value !== null);\n        const includesNull = nonNull.length !== condition.in.length;\n        const inClause =\n          nonNull.length > 0 ? `\"${column}\" IN (${nonNull.map(() => `$${index++}`).join(', ')})` : undefined;\n        clauses.push(\n          inClause && includesNull ? `(${inClause} OR \"${column}\" IS NULL)` : (inClause ?? `\"${column}\" IS NULL`),\n        );\n        args.push(...nonNull.map(value => this.#serialize(spec, value)));\n      } else if (condition === null) {\n        clauses.push(`\"${column}\" IS NULL`);\n      } else {\n        clauses.push(`\"${column}\" = $${index++}`);\n        args.push(this.#serialize(spec, condition));\n      }\n    }\n    return { sql: clauses.length > 0 ? clauses.join(' AND ') : 'TRUE', args, nextIndex: index };\n  }\n\n  /** Keyset condition: rows strictly after `cursor.values` in the `orderBy` order. */\n  #buildCursor(\n    schema: CollectionSchema,\n    orderBy: NonNullable<CollectionListOptions['orderBy']>,\n    values: CollectionValue[],\n    startIndex: number,\n  ): { sql: string; args: unknown[]; nextIndex: number } {\n    if (values.length !== orderBy.length) {\n      throw new Error(`PgFactoryStorage: cursor has ${values.length} values but orderBy has ${orderBy.length} columns`);\n    }\n    const branches: string[] = [];\n    const args: unknown[] = [];\n    let index = startIndex;\n    for (let i = 0; i < orderBy.length; i++) {\n      const parts: string[] = [];\n      for (let j = 0; j < i; j++) {\n        const [column] = orderBy[j]!;\n        parts.push(`\"${column}\" = $${index++}`);\n        args.push(this.#serialize(this.#column(schema, column), values[j]));\n      }\n      const [column, dir] = orderBy[i]!;\n      parts.push(`\"${column}\" ${dir === 'desc' ? '<' : '>'} $${index++}`);\n      args.push(this.#serialize(this.#column(schema, column), values[i]));\n      branches.push(`(${parts.join(' AND ')})`);\n    }\n    return { sql: `(${branches.join(' OR ')})`, args, nextIndex: index };\n  }\n\n  #buildSelect(\n    schema: CollectionSchema,\n    where: CollectionWhere,\n    opts?: CollectionListOptions,\n    forUpdate = false,\n  ): { sql: string; args: unknown[] } {\n    const filter = this.#buildWhere(schema, where);\n    let sql = `SELECT * FROM \"${schema.name}\" WHERE ${filter.sql}`;\n    const args = [...filter.args];\n    let index = filter.nextIndex;\n\n    if (opts?.cursor) {\n      if (!opts.orderBy || opts.orderBy.length === 0) {\n        throw new Error('PgFactoryStorage: cursor pagination requires orderBy');\n      }\n      const cursor = this.#buildCursor(schema, opts.orderBy, opts.cursor.values, index);\n      sql += ` AND ${cursor.sql}`;\n      args.push(...cursor.args);\n      index = cursor.nextIndex;\n    }\n    if (opts?.orderBy && opts.orderBy.length > 0) {\n      const order = opts.orderBy\n        .map(([column, dir]) => {\n          this.#column(schema, column);\n          return `\"${column}\" ${dir === 'desc' ? 'DESC' : 'ASC'}`;\n        })\n        .join(', ');\n      sql += ` ORDER BY ${order}`;\n    }\n    if (opts?.limit !== undefined) {\n      sql += ` LIMIT $${index++}`;\n      args.push(opts.limit);\n    }\n    if (forUpdate) sql += ' FOR UPDATE';\n    return { sql, args };\n  }\n\n  async #select<T extends Record<string, unknown>>(\n    queryable: Queryable,\n    collection: string,\n    where: CollectionWhere,\n    opts?: CollectionListOptions,\n    forUpdate = false,\n  ): Promise<T[]> {\n    const schema = this.#schema(collection);\n    const { sql, args } = this.#buildSelect(schema, where, opts, forUpdate);\n    const result = await queryable.query(sql, args);\n    return result.rows.map((raw: Record<string, unknown>) => this.#deserializeRow<T>(schema, raw));\n  }\n\n  async findOne<T extends Record<string, unknown>>(collection: string, where: CollectionWhere): Promise<T | null> {\n    const rows = await this.#select<T>(this.#queryable, collection, where, { limit: 1 });\n    return rows[0] ?? null;\n  }\n\n  async findMany<T extends Record<string, unknown>>(\n    collection: string,\n    where: CollectionWhere,\n    opts?: CollectionListOptions,\n  ): Promise<T[]> {\n    return this.#select<T>(this.#queryable, collection, where, opts);\n  }\n\n  async count(collection: string, where: CollectionWhere): Promise<number> {\n    const schema = this.#schema(collection);\n    const filter = this.#buildWhere(schema, where);\n    const result = await this.#queryable.query(\n      `SELECT COUNT(*) AS count FROM \"${schema.name}\" WHERE ${filter.sql}`,\n      filter.args,\n    );\n    return Number(result.rows[0]?.count ?? 0);\n  }\n\n  async insertOne<T extends Record<string, unknown>>(collection: string, row: Partial<T>): Promise<T> {\n    const schema = this.#schema(collection);\n    const pk = primaryKeyOf(schema);\n\n    const values: Record<string, unknown> = { ...row };\n    if (schema.columns[pk]!.type === 'uuid-pk' && values[pk] === undefined) {\n      values[pk] = randomUUID();\n    }\n\n    const columns = Object.keys(values).filter(column => values[column] !== undefined);\n    for (const column of columns) this.#column(schema, column);\n\n    const sql = `INSERT INTO \"${schema.name}\" (${columns.map(c => `\"${c}\"`).join(', ')}) VALUES (${columns\n      .map((_, i) => `$${i + 1}`)\n      .join(', ')}) RETURNING *`;\n    const args = columns.map(column => this.#serialize(this.#column(schema, column), values[column]));\n\n    try {\n      const result = await this.#queryable.query(sql, args);\n      return this.#deserializeRow<T>(schema, result.rows[0] as Record<string, unknown>);\n    } catch (error) {\n      if (isUniqueViolation(error)) throw new UniqueViolationError(collection, { cause: error });\n      throw error;\n    }\n  }\n\n  async upsertOne<T extends Record<string, unknown>>(\n    collection: string,\n    conflictKeys: string[],\n    row: Partial<T>,\n  ): Promise<T> {\n    const schema = this.#schema(collection);\n    const pk = primaryKeyOf(schema);\n    assertUpsertConflict(schema, conflictKeys, row);\n    const keyWhere = Object.fromEntries(conflictKeys.map(key => [key, row[key] as CollectionValue])) as CollectionWhere;\n\n    let lastError: unknown;\n    for (let attempt = 0; attempt < 2; attempt++) {\n      const existing = await this.findOne<T>(collection, keyWhere);\n      if (existing) {\n        const set = Object.fromEntries(\n          Object.entries(row).filter(\n            ([column, value]) => value !== undefined && column !== pk && !conflictKeys.includes(column),\n          ),\n        );\n        if (Object.keys(set).length > 0) {\n          await this.updateMany(collection, { [pk]: existing[pk] as CollectionValue }, set);\n        }\n        const updated = await this.findOne<T>(collection, { [pk]: existing[pk] as CollectionValue });\n        if (!updated) continue; // deleted concurrently; retry\n        return updated;\n      }\n      try {\n        return await this.insertOne<T>(collection, row);\n      } catch (error) {\n        if (!(error instanceof UniqueViolationError)) throw error;\n        lastError = error; // lost an insert race; retry as update\n      }\n    }\n    throw lastError ?? new Error(`PgFactoryStorage: upsert into '${collection}' did not converge`);\n  }\n\n  async updateMany(collection: string, where: CollectionWhere, set: Record<string, unknown>): Promise<number> {\n    return this.#updateMany(this.#queryable, collection, where, set);\n  }\n\n  async #updateMany(\n    queryable: Queryable,\n    collection: string,\n    where: CollectionWhere,\n    set: Record<string, unknown>,\n  ): Promise<number> {\n    const schema = this.#schema(collection);\n    const columns = Object.keys(set).filter(column => set[column] !== undefined);\n    if (columns.length === 0) return 0;\n    const assignments = columns.map((column, i) => `\"${column}\" = $${i + 1}`).join(', ');\n    const filter = this.#buildWhere(schema, where, columns.length + 1);\n    const args = [...columns.map(column => this.#serialize(this.#column(schema, column), set[column])), ...filter.args];\n    const result = await queryable.query(`UPDATE \"${schema.name}\" SET ${assignments} WHERE ${filter.sql}`, args);\n    return result.rowCount ?? 0;\n  }\n\n  async deleteMany(collection: string, where: CollectionWhere): Promise<number> {\n    const schema = this.#schema(collection);\n    const filter = this.#buildWhere(schema, where);\n    const result = await this.#queryable.query(`DELETE FROM \"${schema.name}\" WHERE ${filter.sql}`, filter.args);\n    return result.rowCount ?? 0;\n  }\n\n  async updateAtomic<T extends Record<string, unknown>>(\n    collection: string,\n    where: CollectionWhere,\n    fn: (row: T) => Partial<T> | null | Promise<Partial<T> | null>,\n  ): Promise<T | null> {\n    const run = async (client: PoolClient): Promise<T | null> => {\n      const schema = this.#schema(collection);\n      const pk = primaryKeyOf(schema);\n      const rows = await this.#select<T>(client, collection, where, { limit: 1 }, true);\n      const row = rows[0];\n      if (!row) return null;\n      const patch = await fn(row);\n      if (patch === null) return row;\n      const pkWhere = { [pk]: row[pk] as CollectionValue } as CollectionWhere;\n      await this.#updateMany(client, collection, pkWhere, patch);\n      const updated = await this.#select<T>(client, collection, pkWhere, { limit: 1 });\n      return updated[0] ?? null;\n    };\n\n    if (this.#transactionClient) return run(this.#transactionClient);\n\n    const pool = this.#queryable as Pool;\n    const client = await pool.connect();\n    try {\n      await client.query('BEGIN');\n      try {\n        const result = await run(client);\n        await client.query('COMMIT');\n        return result;\n      } catch (error) {\n        await client.query('ROLLBACK');\n        throw error;\n      }\n    } finally {\n      client.release();\n    }\n  }\n}\n\n/**\n * PostgreSQL {@link FactoryStorage} backend: one database powering agent state\n * (via a wrapped {@link PostgresStore}) and app-owned collections (via\n * {@link FactoryStorageOps}), sharing a single pool.\n *\n * Supports serializable app-table transactions for cross-replica invariant\n * enforcement and `authDatabase()` exposing the shared pool.\n */\n/**\n * A pool-level `error` listener only covers *idle* clients: pg hands ownership\n * of a client to the borrower for the duration of a checkout and takes its own\n * listener off. So a backend restart or network blip that lands on a client\n * mid-transaction reaches an emitter with no listener, and Node escalates that\n * to an uncaughtException that kills the process — the pool handler logs the\n * idle siblings and the borrowed one still brings everything down.\n *\n * Attach a listener once per physical connection instead. `connect` fires when\n * the pool establishes a client, so the client stays covered for its whole life\n * and there is nothing to remove on release.\n *\n * That listener outlives the checkout, so it also sees the failures the pool is\n * already reporting through its own idle listener. Follow `acquire`/`release`\n * to tell the two apart and stay quiet while the client is idle — otherwise one\n * dropped connection is announced twice, the second time as the wrong thing.\n *\n * The pool still discards the failed connection; this only keeps the failure\n * reportable instead of fatal.\n */\nexport function guardCheckedOutClientErrors(pool: Pool, warn = console.warn): void {\n  // pg emits 'connect' from inside the acquire path, so a client is borrowed\n  // from the moment it exists.\n  const borrowed = new WeakSet<object>();\n\n  pool.on('connect', client => {\n    borrowed.add(client);\n    client.on('error', err => {\n      if (!borrowed.has(client)) return; // idle: the pool's own listener reports this one\n      warn(\n        `PgFactoryStorage: client error while checked out (the pool discards this connection): ${err instanceof Error ? err.message : String(err)}`,\n      );\n    });\n  });\n  pool.on('acquire', client => borrowed.add(client));\n  pool.on('release', (_err, client) => borrowed.delete(client));\n}\n\nexport class PgFactoryStorage extends FactoryStorage {\n  readonly ops: FactoryStorageOps;\n\n  readonly #pool: Pool;\n  readonly #ownsPool: boolean;\n  readonly #config: PgFactoryStorageConfig;\n  readonly #schemas = new Map<string, CollectionSchema>();\n  #mastraStorage?: PostgresStore;\n\n  constructor(config: PgFactoryStorageConfig) {\n    super();\n    this.#config = config;\n    if ('store' in config) {\n      this.#pool = config.store.pool;\n      this.#ownsPool = false;\n      this.#mastraStorage = config.store;\n    } else {\n      this.#pool = new pg.Pool({ connectionString: config.connectionString });\n      this.#ownsPool = true;\n      // pg emits 'error' on the pool when an idle client's connection drops\n      // (backend restart, network partition, local address changes). Without a\n      // listener Node escalates the event to an uncaughtException and crashes\n      // the process. Only pools this storage creates get the listener — a\n      // wrapped store keeps its own listeners, mirroring close().\n      this.#pool.on('error', err => {\n        console.warn(\n          `PgFactoryStorage: idle pool client error (pool discards the client and reconnects on next checkout): ${err instanceof Error ? err.message : String(err)}`,\n        );\n      });\n      guardCheckedOutClientErrors(this.#pool);\n    }\n    this.ops = new PgFactoryStorageOps(this.#pool, this.#schemas);\n  }\n\n  getMastraStorage(): MastraCompositeStore {\n    if (!this.#mastraStorage) {\n      const config = this.#config as Extract<PgFactoryStorageConfig, { connectionString: string }>;\n      this.#mastraStorage = new PostgresStore({\n        id: config.id ?? 'pg-factory',\n        pool: this.#pool,\n        ...(config.retention ? { retention: config.retention } : {}),\n      });\n    }\n    return this.#mastraStorage;\n  }\n\n  protected async initStorage(): Promise<void> {\n    await this.#pool.query('SELECT 1');\n  }\n\n  async withTransaction<T>(\n    fn: (ops: FactoryStorageOps) => Promise<T>,\n    options?: { isolationLevel?: 'serializable' },\n  ): Promise<T> {\n    const maxAttempts = options?.isolationLevel === 'serializable' ? 3 : 1;\n    for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n      const client = await this.#pool.connect();\n      let transactionOpen = false;\n      let releaseError: Error | undefined;\n      try {\n        await client.query(options?.isolationLevel === 'serializable' ? 'BEGIN ISOLATION LEVEL SERIALIZABLE' : 'BEGIN');\n        transactionOpen = true;\n        const result = await fn(new PgFactoryStorageOps(client, this.#schemas, client));\n        await client.query('COMMIT');\n        transactionOpen = false;\n        return result;\n      } catch (error) {\n        if (transactionOpen) {\n          try {\n            await client.query('ROLLBACK');\n            transactionOpen = false;\n          } catch (rollbackError) {\n            releaseError = rollbackError instanceof Error ? rollbackError : new Error(String(rollbackError));\n            throw new AggregateError([error, rollbackError], 'Factory transaction and rollback both failed');\n          }\n        }\n        const serializationFailure =\n          typeof error === 'object' && error !== null && (error as { code?: string }).code === '40001';\n        if (!serializationFailure || attempt === maxAttempts) throw error;\n      } finally {\n        client.release(releaseError);\n      }\n    }\n    throw new Error('PgFactoryStorage: serializable transaction retry limit exceeded');\n  }\n\n  async ensureCollections(schemas: CollectionSchema[]): Promise<void> {\n    for (const schema of schemas) {\n      await this.#ensureCollection(schema);\n      this.#schemas.set(schema.name, schema);\n    }\n  }\n\n  async close(): Promise<void> {\n    if (this.#ownsPool) {\n      await this.#pool.end();\n    } else {\n      await this.#mastraStorage?.close();\n    }\n  }\n\n  authDatabase(): FactoryAuthDatabase {\n    return { dialect: 'postgres', pool: this.#pool };\n  }\n\n  #columnDdl(name: string, spec: CollectionColumnSpec): string {\n    assertIdentifier('column', name);\n    let ddl = `\"${name}\" ${COLUMN_DDL[spec.type]}`;\n    if (spec.type === 'uuid-pk' || spec.primaryKey) ddl += ' PRIMARY KEY';\n    if (!spec.nullable && spec.type !== 'uuid-pk' && !spec.primaryKey) ddl += ' NOT NULL';\n    if (spec.default !== undefined) ddl += ` DEFAULT ${serializeDefault(spec.default)}`;\n    return ddl;\n  }\n\n  async #ensureCollection(schema: CollectionSchema): Promise<void> {\n    assertIdentifier('collection', schema.name);\n    primaryKeyOf(schema); // validates exactly one pk\n\n    const columns = Object.entries(schema.columns).map(([name, spec]) => this.#columnDdl(name, spec));\n    await this.#pool.query(`CREATE TABLE IF NOT EXISTS \"${schema.name}\" (${columns.join(', ')})`);\n\n    // Additive evolution: add any columns missing from an existing table.\n    for (const [name, spec] of Object.entries(schema.columns)) {\n      await this.#pool.query(`ALTER TABLE \"${schema.name}\" ADD COLUMN IF NOT EXISTS ${this.#columnDdl(name, spec)}`);\n    }\n\n    // Relaxing evolution: a table created by an older schema may still say\n    // NOT NULL on a column that is now declared nullable — drop the stale\n    // constraint so inserts of null don't fail on pre-existing databases.\n    for (const [name, spec] of Object.entries(schema.columns)) {\n      if (!spec.nullable || spec.type === 'uuid-pk' || spec.primaryKey) continue;\n      await this.#pool.query(`ALTER TABLE \"${schema.name}\" ALTER COLUMN \"${name}\" DROP NOT NULL`);\n    }\n\n    // Widening evolution: a column now declared bigint may still be the\n    // INTEGER an older schema created, which epoch-ms values overflow.\n    for (const [name, spec] of Object.entries(schema.columns)) {\n      if (spec.type !== 'bigint') continue;\n      const { rows } = await this.#pool.query<{ data_type: string }>(\n        `SELECT data_type FROM information_schema.columns WHERE table_schema = current_schema() AND table_name = $1 AND column_name = $2`,\n        [schema.name, name],\n      );\n      if (rows[0]?.data_type === 'integer') {\n        await this.#pool.query(`ALTER TABLE \"${schema.name}\" ALTER COLUMN \"${name}\" TYPE BIGINT`);\n      }\n    }\n\n    for (const index of schema.uniqueIndexes ?? []) {\n      assertIdentifier('index', index.name);\n      index.columns.forEach(column => assertIdentifier('column', column));\n      let where = '';\n      if (index.whereNotNull) {\n        assertIdentifier('column', index.whereNotNull);\n        where = ` WHERE \"${index.whereNotNull}\" IS NOT NULL`;\n      } else if (index.whereNull) {\n        assertIdentifier('column', index.whereNull);\n        where = ` WHERE \"${index.whereNull}\" IS NULL`;\n      }\n      await this.#pool.query(\n        `CREATE UNIQUE INDEX IF NOT EXISTS \"${index.name}\" ON \"${schema.name}\" (${index.columns\n          .map(c => `\"${c}\"`)\n          .join(', ')})${where}`,\n      );\n    }\n    for (const index of schema.indexes ?? []) {\n      assertIdentifier('index', index.name);\n      index.columns.forEach(column => assertIdentifier('column', column));\n      await this.#pool.query(\n        `CREATE INDEX IF NOT EXISTS \"${index.name}\" ON \"${schema.name}\" (${index.columns\n          .map(c => `\"${c}\"`)\n          .join(', ')})`,\n      );\n    }\n  }\n}\n","import type { ConnectionOptions } from 'node:tls';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createStorageErrorId, MastraCompositeStore } from '@mastra/core/storage';\nimport type { StorageDomains } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { Pool } from 'pg';\nimport {\n  validateConfig,\n  isCloudSqlConfig,\n  isConnectionStringConfig,\n  isHostConfig,\n  isPoolConfig,\n  isWritePoolConfig,\n} from '../shared/config';\nimport type { PostgresStoreConfig } from '../shared/config';\nimport { buildConnectionStringPoolConfig } from '../shared/pool-config';\nimport { PinnedClientAdapter, PoolAdapter, RoutingDbClient } from './client';\nimport type { DbClient, PoolClient } from './client';\nimport type { PgDomainClientConfig } from './db';\nimport { getSchemaName } from './db';\nimport { loadSchemaSnapshot } from './db/schema-snapshot';\nimport { AgentsPG } from './domains/agents';\nimport { BackgroundTasksPG } from './domains/background-tasks';\nimport { BlobsPG } from './domains/blobs';\nimport { ChannelsPG } from './domains/channels';\nimport { DatasetsPG } from './domains/datasets';\nimport { ExperimentsPG } from './domains/experiments';\nimport { FavoritesPG } from './domains/favorites';\nimport { KnowledgePG } from './domains/knowledge';\nimport { MCPClientsPG } from './domains/mcp-clients';\nimport { MCPServersPG } from './domains/mcp-servers';\nimport { MemoryPG } from './domains/memory';\nimport { NotificationsPG } from './domains/notifications';\nimport { ObservabilityPG } from './domains/observability';\nimport { ObservabilityStoragePostgresVNext } from './domains/observability/v-next';\nimport type { VNextPostgresObservabilityConfig } from './domains/observability/v-next';\nimport { PromptBlocksPG } from './domains/prompt-blocks';\nimport { SchedulesPG } from './domains/schedules';\nimport { ScorerDefinitionsPG } from './domains/scorer-definitions';\nimport { ScoresPG } from './domains/scores';\nimport { SkillsPG } from './domains/skills';\nimport { ThreadStatePG } from './domains/thread-state';\nimport { ToolProviderConnectionsPG } from './domains/tool-provider-connections';\nimport { WorkflowDefinitionsPG } from './domains/workflow-definitions';\nimport { WorkflowsPG } from './domains/workflows';\nimport { WorkspacesPG } from './domains/workspaces';\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\ntype ConnectionStringPoolConfig = {\n  connectionString: string;\n  ssl?: ConnectionOptions | boolean;\n  max?: number;\n  idleTimeoutMillis?: number;\n};\n\ntype HostPoolConfig = {\n  host: string;\n  port?: number;\n  database: string;\n  user: string;\n  password: string;\n  ssl?: ConnectionOptions | boolean;\n  max?: number;\n  idleTimeoutMillis?: number;\n};\n\nfunction createConnectionStringPool(config: ConnectionStringPoolConfig): Pool {\n  return new Pool(\n    buildConnectionStringPoolConfig(config, {\n      max: DEFAULT_MAX_CONNECTIONS,\n      idleTimeoutMillis: DEFAULT_IDLE_TIMEOUT_MS,\n    }),\n  );\n}\n\nfunction createHostPool(config: HostPoolConfig): Pool {\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/**\n * All storage domain classes, in order. Each provides a static getExportDDL method\n * that returns the complete DDL (tables, constraints, indexes, triggers) for that domain.\n */\nconst ALL_DOMAINS = [\n  MemoryPG,\n  KnowledgePG,\n  NotificationsPG,\n  ObservabilityPG,\n  ScoresPG,\n  ScorerDefinitionsPG,\n  PromptBlocksPG,\n  AgentsPG,\n  MCPClientsPG,\n  MCPServersPG,\n  WorkspacesPG,\n  SkillsPG,\n  BlobsPG,\n  ToolProviderConnectionsPG,\n  WorkflowsPG,\n  WorkflowDefinitionsPG,\n  DatasetsPG,\n  ExperimentsPG,\n  BackgroundTasksPG,\n  FavoritesPG,\n  ChannelsPG,\n  SchedulesPG,\n  ThreadStatePG,\n] as const;\n\n/**\n * Exports the Mastra database schema as SQL DDL statements, including tables, indexes, and triggers.\n * Does not require a database connection. Each domain class provides its own DDL contribution\n * via a static getExportDDL method, ensuring a single source of truth.\n */\nexport function exportSchemas(schemaName?: string): string {\n  const statements: string[] = [];\n\n  if (schemaName) {\n    const quotedSchemaName = getSchemaName(schemaName);\n    statements.push(`CREATE SCHEMA IF NOT EXISTS ${quotedSchemaName};`);\n    statements.push('');\n  }\n\n  for (const Domain of ALL_DOMAINS) {\n    statements.push(...Domain.getExportDDL(schemaName));\n  }\n\n  return statements.join('\\n');\n}\n// Export domain classes for direct use with MastraStorage composition\nexport {\n  AgentsPG,\n  BackgroundTasksPG,\n  BlobsPG,\n  ChannelsPG,\n  DatasetsPG,\n  ExperimentsPG,\n  KnowledgePG,\n  MCPClientsPG,\n  MCPServersPG,\n  MemoryPG,\n  NotificationsPG,\n  ObservabilityPG,\n  ObservabilityStoragePostgresVNext,\n  PromptBlocksPG,\n  ScorerDefinitionsPG,\n  ScoresPG,\n  SchedulesPG,\n  SkillsPG,\n  FavoritesPG,\n  ThreadStatePG,\n  ToolProviderConnectionsPG,\n  WorkflowsPG,\n  WorkflowDefinitionsPG,\n  WorkspacesPG,\n};\nexport type { VNextPostgresObservabilityConfig };\nexport { PoolAdapter } from './client';\nexport type { DbClient, TxClient, QueryValues, Pool, PoolClient, QueryResult } from './client';\nexport type { PgDomainConfig, PgDomainClientConfig, PgDomainPoolConfig, PgDomainRestConfig } from './db';\nexport { PgFactoryStorage, type PgFactoryStorageConfig } from './factory-storage';\n\n/**\n * PostgreSQL storage adapter for Mastra.\n *\n * @example\n * ```typescript\n * // Option 1: Connection string\n * const store = new PostgresStore({\n *   id: 'my-store',\n *   connectionString: 'postgresql://...',\n * });\n *\n * // Option 2: Pre-configured pool\n * const pool = new Pool({ connectionString: 'postgresql://...' });\n * const store = new PostgresStore({ id: 'my-store', pool });\n *\n * // Access domain storage\n * const memory = await store.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Execute custom queries\n * const rows = await store.db.any('SELECT * FROM my_table');\n * ```\n */\nexport class PostgresStore extends MastraCompositeStore {\n  #writePool: Pool;\n  #readPool: Pool;\n  // Narrowed to RoutingDbClient so init()'s pin/unpin path is type-checked.\n  // The public `db` getter still exposes it as DbClient.\n  #db: RoutingDbClient;\n  #readDb: DbClient;\n  #ownsWritePool: boolean;\n  #writePoolClosed: boolean = false;\n  private schema: string;\n  private isInitialized: boolean = false;\n  // Caches the in-flight init() so concurrent callers share one initialization\n  // instead of each acquiring + pinning a client. See init() / issue #18282.\n  #initPromise: Promise<void> | null = null;\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, retention: config.retention });\n      // Validate schema name to prevent SQL injection\n      this.schema = parseSqlIdentifier(config.schemaName || 'public', 'schema name');\n\n      if (isPoolConfig(config)) {\n        this.#writePool = config.pool;\n        this.#ownsWritePool = false;\n      } else if (isWritePoolConfig(config)) {\n        this.#writePool = config.writePool;\n        this.#ownsWritePool = false;\n      } else {\n        this.#writePool = this.createPool(config);\n        this.#ownsWritePool = true;\n      }\n      this.#readPool = config.readPool ?? this.#writePool;\n\n      // Wrap the writer adapter in a routing client so init() can temporarily\n      // pin all DDL traffic to a single PoolClient. See PostgresStore.init().\n      this.#db = new RoutingDbClient(new PoolAdapter(this.#writePool));\n      this.#readDb = this.#readPool === this.#writePool ? this.#db : new PoolAdapter(this.#readPool);\n\n      const domainConfig: PgDomainClientConfig = {\n        client: this.#db,\n        readClient: this.#readDb,\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        workflowDefinitions: new WorkflowDefinitionsPG(domainConfig),\n        memory: new MemoryPG(domainConfig),\n        knowledge: new KnowledgePG(domainConfig),\n        notifications: new NotificationsPG(domainConfig),\n        observability: new ObservabilityPG(domainConfig),\n        agents: new AgentsPG(domainConfig),\n        promptBlocks: new PromptBlocksPG(domainConfig),\n        scorerDefinitions: new ScorerDefinitionsPG(domainConfig),\n        mcpClients: new MCPClientsPG(domainConfig),\n        mcpServers: new MCPServersPG(domainConfig),\n        workspaces: new WorkspacesPG(domainConfig),\n        skills: new SkillsPG(domainConfig),\n        favorites: new FavoritesPG(domainConfig),\n        toolProviderConnections: new ToolProviderConnectionsPG(domainConfig),\n        blobs: new BlobsPG(domainConfig),\n        datasets: new DatasetsPG(domainConfig),\n        experiments: new ExperimentsPG(domainConfig),\n        backgroundTasks: new BackgroundTasksPG(domainConfig),\n        channels: new ChannelsPG(domainConfig),\n        schedules: new SchedulesPG(domainConfig),\n        threadState: new ThreadStatePG(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    const pool = this.#buildPool(config);\n\n    // pg emits 'error' on the pool when an idle client's connection drops\n    // (backend restart, network partition, cloud proxies reaping idle\n    // sockets). Without a listener Node escalates the event to an\n    // uncaughtException and crashes the process. Only pools this store\n    // creates get the listener — a user-provided pool keeps the user's own\n    // listeners, mirroring close().\n    pool.on('error', err => {\n      this.logger?.warn?.(\n        'PostgresStore: idle pool client error (pool discards the client and reconnects on next checkout)',\n        {\n          err: err instanceof Error ? err.message : err,\n        },\n      );\n    });\n\n    return pool;\n  }\n\n  #buildPool(config: PostgresStoreConfig): Pool {\n    if (isConnectionStringConfig(config)) {\n      return createConnectionStringPool(config);\n    }\n\n    if (isHostConfig(config)) {\n      return createHostPool(config);\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    // Skip the pinned-init path entirely when initialization is disabled. The\n    // caller manages schema/migrations externally, so init() must not connect,\n    // pin, or run DDL. This also keeps the call-site contract in @mastra/core\n    // (which calls storage.init() directly and assumes it is \"a no-op when\n    // disabled\") true for Postgres. See issue #18282.\n    if (this.disableInit || process.env.MASTRA_DISABLE_STORAGE_INIT === 'true') {\n      return;\n    }\n\n    if (this.isInitialized) {\n      return;\n    }\n\n    // Coalesce concurrent init() calls into a single in-flight promise. A\n    // PostgresStore shared across request-scoped Mastra instances can have\n    // init() invoked from several callers at once; without this guard both\n    // race past the `isInitialized` check and pin the RoutingDbClient twice,\n    // throwing \"RoutingDbClient already has a pinned client\" (issue #18282).\n    this.#initPromise ??= this.#runPinnedInit();\n    await this.#initPromise;\n  }\n\n  async #runPinnedInit(): Promise<void> {\n    // Acquire a single backend connection and pin every domain's DDL to it\n    // for the duration of init(). This avoids:\n    //   - per-statement pool.connect() RTT on remote/managed Postgres\n    //   - transaction-pooler budget exhaustion under concurrent DDL fan-out\n    //   - inter-statement lock contention across domains (issue #17679)\n    // Runtime queries continue to use the pool normally once init completes.\n    // connect() runs inside the try so a failing connection (e.g. a network\n    // blip during boot) is caught below and resets #initPromise, keeping\n    // init() retryable instead of permanently rejecting.\n    let pinnedClient: PoolClient | undefined;\n\n    try {\n      pinnedClient = await this.#writePool.connect();\n      const pinned = new PinnedClientAdapter(this.#writePool, pinnedClient);\n      this.#db.pin(pinned);\n      // Read the schema's catalog once, up front, so the domains below can\n      // answer \"does this table/column/index already exist?\" locally instead of\n      // asking the server ~350 times over this one serialized connection.\n      // Cleared in the finally: the snapshot never outlives init().\n      this.#db.setSchemaSnapshot(await loadSchemaSnapshot(pinned, this.schema));\n      await super.init();\n      // Only mark initialized after schema creation actually finishes so a\n      // racing second init() caller can't return early and issue runtime\n      // queries against tables that aren't yet created.\n      this.isInitialized = true;\n    } catch (error) {\n      // Drop the cached promise so a transient failure (e.g. a network blip\n      // during boot) can be retried by a later init() call instead of\n      // permanently rejecting. Mirrors storageWithInit's cacheInit behavior.\n      this.#initPromise = null;\n      // Rethrow MastraError directly to preserve structured error IDs (e.g., MIGRATION_REQUIRED::DUPLICATE_SPANS)\n      if (error instanceof MastraError) {\n        throw error;\n      }\n      throw new MastraError(\n        {\n          id: createStorageErrorId('PG', 'INIT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    } finally {\n      // Drop the snapshot unconditionally — including when loading it or\n      // super.init() threw — so no code path can read a stale catalog picture\n      // after init returns.\n      this.#db.setSchemaSnapshot(null);\n      // Only unpin/release when connect() actually handed us a client; on a\n      // failed connect() pinnedClient is undefined and pin() never ran.\n      if (pinnedClient) {\n        this.#db.unpin();\n        pinnedClient.release();\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  /** Database client for queries that may run against the configured read replica. */\n  public get readDb(): DbClient {\n    return this.#readDb;\n  }\n\n  /** The underlying writer pg.Pool for direct database access or ORM integration. */\n  public get pool(): Pool {\n    return this.#writePool;\n  }\n\n  /** The underlying reader pg.Pool, falling back to the writer pool when unset. */\n  public get readPool(): Pool {\n    return this.#readPool;\n  }\n\n  /**\n   * Closes the writer connection pool if it was created by this store.\n   * Caller-provided writer and reader pools are not closed.\n   * Safe to call multiple times — subsequent calls are no-ops.\n   */\n  async close(): Promise<void> {\n    if (this.#ownsWritePool && !this.#writePoolClosed) {\n      this.#writePoolClosed = true;\n      await this.#writePool.end();\n    }\n  }\n}\n\n/**\n * Required connection config for the v-next observability domain. Accepts\n * the same connection shapes as `PostgresStoreConfig` (pool /\n * connectionString / host+port / Cloud SQL connector) plus the\n * vNext-specific options.\n *\n * Required by design — `PostgresStoreVNext` will not implicitly share the\n * primary connection. Callers who want to share must pass identical\n * connection details here, and they'll receive a runtime warning every time\n * the store is constructed (and again on every init() over the same logger).\n */\nexport type PostgresStoreVNextObservabilityConfig = (\n  | { pool: Pool }\n  | {\n      connectionString: string;\n      ssl?: ConnectionOptions | boolean;\n      max?: number;\n      idleTimeoutMillis?: number;\n    }\n  | {\n      host: string;\n      port?: number;\n      database: string;\n      user: string;\n      password: string;\n      ssl?: ConnectionOptions | boolean;\n      max?: number;\n      idleTimeoutMillis?: number;\n    }\n) & {\n  schemaName?: string;\n  partitioning?: VNextPostgresObservabilityConfig['partitioning'];\n  discovery?: VNextPostgresObservabilityConfig['discovery'];\n  traceQueryTimeoutMs?: VNextPostgresObservabilityConfig['traceQueryTimeoutMs'];\n};\n\n/**\n * Best-effort detection of two configs pointing at the same Postgres\n * instance. Catches the common collision cases without over-reaching:\n * - identical pool references\n * - identical connectionStrings\n * - identical (host, port, database) tuples\n *\n * Mixed shapes (e.g. connectionString vs host config) return false; we don't\n * try to parse URLs since false positives are worse than the occasional miss.\n */\nfunction isSameConnectionTarget(\n  primary: PostgresStoreConfig,\n  observability: PostgresStoreVNextObservabilityConfig,\n): boolean {\n  if ('pool' in primary && 'pool' in observability) {\n    return primary.pool === observability.pool;\n  }\n  if ('connectionString' in primary && 'connectionString' in observability) {\n    return primary.connectionString === observability.connectionString;\n  }\n  if ('host' in primary && 'host' in observability) {\n    return (\n      primary.host === observability.host &&\n      (primary.port ?? 5432) === ((observability as { port?: number }).port ?? 5432) &&\n      primary.database === observability.database\n    );\n  }\n  return false;\n}\n\nconst COLLISION_WARNING =\n  'PostgresStoreVNext: the `observability` connection appears to point at the same Postgres instance ' +\n  'as the primary store. For production workloads, point observability at a dedicated Postgres ' +\n  'instance to avoid degrading your application database performance.';\n\n/**\n * Postgres storage adapter that uses the v-next observability domain.\n *\n * Composes a primary `PostgresStore` (memory / workflows / scores / agents /\n * etc.) with an `ObservabilityStoragePostgresVNext` for logs, metrics,\n * scores, feedback, and traces.\n *\n * The `observability` connection is **required**: every caller has to make\n * an explicit decision about where observability data goes. For production,\n * point it at a dedicated Postgres instance. For local development you can\n * pass the same connection details as the primary store — you'll get a\n * runtime warning every time the store is constructed.\n *\n * IMPORTANT: this adapter is intended for **low-volume production**\n * workloads only. For high-volume agent workloads, use the ClickHouse\n * adapter — Postgres (with or without TimescaleDB) cannot keep up past\n * roughly 1,500 calls/sec sustained on a single primary.\n *\n * @example\n * ```typescript\n * import { Mastra } from '@mastra/core';\n * import { PostgresStoreVNext } from '@mastra/pg';\n *\n * export const mastra = new Mastra({\n *   storage: new PostgresStoreVNext({\n *     id: 'app',\n *     connectionString: process.env.DATABASE_URL!,\n *     observability: {\n *       connectionString: process.env.OBSERVABILITY_DATABASE_URL!,\n *     },\n *   }),\n * });\n * ```\n */\nexport class PostgresStoreVNext extends PostgresStore {\n  #observabilityPool?: Pool;\n  #ownsObservabilityPool = false;\n  #observabilityPoolClosed = false;\n\n  constructor(\n    config: PostgresStoreConfig & {\n      /**\n       * Connection config for the vNext observability domain. Required.\n       * Pass a dedicated connection in production; reusing the primary\n       * connection logs a runtime warning every construction.\n       */\n      observability: PostgresStoreVNextObservabilityConfig;\n    },\n  ) {\n    super(config);\n    this.name = 'PostgresStoreVNext';\n\n    const obsConfig = config.observability;\n    if (isSameConnectionTarget(config, obsConfig)) {\n      console.warn(COLLISION_WARNING);\n    }\n    const built = this.#createObservabilityClient(obsConfig);\n    const observabilityClient = built.client;\n    this.#observabilityPool = built.pool;\n    this.#ownsObservabilityPool = built.owned;\n\n    // Same crash-prevention as the primary pool in createPool(): without an\n    // 'error' listener, an idle client dropped by the backend escalates to an\n    // uncaughtException. Only for pools this store created.\n    if (built.owned) {\n      built.pool.on('error', err => {\n        this.logger?.warn?.(\n          'PostgresStoreVNext: idle observability pool client error (pool discards the client and reconnects on next checkout)',\n          {\n            err: err instanceof Error ? err.message : err,\n          },\n        );\n      });\n    }\n\n    // NOTE: `skipDefaultIndexes` / `indexes` from the primary config are\n    // intentionally NOT forwarded. The vNext observability domain manages\n    // its own index set (see `allIndexDDL` in `ddl.ts`) — pretending to\n    // honor primary-store index config here would mislead callers. If the\n    // need for custom observability indexes shows up, plumb them through\n    // `observability.indexes` as a dedicated field.\n    const observability = new ObservabilityStoragePostgresVNext({\n      client: observabilityClient,\n      schemaName: obsConfig.schemaName ?? config.schemaName,\n      partitioning: obsConfig.partitioning,\n      discovery: obsConfig.discovery,\n      traceQueryTimeoutMs: obsConfig.traceQueryTimeoutMs,\n    });\n\n    this.stores = {\n      ...this.stores,\n      observability,\n    };\n  }\n\n  #createObservabilityClient(cfg: PostgresStoreVNextObservabilityConfig): {\n    client: DbClient;\n    pool: Pool;\n    owned: boolean;\n  } {\n    if ('pool' in cfg && cfg.pool) {\n      return { client: new PoolAdapter(cfg.pool), pool: cfg.pool, owned: false };\n    }\n    if ('connectionString' in cfg && typeof cfg.connectionString === 'string') {\n      const pool = createConnectionStringPool(cfg);\n      return { client: new PoolAdapter(pool), pool, owned: true };\n    }\n    if ('host' in cfg) {\n      const pool = createHostPool(cfg);\n      return { client: new PoolAdapter(pool), pool, owned: true };\n    }\n    // Cloud SQL connector / pg ClientConfig style — pass through to pg.Pool.\n    const pool = new Pool(cfg as never);\n    return { client: new PoolAdapter(pool), pool, owned: true };\n  }\n\n  /**\n   * Closes both the primary pool (when owned) and the observability pool\n   * (when this store created it). Safe to call multiple times.\n   */\n  override async close(): Promise<void> {\n    await super.close();\n    if (this.#ownsObservabilityPool && this.#observabilityPool && !this.#observabilityPoolClosed) {\n      this.#observabilityPoolClosed = true;\n      await this.#observabilityPool.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"],"mappings":"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"}