{"version":3,"sources":["../src/storage/base.ts","../src/storage/domains/base.ts","../src/storage/domains/observability/base.ts","../src/storage/utils.ts","../src/storage/domains/observability/inmemory.ts","../src/storage/domains/observability/record-builders.ts","../src/storage/domains/versioned.ts","../src/storage/domains/agents/base.ts","../src/storage/domains/agents/inmemory.ts","../src/storage/domains/blobs/base.ts","../src/storage/domains/blobs/inmemory.ts","../src/datasets/validation/errors.ts","../src/datasets/validation/validator.ts","../src/storage/domains/datasets/base.ts","../src/storage/domains/datasets/inmemory.ts","../src/storage/domains/experiments/base.ts","../src/storage/domains/experiments/inmemory.ts","../src/storage/domains/inmemory-db.ts","../src/storage/domains/mcp-clients/base.ts","../src/storage/domains/mcp-clients/inmemory.ts","../src/storage/domains/mcp-servers/base.ts","../src/storage/domains/mcp-servers/inmemory.ts","../src/storage/domains/memory/base.ts","../src/storage/domains/memory/inmemory.ts","../src/storage/domains/prompt-blocks/base.ts","../src/storage/domains/prompt-blocks/inmemory.ts","../src/storage/domains/scorer-definitions/base.ts","../src/storage/domains/scorer-definitions/inmemory.ts","../src/storage/domains/scores/base.ts","../src/storage/domains/scores/inmemory.ts","../src/storage/domains/skills/base.ts","../src/storage/domains/skills/inmemory.ts","../src/workflows/evented/types.ts","../src/storage/domains/workflows/base.ts","../src/storage/domains/workflows/inmemory.ts","../src/storage/domains/workspaces/base.ts","../src/storage/domains/workspaces/inmemory.ts","../src/storage/mock.ts","../src/storage/git-history.ts","../src/storage/filesystem-versioned.ts","../src/storage/domains/agents/filesystem.ts","../src/storage/domains/mcp-clients/filesystem.ts","../src/storage/domains/mcp-servers/filesystem.ts","../src/storage/domains/prompt-blocks/filesystem.ts","../src/storage/domains/scorer-definitions/filesystem.ts","../src/storage/domains/skills/filesystem.ts","../src/storage/domains/workspaces/filesystem.ts","../src/storage/filesystem-db.ts","../src/storage/filesystem.ts","../src/storage/domains/operations/base.ts","../src/storage/domains/operations/inmemory.ts"],"names":["MastraBase","resolve","MastraError","TABLE_SCHEMAS","TABLE_SCORERS","listTracesArgsSchema","toTraceSpans","listMetricsArgsSchema","bucketMap","costSummary","EntityType","listLogsArgsSchema","listScoresArgsSchema","listFeedbackArgsSchema","deepEqual","version","z","jsonSchemaToZod","MessageList","id","randomUUID","realpathSync","relative","execFile","existsSync","mkdirSync","join","readFileSync","dirname","writeFileSync","renameSync","sep","rmSync","readdirSync","statSync","TABLE_WORKFLOW_SNAPSHOT"],"mappings":"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","file":"chunk-KIG55OSO.cjs","sourcesContent":["import { MastraBase } from '../base';\n\nimport type {\n  AgentsStorage,\n  PromptBlocksStorage,\n  ScorerDefinitionsStorage,\n  MCPClientsStorage,\n  MCPServersStorage,\n  WorkspacesStorage,\n  SkillsStorage,\n  ScoresStorage,\n  WorkflowsStorage,\n  MemoryStorage,\n  ObservabilityStorage,\n  BlobStore,\n  DatasetsStorage,\n  ExperimentsStorage,\n} from './domains';\n\n/** Map of all storage domain interfaces available in a composite store. */\nexport type StorageDomains = {\n  workflows?: WorkflowsStorage;\n  scores?: ScoresStorage;\n  memory?: MemoryStorage;\n  observability?: ObservabilityStorage;\n  agents?: AgentsStorage;\n  datasets?: DatasetsStorage;\n  experiments?: ExperimentsStorage;\n  promptBlocks?: PromptBlocksStorage;\n  scorerDefinitions?: ScorerDefinitionsStorage;\n  mcpClients?: MCPClientsStorage;\n  mcpServers?: MCPServersStorage;\n  workspaces?: WorkspacesStorage;\n  skills?: SkillsStorage;\n  blobs?: BlobStore;\n};\n\n/**\n * Domain keys used by the Mastra Editor.\n * Used by the `editor` shorthand on MastraCompositeStoreConfig to route\n * all editor-related domains to a single store.\n */\nexport const EDITOR_DOMAINS = [\n  'agents',\n  'promptBlocks',\n  'scorerDefinitions',\n  'mcpClients',\n  'mcpServers',\n  'workspaces',\n  'skills',\n] as const satisfies ReadonlyArray<keyof StorageDomains>;\n\n/**\n * Normalizes perPage input for pagination queries.\n *\n * @param perPageInput - The raw perPage value from the user\n * @param defaultValue - The default perPage value to use when undefined (typically 40 for messages, 100 for threads)\n * @returns A numeric perPage value suitable for queries (false becomes MAX_SAFE_INTEGER)\n * @throws Error if perPage is a negative number\n */\nexport function normalizePerPage(perPageInput: number | false | undefined, defaultValue: number): number {\n  if (perPageInput === false) {\n    return Number.MAX_SAFE_INTEGER; // Get all results\n  } else if (perPageInput === 0) {\n    return 0; // Return zero results\n  } else if (typeof perPageInput === 'number' && perPageInput > 0) {\n    return perPageInput; // Valid positive number\n  } else if (typeof perPageInput === 'number' && perPageInput < 0) {\n    throw new Error('perPage must be >= 0');\n  }\n  // For undefined, use default\n  return defaultValue;\n}\n\n/**\n * Calculates pagination offset and prepares perPage value for response.\n * When perPage is false (fetch all), offset is always 0 regardless of page.\n *\n * @param page - The page number (0-indexed)\n * @param perPageInput - The original perPage input (number, false for all, or undefined)\n * @param normalizedPerPage - The normalized perPage value (from normalizePerPage)\n * @returns Object with offset for query and perPage for response\n */\nexport function calculatePagination(\n  page: number,\n  perPageInput: number | false | undefined,\n  normalizedPerPage: number,\n): { offset: number; perPage: number | false } {\n  return {\n    offset: perPageInput === false ? 0 : page * normalizedPerPage,\n    perPage: perPageInput === false ? false : normalizedPerPage,\n  };\n}\n\n/**\n * Configuration for individual domain overrides.\n * Each domain can be sourced from a different storage adapter.\n */\nexport type MastraStorageDomains = Partial<StorageDomains>;\n\n/**\n * Configuration options for MastraCompositeStore.\n *\n * Can be used in two ways:\n * 1. By store implementations: `{ id, name, disableInit? }` - stores set `this.stores` directly\n * 2. For composition: `{ id, default?, domains?, disableInit? }` - compose domains from multiple stores\n */\nexport interface MastraCompositeStoreConfig {\n  /**\n   * Unique identifier for this storage instance.\n   */\n  id: string;\n\n  /**\n   * Name of the storage adapter (used for logging).\n   * Required for store implementations extending MastraCompositeStore.\n   */\n  name?: string;\n\n  /**\n   * Default storage adapter to use for domains not explicitly specified.\n   * If provided, domains from this storage will be used as fallbacks.\n   */\n  default?: MastraCompositeStore;\n\n  /**\n   * Storage adapter for editor-related domains (agents, promptBlocks, scorerDefinitions,\n   * mcpClients, mcpServers, workspaces, skills).\n   *\n   * This is a shorthand that routes all editor domains to a single store instead of\n   * specifying each individually in `domains`. Useful for filesystem-based storage\n   * where editor configs are stored as JSON files in the repository.\n   *\n   * Priority: domains > editor > default\n   *\n   * @example\n   * ```typescript\n   * new MastraCompositeStore({\n   *   id: 'my-store',\n   *   default: postgresStore,\n   *   editor: filesystemStore,\n   * })\n   * ```\n   */\n  editor?: MastraCompositeStore;\n\n  /**\n   * Individual domain overrides. Each domain can come from a different storage adapter.\n   * These take precedence over both `editor` and `default` storage.\n   *\n   * @example\n   * ```typescript\n   * domains: {\n   *   memory: pgStore.stores?.memory,\n   *   workflows: libsqlStore.stores?.workflows,\n   * }\n   * ```\n   */\n  domains?: MastraStorageDomains;\n\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\n/**\n * Base class for all Mastra storage adapters.\n *\n * Can be used in two ways:\n *\n * 1. **Extended by store implementations** (PostgresStore, LibSQLStore, etc.):\n *    Store implementations extend this class and set `this.stores` with their domain implementations.\n *\n * 2. **Directly instantiated for composition**:\n *    Compose domains from multiple storage backends using `default` and `domains` options.\n *\n * All domain-specific operations should be accessed through `getStore()`:\n *\n * @example\n * ```typescript\n * // Composition: mix domains from different stores\n * const storage = new MastraCompositeStore({\n *   id: 'composite',\n *   default: pgStore,\n *   domains: {\n *     memory: libsqlStore.stores?.memory,\n *   },\n * });\n *\n * // Use `editor` shorthand to route all editor domains to a filesystem store\n * const storage2 = new MastraCompositeStore({\n *   id: 'with-fs-editor',\n *   default: pgStore,\n *   editor: filesystemStore,\n * });\n *\n * // Access domains\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n * ```\n */\nexport class MastraCompositeStore extends MastraBase {\n  protected hasInitialized: null | Promise<boolean> = null;\n  protected shouldCacheInit = true;\n\n  id: string;\n  stores?: StorageDomains;\n\n  /**\n   * When true, automatic initialization (table creation/migrations) is disabled.\n   */\n  disableInit: boolean = false;\n\n  constructor(config: MastraCompositeStoreConfig) {\n    const name = config.name ?? 'MastraCompositeStore';\n\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    super({\n      component: 'STORAGE',\n      name,\n    });\n\n    this.id = config.id;\n    this.disableInit = config.disableInit ?? false;\n\n    // If composition config is provided (default, editor, or domains), compose the stores\n    if (config.default || config.editor || config.domains) {\n      const defaultStores = config.default?.stores;\n      const editorStores = config.editor?.stores;\n      const domainOverrides = config.domains ?? {};\n\n      // Validate that at least one storage source is provided\n      const hasDefaultDomains = defaultStores && Object.values(defaultStores).some(v => v !== undefined);\n      const hasEditorDomains = editorStores && Object.values(editorStores).some(v => v !== undefined);\n      const hasOverrideDomains = Object.values(domainOverrides).some(v => v !== undefined);\n\n      if (!hasDefaultDomains && !hasEditorDomains && !hasOverrideDomains) {\n        throw new Error(\n          'MastraCompositeStore requires at least one storage source. Provide a default storage, an editor storage, or domain overrides.',\n        );\n      }\n\n      const editorDomainSet = new Set<string>(EDITOR_DOMAINS);\n\n      // Helper: resolve a domain with priority: domains > editor (for editor domains) > default\n      const resolve = <K extends keyof StorageDomains>(key: K): StorageDomains[K] | undefined => {\n        if (domainOverrides[key] !== undefined) return domainOverrides[key];\n        if (editorDomainSet.has(key) && editorStores?.[key] !== undefined) return editorStores[key];\n        return defaultStores?.[key];\n      };\n\n      // Build the composed stores object\n      this.stores = {\n        memory: resolve('memory'),\n        workflows: resolve('workflows'),\n        scores: resolve('scores'),\n        observability: resolve('observability'),\n        agents: resolve('agents'),\n        datasets: resolve('datasets'),\n        experiments: resolve('experiments'),\n        promptBlocks: resolve('promptBlocks'),\n        scorerDefinitions: resolve('scorerDefinitions'),\n        mcpClients: resolve('mcpClients'),\n        mcpServers: resolve('mcpServers'),\n        workspaces: resolve('workspaces'),\n        skills: resolve('skills'),\n        blobs: resolve('blobs'),\n      } as StorageDomains;\n    }\n    // Otherwise, subclasses set stores themselves\n  }\n\n  /**\n   * Get a domain-specific storage interface.\n   *\n   * @param storeName - The name of the domain to access ('memory', 'workflows', 'scores', 'observability', 'agents')\n   * @returns The domain storage interface, or undefined if not available\n   *\n   * @example\n   * ```typescript\n   * const memory = await storage.getStore('memory');\n   * if (memory) {\n   *   await memory.saveThread({ thread });\n   * }\n   * ```\n   */\n  async getStore<K extends keyof StorageDomains>(storeName: K): Promise<StorageDomains[K] | undefined> {\n    return this.stores?.[storeName];\n  }\n\n  /**\n   * Initialize all domain stores.\n   * This creates necessary tables, indexes, and performs any required migrations.\n   */\n  async init(): Promise<void> {\n    // to prevent race conditions, await any current init\n    if (this.shouldCacheInit && (await this.hasInitialized)) {\n      return;\n    }\n\n    // Initialize all domain stores\n    const initTasks: Promise<void>[] = [];\n\n    if (this.stores?.memory) {\n      initTasks.push(this.stores.memory.init());\n    }\n\n    if (this.stores?.workflows) {\n      initTasks.push(this.stores.workflows.init());\n    }\n\n    if (this.stores?.scores) {\n      initTasks.push(this.stores.scores.init());\n    }\n\n    if (this.stores?.observability) {\n      initTasks.push(this.stores.observability.init());\n    }\n\n    if (this.stores?.agents) {\n      initTasks.push(this.stores.agents.init());\n    }\n\n    if (this.stores?.datasets) {\n      initTasks.push(this.stores.datasets.init());\n    }\n\n    if (this.stores?.experiments) {\n      initTasks.push(this.stores.experiments.init());\n    }\n\n    if (this.stores?.promptBlocks) {\n      initTasks.push(this.stores.promptBlocks.init());\n    }\n\n    if (this.stores?.scorerDefinitions) {\n      initTasks.push(this.stores.scorerDefinitions.init());\n    }\n\n    if (this.stores?.mcpClients) {\n      initTasks.push(this.stores.mcpClients.init());\n    }\n\n    if (this.stores?.mcpServers) {\n      initTasks.push(this.stores.mcpServers.init());\n    }\n\n    if (this.stores?.workspaces) {\n      initTasks.push(this.stores.workspaces.init());\n    }\n\n    if (this.stores?.skills) {\n      initTasks.push(this.stores.skills.init());\n    }\n\n    if (this.stores?.blobs) {\n      initTasks.push(this.stores.blobs.init());\n    }\n\n    this.hasInitialized = Promise.all(initTasks).then(() => true);\n\n    await this.hasInitialized;\n  }\n}\n\n/**\n * @deprecated Use MastraCompositeStoreConfig instead. This alias will be removed in a future version.\n */\nexport interface MastraStorageConfig extends MastraCompositeStoreConfig {}\n\n/**\n * @deprecated Use MastraCompositeStore instead. This alias will be removed in a future version.\n */\nexport class MastraStorage extends MastraCompositeStore {}\n","import { MastraBase } from '../../base';\n\n/**\n * Base class for all storage domains.\n * Provides common interface for initialization and data clearing.\n */\nexport abstract class StorageDomain extends MastraBase {\n  /**\n   * Initialize the storage domain.\n   * This should create any necessary tables/collections.\n   * Default implementation is a no-op - override in adapters that need initialization.\n   */\n  async init(): Promise<void> {\n    // Default no-op - adapters override if they need to create tables/collections\n  }\n\n  /**\n   * Clears all data from this storage domain.\n   * This is a destructive operation - use with caution.\n   * Primarily used for testing.\n   */\n  abstract dangerouslyClearAll(): Promise<void>;\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport { StorageDomain } from '../base';\nimport type {\n  GetEntityTypesArgs,\n  GetEntityTypesResponse,\n  GetEntityNamesArgs,\n  GetEntityNamesResponse,\n  GetServiceNamesArgs,\n  GetServiceNamesResponse,\n  GetEnvironmentsArgs,\n  GetEnvironmentsResponse,\n  GetTagsArgs,\n  GetTagsResponse,\n  GetMetricNamesArgs,\n  GetMetricNamesResponse,\n  GetMetricLabelKeysArgs,\n  GetMetricLabelKeysResponse,\n  GetMetricLabelValuesArgs,\n  GetMetricLabelValuesResponse,\n} from './discovery';\nimport type {\n  BatchCreateFeedbackArgs,\n  CreateFeedbackArgs,\n  ListFeedbackArgs,\n  ListFeedbackResponse,\n  GetFeedbackAggregateArgs,\n  GetFeedbackAggregateResponse,\n  GetFeedbackBreakdownArgs,\n  GetFeedbackBreakdownResponse,\n  GetFeedbackTimeSeriesArgs,\n  GetFeedbackTimeSeriesResponse,\n  GetFeedbackPercentilesArgs,\n  GetFeedbackPercentilesResponse,\n} from './feedback';\nimport type { BatchCreateLogsArgs, ListLogsArgs, ListLogsResponse } from './logs';\nimport type {\n  BatchCreateMetricsArgs,\n  ListMetricsArgs,\n  ListMetricsResponse,\n  GetMetricAggregateArgs,\n  GetMetricAggregateResponse,\n  GetMetricBreakdownArgs,\n  GetMetricBreakdownResponse,\n  GetMetricTimeSeriesArgs,\n  GetMetricTimeSeriesResponse,\n  GetMetricPercentilesArgs,\n  GetMetricPercentilesResponse,\n} from './metrics';\nimport type {\n  BatchCreateScoresArgs,\n  CreateScoreArgs,\n  ListScoresArgs,\n  ListScoresResponse,\n  GetScoreAggregateArgs,\n  GetScoreAggregateResponse,\n  GetScoreBreakdownArgs,\n  GetScoreBreakdownResponse,\n  GetScoreTimeSeriesArgs,\n  GetScoreTimeSeriesResponse,\n  GetScorePercentilesArgs,\n  GetScorePercentilesResponse,\n} from './scores';\nimport type {\n  BatchCreateSpansArgs,\n  BatchDeleteTracesArgs,\n  BatchUpdateSpansArgs,\n  CreateSpanArgs,\n  GetRootSpanArgs,\n  GetRootSpanResponse,\n  GetSpanArgs,\n  GetSpanResponse,\n  GetTraceArgs,\n  GetTraceResponse,\n  ListTracesArgs,\n  ListTracesResponse,\n  UpdateSpanArgs,\n} from './tracing';\nimport type { ObservabilityStorageStrategy, TracingStorageStrategy } from './types';\n\n/**\n * Base storage class for observability data (traces, metrics, logs, scores, feedback).\n * Not abstract -- provides default implementations that throw \"not implemented\" errors.\n * Storage adapters override only the methods they support.\n */\nexport class ObservabilityStorage extends StorageDomain {\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'OBSERVABILITY',\n    });\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    // Default no-op - subclasses override\n  }\n\n  /**\n   * Provides hints for tracing strategy selection by the DefaultExporter.\n   * Storage adapters can override this to specify their preferred and supported strategies.\n   */\n  public get observabilityStrategy(): {\n    preferred: ObservabilityStorageStrategy;\n    supported: ObservabilityStorageStrategy[];\n  } {\n    return {\n      preferred: 'batch-with-updates', // Default for most SQL stores\n      supported: ['realtime', 'batch-with-updates', 'insert-only'],\n    };\n  }\n\n  /**\n   * Provides hints for tracing strategy selection by the DefaultExporter.\n   * Storage adapters can override this to specify their preferred and supported strategies.\n   * @deprecated Use {@link observabilityStrategy} instead.\n   * @see {@link observabilityStrategy} for the replacement property.\n   */\n  public get tracingStrategy(): {\n    preferred: TracingStorageStrategy;\n    supported: TracingStorageStrategy[];\n  } {\n    return this.observabilityStrategy;\n  }\n\n  /**\n   * Creates a single Span record in the storage provider.\n   */\n  async createSpan(_args: CreateSpanArgs): Promise<void> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_CREATE_SPAN_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support creating spans',\n    });\n  }\n\n  /**\n   * Updates a single Span with partial data. Primarily used for realtime trace creation.\n   *\n   * @deprecated This method only works with stores that support span updates,\n   * It will be removed in the future. Instead try to add all data to a span before\n   * ending it.\n   */\n  async updateSpan(_args: UpdateSpanArgs): Promise<void> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_UPDATE_SPAN_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support updating spans',\n    });\n  }\n\n  /**\n   * Retrieves a single span.\n   */\n  async getSpan(_args: GetSpanArgs): Promise<GetSpanResponse | null> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_SPAN_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support getting spans',\n    });\n  }\n\n  /**\n   * Retrieves a single root span.\n   */\n  async getRootSpan(_args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_ROOT_SPAN_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support getting root spans',\n    });\n  }\n\n  /**\n   * Retrieves a single trace with all its associated spans.\n   */\n  async getTrace(_args: GetTraceArgs): Promise<GetTraceResponse | null> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_TRACE_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support getting traces',\n    });\n  }\n\n  /**\n   * Retrieves a list of traces with optional filtering.\n   */\n  async listTraces(_args: ListTracesArgs): Promise<ListTracesResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_LIST_TRACES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support listing traces',\n    });\n  }\n\n  /**\n   * Creates multiple Spans in a single batch.\n   */\n  async batchCreateSpans(_args: BatchCreateSpansArgs): Promise<void> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_SPAN_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support batch creating spans',\n    });\n  }\n\n  /**\n   * Updates multiple Spans in a single batch.\n   */\n  async batchUpdateSpans(_args: BatchUpdateSpansArgs): Promise<void> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_BATCH_UPDATE_SPANS_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support batch updating spans',\n    });\n  }\n\n  /**\n   * Deletes multiple traces and all their associated spans in a single batch operation.\n   */\n  async batchDeleteTraces(_args: BatchDeleteTracesArgs): Promise<void> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_BATCH_DELETE_TRACES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support batch deleting traces',\n    });\n  }\n\n  // ============================================================================\n  // Logs\n  // ============================================================================\n\n  /**\n   * Creates multiple log records in a single batch.\n   */\n  async batchCreateLogs(_args: BatchCreateLogsArgs): Promise<void> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_LOGS_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support batch creating logs',\n    });\n  }\n\n  /**\n   * Retrieves a list of logs with optional filtering.\n   */\n  async listLogs(_args: ListLogsArgs): Promise<ListLogsResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_LIST_LOGS_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support listing logs',\n    });\n  }\n\n  // ============================================================================\n  // Metrics\n  // ============================================================================\n\n  /**\n   * Creates multiple metric observations in a single batch.\n   */\n  async batchCreateMetrics(_args: BatchCreateMetricsArgs): Promise<void> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_METRICS_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support batch creating metrics',\n    });\n  }\n\n  async listMetrics(_args: ListMetricsArgs): Promise<ListMetricsResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_LIST_METRICS_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support listing metrics',\n    });\n  }\n\n  async getMetricAggregate(_args: GetMetricAggregateArgs): Promise<GetMetricAggregateResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_METRIC_AGGREGATE_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support metric aggregation',\n    });\n  }\n\n  async getMetricBreakdown(_args: GetMetricBreakdownArgs): Promise<GetMetricBreakdownResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_METRIC_BREAKDOWN_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support metric breakdown',\n    });\n  }\n\n  async getMetricTimeSeries(_args: GetMetricTimeSeriesArgs): Promise<GetMetricTimeSeriesResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_METRIC_TIME_SERIES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support metric time series',\n    });\n  }\n\n  async getMetricPercentiles(_args: GetMetricPercentilesArgs): Promise<GetMetricPercentilesResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_METRIC_PERCENTILES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support metric percentiles',\n    });\n  }\n\n  // ============================================================================\n  // Discovery / Metadata Methods\n  // ============================================================================\n\n  async getMetricNames(_args: GetMetricNamesArgs): Promise<GetMetricNamesResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_METRIC_NAMES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support metric name discovery',\n    });\n  }\n\n  async getMetricLabelKeys(_args: GetMetricLabelKeysArgs): Promise<GetMetricLabelKeysResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_METRIC_LABEL_KEYS_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support metric label key discovery',\n    });\n  }\n\n  async getMetricLabelValues(_args: GetMetricLabelValuesArgs): Promise<GetMetricLabelValuesResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_LABEL_VALUES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support label value discovery',\n    });\n  }\n\n  async getEntityTypes(_args: GetEntityTypesArgs): Promise<GetEntityTypesResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_ENTITY_TYPES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support entity type discovery',\n    });\n  }\n\n  async getEntityNames(_args: GetEntityNamesArgs): Promise<GetEntityNamesResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_ENTITY_NAMES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support entity name discovery',\n    });\n  }\n\n  async getServiceNames(_args: GetServiceNamesArgs): Promise<GetServiceNamesResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_SERVICE_NAMES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support service name discovery',\n    });\n  }\n\n  async getEnvironments(_args: GetEnvironmentsArgs): Promise<GetEnvironmentsResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_ENVIRONMENTS_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support environment discovery',\n    });\n  }\n\n  async getTags(_args: GetTagsArgs): Promise<GetTagsResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_TAGS_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support tag discovery',\n    });\n  }\n\n  // ============================================================================\n  // Scores\n  // ============================================================================\n\n  /**\n   * Creates a single score record.\n   */\n  async createScore(_args: CreateScoreArgs): Promise<void> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_CREATE_SCORE_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support creating scores',\n    });\n  }\n\n  /**\n   * Creates multiple score observations in a single batch.\n   */\n  async batchCreateScores(_args: BatchCreateScoresArgs): Promise<void> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_SCORES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support batch creating scores',\n    });\n  }\n\n  /**\n   * Retrieves a list of scores with optional filtering.\n   */\n  async listScores(_args: ListScoresArgs): Promise<ListScoresResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_LIST_SCORES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support listing scores',\n    });\n  }\n\n  async getScoreAggregate(_args: GetScoreAggregateArgs): Promise<GetScoreAggregateResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_SCORE_AGGREGATE_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support score aggregation',\n    });\n  }\n\n  async getScoreBreakdown(_args: GetScoreBreakdownArgs): Promise<GetScoreBreakdownResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_SCORE_BREAKDOWN_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support score breakdown',\n    });\n  }\n\n  async getScoreTimeSeries(_args: GetScoreTimeSeriesArgs): Promise<GetScoreTimeSeriesResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_SCORE_TIME_SERIES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support score time series',\n    });\n  }\n\n  async getScorePercentiles(_args: GetScorePercentilesArgs): Promise<GetScorePercentilesResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_SCORE_PERCENTILES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support score percentiles',\n    });\n  }\n\n  // ============================================================================\n  // Feedback\n  // ============================================================================\n\n  /**\n   * Creates a single feedback record.\n   */\n  async createFeedback(_args: CreateFeedbackArgs): Promise<void> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_CREATE_FEEDBACK_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support creating feedback',\n    });\n  }\n\n  /**\n   * Creates multiple feedback observations in a single batch.\n   */\n  async batchCreateFeedback(_args: BatchCreateFeedbackArgs): Promise<void> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_FEEDBACK_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support batch creating feedback',\n    });\n  }\n\n  /**\n   * Retrieves a list of feedback with optional filtering.\n   */\n  async listFeedback(_args: ListFeedbackArgs): Promise<ListFeedbackResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_LIST_FEEDBACK_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support listing feedback',\n    });\n  }\n\n  async getFeedbackAggregate(_args: GetFeedbackAggregateArgs): Promise<GetFeedbackAggregateResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_FEEDBACK_AGGREGATE_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support feedback aggregation',\n    });\n  }\n\n  async getFeedbackBreakdown(_args: GetFeedbackBreakdownArgs): Promise<GetFeedbackBreakdownResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_FEEDBACK_BREAKDOWN_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support feedback breakdown',\n    });\n  }\n\n  async getFeedbackTimeSeries(_args: GetFeedbackTimeSeriesArgs): Promise<GetFeedbackTimeSeriesResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_FEEDBACK_TIME_SERIES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support feedback time series',\n    });\n  }\n\n  async getFeedbackPercentiles(_args: GetFeedbackPercentilesArgs): Promise<GetFeedbackPercentilesResponse> {\n    throw new MastraError({\n      id: 'OBSERVABILITY_STORAGE_GET_FEEDBACK_PERCENTILES_NOT_IMPLEMENTED',\n      domain: ErrorDomain.MASTRA_OBSERVABILITY,\n      category: ErrorCategory.SYSTEM,\n      text: 'This storage provider does not support feedback percentiles',\n    });\n  }\n}\n","import type { ScoreRowData } from '../evals/types';\nimport { TABLE_SCHEMAS, TABLE_SCORERS } from './constants';\nimport type { TABLE_NAMES } from './constants';\nimport type { StorageColumn } from './types';\n\n/**\n * Canonical store names for type safety.\n * Provides autocomplete suggestions while still accepting any string.\n */\nexport type StoreName =\n  | 'PG'\n  | 'MSSQL'\n  | 'LIBSQL'\n  | 'MONGODB'\n  | 'CLICKHOUSE'\n  | 'CLOUDFLARE'\n  | 'CLOUDFLARE_D1'\n  | 'DYNAMODB'\n  | 'LANCE'\n  | 'UPSTASH'\n  | 'ASTRA'\n  | 'CHROMA'\n  | 'COUCHBASE'\n  | 'OPENSEARCH'\n  | 'PINECONE'\n  | 'QDRANT'\n  | 'S3'\n  | 'TURBOPUFFER'\n  | 'VECTORIZE'\n  | (string & {});\n\nexport function safelyParseJSON(input: any): any {\n  // If already an object (and not null), return as-is\n  if (input && typeof input === 'object') return input;\n  if (input == null) return {};\n  // If it's a string, try to parse\n  if (typeof input === 'string') {\n    try {\n      return JSON.parse(input);\n    } catch {\n      return input;\n    }\n  }\n  // For anything else (number, boolean, etc.), return empty object\n  return {};\n}\n\n/**\n * Options for transforming storage rows\n */\nexport interface TransformRowOptions {\n  /**\n   * Preferred source fields for timestamps (e.g., { createdAt: 'createdAtZ' } means use createdAtZ if available, else createdAt)\n   */\n  preferredTimestampFields?: Record<string, string>;\n\n  /**\n   * Convert timestamp strings to Date objects (default: false for backwards compatibility)\n   */\n  convertTimestamps?: boolean;\n\n  /**\n   * Pattern to treat as null (e.g., '_null_' for ClickHouse)\n   */\n  nullValuePattern?: string;\n\n  /**\n   * Custom field mappings from source to target (e.g., { entity: 'entityData' } for DynamoDB)\n   */\n  fieldMappings?: Record<string, string>;\n}\n\n/**\n * Generic schema-driven row transformer.\n * Uses TABLE_SCHEMAS to determine field types and apply appropriate transformations:\n * - 'jsonb' fields: parsed from JSON strings using safelyParseJSON\n * - 'timestamp' fields: optionally converted to Date objects\n *\n * @param row - The raw row from storage\n * @param tableName - The table name to look up schema from TABLE_SCHEMAS\n * @param options - Optional configuration for store-specific behavior\n * @returns Transformed row with proper types\n */\nexport function transformRow<T = Record<string, any>>(\n  row: Record<string, any>,\n  tableName: TABLE_NAMES,\n  options: TransformRowOptions = {},\n): T {\n  const { preferredTimestampFields = {}, convertTimestamps = false, nullValuePattern, fieldMappings = {} } = options;\n\n  const tableSchema = TABLE_SCHEMAS[tableName];\n  const result: Record<string, any> = {};\n\n  for (const [key, columnSchema] of Object.entries(tableSchema)) {\n    // Handle field mappings (e.g., entityData -> entity for DynamoDB)\n    const sourceKey = fieldMappings[key] ?? key;\n    let value = row[sourceKey];\n\n    // Handle preferred timestamp sources (e.g., use createdAtZ if available, else createdAt)\n    if (preferredTimestampFields[key]) {\n      value = row[preferredTimestampFields[key]] ?? value;\n    }\n\n    // Skip null/undefined values\n    if (value === undefined || value === null) {\n      continue;\n    }\n\n    // Skip null pattern values (e.g., ClickHouse's '_null_')\n    if (nullValuePattern && value === nullValuePattern) {\n      continue;\n    }\n\n    // Transform based on column type\n    if (columnSchema.type === 'jsonb') {\n      if (typeof value === 'string') {\n        result[key] = safelyParseJSON(value);\n      } else if (typeof value === 'object') {\n        result[key] = value; // Already parsed\n      } else {\n        result[key] = value;\n      }\n    } else if (columnSchema.type === 'timestamp' && convertTimestamps && typeof value === 'string') {\n      result[key] = new Date(value);\n    } else {\n      result[key] = value;\n    }\n  }\n\n  return result as T;\n}\n\n/**\n * Transform a raw score row from storage to ScoreRowData.\n * Convenience wrapper around transformRow for the scores table (TABLE_SCORERS).\n *\n * @param row - The raw row from storage\n * @param options - Optional configuration for store-specific behavior\n * @returns Transformed ScoreRowData\n */\nexport function transformScoreRow(row: Record<string, any>, options: TransformRowOptions = {}): ScoreRowData {\n  return transformRow<ScoreRowData>(row, TABLE_SCORERS, options);\n}\n\n/**\n * Converts a string to UPPER_SNAKE_CASE, preserving word boundaries from camelCase, PascalCase, kebab-case, etc.\n */\nfunction toUpperSnakeCase(str: string): string {\n  return (\n    str\n      // Insert underscore before uppercase letters that follow lowercase letters (camelCase -> camel_Case)\n      .replace(/([a-z])([A-Z])/g, '$1_$2')\n      // Insert underscore before uppercase letters that are followed by lowercase letters (XMLParser -> XML_Parser)\n      .replace(/([A-Z])([A-Z][a-z])/g, '$1_$2')\n      // Convert to uppercase\n      .toUpperCase()\n      // Replace any non-alphanumeric characters with underscore\n      .replace(/[^A-Z0-9]+/g, '_')\n      // Remove leading/trailing underscores\n      .replace(/^_+|_+$/g, '')\n  );\n}\n\n/**\n * Generates a standardized error ID for storage and vector operations.\n *\n * Formats:\n * - Storage: MASTRA_STORAGE_{STORE}_{OPERATION}_{STATUS}\n * - Vector:  MASTRA_VECTOR_{STORE}_{OPERATION}_{STATUS}\n *\n * This function auto-normalizes inputs to UPPER_SNAKE_CASE for flexibility.\n * The store parameter is type-checked against canonical store names for IDE autocomplete.\n *\n * @param type - The operation type ('storage' or 'vector')\n * @param store - The store adapter name (type-checked canonical names)\n * @param operation - The operation that failed (e.g., 'LIST_THREADS_BY_RESOURCE_ID', 'QUERY')\n * @param status - The status/error type (e.g., 'FAILED', 'INVALID_THREAD_ID', 'DUPLICATE_KEY')\n *\n * @example\n * ```ts\n * // Storage operations\n * createStoreErrorId('storage', 'PG', 'LIST_THREADS', 'FAILED')\n * // Returns: 'MASTRA_STORAGE_PG_LIST_THREADS_FAILED'\n *\n * // Vector operations\n * createStoreErrorId('vector', 'CHROMA', 'QUERY', 'FAILED')\n * // Returns: 'MASTRA_VECTOR_CHROMA_QUERY_FAILED'\n *\n * // Auto-normalizes any casing\n * createStoreErrorId('storage', 'PG', 'listMessagesById', 'failed')\n * // Returns: 'MASTRA_STORAGE_PG_LIST_MESSAGES_BY_ID_FAILED'\n * ```\n */\nexport function createStoreErrorId(\n  type: 'storage' | 'vector',\n  store: StoreName,\n  operation: string,\n  status: string,\n): Uppercase<string> {\n  const normalizedStore = toUpperSnakeCase(store);\n  const normalizedOperation = toUpperSnakeCase(operation);\n  const normalizedStatus = toUpperSnakeCase(status);\n  const typePrefix = type === 'storage' ? 'STORAGE' : 'VECTOR';\n\n  return `MASTRA_${typePrefix}_${normalizedStore}_${normalizedOperation}_${normalizedStatus}` as Uppercase<string>;\n}\n\nexport function createStorageErrorId(store: StoreName, operation: string, status: string): Uppercase<string> {\n  return createStoreErrorId('storage', store, operation, status);\n}\n\nexport function createVectorErrorId(store: StoreName, operation: string, status: string): Uppercase<string> {\n  return createStoreErrorId('vector', store, operation, status);\n}\n\nexport function getSqlType(type: StorageColumn['type']): string {\n  switch (type) {\n    case 'text':\n      return 'TEXT';\n    case 'timestamp':\n      return 'TIMESTAMP';\n    case 'float':\n      return 'FLOAT';\n    case 'integer':\n      return 'INTEGER';\n    case 'bigint':\n      return 'BIGINT';\n    case 'jsonb':\n      return 'JSONB';\n    case 'boolean':\n      return 'BOOLEAN';\n    default:\n      return 'TEXT';\n  }\n}\n\nexport function getDefaultValue(type: StorageColumn['type']): string {\n  switch (type) {\n    case 'text':\n    case 'uuid':\n      return \"DEFAULT ''\";\n    case 'timestamp':\n      return \"DEFAULT '1970-01-01 00:00:00'\";\n    case 'integer':\n    case 'bigint':\n    case 'float':\n      return 'DEFAULT 0';\n    case 'jsonb':\n      return \"DEFAULT '{}'\";\n    case 'boolean':\n      return 'DEFAULT FALSE';\n    default:\n      return \"DEFAULT ''\";\n  }\n}\n\nexport function ensureDate(date: Date | string | undefined): Date | undefined {\n  if (!date) return undefined;\n  return date instanceof Date ? date : new Date(date);\n}\n\nexport function serializeDate(date: Date | string | undefined): string | undefined {\n  if (!date) return undefined;\n  const dateObj = ensureDate(date);\n  return dateObj?.toISOString();\n}\n\n/**\n * Date range filter configuration for in-memory filtering operations.\n */\nexport interface DateRangeFilter {\n  start?: Date | string;\n  end?: Date | string;\n  startExclusive?: boolean;\n  endExclusive?: boolean;\n}\n\n/**\n * Filter an array of items by date range. Used by in-memory storage adapters.\n *\n * This provides a consistent implementation of date range filtering with\n * support for inclusive/exclusive bounds across all storage adapters.\n *\n * @param items - Array of items to filter\n * @param getCreatedAt - Function to extract the createdAt date from an item\n * @param dateRange - Optional date range filter configuration\n * @returns Filtered array of items\n *\n * @example\n * ```ts\n * const filtered = filterByDateRange(\n *   messages,\n *   (msg) => new Date(msg.createdAt),\n *   { start: new Date('2024-01-01'), startExclusive: true }\n * );\n * ```\n */\nexport function filterByDateRange<T>(items: T[], getCreatedAt: (item: T) => Date, dateRange?: DateRangeFilter): T[] {\n  if (!dateRange) return items;\n\n  let result = items;\n\n  if (dateRange.start) {\n    const startTime = ensureDate(dateRange.start)!.getTime();\n    result = result.filter(item => {\n      const itemTime = getCreatedAt(item).getTime();\n      return dateRange.startExclusive ? itemTime > startTime : itemTime >= startTime;\n    });\n  }\n\n  if (dateRange.end) {\n    const endTime = ensureDate(dateRange.end)!.getTime();\n    result = result.filter(item => {\n      const itemTime = getCreatedAt(item).getTime();\n      return dateRange.endExclusive ? itemTime < endTime : itemTime <= endTime;\n    });\n  }\n\n  return result;\n}\n\n/**\n * Deep equality check for JSON values.\n * Compares primitives, arrays, objects, and Date instances recursively.\n *\n * @param a - First value to compare\n * @param b - Second value to compare\n * @returns true if values are deeply equal, false otherwise\n */\nexport function jsonValueEquals(a: unknown, b: unknown): boolean {\n  if (a === undefined || b === undefined) {\n    return a === b;\n  }\n  if (a === null || b === null) {\n    return a === b;\n  }\n  if (typeof a !== typeof b) {\n    return false;\n  }\n  // Handle Date objects\n  if (a instanceof Date && b instanceof Date) {\n    return a.getTime() === b.getTime();\n  }\n  if (a instanceof Date || b instanceof Date) {\n    return false; // One is Date, other is not\n  }\n  if (typeof a === 'object') {\n    if (Array.isArray(a) && Array.isArray(b)) {\n      if (a.length !== b.length) return false;\n      return a.every((val, i) => jsonValueEquals(val, b[i]));\n    }\n    if (Array.isArray(a) || Array.isArray(b)) {\n      return false;\n    }\n    const aKeys = Object.keys(a as object);\n    const bKeys = Object.keys(b as object);\n    if (aKeys.length !== bKeys.length) return false;\n    return aKeys.every(key =>\n      jsonValueEquals((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]),\n    );\n  }\n  return a === b;\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport { EntityType } from '../../../observability';\nimport { jsonValueEquals } from '../../utils';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { ObservabilityStorage } from './base';\nimport type {\n  GetEntityTypesArgs,\n  GetEntityTypesResponse,\n  GetEntityNamesArgs,\n  GetEntityNamesResponse,\n  GetServiceNamesArgs,\n  GetServiceNamesResponse,\n  GetEnvironmentsArgs,\n  GetEnvironmentsResponse,\n  GetTagsArgs,\n  GetTagsResponse,\n  GetMetricNamesArgs,\n  GetMetricNamesResponse,\n  GetMetricLabelKeysArgs,\n  GetMetricLabelKeysResponse,\n  GetMetricLabelValuesArgs,\n  GetMetricLabelValuesResponse,\n} from './discovery';\nimport { listFeedbackArgsSchema } from './feedback';\nimport type {\n  BatchCreateFeedbackArgs,\n  CreateFeedbackArgs,\n  FeedbackFilter,\n  GetFeedbackAggregateArgs,\n  GetFeedbackAggregateResponse,\n  GetFeedbackBreakdownArgs,\n  GetFeedbackBreakdownResponse,\n  GetFeedbackPercentilesArgs,\n  GetFeedbackPercentilesResponse,\n  GetFeedbackTimeSeriesArgs,\n  GetFeedbackTimeSeriesResponse,\n  ListFeedbackArgs,\n  ListFeedbackResponse,\n  FeedbackRecord,\n} from './feedback';\nimport { listLogsArgsSchema } from './logs';\nimport type { BatchCreateLogsArgs, ListLogsArgs, ListLogsResponse, LogRecord } from './logs';\nimport type {\n  BatchCreateMetricsArgs,\n  MetricRecord,\n  ListMetricsArgs,\n  ListMetricsResponse,\n  GetMetricAggregateArgs,\n  GetMetricAggregateResponse,\n  GetMetricBreakdownArgs,\n  GetMetricBreakdownResponse,\n  GetMetricTimeSeriesArgs,\n  GetMetricTimeSeriesResponse,\n  GetMetricPercentilesArgs,\n  GetMetricPercentilesResponse,\n  AggregationType,\n} from './metrics';\nimport { listMetricsArgsSchema } from './metrics';\nimport { listScoresArgsSchema } from './scores';\nimport type {\n  BatchCreateScoresArgs,\n  CreateScoreArgs,\n  GetScoreAggregateArgs,\n  GetScoreAggregateResponse,\n  GetScoreBreakdownArgs,\n  GetScoreBreakdownResponse,\n  GetScorePercentilesArgs,\n  GetScorePercentilesResponse,\n  GetScoreTimeSeriesArgs,\n  GetScoreTimeSeriesResponse,\n  ListScoresArgs,\n  ListScoresResponse,\n  ScoreRecord,\n} from './scores';\nimport type {\n  BatchCreateSpansArgs,\n  BatchDeleteTracesArgs,\n  BatchUpdateSpansArgs,\n  CreateSpanArgs,\n  CreateSpanRecord,\n  GetRootSpanArgs,\n  GetRootSpanResponse,\n  GetSpanArgs,\n  GetSpanResponse,\n  GetTraceArgs,\n  GetTraceResponse,\n  ListTracesArgs,\n  ListTracesResponse,\n  SpanRecord,\n  UpdateSpanArgs,\n} from './tracing';\n\nimport { listTracesArgsSchema, TraceStatus, toTraceSpans } from './tracing';\n\n/**\n * Internal structure for storing a trace with computed properties for efficient filtering\n */\nexport interface TraceEntry {\n  /** All spans in this trace, keyed by spanId */\n  spans: Record<string, SpanRecord>;\n  /** Root span for this trace (parentSpanId === null) */\n  rootSpan: SpanRecord | null;\n  /** Computed trace status based on root span state */\n  status: TraceStatus;\n  /** True if any span in the trace has an error */\n  hasChildError: boolean;\n}\n\n/** In-memory implementation of ObservabilityStorage for testing and development. */\nexport class ObservabilityInMemory extends ObservabilityStorage {\n  private db: InMemoryDB;\n\n  constructor({ db }: { db: InMemoryDB }) {\n    super();\n    this.db = db;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.db.traces.clear();\n    this.db.metricRecords.length = 0;\n    this.db.logRecords.length = 0;\n    this.db.scoreRecords.length = 0;\n    this.db.feedbackRecords.length = 0;\n  }\n\n  async createSpan(args: CreateSpanArgs): Promise<void> {\n    const { span } = args;\n    this.validateCreateSpan(span);\n    const now = new Date();\n    const record: SpanRecord = {\n      ...span,\n      createdAt: now,\n      updatedAt: now,\n    };\n\n    this.upsertSpanToTrace(record);\n  }\n\n  async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n    const now = new Date();\n    for (const span of args.records) {\n      this.validateCreateSpan(span);\n      const record: SpanRecord = {\n        ...span,\n        createdAt: now,\n        updatedAt: now,\n      };\n      this.upsertSpanToTrace(record);\n    }\n  }\n\n  private validateCreateSpan(record: CreateSpanRecord): void {\n    if (!record.spanId) {\n      throw new MastraError({\n        id: 'OBSERVABILITY_SPAN_ID_REQUIRED',\n        domain: ErrorDomain.MASTRA_OBSERVABILITY,\n        category: ErrorCategory.SYSTEM,\n        text: 'Span ID is required for creating a span',\n      });\n    }\n\n    if (!record.traceId) {\n      throw new MastraError({\n        id: 'OBSERVABILITY_TRACE_ID_REQUIRED',\n        domain: ErrorDomain.MASTRA_OBSERVABILITY,\n        category: ErrorCategory.SYSTEM,\n        text: 'Trace ID is required for creating a span',\n      });\n    }\n  }\n\n  /**\n   * Inserts or updates a span in the trace and recomputes trace-level properties\n   */\n  private upsertSpanToTrace(span: SpanRecord): void {\n    const { traceId, spanId } = span;\n    let traceEntry = this.db.traces.get(traceId);\n\n    if (!traceEntry) {\n      traceEntry = {\n        spans: {},\n        rootSpan: null,\n        status: TraceStatus.RUNNING,\n        hasChildError: false,\n      };\n      this.db.traces.set(traceId, traceEntry);\n    }\n\n    traceEntry.spans[spanId] = span;\n\n    // Update root span if this is a root span\n    if (span.parentSpanId == null) {\n      traceEntry.rootSpan = span;\n    }\n\n    this.recomputeTraceProperties(traceEntry);\n  }\n\n  /**\n   * Recomputes derived trace properties from all spans\n   */\n  private recomputeTraceProperties(traceEntry: TraceEntry): void {\n    const spans = Object.values(traceEntry.spans);\n    if (spans.length === 0) return;\n\n    // Compute hasChildError (use != null to catch both null and undefined)\n    traceEntry.hasChildError = spans.some(s => s.error != null);\n\n    // Compute status from root span\n    const rootSpan = traceEntry.rootSpan;\n    if (rootSpan) {\n      if (rootSpan.error != null) {\n        traceEntry.status = TraceStatus.ERROR;\n      } else if (rootSpan.endedAt == null) {\n        traceEntry.status = TraceStatus.RUNNING;\n      } else {\n        traceEntry.status = TraceStatus.SUCCESS;\n      }\n    } else {\n      // No root span yet, consider it running\n      traceEntry.status = TraceStatus.RUNNING;\n    }\n  }\n\n  async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n    const { traceId, spanId } = args;\n    const traceEntry = this.db.traces.get(traceId);\n    if (!traceEntry) {\n      return null;\n    }\n\n    const span = traceEntry.spans[spanId];\n    if (!span) {\n      return null;\n    }\n\n    return { span };\n  }\n\n  async getRootSpan(args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n    const { traceId } = args;\n    const traceEntry = this.db.traces.get(traceId);\n    if (!traceEntry || !traceEntry.rootSpan) {\n      return null;\n    }\n\n    return { span: traceEntry.rootSpan };\n  }\n\n  async getTrace(args: GetTraceArgs): Promise<GetTraceResponse | null> {\n    const { traceId } = args;\n    const traceEntry = this.db.traces.get(traceId);\n    if (!traceEntry) {\n      return null;\n    }\n\n    const spans = Object.values(traceEntry.spans);\n    if (spans.length === 0) {\n      return null;\n    }\n\n    // Sort spans by startedAt\n    spans.sort((a, b) => a.startedAt.getTime() - b.startedAt.getTime());\n\n    return {\n      traceId,\n      spans,\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\n    // Collect all traces that match filters\n    const matchingRootSpans: SpanRecord[] = [];\n\n    for (const [, traceEntry] of this.db.traces) {\n      if (!traceEntry.rootSpan) continue;\n\n      if (this.traceMatchesFilters(traceEntry, filters)) {\n        matchingRootSpans.push(traceEntry.rootSpan);\n      }\n    }\n\n    // Sort by orderBy field\n    const { field: sortField, direction: sortDirection } = orderBy;\n\n    matchingRootSpans.sort((a, b) => {\n      if (sortField === 'endedAt') {\n        const aVal = a.endedAt;\n        const bVal = b.endedAt;\n\n        // Handle nullish values (running spans with null 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        if (aVal == null && bVal == null) return 0;\n        if (aVal == null) return sortDirection === 'DESC' ? -1 : 1;\n        if (bVal == null) return sortDirection === 'DESC' ? 1 : -1;\n\n        const diff = aVal.getTime() - bVal.getTime();\n        return sortDirection === 'DESC' ? -diff : diff;\n      } else {\n        // startedAt is never null (required field)\n        const diff = a.startedAt.getTime() - b.startedAt.getTime();\n        return sortDirection === 'DESC' ? -diff : diff;\n      }\n    });\n\n    // Apply pagination\n    const total = matchingRootSpans.length;\n    const { page, perPage } = pagination;\n    const start = page * perPage;\n    const end = start + perPage;\n\n    const paged = matchingRootSpans.slice(start, end);\n\n    return {\n      spans: toTraceSpans(paged),\n      pagination: { total, page, perPage, hasMore: end < total },\n    };\n  }\n\n  /**\n   * Check if a trace matches all provided filters\n   */\n  private traceMatchesFilters(traceEntry: TraceEntry, filters: ListTracesArgs['filters']): boolean {\n    if (!filters) return true;\n\n    const rootSpan = traceEntry.rootSpan;\n    if (!rootSpan) return false;\n\n    // Date range filters on startedAt (based on root span)\n    if (filters.startedAt) {\n      if (filters.startedAt.start && rootSpan.startedAt < filters.startedAt.start) {\n        return false;\n      }\n      if (filters.startedAt.end && rootSpan.startedAt > filters.startedAt.end) {\n        return false;\n      }\n    }\n\n    // Date range filters on endedAt (based on root span)\n    if (filters.endedAt) {\n      // If root span is still running (endedAt is nullish), it doesn't match endedAt filters\n      if (rootSpan.endedAt == null) {\n        return false;\n      }\n      if (filters.endedAt.start && rootSpan.endedAt < filters.endedAt.start) {\n        return false;\n      }\n      if (filters.endedAt.end && rootSpan.endedAt > filters.endedAt.end) {\n        return false;\n      }\n    }\n\n    // Span type filter (on root span)\n    if (filters.spanType !== undefined && rootSpan.spanType !== filters.spanType) {\n      return false;\n    }\n\n    // Entity filters\n    if (filters.entityType !== undefined && rootSpan.entityType !== filters.entityType) {\n      return false;\n    }\n    if (filters.entityId !== undefined && rootSpan.entityId !== filters.entityId) {\n      return false;\n    }\n    if (filters.entityName !== undefined && rootSpan.entityName !== filters.entityName) {\n      return false;\n    }\n    if (filters.entityVersionId !== undefined && rootSpan.entityVersionId !== filters.entityVersionId) {\n      return false;\n    }\n\n    // Experimentation\n    if (filters.experimentId !== undefined && rootSpan.experimentId !== filters.experimentId) {\n      return false;\n    }\n\n    // Identity & Tenancy filters\n    if (filters.userId !== undefined && rootSpan.userId !== filters.userId) {\n      return false;\n    }\n    if (filters.organizationId !== undefined && rootSpan.organizationId !== filters.organizationId) {\n      return false;\n    }\n    if (filters.resourceId !== undefined && rootSpan.resourceId !== filters.resourceId) {\n      return false;\n    }\n\n    // Correlation ID filters\n    if (filters.runId !== undefined && rootSpan.runId !== filters.runId) {\n      return false;\n    }\n    if (filters.sessionId !== undefined && rootSpan.sessionId !== filters.sessionId) {\n      return false;\n    }\n    if (filters.threadId !== undefined && rootSpan.threadId !== filters.threadId) {\n      return false;\n    }\n    if (filters.requestId !== undefined && rootSpan.requestId !== filters.requestId) {\n      return false;\n    }\n\n    // Deployment context filters\n    if (filters.environment !== undefined && rootSpan.environment !== filters.environment) {\n      return false;\n    }\n    if (filters.source !== undefined && rootSpan.source !== filters.source) {\n      return false;\n    }\n    if (filters.serviceName !== undefined && rootSpan.serviceName !== filters.serviceName) {\n      return false;\n    }\n\n    // Scope filter (partial match - all provided keys must match)\n    // Use != null to handle both null and undefined (nullish filter fields)\n    if (filters.scope != null && rootSpan.scope != null) {\n      for (const [key, value] of Object.entries(filters.scope)) {\n        if (!jsonValueEquals(rootSpan.scope[key], value)) {\n          return false;\n        }\n      }\n    } else if (filters.scope != null && rootSpan.scope == null) {\n      return false;\n    }\n\n    // Metadata filter (partial match - all provided keys must match)\n    // Use != null to handle both null and undefined (nullish filter fields)\n    if (filters.metadata != null && rootSpan.metadata != null) {\n      for (const [key, value] of Object.entries(filters.metadata)) {\n        if (!jsonValueEquals(rootSpan.metadata[key], value)) {\n          return false;\n        }\n      }\n    } else if (filters.metadata != null && rootSpan.metadata == null) {\n      return false;\n    }\n\n    // Tags filter (all provided tags must be present)\n    // Use != null to handle both null and undefined (nullish filter fields)\n    if (filters.tags != null && filters.tags.length > 0) {\n      if (rootSpan.tags == null) {\n        return false;\n      }\n      for (const tag of filters.tags) {\n        if (!rootSpan.tags.includes(tag)) {\n          return false;\n        }\n      }\n    }\n\n    // Derived status filter\n    if (filters.status !== undefined && traceEntry.status !== filters.status) {\n      return false;\n    }\n\n    // Has child error filter\n    if (filters.hasChildError !== undefined && traceEntry.hasChildError !== filters.hasChildError) {\n      return false;\n    }\n\n    return true;\n  }\n\n  async updateSpan(args: UpdateSpanArgs): Promise<void> {\n    const { traceId, spanId, updates } = args;\n    const traceEntry = this.db.traces.get(traceId);\n\n    if (!traceEntry) {\n      throw new MastraError({\n        id: 'OBSERVABILITY_UPDATE_SPAN_NOT_FOUND',\n        domain: ErrorDomain.MASTRA_OBSERVABILITY,\n        category: ErrorCategory.SYSTEM,\n        text: 'Trace not found for span update',\n      });\n    }\n\n    const span = traceEntry.spans[spanId];\n    if (!span) {\n      throw new MastraError({\n        id: 'OBSERVABILITY_UPDATE_SPAN_NOT_FOUND',\n        domain: ErrorDomain.MASTRA_OBSERVABILITY,\n        category: ErrorCategory.SYSTEM,\n        text: 'Span not found for update',\n      });\n    }\n\n    const updatedSpan: SpanRecord = {\n      ...span,\n      ...updates,\n      updatedAt: new Date(),\n    };\n\n    traceEntry.spans[spanId] = updatedSpan;\n\n    // Update root span reference if this is the root span\n    if (updatedSpan.parentSpanId == null) {\n      traceEntry.rootSpan = updatedSpan;\n    }\n\n    this.recomputeTraceProperties(traceEntry);\n  }\n\n  async batchUpdateSpans(args: BatchUpdateSpansArgs): Promise<void> {\n    for (const record of args.records) {\n      await this.updateSpan(record);\n    }\n  }\n\n  async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n    for (const traceId of args.traceIds) {\n      this.db.traces.delete(traceId);\n    }\n  }\n\n  // ============================================================================\n  // Metrics\n  // ============================================================================\n\n  async batchCreateMetrics(args: BatchCreateMetricsArgs): Promise<void> {\n    for (const metric of args.metrics) {\n      this.db.metricRecords.push(metric as MetricRecord);\n    }\n  }\n\n  async listMetrics(args: ListMetricsArgs): Promise<ListMetricsResponse> {\n    const { filters, pagination, orderBy } = listMetricsArgsSchema.parse(args);\n\n    let matching = this.filterMetrics(filters as Record<string, unknown>);\n\n    const dir = orderBy.direction === 'DESC' ? -1 : 1;\n    matching.sort((a, b) => dir * (a.timestamp.getTime() - b.timestamp.getTime()));\n\n    const total = matching.length;\n    const page = Number(pagination.page);\n    const perPage = Number(pagination.perPage);\n    const start = page * perPage;\n\n    return {\n      metrics: matching.slice(start, start + perPage),\n      pagination: { total, page, perPage, hasMore: start + perPage < total },\n    };\n  }\n\n  private filterMetrics(filters?: Record<string, unknown>): MetricRecord[] {\n    if (!filters) return [...this.db.metricRecords];\n    return this.db.metricRecords.filter(m => {\n      if (filters.timestamp) {\n        const ts = filters.timestamp as { start?: Date; end?: Date; startExclusive?: boolean; endExclusive?: boolean };\n        if (ts.start && (ts.startExclusive ? m.timestamp <= ts.start : m.timestamp < ts.start)) return false;\n        if (ts.end && (ts.endExclusive ? m.timestamp >= ts.end : m.timestamp > ts.end)) return false;\n      }\n      if (filters.name != null) {\n        if (!(filters.name as string[]).includes(m.name)) return false;\n      }\n      if (filters.traceId !== undefined && m.traceId !== filters.traceId) return false;\n      if (filters.spanId !== undefined && m.spanId !== filters.spanId) return false;\n      if (filters.provider !== undefined && m.provider !== filters.provider) return false;\n      if (filters.model !== undefined && m.model !== filters.model) return false;\n      if (filters.costUnit !== undefined && m.costUnit !== filters.costUnit) return false;\n      if (filters.entityType !== undefined && m.entityType !== filters.entityType) return false;\n      if (filters.entityName !== undefined && m.entityName !== filters.entityName) return false;\n      if (filters.entityVersionId !== undefined && m.entityVersionId !== filters.entityVersionId) return false;\n      if (filters.parentEntityVersionId !== undefined && m.parentEntityVersionId !== filters.parentEntityVersionId)\n        return false;\n      if (filters.rootEntityVersionId !== undefined && m.rootEntityVersionId !== filters.rootEntityVersionId)\n        return false;\n      if (filters.userId !== undefined && m.userId !== filters.userId) return false;\n      if (filters.organizationId !== undefined && m.organizationId !== filters.organizationId) return false;\n      if (filters.resourceId !== undefined && m.resourceId !== filters.resourceId) return false;\n      if (filters.runId !== undefined && m.runId !== filters.runId) return false;\n      if (filters.sessionId !== undefined && m.sessionId !== filters.sessionId) return false;\n      if (filters.threadId !== undefined && m.threadId !== filters.threadId) return false;\n      if (filters.requestId !== undefined && m.requestId !== filters.requestId) return false;\n      if (filters.experimentId !== undefined && m.experimentId !== filters.experimentId) return false;\n      if (filters.serviceName !== undefined && m.serviceName !== filters.serviceName) return false;\n      if (filters.environment !== undefined && m.environment !== filters.environment) return false;\n      const metricExecutionSource = m.executionSource ?? m.source ?? null;\n      if (filters.executionSource !== undefined && metricExecutionSource !== filters.executionSource) return false;\n      if (filters.source !== undefined && metricExecutionSource !== filters.source) return false;\n      if (filters.parentEntityType !== undefined && m.parentEntityType !== filters.parentEntityType) return false;\n      if (filters.parentEntityName !== undefined && m.parentEntityName !== filters.parentEntityName) return false;\n      if (filters.rootEntityType !== undefined && m.rootEntityType !== filters.rootEntityType) return false;\n      if (filters.rootEntityName !== undefined && m.rootEntityName !== filters.rootEntityName) return false;\n      if (filters.tags != null && Array.isArray(filters.tags) && filters.tags.length > 0) {\n        if (m.tags == null) return false;\n        for (const tag of filters.tags) {\n          if (!m.tags.includes(tag)) return false;\n        }\n      }\n      if (filters.labels) {\n        const labelFilters = filters.labels as Record<string, string>;\n        for (const [k, v] of Object.entries(labelFilters)) {\n          if (m.labels[k] !== v) return false;\n        }\n      }\n      return true;\n    });\n  }\n\n  private aggregate(values: number[], type: AggregationType, timestamps?: number[]): number | null {\n    if (values.length === 0) return null;\n    switch (type) {\n      case 'sum':\n        return values.reduce((a, b) => a + b, 0);\n      case 'avg':\n        return values.reduce((a, b) => a + b, 0) / values.length;\n      case 'min':\n        return Math.min(...values);\n      case 'max':\n        return Math.max(...values);\n      case 'count':\n        return values.length;\n      case 'last': {\n        if (!timestamps || timestamps.length !== values.length) {\n          return values[values.length - 1]!;\n        }\n\n        let latestIndex = 0;\n        let latestTimestamp = timestamps[0]!;\n\n        for (let i = 1; i < timestamps.length; i++) {\n          const timestamp = timestamps[i]!;\n          if (timestamp >= latestTimestamp) {\n            latestTimestamp = timestamp;\n            latestIndex = i;\n          }\n        }\n\n        return values[latestIndex]!;\n      }\n      default:\n        return values.reduce((a, b) => a + b, 0);\n    }\n  }\n\n  private interpolatePercentile(sortedValues: number[], percentile: number): number {\n    if (sortedValues.length === 0) return 0;\n\n    const position = percentile * (sortedValues.length - 1);\n    const lowerIndex = Math.floor(position);\n    const upperIndex = Math.ceil(position);\n    const lowerValue = sortedValues[lowerIndex]!;\n    const upperValue = sortedValues[upperIndex]!;\n\n    if (lowerIndex === upperIndex) {\n      return lowerValue;\n    }\n\n    return lowerValue + (upperValue - lowerValue) * (position - lowerIndex);\n  }\n\n  /**\n   * Cost is returned alongside value-based OLAP results so callers can derive\n   * token and monetary views from the same filtered scan.\n   */\n  private summarizeCost(records: MetricRecord[]): { estimatedCost: number | null; costUnit: string | null } {\n    const costValues = records\n      .map(record => record.estimatedCost)\n      .filter((value): value is number => typeof value === 'number' && Number.isFinite(value));\n    const costUnits = new Set(\n      records.map(record => record.costUnit).filter((unit): unit is string => typeof unit === 'string'),\n    );\n\n    return {\n      estimatedCost: costValues.length > 0 ? costValues.reduce((sum, value) => sum + value, 0) : null,\n      costUnit: costUnits.size === 1 ? Array.from(costUnits)[0]! : null,\n    };\n  }\n\n  async getMetricAggregate(args: GetMetricAggregateArgs): Promise<GetMetricAggregateResponse> {\n    const names = Array.isArray(args.name) ? args.name : [args.name];\n    const filtered = this.filterMetrics(args.filters as Record<string, unknown>).filter(m => names.includes(m.name));\n    const value = this.aggregate(\n      filtered.map(m => m.value),\n      args.aggregation,\n    );\n    const costSummary = this.summarizeCost(filtered);\n\n    if (args.comparePeriod && args.filters?.timestamp) {\n      const ts = args.filters.timestamp;\n      if (ts.start && ts.end) {\n        const duration = ts.end.getTime() - ts.start.getTime();\n        let prevStart: Date;\n        let prevEnd: Date;\n\n        switch (args.comparePeriod) {\n          case 'previous_period':\n            prevStart = new Date(ts.start.getTime() - duration);\n            prevEnd = new Date(ts.end.getTime() - duration);\n            break;\n          case 'previous_day':\n            prevStart = new Date(ts.start.getTime() - 86400000);\n            prevEnd = new Date(ts.end.getTime() - 86400000);\n            break;\n          case 'previous_week':\n            prevStart = new Date(ts.start.getTime() - 604800000);\n            prevEnd = new Date(ts.end.getTime() - 604800000);\n            break;\n        }\n\n        const prevFiltered = this.filterMetrics({\n          ...(args.filters as Record<string, unknown>),\n          timestamp: { ...ts, start: prevStart, end: prevEnd },\n        }).filter(m => names.includes(m.name));\n        const previousValue = this.aggregate(\n          prevFiltered.map(m => m.value),\n          args.aggregation,\n        );\n        const previousCostSummary = this.summarizeCost(prevFiltered);\n\n        let changePercent: number | null = null;\n        if (previousValue !== null && previousValue !== 0 && value !== null) {\n          changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n        }\n\n        let costChangePercent: number | null = null;\n        if (\n          previousCostSummary.estimatedCost !== null &&\n          previousCostSummary.estimatedCost !== 0 &&\n          costSummary.estimatedCost !== null\n        ) {\n          costChangePercent =\n            ((costSummary.estimatedCost - previousCostSummary.estimatedCost) /\n              Math.abs(previousCostSummary.estimatedCost)) *\n            100;\n        }\n\n        return {\n          value,\n          estimatedCost: costSummary.estimatedCost,\n          costUnit: costSummary.costUnit,\n          previousValue,\n          previousEstimatedCost: previousCostSummary.estimatedCost,\n          changePercent,\n          costChangePercent,\n        };\n      }\n    }\n\n    return { value, estimatedCost: costSummary.estimatedCost, costUnit: costSummary.costUnit };\n  }\n\n  async getMetricBreakdown(args: GetMetricBreakdownArgs): Promise<GetMetricBreakdownResponse> {\n    const names = Array.isArray(args.name) ? args.name : [args.name];\n    const filtered = this.filterMetrics(args.filters as Record<string, unknown>).filter(m => names.includes(m.name));\n\n    const groupMap = new Map<string, MetricRecord[]>();\n    for (const m of filtered) {\n      const dims: Record<string, string | null> = {};\n      for (const col of args.groupBy) {\n        dims[col] = ((m as Record<string, unknown>)[col] as string | null | undefined) ?? m.labels[col] ?? null;\n      }\n      const key = JSON.stringify(dims);\n      if (!groupMap.has(key)) groupMap.set(key, []);\n      groupMap.get(key)!.push(m);\n    }\n\n    const groups = Array.from(groupMap.entries()).map(([key, records]) => {\n      const costSummary = this.summarizeCost(records);\n      return {\n        dimensions: JSON.parse(key) as Record<string, string | null>,\n        value:\n          this.aggregate(\n            records.map(record => record.value),\n            args.aggregation,\n          ) ?? 0,\n        estimatedCost: costSummary.estimatedCost,\n        costUnit: costSummary.costUnit,\n      };\n    });\n    groups.sort((a, b) => b.value - a.value);\n\n    return { groups };\n  }\n\n  async getMetricTimeSeries(args: GetMetricTimeSeriesArgs): Promise<GetMetricTimeSeriesResponse> {\n    const names = Array.isArray(args.name) ? args.name : [args.name];\n    const filtered = this.filterMetrics(args.filters as Record<string, unknown>).filter(m => names.includes(m.name));\n\n    const intervalMs = this.intervalToMs(args.interval);\n\n    if (args.groupBy && args.groupBy.length > 0) {\n      const seriesMap = new Map<string, Map<number, MetricRecord[]>>();\n      for (const m of filtered) {\n        const key = args.groupBy\n          .map(col => String((m as Record<string, unknown>)[col] ?? m.labels[col] ?? ''))\n          .join('|');\n        if (!seriesMap.has(key)) seriesMap.set(key, new Map());\n        const bucket = Math.floor(m.timestamp.getTime() / intervalMs) * intervalMs;\n        const bucketMap = seriesMap.get(key)!;\n        if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n        bucketMap.get(bucket)!.push(m);\n      }\n\n      return {\n        series: Array.from(seriesMap.entries()).map(([name, bucketMap]) => {\n          const seriesRecords = Array.from(bucketMap.values()).flat();\n          const costSummary = this.summarizeCost(seriesRecords);\n          return {\n            name,\n            costUnit: costSummary.costUnit,\n            points: Array.from(bucketMap.entries())\n              .sort(([a], [b]) => a - b)\n              .map(([ts, records]) => ({\n                timestamp: new Date(ts),\n                value:\n                  this.aggregate(\n                    records.map(record => record.value),\n                    args.aggregation,\n                  ) ?? 0,\n                estimatedCost: this.summarizeCost(records).estimatedCost,\n              })),\n          };\n        }),\n      };\n    }\n\n    const bucketMap = new Map<number, MetricRecord[]>();\n    for (const m of filtered) {\n      const bucket = Math.floor(m.timestamp.getTime() / intervalMs) * intervalMs;\n      if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n      bucketMap.get(bucket)!.push(m);\n    }\n\n    const metricName = Array.isArray(args.name) ? args.name.join(',') : args.name;\n    const costSummary = this.summarizeCost(filtered);\n    return {\n      series: [\n        {\n          name: metricName,\n          costUnit: costSummary.costUnit,\n          points: Array.from(bucketMap.entries())\n            .sort(([a], [b]) => a - b)\n            .map(([ts, records]) => ({\n              timestamp: new Date(ts),\n              value:\n                this.aggregate(\n                  records.map(record => record.value),\n                  args.aggregation,\n                ) ?? 0,\n              estimatedCost: this.summarizeCost(records).estimatedCost,\n            })),\n        },\n      ],\n    };\n  }\n\n  async getMetricPercentiles(args: GetMetricPercentilesArgs): Promise<GetMetricPercentilesResponse> {\n    const filtered = this.filterMetrics(args.filters as Record<string, unknown>).filter(m => m.name === args.name);\n    const intervalMs = this.intervalToMs(args.interval);\n\n    const bucketMap = new Map<number, number[]>();\n    for (const m of filtered) {\n      const bucket = Math.floor(m.timestamp.getTime() / intervalMs) * intervalMs;\n      if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n      bucketMap.get(bucket)!.push(m.value);\n    }\n\n    const sortedBuckets = Array.from(bucketMap.entries()).sort(([a], [b]) => a - b);\n\n    return {\n      series: args.percentiles.map(p => ({\n        percentile: p,\n        points: sortedBuckets.map(([ts, values]) => {\n          const sorted = [...values].sort((a, b) => a - b);\n          const idx = Math.min(Math.floor(p * sorted.length), sorted.length - 1);\n          return { timestamp: new Date(ts), value: sorted[idx] ?? 0 };\n        }),\n      })),\n    };\n  }\n\n  private intervalToMs(interval: string): number {\n    switch (interval) {\n      case '1m':\n        return 60_000;\n      case '5m':\n        return 300_000;\n      case '15m':\n        return 900_000;\n      case '1h':\n        return 3_600_000;\n      case '1d':\n        return 86_400_000;\n      default:\n        return 3_600_000;\n    }\n  }\n\n  // ============================================================================\n  // Discovery / Metadata Methods\n  // ============================================================================\n\n  async getMetricNames(args: GetMetricNamesArgs): Promise<GetMetricNamesResponse> {\n    const nameSet = new Set<string>();\n    for (const m of this.db.metricRecords) {\n      if (args.prefix && !m.name.startsWith(args.prefix)) continue;\n      nameSet.add(m.name);\n    }\n    let names = Array.from(nameSet).sort();\n    if (args.limit) names = names.slice(0, args.limit);\n    return { names };\n  }\n\n  async getMetricLabelKeys(args: GetMetricLabelKeysArgs): Promise<GetMetricLabelKeysResponse> {\n    const keySet = new Set<string>();\n    for (const m of this.db.metricRecords) {\n      if (m.name !== args.metricName) continue;\n      for (const key of Object.keys(m.labels)) {\n        keySet.add(key);\n      }\n    }\n    return { keys: Array.from(keySet).sort() };\n  }\n\n  async getMetricLabelValues(args: GetMetricLabelValuesArgs): Promise<GetMetricLabelValuesResponse> {\n    const valueSet = new Set<string>();\n    for (const m of this.db.metricRecords) {\n      if (m.name !== args.metricName) continue;\n      const val = m.labels[args.labelKey];\n      if (val === undefined) continue;\n      if (args.prefix && !val.startsWith(args.prefix)) continue;\n      valueSet.add(val);\n    }\n    let values = Array.from(valueSet).sort();\n    if (args.limit) values = values.slice(0, args.limit);\n    return { values };\n  }\n\n  async getEntityTypes(_args: GetEntityTypesArgs): Promise<GetEntityTypesResponse> {\n    const validTypes = new Set(Object.values(EntityType));\n    const typeSet = new Set<EntityType>();\n    for (const [, traceEntry] of this.db.traces) {\n      for (const span of Object.values(traceEntry.spans)) {\n        if (span.entityType && validTypes.has(span.entityType as EntityType)) {\n          typeSet.add(span.entityType as EntityType);\n        }\n      }\n    }\n    return { entityTypes: Array.from(typeSet).sort() };\n  }\n\n  async getEntityNames(args: GetEntityNamesArgs): Promise<GetEntityNamesResponse> {\n    const nameSet = new Set<string>();\n    for (const [, traceEntry] of this.db.traces) {\n      for (const span of Object.values(traceEntry.spans)) {\n        if (!span.entityName) continue;\n        if (args.entityType && span.entityType !== args.entityType) continue;\n        nameSet.add(span.entityName);\n      }\n    }\n    return { names: Array.from(nameSet).sort() };\n  }\n\n  async getServiceNames(_args: GetServiceNamesArgs): Promise<GetServiceNamesResponse> {\n    const nameSet = new Set<string>();\n    for (const [, traceEntry] of this.db.traces) {\n      for (const span of Object.values(traceEntry.spans)) {\n        if (span.serviceName) nameSet.add(span.serviceName);\n      }\n    }\n    return { serviceNames: Array.from(nameSet).sort() };\n  }\n\n  async getEnvironments(_args: GetEnvironmentsArgs): Promise<GetEnvironmentsResponse> {\n    const envSet = new Set<string>();\n    for (const [, traceEntry] of this.db.traces) {\n      for (const span of Object.values(traceEntry.spans)) {\n        if (span.environment) envSet.add(span.environment);\n      }\n    }\n    return { environments: Array.from(envSet).sort() };\n  }\n\n  async getTags(args: GetTagsArgs): Promise<GetTagsResponse> {\n    const tagSet = new Set<string>();\n    for (const [, traceEntry] of this.db.traces) {\n      for (const span of Object.values(traceEntry.spans)) {\n        if (!span.tags) continue;\n        if (args.entityType && span.entityType !== args.entityType) continue;\n        for (const tag of span.tags) {\n          tagSet.add(tag);\n        }\n      }\n    }\n    return { tags: Array.from(tagSet).sort() };\n  }\n\n  // ============================================================================\n  // Logs\n  // ============================================================================\n\n  async batchCreateLogs(args: BatchCreateLogsArgs): Promise<void> {\n    for (const log of args.logs) {\n      this.db.logRecords.push(log as LogRecord);\n    }\n  }\n\n  async listLogs(args: ListLogsArgs): Promise<ListLogsResponse> {\n    const { filters, pagination, orderBy } = listLogsArgsSchema.parse(args);\n\n    let matching = this.db.logRecords.filter(log => this.logMatchesFilters(log, filters));\n\n    // Sort\n    const dir = orderBy.direction === 'DESC' ? -1 : 1;\n    matching.sort((a, b) => dir * (a.timestamp.getTime() - b.timestamp.getTime()));\n\n    // Paginate\n    const total = matching.length;\n    const page = Number(pagination.page);\n    const perPage = Number(pagination.perPage);\n    const start = page * perPage;\n\n    return {\n      logs: matching.slice(start, start + perPage),\n      pagination: { total, page, perPage, hasMore: start + perPage < total },\n    };\n  }\n\n  private logMatchesFilters(log: LogRecord, filters?: ListLogsArgs['filters']): boolean {\n    if (!filters) return true;\n\n    if (filters.timestamp) {\n      if (\n        filters.timestamp.start &&\n        (filters.timestamp.startExclusive\n          ? log.timestamp <= filters.timestamp.start\n          : log.timestamp < filters.timestamp.start)\n      ) {\n        return false;\n      }\n      if (\n        filters.timestamp.end &&\n        (filters.timestamp.endExclusive\n          ? log.timestamp >= filters.timestamp.end\n          : log.timestamp > filters.timestamp.end)\n      ) {\n        return false;\n      }\n    }\n    if (filters.level !== undefined) {\n      const levels = Array.isArray(filters.level) ? filters.level : [filters.level];\n      if (!levels.includes(log.level)) return false;\n    }\n    if (filters.traceId !== undefined && log.traceId !== filters.traceId) return false;\n    if (filters.spanId !== undefined && log.spanId !== filters.spanId) return false;\n    if (filters.entityType !== undefined && log.entityType !== filters.entityType) return false;\n    if (filters.entityName !== undefined && log.entityName !== filters.entityName) return false;\n    if (filters.entityVersionId !== undefined && log.entityVersionId !== filters.entityVersionId) return false;\n    if (filters.parentEntityVersionId !== undefined && log.parentEntityVersionId !== filters.parentEntityVersionId)\n      return false;\n    if (filters.rootEntityVersionId !== undefined && log.rootEntityVersionId !== filters.rootEntityVersionId)\n      return false;\n    if (filters.userId !== undefined && log.userId !== filters.userId) return false;\n    if (filters.organizationId !== undefined && log.organizationId !== filters.organizationId) return false;\n    if (filters.resourceId !== undefined && log.resourceId !== filters.resourceId) return false;\n    if (filters.runId !== undefined && log.runId !== filters.runId) return false;\n    if (filters.sessionId !== undefined && log.sessionId !== filters.sessionId) return false;\n    if (filters.threadId !== undefined && log.threadId !== filters.threadId) return false;\n    if (filters.requestId !== undefined && log.requestId !== filters.requestId) return false;\n    if (filters.parentEntityType !== undefined && log.parentEntityType !== filters.parentEntityType) return false;\n    if (filters.parentEntityName !== undefined && log.parentEntityName !== filters.parentEntityName) return false;\n    if (filters.rootEntityType !== undefined && log.rootEntityType !== filters.rootEntityType) return false;\n    if (filters.rootEntityName !== undefined && log.rootEntityName !== filters.rootEntityName) return false;\n    if (filters.serviceName !== undefined && log.serviceName !== filters.serviceName) return false;\n    if (filters.environment !== undefined && log.environment !== filters.environment) return false;\n    const logExecutionSource = log.executionSource ?? log.source ?? null;\n    if (filters.executionSource !== undefined && logExecutionSource !== filters.executionSource) return false;\n    if (filters.source !== undefined && logExecutionSource !== filters.source) return false;\n    if (filters.experimentId !== undefined && log.experimentId !== filters.experimentId) return false;\n    if (filters.tags != null && filters.tags.length > 0) {\n      if (log.tags == null) return false;\n      for (const tag of filters.tags) {\n        if (!log.tags.includes(tag)) return false;\n      }\n    }\n\n    return true;\n  }\n\n  // ============================================================================\n  // Scores\n  // ============================================================================\n\n  async createScore(args: CreateScoreArgs): Promise<void> {\n    const scoreSource = args.score.scoreSource ?? args.score.source ?? null;\n    this.db.scoreRecords.push({\n      ...args.score,\n      scoreSource,\n      source: scoreSource,\n    } as ScoreRecord);\n  }\n\n  async batchCreateScores(args: BatchCreateScoresArgs): Promise<void> {\n    for (const score of args.scores) {\n      const scoreSource = score.scoreSource ?? score.source ?? null;\n      this.db.scoreRecords.push({\n        ...score,\n        scoreSource,\n        source: scoreSource,\n      } as ScoreRecord);\n    }\n  }\n\n  async listScores(args: ListScoresArgs): Promise<ListScoresResponse> {\n    const { filters, pagination, orderBy } = listScoresArgsSchema.parse(args);\n\n    let matching = this.db.scoreRecords.filter(score => this.scoreMatchesFilters(score, filters));\n\n    // Sort\n    const dir = orderBy.direction === 'DESC' ? -1 : 1;\n    if (orderBy.field === 'score') {\n      matching.sort((a, b) => dir * (a.score - b.score));\n    } else {\n      matching.sort((a, b) => dir * (a.timestamp.getTime() - b.timestamp.getTime()));\n    }\n\n    // Paginate\n    const total = matching.length;\n    const page = Number(pagination.page);\n    const perPage = Number(pagination.perPage);\n    const start = page * perPage;\n\n    return {\n      scores: matching.slice(start, start + perPage),\n      pagination: { total, page, perPage, hasMore: start + perPage < total },\n    };\n  }\n\n  private scoreMatchesFilters(score: ScoreRecord, filters?: ListScoresArgs['filters']): boolean {\n    if (!filters) return true;\n\n    if (filters.timestamp) {\n      if (filters.timestamp.start && score.timestamp < filters.timestamp.start) return false;\n      if (filters.timestamp.end && score.timestamp > filters.timestamp.end) return false;\n    }\n    if (filters.traceId !== undefined && score.traceId !== filters.traceId) return false;\n    if (filters.spanId !== undefined && score.spanId !== filters.spanId) return false;\n    if (filters.entityType !== undefined && score.entityType !== filters.entityType) return false;\n    if (filters.entityName !== undefined && score.entityName !== filters.entityName) return false;\n    if (filters.entityVersionId !== undefined && score.entityVersionId !== filters.entityVersionId) return false;\n    if (filters.parentEntityVersionId !== undefined && score.parentEntityVersionId !== filters.parentEntityVersionId)\n      return false;\n    if (filters.rootEntityVersionId !== undefined && score.rootEntityVersionId !== filters.rootEntityVersionId)\n      return false;\n    if (filters.userId !== undefined && score.userId !== filters.userId) return false;\n    if (filters.organizationId !== undefined && score.organizationId !== filters.organizationId) return false;\n    if (filters.resourceId !== undefined && score.resourceId !== filters.resourceId) return false;\n    if (filters.runId !== undefined && score.runId !== filters.runId) return false;\n    if (filters.sessionId !== undefined && score.sessionId !== filters.sessionId) return false;\n    if (filters.threadId !== undefined && score.threadId !== filters.threadId) return false;\n    if (filters.requestId !== undefined && score.requestId !== filters.requestId) return false;\n    if (filters.parentEntityType !== undefined && score.parentEntityType !== filters.parentEntityType) return false;\n    if (filters.parentEntityName !== undefined && score.parentEntityName !== filters.parentEntityName) return false;\n    if (filters.rootEntityType !== undefined && score.rootEntityType !== filters.rootEntityType) return false;\n    if (filters.rootEntityName !== undefined && score.rootEntityName !== filters.rootEntityName) return false;\n    if (filters.serviceName !== undefined && score.serviceName !== filters.serviceName) return false;\n    if (filters.environment !== undefined && score.environment !== filters.environment) return false;\n    if (filters.executionSource !== undefined && score.executionSource !== filters.executionSource) return false;\n    if (filters.scorerId !== undefined) {\n      const names = Array.isArray(filters.scorerId) ? filters.scorerId : [filters.scorerId];\n      if (!names.includes(score.scorerId)) return false;\n    }\n    const scoreSource = score.scoreSource ?? score.source ?? null;\n    if (filters.scoreSource !== undefined && scoreSource !== filters.scoreSource) return false;\n    if (filters.source !== undefined && scoreSource !== filters.source) return false;\n    if (filters.experimentId !== undefined && score.experimentId !== filters.experimentId) return false;\n    if (filters.tags != null && filters.tags.length > 0) {\n      if (score.tags == null) return false;\n      for (const tag of filters.tags) {\n        if (!score.tags.includes(tag)) return false;\n      }\n    }\n\n    return true;\n  }\n\n  async getScoreAggregate(args: GetScoreAggregateArgs): Promise<GetScoreAggregateResponse> {\n    const filtered = this.db.scoreRecords\n      .filter(score => this.scoreMatchesFilters(score, args.filters))\n      .filter(score => score.scorerId === args.scorerId)\n      .filter(score => (args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true));\n    const value = this.aggregate(\n      filtered.map(score => score.score),\n      args.aggregation,\n      filtered.map(score => score.timestamp.getTime()),\n    );\n\n    if (args.comparePeriod && args.filters?.timestamp) {\n      const previousRange = this.getComparisonDateRange(args.comparePeriod, args.filters.timestamp);\n      if (previousRange) {\n        const previousFiltered = this.db.scoreRecords\n          .filter(score =>\n            this.scoreMatchesFilters(score, {\n              ...(args.filters ?? {}),\n              timestamp: previousRange,\n            }),\n          )\n          .filter(score => score.scorerId === args.scorerId)\n          .filter(score =>\n            args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true,\n          );\n\n        const previousValue = this.aggregate(\n          previousFiltered.map(score => score.score),\n          args.aggregation,\n          previousFiltered.map(score => score.timestamp.getTime()),\n        );\n\n        let changePercent: number | null = null;\n        if (previousValue !== null && previousValue !== 0 && value !== null) {\n          changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n        }\n\n        return { value, previousValue, changePercent };\n      }\n    }\n\n    return { value };\n  }\n\n  async getScoreBreakdown(args: GetScoreBreakdownArgs): Promise<GetScoreBreakdownResponse> {\n    const filtered = this.db.scoreRecords\n      .filter(score => this.scoreMatchesFilters(score, args.filters))\n      .filter(score => score.scorerId === args.scorerId)\n      .filter(score => (args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true));\n\n    const groupMap = new Map<string, ScoreRecord[]>();\n    for (const score of filtered) {\n      const dims: Record<string, string | null> = {};\n      for (const col of args.groupBy) {\n        const value = (score as Record<string, unknown>)[col];\n        dims[col] = value === null || value === undefined ? null : String(value);\n      }\n      const key = JSON.stringify(dims);\n      if (!groupMap.has(key)) groupMap.set(key, []);\n      groupMap.get(key)!.push(score);\n    }\n\n    const groups = Array.from(groupMap.entries()).map(([key, records]) => ({\n      dimensions: JSON.parse(key) as Record<string, string | null>,\n      value:\n        this.aggregate(\n          records.map(record => record.score),\n          args.aggregation,\n          records.map(record => record.timestamp.getTime()),\n        ) ?? 0,\n    }));\n    groups.sort((a, b) => b.value - a.value);\n\n    return { groups };\n  }\n\n  async getScoreTimeSeries(args: GetScoreTimeSeriesArgs): Promise<GetScoreTimeSeriesResponse> {\n    const filtered = this.db.scoreRecords\n      .filter(score => this.scoreMatchesFilters(score, args.filters))\n      .filter(score => score.scorerId === args.scorerId)\n      .filter(score => (args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true));\n    const intervalMs = this.intervalToMs(args.interval);\n\n    if (args.groupBy && args.groupBy.length > 0) {\n      const seriesMap = new Map<string, Map<number, ScoreRecord[]>>();\n      const seriesNames = new Map<string, string>();\n\n      for (const score of filtered) {\n        const values = args.groupBy.map(col => (score as Record<string, unknown>)[col] ?? '');\n        const key = JSON.stringify(values);\n        if (!seriesMap.has(key)) seriesMap.set(key, new Map());\n        if (!seriesNames.has(key)) {\n          seriesNames.set(\n            key,\n            values.map(value => (value === null || value === undefined ? '' : String(value))).join('|'),\n          );\n        }\n        const bucket = Math.floor(score.timestamp.getTime() / intervalMs) * intervalMs;\n        const bucketMap = seriesMap.get(key)!;\n        if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n        bucketMap.get(bucket)!.push(score);\n      }\n\n      return {\n        series: Array.from(seriesMap.entries()).map(([key, bucketMap]) => ({\n          name: seriesNames.get(key)!,\n          points: Array.from(bucketMap.entries())\n            .sort(([a], [b]) => a - b)\n            .map(([ts, records]) => ({\n              timestamp: new Date(ts),\n              value:\n                this.aggregate(\n                  records.map(record => record.score),\n                  args.aggregation,\n                  records.map(record => record.timestamp.getTime()),\n                ) ?? 0,\n            })),\n        })),\n      };\n    }\n\n    const bucketMap = new Map<number, ScoreRecord[]>();\n    for (const score of filtered) {\n      const bucket = Math.floor(score.timestamp.getTime() / intervalMs) * intervalMs;\n      if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n      bucketMap.get(bucket)!.push(score);\n    }\n\n    return {\n      series: [\n        {\n          name: args.scoreSource ? `${args.scorerId}|${args.scoreSource}` : args.scorerId,\n          points: Array.from(bucketMap.entries())\n            .sort(([a], [b]) => a - b)\n            .map(([ts, records]) => ({\n              timestamp: new Date(ts),\n              value:\n                this.aggregate(\n                  records.map(record => record.score),\n                  args.aggregation,\n                  records.map(record => record.timestamp.getTime()),\n                ) ?? 0,\n            })),\n        },\n      ],\n    };\n  }\n\n  async getScorePercentiles(args: GetScorePercentilesArgs): Promise<GetScorePercentilesResponse> {\n    const filtered = this.db.scoreRecords\n      .filter(score => this.scoreMatchesFilters(score, args.filters))\n      .filter(score => score.scorerId === args.scorerId)\n      .filter(score => (args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true));\n    const intervalMs = this.intervalToMs(args.interval);\n\n    const bucketMap = new Map<number, number[]>();\n    for (const score of filtered) {\n      const bucket = Math.floor(score.timestamp.getTime() / intervalMs) * intervalMs;\n      if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n      bucketMap.get(bucket)!.push(score.score);\n    }\n\n    const sortedBuckets = Array.from(bucketMap.entries()).sort(([a], [b]) => a - b);\n\n    return {\n      series: args.percentiles.map(percentile => ({\n        percentile,\n        points: sortedBuckets.map(([ts, values]) => {\n          const sorted = [...values].sort((a, b) => a - b);\n          return { timestamp: new Date(ts), value: this.interpolatePercentile(sorted, percentile) };\n        }),\n      })),\n    };\n  }\n\n  private getNumericFeedbackValue(value: FeedbackRecord['value']): number | null {\n    if (typeof value === 'number') {\n      return Number.isFinite(value) ? value : null;\n    }\n\n    if (typeof value === 'string') {\n      const trimmed = value.trim();\n      if (trimmed.length === 0) return null;\n      const numeric = Number(trimmed);\n      return Number.isFinite(numeric) ? numeric : null;\n    }\n\n    return null;\n  }\n\n  private getComparisonDateRange(\n    comparePeriod: 'previous_period' | 'previous_day' | 'previous_week',\n    timestamp: { start?: Date; end?: Date; startExclusive?: boolean; endExclusive?: boolean },\n  ): { start: Date; end: Date; startExclusive?: boolean; endExclusive?: boolean } | null {\n    if (!timestamp.start || !timestamp.end) return null;\n\n    const duration = timestamp.end.getTime() - timestamp.start.getTime();\n    switch (comparePeriod) {\n      case 'previous_period':\n        return {\n          start: new Date(timestamp.start.getTime() - duration),\n          end: new Date(timestamp.end.getTime() - duration),\n          startExclusive: timestamp.startExclusive,\n          endExclusive: timestamp.endExclusive,\n        };\n      case 'previous_day':\n        return {\n          start: new Date(timestamp.start.getTime() - 86_400_000),\n          end: new Date(timestamp.end.getTime() - 86_400_000),\n          startExclusive: timestamp.startExclusive,\n          endExclusive: timestamp.endExclusive,\n        };\n      case 'previous_week':\n        return {\n          start: new Date(timestamp.start.getTime() - 604_800_000),\n          end: new Date(timestamp.end.getTime() - 604_800_000),\n          startExclusive: timestamp.startExclusive,\n          endExclusive: timestamp.endExclusive,\n        };\n    }\n  }\n\n  // ============================================================================\n  // Feedback\n  // ============================================================================\n\n  async createFeedback(args: CreateFeedbackArgs): Promise<void> {\n    this.db.feedbackRecords.push({\n      ...args.feedback,\n      feedbackSource: args.feedback.feedbackSource ?? args.feedback.source ?? '',\n      source: args.feedback.feedbackSource ?? args.feedback.source ?? '',\n      feedbackUserId:\n        args.feedback.feedbackUserId ??\n        args.feedback.userId ??\n        (typeof args.feedback.metadata?.userId === 'string' ? args.feedback.metadata.userId : null),\n    } as FeedbackRecord);\n  }\n\n  async batchCreateFeedback(args: BatchCreateFeedbackArgs): Promise<void> {\n    for (const fb of args.feedbacks) {\n      this.db.feedbackRecords.push({\n        ...fb,\n        feedbackSource: fb.feedbackSource ?? fb.source ?? '',\n        source: fb.feedbackSource ?? fb.source ?? '',\n        feedbackUserId:\n          fb.feedbackUserId ?? fb.userId ?? (typeof fb.metadata?.userId === 'string' ? fb.metadata.userId : null),\n      } as FeedbackRecord);\n    }\n  }\n\n  async listFeedback(args: ListFeedbackArgs): Promise<ListFeedbackResponse> {\n    const { filters, pagination, orderBy } = listFeedbackArgsSchema.parse(args);\n\n    let matching = this.db.feedbackRecords.filter(fb => this.feedbackMatchesFilters(fb, filters));\n\n    // Sort\n    const dir = orderBy.direction === 'DESC' ? -1 : 1;\n    matching.sort((a, b) => dir * (a.timestamp.getTime() - b.timestamp.getTime()));\n\n    // Paginate\n    const total = matching.length;\n    const page = Number(pagination.page);\n    const perPage = Number(pagination.perPage);\n    const start = page * perPage;\n\n    return {\n      feedback: matching.slice(start, start + perPage),\n      pagination: { total, page, perPage, hasMore: start + perPage < total },\n    };\n  }\n\n  async getFeedbackAggregate(args: GetFeedbackAggregateArgs): Promise<GetFeedbackAggregateResponse> {\n    const filtered = this.db.feedbackRecords\n      .filter(feedback => this.feedbackMatchesFilters(feedback, args.filters))\n      .filter(feedback => feedback.feedbackType === args.feedbackType)\n      .filter(feedback =>\n        args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n      );\n    const numericEntries = filtered.flatMap(feedback => {\n      const numericValue = this.getNumericFeedbackValue(feedback.value);\n      return numericValue === null ? [] : [{ numericValue, timestamp: feedback.timestamp.getTime() }];\n    });\n    const value = this.aggregate(\n      numericEntries.map(entry => entry.numericValue),\n      args.aggregation,\n      numericEntries.map(entry => entry.timestamp),\n    );\n\n    if (args.comparePeriod && args.filters?.timestamp) {\n      const previousRange = this.getComparisonDateRange(args.comparePeriod, args.filters.timestamp);\n      if (previousRange) {\n        const previousNumericEntries = this.db.feedbackRecords\n          .filter(feedback =>\n            this.feedbackMatchesFilters(feedback, {\n              ...(args.filters ?? {}),\n              timestamp: previousRange,\n            }),\n          )\n          .filter(feedback => feedback.feedbackType === args.feedbackType)\n          .filter(feedback =>\n            args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n          )\n          .flatMap(feedback => {\n            const numericValue = this.getNumericFeedbackValue(feedback.value);\n            return numericValue === null ? [] : [{ numericValue, timestamp: feedback.timestamp.getTime() }];\n          });\n\n        const previousValue = this.aggregate(\n          previousNumericEntries.map(entry => entry.numericValue),\n          args.aggregation,\n          previousNumericEntries.map(entry => entry.timestamp),\n        );\n        let changePercent: number | null = null;\n        if (previousValue !== null && previousValue !== 0 && value !== null) {\n          changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n        }\n\n        return { value, previousValue, changePercent };\n      }\n    }\n\n    return { value };\n  }\n\n  async getFeedbackBreakdown(args: GetFeedbackBreakdownArgs): Promise<GetFeedbackBreakdownResponse> {\n    const filtered = this.db.feedbackRecords\n      .filter(feedback => this.feedbackMatchesFilters(feedback, args.filters))\n      .filter(feedback => feedback.feedbackType === args.feedbackType)\n      .filter(feedback =>\n        args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n      )\n      .filter(feedback => this.getNumericFeedbackValue(feedback.value) !== null);\n\n    const groupMap = new Map<string, FeedbackRecord[]>();\n    for (const feedback of filtered) {\n      const dims: Record<string, string | null> = {};\n      for (const col of args.groupBy) {\n        const rawValue = (feedback as Record<string, unknown>)[col];\n        dims[col] = rawValue === null || rawValue === undefined ? null : String(rawValue);\n      }\n      const key = JSON.stringify(dims);\n      if (!groupMap.has(key)) groupMap.set(key, []);\n      groupMap.get(key)!.push(feedback);\n    }\n\n    const groups = Array.from(groupMap.entries()).map(([key, records]) => ({\n      dimensions: JSON.parse(key) as Record<string, string | null>,\n      value: (() => {\n        const numericEntries = records.flatMap(record => {\n          const numericValue = this.getNumericFeedbackValue(record.value);\n          return numericValue === null ? [] : [{ numericValue, timestamp: record.timestamp.getTime() }];\n        });\n\n        return (\n          this.aggregate(\n            numericEntries.map(entry => entry.numericValue),\n            args.aggregation,\n            numericEntries.map(entry => entry.timestamp),\n          ) ?? 0\n        );\n      })(),\n    }));\n    groups.sort((a, b) => b.value - a.value);\n\n    return { groups };\n  }\n\n  async getFeedbackTimeSeries(args: GetFeedbackTimeSeriesArgs): Promise<GetFeedbackTimeSeriesResponse> {\n    const filtered = this.db.feedbackRecords\n      .filter(feedback => this.feedbackMatchesFilters(feedback, args.filters))\n      .filter(feedback => feedback.feedbackType === args.feedbackType)\n      .filter(feedback =>\n        args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n      )\n      .filter(feedback => this.getNumericFeedbackValue(feedback.value) !== null);\n    const intervalMs = this.intervalToMs(args.interval);\n\n    if (args.groupBy && args.groupBy.length > 0) {\n      const seriesMap = new Map<string, Map<number, FeedbackRecord[]>>();\n      const seriesNames = new Map<string, string>();\n\n      for (const feedback of filtered) {\n        const values = args.groupBy.map(col => (feedback as Record<string, unknown>)[col] ?? '');\n        const key = JSON.stringify(values);\n        if (!seriesMap.has(key)) seriesMap.set(key, new Map());\n        if (!seriesNames.has(key)) {\n          seriesNames.set(\n            key,\n            values.map(value => (value === null || value === undefined ? '' : String(value))).join('|'),\n          );\n        }\n        const bucket = Math.floor(feedback.timestamp.getTime() / intervalMs) * intervalMs;\n        const bucketMap = seriesMap.get(key)!;\n        if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n        bucketMap.get(bucket)!.push(feedback);\n      }\n\n      return {\n        series: Array.from(seriesMap.entries()).map(([key, bucketMap]) => ({\n          name: seriesNames.get(key)!,\n          points: Array.from(bucketMap.entries())\n            .sort(([a], [b]) => a - b)\n            .map(([ts, records]) => ({\n              timestamp: new Date(ts),\n              value: (() => {\n                const numericEntries = records.flatMap(record => {\n                  const numericValue = this.getNumericFeedbackValue(record.value);\n                  return numericValue === null ? [] : [{ numericValue, timestamp: record.timestamp.getTime() }];\n                });\n\n                return (\n                  this.aggregate(\n                    numericEntries.map(entry => entry.numericValue),\n                    args.aggregation,\n                    numericEntries.map(entry => entry.timestamp),\n                  ) ?? 0\n                );\n              })(),\n            })),\n        })),\n      };\n    }\n\n    const bucketMap = new Map<number, FeedbackRecord[]>();\n    for (const feedback of filtered) {\n      const bucket = Math.floor(feedback.timestamp.getTime() / intervalMs) * intervalMs;\n      if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n      bucketMap.get(bucket)!.push(feedback);\n    }\n\n    return {\n      series: [\n        {\n          name: args.feedbackSource ? `${args.feedbackType}|${args.feedbackSource}` : args.feedbackType,\n          points: Array.from(bucketMap.entries())\n            .sort(([a], [b]) => a - b)\n            .map(([ts, records]) => ({\n              timestamp: new Date(ts),\n              value: (() => {\n                const numericEntries = records.flatMap(record => {\n                  const numericValue = this.getNumericFeedbackValue(record.value);\n                  return numericValue === null ? [] : [{ numericValue, timestamp: record.timestamp.getTime() }];\n                });\n\n                return (\n                  this.aggregate(\n                    numericEntries.map(entry => entry.numericValue),\n                    args.aggregation,\n                    numericEntries.map(entry => entry.timestamp),\n                  ) ?? 0\n                );\n              })(),\n            })),\n        },\n      ],\n    };\n  }\n\n  async getFeedbackPercentiles(args: GetFeedbackPercentilesArgs): Promise<GetFeedbackPercentilesResponse> {\n    const filtered = this.db.feedbackRecords\n      .filter(feedback => this.feedbackMatchesFilters(feedback, args.filters))\n      .filter(feedback => feedback.feedbackType === args.feedbackType)\n      .filter(feedback =>\n        args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n      );\n    const intervalMs = this.intervalToMs(args.interval);\n\n    const bucketMap = new Map<number, number[]>();\n    for (const feedback of filtered) {\n      const numericValue = this.getNumericFeedbackValue(feedback.value);\n      if (numericValue === null) continue;\n      const bucket = Math.floor(feedback.timestamp.getTime() / intervalMs) * intervalMs;\n      if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n      bucketMap.get(bucket)!.push(numericValue);\n    }\n\n    const sortedBuckets = Array.from(bucketMap.entries()).sort(([a], [b]) => a - b);\n\n    return {\n      series: args.percentiles.map(percentile => ({\n        percentile,\n        points: sortedBuckets.map(([ts, values]) => {\n          const sorted = [...values].sort((a, b) => a - b);\n          return { timestamp: new Date(ts), value: this.interpolatePercentile(sorted, percentile) };\n        }),\n      })),\n    };\n  }\n\n  private feedbackMatchesFilters(fb: FeedbackRecord, filters?: FeedbackFilter): boolean {\n    if (!filters) return true;\n\n    if (filters.timestamp) {\n      if (filters.timestamp.start && fb.timestamp < filters.timestamp.start) return false;\n      if (filters.timestamp.end && fb.timestamp > filters.timestamp.end) return false;\n    }\n    if (filters.traceId !== undefined && fb.traceId !== filters.traceId) return false;\n    if (filters.spanId !== undefined && fb.spanId !== filters.spanId) return false;\n    if (filters.entityType !== undefined && fb.entityType !== filters.entityType) return false;\n    if (filters.entityName !== undefined && fb.entityName !== filters.entityName) return false;\n    if (filters.entityVersionId !== undefined && fb.entityVersionId !== filters.entityVersionId) return false;\n    if (filters.parentEntityVersionId !== undefined && fb.parentEntityVersionId !== filters.parentEntityVersionId)\n      return false;\n    if (filters.rootEntityVersionId !== undefined && fb.rootEntityVersionId !== filters.rootEntityVersionId)\n      return false;\n    if (filters.userId !== undefined && fb.userId !== filters.userId) return false;\n    if (filters.organizationId !== undefined && fb.organizationId !== filters.organizationId) return false;\n    if (filters.resourceId !== undefined && fb.resourceId !== filters.resourceId) return false;\n    if (filters.runId !== undefined && fb.runId !== filters.runId) return false;\n    if (filters.sessionId !== undefined && fb.sessionId !== filters.sessionId) return false;\n    if (filters.threadId !== undefined && fb.threadId !== filters.threadId) return false;\n    if (filters.requestId !== undefined && fb.requestId !== filters.requestId) return false;\n    if (filters.parentEntityType !== undefined && fb.parentEntityType !== filters.parentEntityType) return false;\n    if (filters.parentEntityName !== undefined && fb.parentEntityName !== filters.parentEntityName) return false;\n    if (filters.rootEntityType !== undefined && fb.rootEntityType !== filters.rootEntityType) return false;\n    if (filters.rootEntityName !== undefined && fb.rootEntityName !== filters.rootEntityName) return false;\n    if (filters.serviceName !== undefined && fb.serviceName !== filters.serviceName) return false;\n    if (filters.environment !== undefined && fb.environment !== filters.environment) return false;\n    if (filters.executionSource !== undefined && fb.executionSource !== filters.executionSource) return false;\n    if (filters.feedbackType !== undefined) {\n      const types = Array.isArray(filters.feedbackType) ? filters.feedbackType : [filters.feedbackType];\n      if (!types.includes(fb.feedbackType)) return false;\n    }\n    const feedbackSource = fb.feedbackSource ?? fb.source ?? '';\n    if (filters.feedbackSource !== undefined && feedbackSource !== filters.feedbackSource) return false;\n    if (filters.source !== undefined && feedbackSource !== filters.source) return false;\n    if (filters.experimentId !== undefined && fb.experimentId !== filters.experimentId) return false;\n    if (filters.feedbackUserId !== undefined && fb.feedbackUserId !== filters.feedbackUserId) return false;\n    if (filters.tags != null && filters.tags.length > 0) {\n      if (fb.tags == null) return false;\n      for (const tag of filters.tags) {\n        if (!fb.tags.includes(tag)) return false;\n      }\n    }\n\n    return true;\n  }\n}\n","import type {\n  AnyExportedSpan,\n  MetricEvent,\n  LogEvent,\n  ScoreEvent,\n  FeedbackEvent,\n} from '../../../observability/index.js';\nimport type { CorrelationContext } from '../../../observability/types/core.js';\nimport { EntityType } from '../../../observability/types/tracing.js';\nimport type { CreateFeedbackRecord } from './feedback.js';\nimport type { CreateLogRecord } from './logs.js';\nimport type { CreateMetricRecord } from './metrics.js';\nimport type { CreateScoreRecord } from './scores.js';\nimport type { CreateSpanRecord, UpdateSpanRecord } from './tracing.js';\n\n// ============================================================================\n// Shared helpers for extracting typed fields from untyped metadata/labels\n// ============================================================================\n\nconst entityTypeValues = new Set(Object.values(EntityType));\n\n/** Safely cast string to EntityType, returning null if invalid */\nexport function toEntityType(value: string | undefined | null): EntityType | null {\n  if (value && entityTypeValues.has(value as EntityType)) {\n    return value as EntityType;\n  }\n  return null;\n}\n\n/** Extract a string from an unknown value, returning null if not a string. */\nexport function getStringOrNull(value: unknown): string | null {\n  return typeof value === 'string' ? value : null;\n}\n\n/** Extract a plain object from an unknown value, returning null if not an object. */\nexport function getObjectOrNull(value: unknown): Record<string, any> | null {\n  return value !== null && typeof value === 'object' && !Array.isArray(value) ? (value as Record<string, any>) : null;\n}\n\n// ============================================================================\n// Span attribute serialization\n// ============================================================================\n\n/**\n * Serializes span attributes to a plain JSON-safe object.\n * Handles Date objects and nested structures.\n */\nexport function serializeSpanAttributes(span: AnyExportedSpan): Record<string, any> | null {\n  if (!span.attributes) {\n    return null;\n  }\n\n  try {\n    return JSON.parse(\n      JSON.stringify(span.attributes, (_key, value) => {\n        if (value instanceof Date) {\n          return value.toISOString();\n        }\n        return value;\n      }),\n    );\n  } catch {\n    return null;\n  }\n}\n\ntype CorrelationRecordFields = Pick<\n  CreateLogRecord,\n  | 'tags'\n  | 'entityType'\n  | 'entityId'\n  | 'entityName'\n  | 'entityVersionId'\n  | 'parentEntityType'\n  | 'parentEntityId'\n  | 'parentEntityName'\n  | 'parentEntityVersionId'\n  | 'rootEntityType'\n  | 'rootEntityId'\n  | 'rootEntityName'\n  | 'rootEntityVersionId'\n  | 'userId'\n  | 'organizationId'\n  | 'resourceId'\n  | 'runId'\n  | 'sessionId'\n  | 'threadId'\n  | 'requestId'\n  | 'environment'\n  | 'executionSource'\n  | 'serviceName'\n  | 'experimentId'\n>;\n\nfunction buildCorrelationRecordFields(context: CorrelationContext | undefined): CorrelationRecordFields {\n  return {\n    tags: context?.tags ?? null,\n    entityType: context?.entityType ?? null,\n    entityId: context?.entityId ?? null,\n    entityName: context?.entityName ?? null,\n    entityVersionId: context?.entityVersionId ?? null,\n    parentEntityType: context?.parentEntityType ?? null,\n    parentEntityId: context?.parentEntityId ?? null,\n    parentEntityName: context?.parentEntityName ?? null,\n    parentEntityVersionId: context?.parentEntityVersionId ?? null,\n    rootEntityType: context?.rootEntityType ?? null,\n    rootEntityId: context?.rootEntityId ?? null,\n    rootEntityName: context?.rootEntityName ?? null,\n    rootEntityVersionId: context?.rootEntityVersionId ?? null,\n    userId: context?.userId ?? null,\n    organizationId: context?.organizationId ?? null,\n    resourceId: context?.resourceId ?? null,\n    runId: context?.runId ?? null,\n    sessionId: context?.sessionId ?? null,\n    threadId: context?.threadId ?? null,\n    requestId: context?.requestId ?? null,\n    environment: context?.environment ?? null,\n    executionSource: context?.source ?? null,\n    serviceName: context?.serviceName ?? null,\n    experimentId: context?.experimentId ?? null,\n  };\n}\n\nfunction buildLegacyMetricLabelCorrelationFields(labels: Record<string, string>): Partial<CorrelationRecordFields> {\n  return {\n    entityType: toEntityType(labels.entity_type),\n    entityName: getStringOrNull(labels.entity_name),\n    parentEntityType: toEntityType(labels.parent_type),\n    parentEntityName: getStringOrNull(labels.parent_name),\n    serviceName: getStringOrNull(labels.service_name),\n  };\n}\n\nfunction stripLegacyMetricCorrelationLabels(labels: Record<string, string>): Record<string, string> {\n  const sanitized = { ...labels };\n  delete sanitized.entity_type;\n  delete sanitized.entity_name;\n  delete sanitized.parent_type;\n  delete sanitized.parent_name;\n  delete sanitized.service_name;\n  return sanitized;\n}\n\nfunction buildLegacyLogMetadataCorrelationFields(\n  metadata: Record<string, any> | null,\n): Partial<CorrelationRecordFields> {\n  return {\n    entityType: toEntityType(getStringOrNull(metadata?.entity_type) ?? undefined),\n    entityName: getStringOrNull(metadata?.entity_name),\n    parentEntityType: toEntityType(getStringOrNull(metadata?.parent_type) ?? undefined),\n    parentEntityName: getStringOrNull(metadata?.parent_name),\n    rootEntityType: toEntityType(getStringOrNull(metadata?.root_type) ?? undefined),\n    rootEntityName: getStringOrNull(metadata?.root_name),\n    environment: getStringOrNull(metadata?.environment),\n    executionSource: getStringOrNull(metadata?.source),\n    serviceName: getStringOrNull(metadata?.service_name),\n  };\n}\n\n// ============================================================================\n// Event → Record builders\n// ============================================================================\n\n/** Convert an exported span to a CreateSpanRecord */\nexport function buildCreateSpanRecord(span: AnyExportedSpan): CreateSpanRecord {\n  const metadata = span.metadata ?? {};\n\n  return {\n    traceId: span.traceId,\n    spanId: span.id,\n    parentSpanId: span.parentSpanId ?? null,\n    name: span.name,\n\n    // Entity identification - from span\n    entityType: span.entityType ?? null,\n    entityId: span.entityId ?? null,\n    entityName: span.entityName ?? null,\n    entityVersionId: getStringOrNull(metadata.entityVersionId),\n\n    // Identity & Tenancy - extracted from metadata if present\n    userId: getStringOrNull(metadata.userId),\n    organizationId: getStringOrNull(metadata.organizationId),\n    resourceId: getStringOrNull(metadata.resourceId),\n\n    // Correlation IDs - extracted from metadata if present\n    runId: getStringOrNull(metadata.runId),\n    sessionId: getStringOrNull(metadata.sessionId),\n    threadId: getStringOrNull(metadata.threadId),\n    requestId: getStringOrNull(metadata.requestId),\n\n    // Deployment context - extracted from metadata if present\n    environment: getStringOrNull(metadata.environment),\n    source: getStringOrNull(metadata.source),\n    serviceName: getStringOrNull(metadata.serviceName),\n    scope: getObjectOrNull(metadata.scope),\n\n    // Experimentation\n    experimentId: getStringOrNull(metadata.experimentId),\n\n    // Span data\n    spanType: span.type,\n    attributes: serializeSpanAttributes(span),\n    metadata: span.metadata ?? null,\n    tags: span.tags ?? null,\n    links: null,\n    input: span.input ?? null,\n    output: span.output ?? null,\n    error: span.errorInfo ?? null,\n    isEvent: span.isEvent,\n\n    // Request context\n    requestContext: span.requestContext ?? null,\n\n    // Timestamps\n    startedAt: span.startTime,\n    endedAt: span.endTime ?? null,\n  };\n}\n\n/** Convert an exported span to a partial UpdateSpanRecord */\nexport function buildUpdateSpanRecord(span: AnyExportedSpan): Partial<UpdateSpanRecord> {\n  return {\n    name: span.name,\n    scope: null,\n    attributes: serializeSpanAttributes(span),\n    metadata: span.metadata ?? null,\n    links: null,\n    endedAt: span.endTime ?? null,\n    input: span.input,\n    output: span.output,\n    error: span.errorInfo ?? null,\n  };\n}\n\n/** Convert a MetricEvent to a CreateMetricRecord. */\nexport function buildMetricRecord(event: MetricEvent): CreateMetricRecord {\n  const m = event.metric;\n  const labels = stripLegacyMetricCorrelationLabels(m.labels);\n  const correlationFields = buildCorrelationRecordFields(m.correlationContext);\n  const legacyCorrelationFields = buildLegacyMetricLabelCorrelationFields(m.labels);\n  const cost = m.costContext;\n\n  return {\n    timestamp: m.timestamp,\n    name: m.name,\n    value: m.value,\n    labels,\n    traceId: m.traceId ?? m.correlationContext?.traceId ?? null,\n    spanId: m.spanId ?? m.correlationContext?.spanId ?? null,\n    ...correlationFields,\n    scope: null,\n    entityType: correlationFields.entityType ?? legacyCorrelationFields.entityType ?? null,\n    entityName: correlationFields.entityName ?? legacyCorrelationFields.entityName ?? null,\n    parentEntityType: correlationFields.parentEntityType ?? legacyCorrelationFields.parentEntityType ?? null,\n    parentEntityName: correlationFields.parentEntityName ?? legacyCorrelationFields.parentEntityName ?? null,\n    serviceName: correlationFields.serviceName ?? legacyCorrelationFields.serviceName ?? null,\n    provider: cost?.provider ?? null,\n    model: cost?.model ?? null,\n    estimatedCost: cost?.estimatedCost ?? null,\n    costUnit: cost?.costUnit ?? null,\n    costMetadata: cost?.costMetadata ?? null,\n    metadata: m.metadata ?? null,\n  };\n}\n\n/** Convert a LogEvent to a CreateLogRecord */\nexport function buildLogRecord(event: LogEvent): CreateLogRecord {\n  const l = event.log;\n  const correlationFields = buildCorrelationRecordFields(l.correlationContext);\n  const legacyCorrelationFields = buildLegacyLogMetadataCorrelationFields(l.metadata ?? null);\n\n  return {\n    timestamp: l.timestamp,\n    level: l.level,\n    message: l.message,\n    data: l.data ?? null,\n    ...correlationFields,\n    traceId: l.traceId ?? l.correlationContext?.traceId ?? null,\n    spanId: l.spanId ?? l.correlationContext?.spanId ?? null,\n    tags: correlationFields.tags ?? l.tags ?? null,\n    entityType: correlationFields.entityType ?? legacyCorrelationFields.entityType ?? null,\n    entityName: correlationFields.entityName ?? legacyCorrelationFields.entityName ?? null,\n    parentEntityType: correlationFields.parentEntityType ?? legacyCorrelationFields.parentEntityType ?? null,\n    parentEntityName: correlationFields.parentEntityName ?? legacyCorrelationFields.parentEntityName ?? null,\n    rootEntityType: correlationFields.rootEntityType ?? legacyCorrelationFields.rootEntityType ?? null,\n    rootEntityName: correlationFields.rootEntityName ?? legacyCorrelationFields.rootEntityName ?? null,\n    environment: correlationFields.environment ?? legacyCorrelationFields.environment ?? null,\n    executionSource: correlationFields.executionSource ?? legacyCorrelationFields.executionSource ?? null,\n    serviceName: correlationFields.serviceName ?? legacyCorrelationFields.serviceName ?? null,\n    scope: null,\n    metadata: l.metadata ?? null,\n  };\n}\n\n/** Convert a ScoreEvent to a CreateScoreRecord */\nexport function buildScoreRecord(event: ScoreEvent): CreateScoreRecord {\n  const s = event.score;\n  const correlationFields = buildCorrelationRecordFields(s.correlationContext);\n  return {\n    timestamp: s.timestamp,\n    traceId: s.traceId ?? s.correlationContext?.traceId ?? null,\n    spanId: s.spanId ?? s.correlationContext?.spanId ?? null,\n    scorerId: s.scorerId,\n    scorerVersion: s.scorerVersion ?? null,\n    scoreSource: s.scoreSource ?? s.source ?? null,\n    source: s.scoreSource ?? s.source ?? null,\n    score: s.score,\n    reason: s.reason ?? null,\n    ...correlationFields,\n    entityType: correlationFields.entityType ?? s.targetEntityType ?? null,\n    experimentId: correlationFields.experimentId ?? s.experimentId ?? null,\n    scope: null,\n    scoreTraceId: s.scoreTraceId ?? null,\n    metadata: s.scorerName ? { ...(s.metadata ?? {}), scorerName: s.scorerName } : (s.metadata ?? null),\n  };\n}\n\n/** Convert a FeedbackEvent to a CreateFeedbackRecord */\nexport function buildFeedbackRecord(event: FeedbackEvent): CreateFeedbackRecord {\n  const fb = event.feedback;\n  const correlationFields = buildCorrelationRecordFields(fb.correlationContext);\n  return {\n    timestamp: fb.timestamp,\n    traceId: fb.traceId ?? fb.correlationContext?.traceId ?? null,\n    spanId: fb.spanId ?? fb.correlationContext?.spanId ?? null,\n    feedbackSource: fb.feedbackSource ?? fb.source ?? '',\n    source: fb.feedbackSource ?? fb.source ?? '',\n    feedbackType: fb.feedbackType,\n    value: fb.value,\n    comment: fb.comment ?? null,\n    ...correlationFields,\n    experimentId: correlationFields.experimentId ?? fb.experimentId ?? null,\n    feedbackUserId:\n      fb.feedbackUserId ?? fb.userId ?? (typeof fb.metadata?.userId === 'string' ? fb.metadata.userId : null),\n    scope: null,\n    sourceId: fb.sourceId ?? null,\n    metadata: fb.metadata ?? null,\n  };\n}\n","import type { StorageOrderBy, ThreadOrderBy, ThreadSortDirection } from '../types';\nimport { StorageDomain } from './base';\n\n// ============================================================================\n// Version Resolution Options\n// ============================================================================\n\n/**\n * Options for resolving which version of an entity to use.\n * Either pick by status (draft/published/archived) or by a specific version ID — not both.\n */\nexport type VersionResolutionOptions =\n  | { status?: 'draft' | 'published' | 'archived'; versionId?: never }\n  | { versionId: string; status?: never };\n\n// ============================================================================\n// Generic Version Types\n// ============================================================================\n\n/**\n * Base interface for version metadata fields that exist on every version row.\n * The `TFkField` parameter controls the name of the foreign key field.\n */\nexport interface VersionBase {\n  /** UUID identifier for this version */\n  id: string;\n  /** Sequential version number (1, 2, 3, ...) */\n  versionNumber: number;\n  /** Array of field names that changed from the previous version */\n  changedFields?: string[];\n  /** Optional message describing the changes */\n  changeMessage?: string;\n  /** When this version was created */\n  createdAt: Date;\n}\n\n/**\n * Base interface for version creation input.\n * Same as VersionBase but without the server-assigned `createdAt` timestamp.\n */\nexport interface CreateVersionInputBase extends Omit<VersionBase, 'createdAt'> {}\n\n/**\n * Sort direction for version listings.\n */\nexport type VersionSortDirectionGeneric = ThreadSortDirection;\n\n/**\n * Fields that can be used for ordering version listings.\n */\nexport type VersionOrderByGeneric = 'versionNumber' | 'createdAt';\n\n/**\n * Input for listing versions with pagination and sorting.\n */\nexport interface ListVersionsInputBase {\n  /** Page number (0-indexed) */\n  page?: number;\n  /**\n   * Number of items per page, or `false` to fetch all records without pagination limit.\n   * Defaults to 20 if not specified.\n   */\n  perPage?: number | false;\n  /** Sorting options */\n  orderBy?: {\n    field?: VersionOrderByGeneric;\n    direction?: VersionSortDirectionGeneric;\n  };\n}\n\n/**\n * Output for listing versions with pagination info.\n */\nexport interface ListVersionsOutputBase<TVersion> {\n  /** Array of versions for the current page */\n  versions: TVersion[];\n  /** Total number of versions */\n  total: number;\n  /** Current page number */\n  page: number;\n  /** Items per page */\n  perPage: number | false;\n  /** Whether there are more pages */\n  hasMore: boolean;\n}\n\n// ============================================================================\n// Entity base — the \"thin record\" must have these fields\n// ============================================================================\n\nexport interface VersionedEntityBase {\n  id: string;\n  activeVersionId?: string;\n}\n\n// ============================================================================\n// Constants for validation (shared across all versioned domains)\n// ============================================================================\n\nconst ENTITY_ORDER_BY_SET: Record<ThreadOrderBy, true> = {\n  createdAt: true,\n  updatedAt: true,\n};\n\nconst SORT_DIRECTION_SET: Record<ThreadSortDirection, true> = {\n  ASC: true,\n  DESC: true,\n};\n\nconst VERSION_ORDER_BY_SET: Record<VersionOrderByGeneric, true> = {\n  versionNumber: true,\n  createdAt: true,\n};\n\n// ============================================================================\n// VersionedStorageDomain — generic base class\n// ============================================================================\n\n/**\n * Generic base class for versioned storage domains (agents, prompt blocks, scorer definitions).\n *\n * Type parameters:\n * - `TEntity`       — Thin record type (e.g. StorageAgentType)\n * - `TSnapshot`     — Snapshot config type (e.g. StorageAgentSnapshotType)\n * - `TResolved`     — Entity + snapshot merged (e.g. StorageResolvedAgentType)\n * - `TVersion`      — Version row (e.g. AgentVersion)\n * - `TCreateVersion` — Input for creating a version\n * - `TListVersionsInput` — Input for listing versions\n * - `TListVersionsOutput` — Output for listing versions\n * - `TCreateInput`  — Input for creating an entity\n * - `TUpdateInput`  — Input for updating an entity\n * - `TListInput`    — Input for listing entities\n * - `TListOutput`   — Output for listing entities (paginated thin records)\n * - `TListResolvedOutput` — Output for listing resolved entities\n */\nexport abstract class VersionedStorageDomain<\n  TEntity extends VersionedEntityBase,\n  TSnapshot,\n  TResolved extends TEntity,\n  TVersion extends VersionBase,\n  TCreateVersion extends CreateVersionInputBase,\n  TListVersionsInput extends ListVersionsInputBase,\n  TListVersionsOutput extends ListVersionsOutputBase<TVersion>,\n  TCreateInput,\n  TUpdateInput,\n  TListInput,\n  TListOutput,\n  TListResolvedOutput,\n> extends StorageDomain {\n  /**\n   * The key name used in list outputs (e.g. 'agents', 'promptBlocks', 'scorerDefinitions').\n   * Subclasses must provide this so the generic resolution logic can build the correct output shape.\n   */\n  protected abstract readonly listKey: string;\n\n  /**\n   * The set of version metadata field names (including the FK field) to strip\n   * when extracting snapshot config from a version row.\n   * e.g. ['id', 'agentId', 'versionNumber', 'changedFields', 'changeMessage', 'createdAt']\n   */\n  protected abstract readonly versionMetadataFields: string[];\n\n  // ==========================================================================\n  // Entity CRUD (abstract — implemented by concrete store classes)\n  // ==========================================================================\n\n  abstract getById(id: string): Promise<TEntity | null>;\n  abstract create(input: TCreateInput): Promise<TEntity>;\n  abstract update(input: TUpdateInput): Promise<TEntity>;\n  abstract delete(id: string): Promise<void>;\n  abstract list(args?: TListInput): Promise<TListOutput>;\n\n  // ==========================================================================\n  // Version methods (abstract — implemented by concrete store classes)\n  // ==========================================================================\n\n  abstract createVersion(input: TCreateVersion): Promise<TVersion>;\n  abstract getVersion(id: string): Promise<TVersion | null>;\n  abstract getVersionByNumber(entityId: string, versionNumber: number): Promise<TVersion | null>;\n  abstract getLatestVersion(entityId: string): Promise<TVersion | null>;\n  abstract listVersions(input: TListVersionsInput): Promise<TListVersionsOutput>;\n  abstract deleteVersion(id: string): Promise<void>;\n  abstract deleteVersionsByParentId(entityId: string): Promise<void>;\n  abstract countVersions(entityId: string): Promise<number>;\n\n  // ==========================================================================\n  // Concrete resolution methods\n  // ==========================================================================\n\n  /**\n   * Strips version metadata fields from a version row, leaving only snapshot config fields.\n   */\n  protected extractSnapshotConfig(version: TVersion): Partial<TSnapshot> {\n    const result: Record<string, unknown> = {};\n    const metadataSet = new Set(this.versionMetadataFields);\n\n    for (const [key, value] of Object.entries(version)) {\n      if (!metadataSet.has(key)) {\n        result[key] = value;\n      }\n    }\n\n    return result as Partial<TSnapshot>;\n  }\n\n  /**\n   * Resolves an entity by merging its thin record with the active or latest version config.\n   * - `{ status: 'draft' }` — resolve with the latest version.\n   * - `{ status: 'published' }` (default) — resolve with the active version, falling back to latest.\n   * - `{ versionId: '...' }` — resolve with a specific version by ID.\n   */\n  async getByIdResolved(id: string, options?: VersionResolutionOptions): Promise<TResolved | null> {\n    const entity = await this.getById(id);\n\n    if (!entity) {\n      return null;\n    }\n\n    return this.resolveEntity(entity, options);\n  }\n\n  /**\n   * Lists entities with version resolution.\n   * When `status` is `'draft'`, each entity is resolved with its latest version.\n   * When `status` is `'published'` (default), each entity is resolved with its active version.\n   */\n  async listResolved(args?: TListInput): Promise<TListResolvedOutput> {\n    const result = await this.list(args);\n\n    const status = (args as Record<string, unknown> | undefined)?.status as string | undefined;\n    const entities = (result as Record<string, unknown>)[this.listKey] as TEntity[];\n    const resolved = await Promise.all(\n      entities.map(entity => this.resolveEntity(entity, { status: status as 'draft' | 'published' | 'archived' })),\n    );\n\n    return {\n      ...result,\n      [this.listKey]: resolved,\n    } as TListResolvedOutput;\n  }\n\n  /**\n   * Resolves a single entity by merging it with its active or latest version.\n   * - `{ versionId: '...' }` — resolve with a specific version by ID.\n   * - `{ status: 'published' }` (default) — use activeVersionId, fall back to latest.\n   * - `{ status: 'draft' }` — always use the latest version.\n   */\n  protected async resolveEntity(entity: TEntity, options?: VersionResolutionOptions): Promise<TResolved> {\n    const status = options?.status || 'published';\n    let version: TVersion | null = null;\n\n    if (options?.versionId) {\n      // Specific version resolution: fetch by exact version ID\n      version = await this.getVersion(options.versionId);\n    } else if (status === 'draft') {\n      // Draft resolution: always use the latest version (which may be ahead of activeVersionId)\n      version = await this.getLatestVersion(entity.id);\n    } else {\n      // Published/archived resolution: use activeVersionId, fall back to latest\n      if (entity.activeVersionId) {\n        version = await this.getVersion(entity.activeVersionId);\n\n        if (!version) {\n          this.logger?.warn?.(\n            `Entity ${entity.id} has activeVersionId ${entity.activeVersionId} but version not found. Falling back to latest version.`,\n          );\n        }\n      }\n\n      if (!version) {\n        version = await this.getLatestVersion(entity.id);\n      }\n    }\n\n    if (version) {\n      const snapshotConfig = this.extractSnapshotConfig(version);\n      return {\n        ...entity,\n        ...snapshotConfig,\n        resolvedVersionId: version.id,\n      } as unknown as TResolved;\n    }\n\n    return entity as unknown as TResolved;\n  }\n\n  // ==========================================================================\n  // Protected Helper Methods\n  // ==========================================================================\n\n  protected parseOrderBy(\n    orderBy?: StorageOrderBy,\n    defaultDirection: ThreadSortDirection = 'DESC',\n  ): { field: ThreadOrderBy; direction: ThreadSortDirection } {\n    return {\n      field: orderBy?.field && orderBy.field in ENTITY_ORDER_BY_SET ? orderBy.field : 'createdAt',\n      direction: orderBy?.direction && orderBy.direction in SORT_DIRECTION_SET ? orderBy.direction : defaultDirection,\n    };\n  }\n\n  protected parseVersionOrderBy(\n    orderBy?: TListVersionsInput['orderBy'],\n    defaultDirection: VersionSortDirectionGeneric = 'DESC',\n  ): { field: VersionOrderByGeneric; direction: VersionSortDirectionGeneric } {\n    return {\n      field: orderBy?.field && orderBy.field in VERSION_ORDER_BY_SET ? orderBy.field : 'versionNumber',\n      direction: orderBy?.direction && orderBy.direction in SORT_DIRECTION_SET ? orderBy.direction : defaultDirection,\n    };\n  }\n}\n","import type {\n  StorageAgentType,\n  StorageAgentSnapshotType,\n  StorageResolvedAgentType,\n  StorageCreateAgentInput,\n  StorageUpdateAgentInput,\n  StorageListAgentsInput,\n  StorageListAgentsOutput,\n  StorageListAgentsResolvedOutput,\n} from '../../types';\nimport { VersionedStorageDomain } from '../versioned';\nimport type { VersionBase, CreateVersionInputBase, ListVersionsInputBase, ListVersionsOutputBase } from '../versioned';\n\n// ============================================================================\n// Agent Version Types\n// ============================================================================\n\n/**\n * Represents a stored version of an agent configuration.\n * The config fields are top-level on the version row (no nested snapshot object).\n */\nexport interface AgentVersion extends StorageAgentSnapshotType, VersionBase {\n  /** ID of the agent this version belongs to */\n  agentId: string;\n}\n\n/**\n * Input for creating a new agent version.\n * Config fields are top-level (no nested snapshot object).\n */\nexport interface CreateVersionInput extends StorageAgentSnapshotType, CreateVersionInputBase {\n  /** ID of the agent this version belongs to */\n  agentId: string;\n}\n\n/**\n * Sort direction for version listings.\n */\nexport type VersionSortDirection = 'ASC' | 'DESC';\n\n/**\n * Fields that can be used for ordering version listings.\n */\nexport type VersionOrderBy = 'versionNumber' | 'createdAt';\n\n/**\n * Input for listing agent versions with pagination and sorting.\n */\nexport interface ListVersionsInput extends ListVersionsInputBase {\n  /** ID of the agent to list versions for */\n  agentId: string;\n}\n\n/**\n * Output for listing agent versions with pagination info.\n */\nexport interface ListVersionsOutput extends ListVersionsOutputBase<AgentVersion> {}\n\n// ============================================================================\n// AgentsStorage Base Class\n// ============================================================================\n\nexport abstract class AgentsStorage extends VersionedStorageDomain<\n  StorageAgentType,\n  StorageAgentSnapshotType,\n  StorageResolvedAgentType,\n  AgentVersion,\n  CreateVersionInput,\n  ListVersionsInput,\n  ListVersionsOutput,\n  { agent: StorageCreateAgentInput },\n  StorageUpdateAgentInput,\n  StorageListAgentsInput | undefined,\n  StorageListAgentsOutput,\n  StorageListAgentsResolvedOutput\n> {\n  protected readonly listKey = 'agents';\n  protected readonly versionMetadataFields = [\n    'id',\n    'agentId',\n    'versionNumber',\n    'changedFields',\n    'changeMessage',\n    'createdAt',\n  ] satisfies (keyof AgentVersion)[];\n\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'AGENTS',\n    });\n  }\n}\n","import { deepEqual } from '../../../utils';\nimport { normalizePerPage, calculatePagination } from '../../base';\nimport type {\n  StorageAgentType,\n  StorageCreateAgentInput,\n  StorageUpdateAgentInput,\n  StorageListAgentsInput,\n  StorageListAgentsOutput,\n  ThreadOrderBy,\n  ThreadSortDirection,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport type {\n  AgentVersion,\n  CreateVersionInput,\n  ListVersionsInput,\n  ListVersionsOutput,\n  VersionOrderBy,\n  VersionSortDirection,\n} from './base';\nimport { AgentsStorage } from './base';\n\nexport class InMemoryAgentsStorage extends AgentsStorage {\n  private db: InMemoryDB;\n\n  constructor({ db }: { db: InMemoryDB }) {\n    super();\n    this.db = db;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.db.agents.clear();\n    this.db.agentVersions.clear();\n  }\n\n  // ==========================================================================\n  // Agent CRUD Methods\n  // ==========================================================================\n\n  async getById(id: string): Promise<StorageAgentType | null> {\n    const agent = this.db.agents.get(id);\n    return agent ? this.deepCopyAgent(agent) : null;\n  }\n\n  async create(input: { agent: StorageCreateAgentInput }): Promise<StorageAgentType> {\n    const { agent } = input;\n\n    if (this.db.agents.has(agent.id)) {\n      throw new Error(`Agent with id ${agent.id} already exists`);\n    }\n\n    const now = new Date();\n    const newAgent: StorageAgentType = {\n      id: agent.id,\n      status: 'draft',\n      activeVersionId: undefined,\n      authorId: agent.authorId,\n      metadata: agent.metadata,\n      createdAt: now,\n      updatedAt: now,\n    };\n\n    this.db.agents.set(agent.id, newAgent);\n\n    // Extract config fields from the flat input (everything except agent-record fields)\n    const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = agent;\n\n    // Create version 1 from the config\n    const versionId = crypto.randomUUID();\n    await this.createVersion({\n      id: versionId,\n      agentId: agent.id,\n      versionNumber: 1,\n      ...snapshotConfig,\n      changedFields: Object.keys(snapshotConfig),\n      changeMessage: 'Initial version',\n    });\n\n    // Return the thin agent record (activeVersionId remains null)\n    return this.deepCopyAgent(newAgent);\n  }\n\n  async update(input: StorageUpdateAgentInput): Promise<StorageAgentType> {\n    const { id, ...updates } = input;\n\n    const existingAgent = this.db.agents.get(id);\n    if (!existingAgent) {\n      throw new Error(`Agent with id ${id} not found`);\n    }\n\n    const { authorId, activeVersionId, metadata, status } = updates;\n\n    const updatedAgent: StorageAgentType = {\n      ...existingAgent,\n      ...(authorId !== undefined && { authorId }),\n      ...(activeVersionId !== undefined && { activeVersionId }),\n      ...(metadata !== undefined && {\n        metadata: { ...existingAgent.metadata, ...metadata },\n      }),\n      ...(status !== undefined && { status }),\n      updatedAt: new Date(),\n    };\n\n    this.db.agents.set(id, updatedAgent);\n    return this.deepCopyAgent(updatedAgent);\n  }\n\n  async delete(id: string): Promise<void> {\n    // Idempotent delete - no-op if agent doesn't exist\n    this.db.agents.delete(id);\n    // Also delete all versions for this agent\n    await this.deleteVersionsByParentId(id);\n  }\n\n  async list(args?: StorageListAgentsInput): Promise<StorageListAgentsOutput> {\n    const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {};\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 100)\n    const perPage = normalizePerPage(perPageInput, 100);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // Prevent unreasonably large page values\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Get all agents and apply filters\n    let agents = Array.from(this.db.agents.values());\n\n    // Filter by status\n    if (status) {\n      agents = agents.filter(agent => agent.status === status);\n    }\n\n    // Filter by authorId if provided\n    if (authorId !== undefined) {\n      agents = agents.filter(agent => agent.authorId === authorId);\n    }\n\n    // Filter by metadata if provided (AND logic - all key-value pairs must match)\n    if (metadata && Object.keys(metadata).length > 0) {\n      agents = agents.filter(agent => {\n        if (!agent.metadata) return false;\n        return Object.entries(metadata).every(([key, value]) => deepEqual(agent.metadata![key], value));\n      });\n    }\n\n    // Sort filtered agents\n    const sortedAgents = this.sortAgents(agents, field, direction);\n\n    // Deep clone agents to avoid mutation\n    const clonedAgents = sortedAgents.map(agent => this.deepCopyAgent(agent));\n\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    return {\n      agents: clonedAgents.slice(offset, offset + perPage),\n      total: clonedAgents.length,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < clonedAgents.length,\n    };\n  }\n\n  // ==========================================================================\n  // Agent Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateVersionInput): Promise<AgentVersion> {\n    // Check if version with this ID already exists (versions are immutable)\n    if (this.db.agentVersions.has(input.id)) {\n      throw new Error(`Version with id ${input.id} already exists`);\n    }\n\n    // Check for duplicate (agentId, versionNumber) pair\n    for (const version of this.db.agentVersions.values()) {\n      if (version.agentId === input.agentId && version.versionNumber === input.versionNumber) {\n        throw new Error(`Version number ${input.versionNumber} already exists for agent ${input.agentId}`);\n      }\n    }\n\n    const version: AgentVersion = {\n      ...input,\n      createdAt: new Date(),\n    };\n\n    // Deep clone before storing to prevent external mutation\n    this.db.agentVersions.set(input.id, this.deepCopyVersion(version));\n    return this.deepCopyVersion(version);\n  }\n\n  async getVersion(id: string): Promise<AgentVersion | null> {\n    const version = this.db.agentVersions.get(id);\n    return version ? this.deepCopyVersion(version) : null;\n  }\n\n  async getVersionByNumber(agentId: string, versionNumber: number): Promise<AgentVersion | null> {\n    for (const version of this.db.agentVersions.values()) {\n      if (version.agentId === agentId && version.versionNumber === versionNumber) {\n        return this.deepCopyVersion(version);\n      }\n    }\n    return null;\n  }\n\n  async getLatestVersion(agentId: string): Promise<AgentVersion | null> {\n    let latest: AgentVersion | null = null;\n    for (const version of this.db.agentVersions.values()) {\n      if (version.agentId === agentId) {\n        if (!latest || version.versionNumber > latest.versionNumber) {\n          latest = version;\n        }\n      }\n    }\n    return latest ? this.deepCopyVersion(latest) : null;\n  }\n\n  async listVersions(input: ListVersionsInput): Promise<ListVersionsOutput> {\n    const { agentId, page = 0, perPage: perPageInput, orderBy } = input;\n    const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n    // Normalize perPage for query (false -> MAX_SAFE_INTEGER, 0 -> 0, undefined -> 20)\n    const perPage = normalizePerPage(perPageInput, 20);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // Prevent unreasonably large page values\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Filter versions by agentId\n    let versions = Array.from(this.db.agentVersions.values()).filter(v => v.agentId === agentId);\n\n    // Sort versions\n    versions = this.sortVersions(versions, field, direction);\n\n    // Deep clone versions to avoid mutation\n    const clonedVersions = versions.map(v => this.deepCopyVersion(v));\n\n    const total = clonedVersions.length;\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const paginatedVersions = clonedVersions.slice(offset, offset + perPage);\n\n    return {\n      versions: paginatedVersions,\n      total,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < total,\n    };\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    // Idempotent delete - no-op if version doesn't exist\n    this.db.agentVersions.delete(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    const idsToDelete: string[] = [];\n    for (const [id, version] of this.db.agentVersions.entries()) {\n      if (version.agentId === entityId) {\n        idsToDelete.push(id);\n      }\n    }\n\n    for (const id of idsToDelete) {\n      this.db.agentVersions.delete(id);\n    }\n  }\n\n  async countVersions(agentId: string): Promise<number> {\n    let count = 0;\n    for (const version of this.db.agentVersions.values()) {\n      if (version.agentId === agentId) {\n        count++;\n      }\n    }\n    return count;\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  /**\n   * Deep copy a thin agent record to prevent external mutation of stored data\n   */\n  private deepCopyAgent(agent: StorageAgentType): StorageAgentType {\n    return {\n      ...agent,\n      metadata: agent.metadata ? { ...agent.metadata } : agent.metadata,\n    };\n  }\n\n  /**\n   * Deep copy a version to prevent external mutation of stored data\n   */\n  private deepCopyVersion(version: AgentVersion): AgentVersion {\n    return structuredClone(version);\n  }\n\n  private sortAgents(\n    agents: StorageAgentType[],\n    field: ThreadOrderBy,\n    direction: ThreadSortDirection,\n  ): StorageAgentType[] {\n    return agents.sort((a, b) => {\n      const aValue = new Date(a[field]).getTime();\n      const bValue = new Date(b[field]).getTime();\n\n      return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n    });\n  }\n\n  private sortVersions(\n    versions: AgentVersion[],\n    field: VersionOrderBy,\n    direction: VersionSortDirection,\n  ): AgentVersion[] {\n    return versions.sort((a, b) => {\n      let aVal: number;\n      let bVal: number;\n\n      if (field === 'createdAt') {\n        aVal = a.createdAt.getTime();\n        bVal = b.createdAt.getTime();\n      } else {\n        // versionNumber\n        aVal = a.versionNumber;\n        bVal = b.versionNumber;\n      }\n\n      return direction === 'ASC' ? aVal - bVal : bVal - aVal;\n    });\n  }\n}\n","import { MastraBase } from '../../../base';\nimport type { StorageBlobEntry } from '../../types';\n\n/**\n * Abstract base class for content-addressable blob storage.\n * Used to store file contents for skill versioning.\n *\n * Blobs are keyed by their SHA-256 hash, providing natural deduplication.\n */\nexport abstract class BlobStore extends MastraBase {\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'BLOBS',\n    });\n  }\n\n  /**\n   * Initialize the blob store (create tables, etc).\n   */\n  abstract init(): Promise<void>;\n\n  /**\n   * Store a blob. If the hash already exists, this is a no-op.\n   */\n  abstract put(entry: StorageBlobEntry): Promise<void>;\n\n  /**\n   * Retrieve a blob by its hash.\n   * Returns null if not found.\n   */\n  abstract get(hash: string): Promise<StorageBlobEntry | null>;\n\n  /**\n   * Check if a blob exists by hash.\n   */\n  abstract has(hash: string): Promise<boolean>;\n\n  /**\n   * Delete a blob by hash.\n   * Returns true if the blob was deleted, false if it didn't exist.\n   */\n  abstract delete(hash: string): Promise<boolean>;\n\n  /**\n   * Store multiple blobs in a batch. Skips any that already exist.\n   */\n  abstract putMany(entries: StorageBlobEntry[]): Promise<void>;\n\n  /**\n   * Retrieve multiple blobs by their hashes.\n   * Returns a Map of hash -> entry. Missing hashes are omitted.\n   */\n  abstract getMany(hashes: string[]): Promise<Map<string, StorageBlobEntry>>;\n\n  /**\n   * Delete all blobs. Used for testing.\n   */\n  abstract dangerouslyClearAll(): Promise<void>;\n}\n","import type { StorageBlobEntry } from '../../types';\nimport { BlobStore } from './base';\n\n/**\n * In-memory implementation of BlobStore for testing.\n */\nexport class InMemoryBlobStore extends BlobStore {\n  readonly #blobs = new Map<string, StorageBlobEntry>();\n\n  async init(): Promise<void> {\n    // No-op for in-memory store\n  }\n\n  async put(entry: StorageBlobEntry): Promise<void> {\n    if (!this.#blobs.has(entry.hash)) {\n      this.#blobs.set(entry.hash, entry);\n    }\n  }\n\n  async get(hash: string): Promise<StorageBlobEntry | null> {\n    return this.#blobs.get(hash) ?? null;\n  }\n\n  async has(hash: string): Promise<boolean> {\n    return this.#blobs.has(hash);\n  }\n\n  async delete(hash: string): Promise<boolean> {\n    return this.#blobs.delete(hash);\n  }\n\n  async putMany(entries: StorageBlobEntry[]): Promise<void> {\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    for (const hash of hashes) {\n      const blob = this.#blobs.get(hash);\n      if (blob) {\n        result.set(hash, blob);\n      }\n    }\n    return result;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.#blobs.clear();\n  }\n}\n","/** Field-level validation error */\nexport interface FieldError {\n  /** JSON Pointer path, e.g., \"/name\" or \"/address/city\" */\n  path: string;\n  /** Zod error code, e.g., \"invalid_type\", \"too_small\" */\n  code: string;\n  /** Human-readable error message */\n  message: string;\n}\n\n/** Schema validation error with field details */\nexport class SchemaValidationError extends Error {\n  constructor(\n    public readonly field: 'input' | 'groundTruth',\n    public readonly errors: FieldError[],\n  ) {\n    const summary = errors\n      .slice(0, 3)\n      .map(e => e.message)\n      .join('; ');\n    super(`Validation failed for ${field}: ${summary}`);\n    this.name = 'SchemaValidationError';\n  }\n}\n\n/** Batch validation result for multiple items */\nexport interface BatchValidationResult {\n  valid: Array<{ index: number; data: unknown }>;\n  invalid: Array<{\n    index: number;\n    data: unknown;\n    field: 'input' | 'groundTruth';\n    errors: FieldError[];\n  }>;\n}\n\n/** Error thrown when schema update would invalidate existing items */\nexport class SchemaUpdateValidationError extends Error {\n  constructor(\n    public readonly failingItems: Array<{\n      index: number;\n      data: unknown;\n      field: 'input' | 'groundTruth';\n      errors: FieldError[];\n    }>,\n  ) {\n    const count = failingItems.length;\n    super(`Cannot update schema: ${count} existing item(s) would fail validation`);\n    this.name = 'SchemaUpdateValidationError';\n  }\n}\n","import { jsonSchemaToZod } from '@mastra/schema-compat/json-to-zod';\nimport type { JSONSchema7 } from 'json-schema';\nimport type { ZodSchema, ZodError, ZodIssue } from 'zod/v4';\nimport { z } from 'zod/v4';\nimport { SchemaValidationError } from './errors';\nimport type { FieldError, BatchValidationResult } from './errors';\n\n/**\n * Convert JSON Schema string to runtime Zod schema.\n * Uses Function() to evaluate the generated Zod code - same pattern as workflow validation.\n */\nfunction resolveZodSchema(zodString: string): ZodSchema {\n  return Function('z', `\"use strict\";return (${zodString});`)(z);\n}\n\n/** Schema validator with compilation caching */\nexport class SchemaValidator {\n  private cache = new Map<string, ZodSchema>();\n\n  /** Get or compile validator for schema */\n  private getValidator(schema: JSONSchema7, cacheKey: string): ZodSchema {\n    let zodSchema = this.cache.get(cacheKey);\n    if (!zodSchema) {\n      const zodString = jsonSchemaToZod(schema);\n      zodSchema = resolveZodSchema(zodString);\n      this.cache.set(cacheKey, zodSchema);\n    }\n    return zodSchema;\n  }\n\n  /** Clear cached validator (call when schema changes) */\n  clearCache(cacheKey: string): void {\n    this.cache.delete(cacheKey);\n  }\n\n  /** Validate data against schema */\n  validate(data: unknown, schema: JSONSchema7, field: 'input' | 'groundTruth', cacheKey: string): void {\n    const zodSchema = this.getValidator(schema, cacheKey);\n    const result = zodSchema.safeParse(data);\n    if (!result.success) {\n      throw new SchemaValidationError(field, this.formatErrors(result.error));\n    }\n  }\n\n  /** Validate multiple items, returning valid/invalid split */\n  validateBatch(\n    items: Array<{ input: unknown; groundTruth?: unknown }>,\n    inputSchema: JSONSchema7 | null | undefined,\n    outputSchema: JSONSchema7 | null | undefined,\n    cacheKeyPrefix: string,\n    maxErrors = 10,\n  ): BatchValidationResult {\n    const result: BatchValidationResult = { valid: [], invalid: [] };\n\n    // Pre-compile schemas for performance\n    const inputValidator = inputSchema ? this.getValidator(inputSchema, `${cacheKeyPrefix}:input`) : null;\n    const outputValidator = outputSchema ? this.getValidator(outputSchema, `${cacheKeyPrefix}:output`) : null;\n\n    for (const [i, item] of items.entries()) {\n      let hasError = false;\n\n      // Validate input if schema enabled\n      if (inputValidator) {\n        const inputResult = inputValidator.safeParse(item.input);\n        if (!inputResult.success) {\n          result.invalid.push({\n            index: i,\n            data: item,\n            field: 'input',\n            errors: this.formatErrors(inputResult.error),\n          });\n          hasError = true;\n          if (result.invalid.length >= maxErrors) break;\n        }\n      }\n\n      // Validate groundTruth if schema enabled and value provided\n      if (!hasError && outputValidator && item.groundTruth !== undefined) {\n        const outputResult = outputValidator.safeParse(item.groundTruth);\n        if (!outputResult.success) {\n          result.invalid.push({\n            index: i,\n            data: item,\n            field: 'groundTruth',\n            errors: this.formatErrors(outputResult.error),\n          });\n          hasError = true;\n          if (result.invalid.length >= maxErrors) break;\n        }\n      }\n\n      if (!hasError) {\n        result.valid.push({ index: i, data: item });\n      }\n    }\n\n    return result;\n  }\n\n  /** Format Zod errors to FieldError array */\n  private formatErrors(error: ZodError): FieldError[] {\n    return error.issues.slice(0, 5).map((issue: ZodIssue) => ({\n      // Convert Zod path array to JSON Pointer string\n      path: issue.path.length > 0 ? '/' + issue.path.join('/') : '/',\n      code: issue.code,\n      message: issue.message,\n    }));\n  }\n}\n\n/** Singleton validator instance */\nlet validatorInstance: SchemaValidator | null = null;\n\n/** Get or create validator instance */\nexport function getSchemaValidator(): SchemaValidator {\n  if (!validatorInstance) {\n    validatorInstance = new SchemaValidator();\n  }\n  return validatorInstance;\n}\n\n/** Create new validator (for testing) */\nexport function createValidator(): SchemaValidator {\n  return new SchemaValidator();\n}\n","import { getSchemaValidator, SchemaUpdateValidationError } from '../../../datasets/validation';\nimport type {\n  DatasetRecord,\n  DatasetItem,\n  DatasetItemRow,\n  DatasetVersion,\n  CreateDatasetInput,\n  UpdateDatasetInput,\n  AddDatasetItemInput,\n  UpdateDatasetItemInput,\n  ListDatasetsInput,\n  ListDatasetsOutput,\n  ListDatasetItemsInput,\n  ListDatasetItemsOutput,\n  ListDatasetVersionsInput,\n  ListDatasetVersionsOutput,\n  BatchInsertItemsInput,\n  BatchDeleteItemsInput,\n} from '../../types';\nimport { StorageDomain } from '../base';\n\n/**\n * Abstract base class for datasets storage domain.\n * Provides the contract for dataset and dataset item CRUD operations.\n *\n * Schema validation is handled in this base class via Template Method pattern.\n * Subclasses implement protected _do* methods for actual storage operations,\n * including SCD-2 versioning (version bump, row ops, dataset_version insert).\n */\nexport abstract class DatasetsStorage extends StorageDomain {\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'DATASETS',\n    });\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    // Default no-op - subclasses override\n  }\n\n  // Dataset CRUD\n  abstract createDataset(input: CreateDatasetInput): Promise<DatasetRecord>;\n  abstract getDatasetById(args: { id: string }): Promise<DatasetRecord | null>;\n  abstract deleteDataset(args: { id: string }): Promise<void>;\n  abstract listDatasets(args: ListDatasetsInput): Promise<ListDatasetsOutput>;\n\n  /**\n   * Update a dataset. Validates existing items against new schemas if schemas are changing.\n   * Subclasses implement _doUpdateDataset for actual storage operation.\n   */\n  async updateDataset(args: UpdateDatasetInput): Promise<DatasetRecord> {\n    const existing = await this.getDatasetById({ id: args.id });\n    if (!existing) {\n      throw new Error(`Dataset not found: ${args.id}`);\n    }\n\n    // Check if schemas are being added or modified\n    const inputSchemaChanging =\n      args.inputSchema !== undefined && JSON.stringify(args.inputSchema) !== JSON.stringify(existing.inputSchema);\n    const groundTruthSchemaChanging =\n      args.groundTruthSchema !== undefined &&\n      JSON.stringify(args.groundTruthSchema) !== JSON.stringify(existing.groundTruthSchema);\n\n    // If schemas changing, validate all existing items against new schemas\n    if (inputSchemaChanging || groundTruthSchemaChanging) {\n      const itemsResult = await this.listItems({\n        datasetId: args.id,\n        pagination: { page: 0, perPage: false }, // Get all items\n      });\n      const items = itemsResult.items;\n\n      if (items.length > 0) {\n        const validator = getSchemaValidator();\n        const newInputSchema = args.inputSchema !== undefined ? args.inputSchema : existing.inputSchema;\n        const newOutputSchema =\n          args.groundTruthSchema !== undefined ? args.groundTruthSchema : existing.groundTruthSchema;\n\n        const result = validator.validateBatch(\n          items.map(i => ({ input: i.input, groundTruth: i.groundTruth })),\n          newInputSchema,\n          newOutputSchema,\n          `dataset:${args.id}:schema-update`,\n          10, // Max 10 errors to report\n        );\n\n        if (result.invalid.length > 0) {\n          throw new SchemaUpdateValidationError(result.invalid);\n        }\n\n        // Clear old cache since schema changed\n        validator.clearCache(`dataset:${args.id}:input`);\n        validator.clearCache(`dataset:${args.id}:output`);\n      }\n    }\n\n    return this._doUpdateDataset(args);\n  }\n\n  /** Subclasses implement actual storage update logic */\n  protected abstract _doUpdateDataset(args: UpdateDatasetInput): Promise<DatasetRecord>;\n\n  /**\n   * Add an item to a dataset. Validates input/groundTruth against dataset schemas.\n   * Subclasses implement _doAddItem which handles SCD-2 versioning internally.\n   */\n  async addItem(args: AddDatasetItemInput): Promise<DatasetItem> {\n    const dataset = await this.getDatasetById({ id: args.datasetId });\n    if (!dataset) {\n      throw new Error(`Dataset not found: ${args.datasetId}`);\n    }\n\n    // Validate against schemas if enabled\n    const validator = getSchemaValidator();\n    const cacheKey = `dataset:${args.datasetId}`;\n\n    if (dataset.inputSchema) {\n      validator.validate(args.input, dataset.inputSchema, 'input', `${cacheKey}:input`);\n    }\n\n    if (dataset.groundTruthSchema && args.groundTruth !== undefined) {\n      validator.validate(args.groundTruth, dataset.groundTruthSchema, 'groundTruth', `${cacheKey}:output`);\n    }\n\n    return this._doAddItem(args);\n  }\n\n  /** Subclasses implement actual storage add logic with SCD-2 versioning */\n  protected abstract _doAddItem(args: AddDatasetItemInput): Promise<DatasetItem>;\n\n  /**\n   * Update an item in a dataset. Validates changed fields against dataset schemas.\n   * Subclasses implement _doUpdateItem which handles SCD-2 versioning internally.\n   */\n  async updateItem(args: UpdateDatasetItemInput): Promise<DatasetItem> {\n    const dataset = await this.getDatasetById({ id: args.datasetId });\n    if (!dataset) {\n      throw new Error(`Dataset not found: ${args.datasetId}`);\n    }\n\n    // Validate new values against schemas if enabled\n    const validator = getSchemaValidator();\n    const cacheKey = `dataset:${args.datasetId}`;\n\n    if (args.input !== undefined && dataset.inputSchema) {\n      validator.validate(args.input, dataset.inputSchema, 'input', `${cacheKey}:input`);\n    }\n\n    if (args.groundTruth !== undefined && dataset.groundTruthSchema) {\n      validator.validate(args.groundTruth, dataset.groundTruthSchema, 'groundTruth', `${cacheKey}:output`);\n    }\n\n    return this._doUpdateItem(args);\n  }\n\n  /** Subclasses implement actual storage update logic with SCD-2 versioning */\n  protected abstract _doUpdateItem(args: UpdateDatasetItemInput): Promise<DatasetItem>;\n\n  /**\n   * Delete an item from a dataset. Creates a tombstone row via SCD-2.\n   * Subclasses implement _doDeleteItem which handles SCD-2 versioning internally.\n   */\n  async deleteItem(args: { id: string; datasetId: string }): Promise<void> {\n    return this._doDeleteItem(args);\n  }\n\n  /** Subclasses implement actual storage delete logic with SCD-2 versioning */\n  protected abstract _doDeleteItem(args: { id: string; datasetId: string }): Promise<void>;\n\n  abstract listItems(args: ListDatasetItemsInput): Promise<ListDatasetItemsOutput>;\n  abstract getItemById(args: { id: string; datasetVersion?: number }): Promise<DatasetItem | null>;\n\n  // SCD-2 queries\n  abstract getItemsByVersion(args: { datasetId: string; version: number }): Promise<DatasetItem[]>;\n  abstract getItemHistory(itemId: string): Promise<DatasetItemRow[]>;\n\n  // Dataset version methods\n  abstract createDatasetVersion(datasetId: string, version: number): Promise<DatasetVersion>;\n  abstract listDatasetVersions(input: ListDatasetVersionsInput): Promise<ListDatasetVersionsOutput>;\n\n  /**\n   * Batch insert items to a dataset. Validates all items against dataset schemas,\n   * then delegates to subclass which handles SCD-2 versioning internally.\n   */\n  async batchInsertItems(input: BatchInsertItemsInput): Promise<DatasetItem[]> {\n    const dataset = await this.getDatasetById({ id: input.datasetId });\n    if (!dataset) {\n      throw new Error(`Dataset not found: ${input.datasetId}`);\n    }\n\n    // Validate all items against schemas\n    const validator = getSchemaValidator();\n    const cacheKey = `dataset:${input.datasetId}`;\n\n    for (const itemData of input.items) {\n      if (dataset.inputSchema) {\n        validator.validate(itemData.input, dataset.inputSchema, 'input', `${cacheKey}:input`);\n      }\n      if (dataset.groundTruthSchema && itemData.groundTruth !== undefined) {\n        validator.validate(itemData.groundTruth, dataset.groundTruthSchema, 'groundTruth', `${cacheKey}:output`);\n      }\n    }\n\n    return this._doBatchInsertItems(input);\n  }\n\n  /** Subclasses implement batch insert with SCD-2 versioning */\n  protected abstract _doBatchInsertItems(input: BatchInsertItemsInput): Promise<DatasetItem[]>;\n\n  /**\n   * Batch delete items from a dataset. Creates tombstone rows via SCD-2.\n   * Subclasses implement _doBatchDeleteItems which handles SCD-2 versioning internally.\n   */\n  async batchDeleteItems(input: BatchDeleteItemsInput): Promise<void> {\n    const dataset = await this.getDatasetById({ id: input.datasetId });\n    if (!dataset) {\n      throw new Error(`Dataset not found: ${input.datasetId}`);\n    }\n\n    return this._doBatchDeleteItems(input);\n  }\n\n  /** Subclasses implement batch delete with SCD-2 versioning */\n  protected abstract _doBatchDeleteItems(input: BatchDeleteItemsInput): Promise<void>;\n}\n","import { calculatePagination, normalizePerPage } from '../../base';\nimport type {\n  DatasetRecord,\n  DatasetItem,\n  DatasetItemRow,\n  DatasetVersion,\n  CreateDatasetInput,\n  UpdateDatasetInput,\n  AddDatasetItemInput,\n  UpdateDatasetItemInput,\n  ListDatasetsInput,\n  ListDatasetsOutput,\n  ListDatasetItemsInput,\n  ListDatasetItemsOutput,\n  ListDatasetVersionsInput,\n  ListDatasetVersionsOutput,\n  BatchInsertItemsInput,\n  BatchDeleteItemsInput,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { DatasetsStorage } from './base';\n\n/** Convert a storage row to the public DatasetItem type (strips validTo/isDeleted) */\nfunction toDatasetItem(row: DatasetItemRow): DatasetItem {\n  return {\n    id: row.id,\n    datasetId: row.datasetId,\n    datasetVersion: row.datasetVersion,\n    input: row.input,\n    groundTruth: row.groundTruth,\n    expectedTrajectory: row.expectedTrajectory,\n    requestContext: row.requestContext,\n    metadata: row.metadata,\n    source: row.source,\n    createdAt: row.createdAt,\n    updatedAt: row.updatedAt,\n  };\n}\n\n/** Internal record that allows null schemas (for \"clear schema\" semantics) */\ntype InternalDatasetRecord = Omit<DatasetRecord, 'inputSchema' | 'groundTruthSchema' | 'requestContextSchema'> & {\n  inputSchema?: Record<string, unknown> | null;\n  groundTruthSchema?: Record<string, unknown> | null;\n  requestContextSchema?: Record<string, unknown> | null;\n};\n\n/** Normalize internal record (which may have null schemas) to public DatasetRecord */\nfunction toDatasetRecord(record: InternalDatasetRecord): DatasetRecord {\n  return {\n    ...record,\n    inputSchema: record.inputSchema ?? undefined,\n    groundTruthSchema: record.groundTruthSchema ?? undefined,\n    requestContextSchema: record.requestContextSchema ?? undefined,\n  };\n}\n\nexport class DatasetsInMemory extends DatasetsStorage {\n  private db: InMemoryDB;\n\n  constructor({ db }: { db: InMemoryDB }) {\n    super();\n    this.db = db;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.db.datasets.clear();\n    this.db.datasetItems.clear();\n    this.db.datasetVersions.clear();\n  }\n\n  // Dataset CRUD\n  async createDataset(input: CreateDatasetInput): Promise<DatasetRecord> {\n    const id = crypto.randomUUID();\n    const now = new Date();\n    const dataset = {\n      id,\n      name: input.name,\n      description: input.description,\n      metadata: input.metadata,\n      inputSchema: input.inputSchema,\n      groundTruthSchema: input.groundTruthSchema,\n      requestContextSchema: input.requestContextSchema,\n      targetType: input.targetType,\n      targetIds: input.targetIds,\n      scorerIds: input.scorerIds ?? null,\n      version: 0,\n      createdAt: now,\n      updatedAt: now,\n    } as DatasetRecord;\n    this.db.datasets.set(id, dataset);\n    return toDatasetRecord(dataset);\n  }\n\n  async getDatasetById({ id }: { id: string }): Promise<DatasetRecord | null> {\n    const record = this.db.datasets.get(id);\n    return record ? toDatasetRecord(record) : null;\n  }\n\n  protected async _doUpdateDataset(args: UpdateDatasetInput): Promise<DatasetRecord> {\n    const existing = this.db.datasets.get(args.id);\n    if (!existing) {\n      throw new Error(`Dataset not found: ${args.id}`);\n    }\n\n    const updated = {\n      ...existing,\n      name: args.name ?? existing.name,\n      description: args.description ?? existing.description,\n      metadata: args.metadata ?? existing.metadata,\n      inputSchema: args.inputSchema !== undefined ? args.inputSchema : existing.inputSchema,\n      groundTruthSchema: args.groundTruthSchema !== undefined ? args.groundTruthSchema : existing.groundTruthSchema,\n      requestContextSchema:\n        args.requestContextSchema !== undefined ? args.requestContextSchema : existing.requestContextSchema,\n      tags: args.tags !== undefined ? args.tags : existing.tags,\n      targetType: args.targetType !== undefined ? args.targetType : existing.targetType,\n      targetIds: args.targetIds !== undefined ? args.targetIds : existing.targetIds,\n      scorerIds: args.scorerIds !== undefined ? args.scorerIds : existing.scorerIds,\n      updatedAt: new Date(),\n    } as DatasetRecord;\n    this.db.datasets.set(args.id, updated);\n    return toDatasetRecord(updated);\n  }\n\n  async deleteDataset({ id }: { id: string }): Promise<void> {\n    // Cascade: delete items and versions\n    for (const [itemId, rows] of this.db.datasetItems) {\n      if (rows.length > 0 && rows[0]!.datasetId === id) {\n        this.db.datasetItems.delete(itemId);\n      }\n    }\n    for (const [vId, v] of this.db.datasetVersions) {\n      if (v.datasetId === id) {\n        this.db.datasetVersions.delete(vId);\n      }\n    }\n\n    // F3 fix: detach experiments (SET NULL) instead of deleting them\n    for (const [expId, exp] of this.db.experiments) {\n      if (exp.datasetId === id) {\n        this.db.experiments.set(expId, { ...exp, datasetId: null, datasetVersion: null });\n      }\n    }\n\n    this.db.datasets.delete(id);\n  }\n\n  async listDatasets(args: ListDatasetsInput): Promise<ListDatasetsOutput> {\n    const datasets = Array.from(this.db.datasets.values());\n    // Sort by createdAt descending (newest first)\n    datasets.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n\n    const { page, perPage: perPageInput } = args.pagination;\n    const perPage = normalizePerPage(perPageInput, 100);\n    const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const end = perPageInput === false ? datasets.length : start + perPage;\n\n    return {\n      datasets: datasets.slice(start, end).map(toDatasetRecord),\n      pagination: {\n        total: datasets.length,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : datasets.length > end,\n      },\n    };\n  }\n\n  // --- SCD-2 item mutations ---\n\n  protected async _doAddItem(args: AddDatasetItemInput): Promise<DatasetItem> {\n    const dataset = this.db.datasets.get(args.datasetId);\n    if (!dataset) {\n      throw new Error(`Dataset not found: ${args.datasetId}`);\n    }\n\n    // Bump version (T3.7, T3.26 — only bumps version, not updatedAt)\n    const newVersion = dataset.version + 1;\n    this.db.datasets.set(args.datasetId, { ...dataset, version: newVersion });\n\n    const now = new Date();\n    const id = crypto.randomUUID();\n    const row: DatasetItemRow = {\n      id,\n      datasetId: args.datasetId,\n      datasetVersion: newVersion,\n      validTo: null,\n      isDeleted: false,\n      input: args.input,\n      groundTruth: args.groundTruth,\n      expectedTrajectory: args.expectedTrajectory,\n      requestContext: args.requestContext,\n      metadata: args.metadata,\n      source: args.source,\n      createdAt: now,\n      updatedAt: now,\n    };\n\n    this.db.datasetItems.set(id, [row]);\n\n    // T3.11 — every mutation inserts exactly one dataset_version row\n    await this.createDatasetVersion(args.datasetId, newVersion);\n\n    return toDatasetItem(row);\n  }\n\n  protected async _doUpdateItem(args: UpdateDatasetItemInput): Promise<DatasetItem> {\n    const rows = this.db.datasetItems.get(args.id);\n    if (!rows || rows.length === 0) {\n      throw new Error(`Item not found: ${args.id}`);\n    }\n\n    const currentRow = rows.find(r => r.validTo === null && !r.isDeleted);\n    if (!currentRow) {\n      throw new Error(`Item not found: ${args.id}`);\n    }\n    if (currentRow.datasetId !== args.datasetId) {\n      throw new Error(`Item ${args.id} does not belong to dataset ${args.datasetId}`);\n    }\n\n    const dataset = this.db.datasets.get(args.datasetId);\n    if (!dataset) {\n      throw new Error(`Dataset not found: ${args.datasetId}`);\n    }\n\n    // Bump version (T3.26)\n    const newVersion = dataset.version + 1;\n    this.db.datasets.set(args.datasetId, { ...dataset, version: newVersion });\n\n    // T3.8 — close old row\n    currentRow.validTo = newVersion;\n\n    // T3.8 — insert new row with same id\n    const now = new Date();\n    const newRow: DatasetItemRow = {\n      id: args.id,\n      datasetId: args.datasetId,\n      datasetVersion: newVersion,\n      validTo: null,\n      isDeleted: false,\n      input: args.input !== undefined ? args.input : currentRow.input,\n      groundTruth: args.groundTruth !== undefined ? args.groundTruth : currentRow.groundTruth,\n      expectedTrajectory:\n        args.expectedTrajectory !== undefined ? args.expectedTrajectory : currentRow.expectedTrajectory,\n      requestContext: args.requestContext !== undefined ? args.requestContext : currentRow.requestContext,\n      metadata: args.metadata !== undefined ? args.metadata : currentRow.metadata,\n      source: args.source !== undefined ? args.source : currentRow.source,\n      createdAt: currentRow.createdAt,\n      updatedAt: now,\n    };\n    rows.push(newRow);\n\n    // T3.11\n    await this.createDatasetVersion(args.datasetId, newVersion);\n\n    return toDatasetItem(newRow);\n  }\n\n  protected async _doDeleteItem({ id, datasetId }: { id: string; datasetId: string }): Promise<void> {\n    const rows = this.db.datasetItems.get(id);\n    if (!rows || rows.length === 0) {\n      return; // no-op if item doesn't exist\n    }\n\n    const currentRow = rows.find(r => r.validTo === null && !r.isDeleted);\n    if (!currentRow) {\n      return; // already deleted\n    }\n    if (currentRow.datasetId !== datasetId) {\n      throw new Error(`Item ${id} does not belong to dataset ${datasetId}`);\n    }\n\n    const dataset = this.db.datasets.get(datasetId);\n    if (!dataset) {\n      throw new Error(`Dataset not found: ${datasetId}`);\n    }\n\n    // Bump version (T3.26)\n    const newVersion = dataset.version + 1;\n    this.db.datasets.set(datasetId, { ...dataset, version: newVersion });\n\n    // T3.9 — close old row\n    currentRow.validTo = newVersion;\n\n    // T3.9 — insert tombstone\n    const now = new Date();\n    rows.push({\n      id,\n      datasetId,\n      datasetVersion: newVersion,\n      validTo: null,\n      isDeleted: true,\n      input: currentRow.input,\n      groundTruth: currentRow.groundTruth,\n      requestContext: currentRow.requestContext,\n      metadata: currentRow.metadata,\n      createdAt: currentRow.createdAt,\n      updatedAt: now,\n    });\n\n    // T3.11\n    await this.createDatasetVersion(datasetId, newVersion);\n  }\n\n  // --- SCD-2 queries ---\n\n  async getItemById(args: { id: string; datasetVersion?: number }): Promise<DatasetItem | null> {\n    const rows = this.db.datasetItems.get(args.id);\n    if (!rows || rows.length === 0) return null;\n\n    if (args.datasetVersion !== undefined) {\n      // T3.13 — exact version match, exclude deleted\n      const row = rows.find(r => r.datasetVersion === args.datasetVersion && !r.isDeleted);\n      return row ? toDatasetItem(row) : null;\n    }\n\n    // T3.12 — current row (validTo IS NULL AND isDeleted = false)\n    const current = rows.find(r => r.validTo === null && !r.isDeleted);\n    return current ? toDatasetItem(current) : null;\n  }\n\n  async getItemsByVersion({ datasetId, version }: { datasetId: string; version: number }): Promise<DatasetItem[]> {\n    // T3.14 — SCD-2 range query: items visible at version N\n    const items: DatasetItem[] = [];\n\n    for (const rows of this.db.datasetItems.values()) {\n      if (rows.length === 0 || rows[0]!.datasetId !== datasetId) continue;\n\n      // Find the row visible at this version:\n      // datasetVersion <= N AND (validTo IS NULL OR validTo > N) AND isDeleted = false\n      const visible = rows.find(\n        r => r.datasetVersion <= version && (r.validTo === null || r.validTo > version) && !r.isDeleted,\n      );\n      if (visible) {\n        items.push(toDatasetItem(visible));\n      }\n    }\n\n    items.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime() || b.id.localeCompare(a.id));\n    return items;\n  }\n\n  async getItemHistory(itemId: string): Promise<DatasetItemRow[]> {\n    // ALL rows including tombstones, ordered by datasetVersion DESC (newest first)\n    const rows = this.db.datasetItems.get(itemId);\n    if (!rows) return [];\n    return [...rows].sort((a, b) => b.datasetVersion - a.datasetVersion);\n  }\n\n  async listItems(args: ListDatasetItemsInput): Promise<ListDatasetItemsOutput> {\n    let items: DatasetItem[];\n\n    if (args.version !== undefined) {\n      // SCD-2 time-travel query\n      items = await this.getItemsByVersion({ datasetId: args.datasetId, version: args.version });\n    } else {\n      // T3.16 — current items only (validTo IS NULL AND isDeleted = false)\n      items = [];\n      for (const rows of this.db.datasetItems.values()) {\n        if (rows.length === 0 || rows[0]!.datasetId !== args.datasetId) continue;\n        const current = rows.find(r => r.validTo === null && !r.isDeleted);\n        if (current) {\n          items.push(toDatasetItem(current));\n        }\n      }\n    }\n\n    // Filter by search term if specified (case-insensitive partial match on input/groundTruth)\n    if (args.search) {\n      const searchLower = args.search.toLowerCase();\n      items = items.filter(item => {\n        const inputStr = typeof item.input === 'string' ? item.input : JSON.stringify(item.input);\n        const outputStr = item.groundTruth\n          ? typeof item.groundTruth === 'string'\n            ? item.groundTruth\n            : JSON.stringify(item.groundTruth)\n          : '';\n        return inputStr.toLowerCase().includes(searchLower) || outputStr.toLowerCase().includes(searchLower);\n      });\n    }\n\n    // Sort by createdAt descending, then by id descending for stability\n    items.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime() || b.id.localeCompare(a.id));\n\n    const { page, perPage: perPageInput } = args.pagination;\n    const perPage = normalizePerPage(perPageInput, 100);\n    const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const end = perPageInput === false ? items.length : start + perPage;\n\n    return {\n      items: items.slice(start, end),\n      pagination: {\n        total: items.length,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : items.length > end,\n      },\n    };\n  }\n\n  // --- Dataset version methods ---\n\n  async createDatasetVersion(datasetId: string, version: number): Promise<DatasetVersion> {\n    const id = crypto.randomUUID();\n    const dsVersion: DatasetVersion = {\n      id,\n      datasetId,\n      version,\n      createdAt: new Date(),\n    };\n    this.db.datasetVersions.set(id, dsVersion);\n    return dsVersion;\n  }\n\n  async listDatasetVersions(input: ListDatasetVersionsInput): Promise<ListDatasetVersionsOutput> {\n    const versions: DatasetVersion[] = [];\n    for (const v of this.db.datasetVersions.values()) {\n      if (v.datasetId === input.datasetId) {\n        versions.push(v);\n      }\n    }\n    versions.sort((a, b) => b.version - a.version);\n\n    const { page, perPage: perPageInput } = input.pagination;\n    const perPage = normalizePerPage(perPageInput, 100);\n    const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const end = perPageInput === false ? versions.length : start + perPage;\n\n    return {\n      versions: versions.slice(start, end),\n      pagination: {\n        total: versions.length,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : versions.length > end,\n      },\n    };\n  }\n\n  // --- Bulk operations (SCD-2 internally) ---\n\n  protected async _doBatchInsertItems(input: BatchInsertItemsInput): Promise<DatasetItem[]> {\n    const dataset = this.db.datasets.get(input.datasetId);\n    if (!dataset) {\n      throw new Error(`Dataset not found: ${input.datasetId}`);\n    }\n\n    // T3.19 — single version increment for all items\n    const newVersion = dataset.version + 1;\n    this.db.datasets.set(input.datasetId, { ...dataset, version: newVersion });\n\n    const now = new Date();\n    const items: DatasetItem[] = [];\n\n    for (const itemInput of input.items) {\n      const id = crypto.randomUUID();\n      const row: DatasetItemRow = {\n        id,\n        datasetId: input.datasetId,\n        datasetVersion: newVersion,\n        validTo: null,\n        isDeleted: false,\n        input: itemInput.input,\n        groundTruth: itemInput.groundTruth,\n        expectedTrajectory: itemInput.expectedTrajectory,\n        requestContext: itemInput.requestContext,\n        metadata: itemInput.metadata,\n        source: itemInput.source,\n        createdAt: now,\n        updatedAt: now,\n      };\n      this.db.datasetItems.set(id, [row]);\n      items.push(toDatasetItem(row));\n    }\n\n    // T3.11 — single dataset version for the bulk operation\n    await this.createDatasetVersion(input.datasetId, newVersion);\n\n    return items;\n  }\n\n  protected async _doBatchDeleteItems(input: BatchDeleteItemsInput): Promise<void> {\n    const dataset = this.db.datasets.get(input.datasetId);\n    if (!dataset) {\n      throw new Error(`Dataset not found: ${input.datasetId}`);\n    }\n\n    // T3.20 — single version increment\n    const newVersion = dataset.version + 1;\n    this.db.datasets.set(input.datasetId, { ...dataset, version: newVersion });\n\n    const now = new Date();\n\n    for (const itemId of input.itemIds) {\n      const rows = this.db.datasetItems.get(itemId);\n      if (!rows) continue;\n\n      const currentRow = rows.find(r => r.validTo === null && !r.isDeleted);\n      if (!currentRow || currentRow.datasetId !== input.datasetId) continue;\n\n      // Close old row\n      currentRow.validTo = newVersion;\n\n      // Insert tombstone\n      rows.push({\n        id: itemId,\n        datasetId: input.datasetId,\n        datasetVersion: newVersion,\n        validTo: null,\n        isDeleted: true,\n        input: currentRow.input,\n        groundTruth: currentRow.groundTruth,\n        requestContext: currentRow.requestContext,\n        metadata: currentRow.metadata,\n        createdAt: currentRow.createdAt,\n        updatedAt: now,\n      });\n    }\n\n    // T3.11\n    await this.createDatasetVersion(input.datasetId, newVersion);\n  }\n}\n","import type {\n  Experiment,\n  ExperimentResult,\n  ExperimentReviewCounts,\n  CreateExperimentInput,\n  UpdateExperimentInput,\n  AddExperimentResultInput,\n  UpdateExperimentResultInput,\n  ListExperimentsInput,\n  ListExperimentsOutput,\n  ListExperimentResultsInput,\n  ListExperimentResultsOutput,\n} from '../../types';\nimport { StorageDomain } from '../base';\n\n/**\n * Abstract base class for dataset experiments storage domain.\n * Provides the contract for experiment lifecycle and result tracking.\n */\nexport abstract class ExperimentsStorage extends StorageDomain {\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'EXPERIMENTS',\n    });\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    // Default no-op - subclasses override\n  }\n\n  // Experiment lifecycle\n  abstract createExperiment(input: CreateExperimentInput): Promise<Experiment>;\n  abstract updateExperiment(input: UpdateExperimentInput): Promise<Experiment>;\n  abstract getExperimentById(args: { id: string }): Promise<Experiment | null>;\n  abstract listExperiments(args: ListExperimentsInput): Promise<ListExperimentsOutput>;\n  abstract deleteExperiment(args: { id: string }): Promise<void>;\n\n  // Results (per-item)\n  abstract addExperimentResult(input: AddExperimentResultInput): Promise<ExperimentResult>;\n  abstract updateExperimentResult(input: UpdateExperimentResultInput): Promise<ExperimentResult>;\n  abstract getExperimentResultById(args: { id: string }): Promise<ExperimentResult | null>;\n  abstract listExperimentResults(args: ListExperimentResultsInput): Promise<ListExperimentResultsOutput>;\n  abstract deleteExperimentResults(args: { experimentId: string }): Promise<void>;\n\n  // Aggregation\n  abstract getReviewSummary(): Promise<ExperimentReviewCounts[]>;\n}\n","import { calculatePagination, normalizePerPage } from '../../base';\nimport type {\n  Experiment,\n  ExperimentResult,\n  ExperimentReviewCounts,\n  CreateExperimentInput,\n  UpdateExperimentInput,\n  AddExperimentResultInput,\n  UpdateExperimentResultInput,\n  ListExperimentsInput,\n  ListExperimentsOutput,\n  ListExperimentResultsInput,\n  ListExperimentResultsOutput,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { ExperimentsStorage } from './base';\n\nexport class ExperimentsInMemory extends ExperimentsStorage {\n  private db: InMemoryDB;\n\n  constructor({ db }: { db: InMemoryDB }) {\n    super();\n    this.db = db;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.db.experiments.clear();\n    this.db.experimentResults.clear();\n  }\n\n  // Experiment lifecycle\n  async createExperiment(input: CreateExperimentInput): Promise<Experiment> {\n    const now = new Date();\n    const experiment: Experiment = {\n      id: input.id ?? crypto.randomUUID(),\n      datasetId: input.datasetId,\n      datasetVersion: input.datasetVersion,\n      agentVersion: input.agentVersion ?? null,\n      targetType: input.targetType,\n      targetId: input.targetId,\n      name: input.name,\n      description: input.description,\n      metadata: input.metadata,\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    this.db.experiments.set(experiment.id, experiment);\n    return experiment;\n  }\n\n  async updateExperiment(input: UpdateExperimentInput): Promise<Experiment> {\n    const existing = this.db.experiments.get(input.id);\n    if (!existing) {\n      throw new Error(`Experiment not found: ${input.id}`);\n    }\n    const updated: Experiment = {\n      ...existing,\n      status: input.status ?? existing.status,\n      totalItems: input.totalItems ?? existing.totalItems,\n      succeededCount: input.succeededCount ?? existing.succeededCount,\n      failedCount: input.failedCount ?? existing.failedCount,\n      skippedCount: input.skippedCount ?? existing.skippedCount,\n      startedAt: input.startedAt ?? existing.startedAt,\n      completedAt: input.completedAt ?? existing.completedAt,\n      name: input.name ?? existing.name,\n      description: input.description ?? existing.description,\n      metadata: input.metadata ?? existing.metadata,\n      updatedAt: new Date(),\n    };\n    this.db.experiments.set(input.id, updated);\n    return updated;\n  }\n\n  async getExperimentById(args: { id: string }): Promise<Experiment | null> {\n    return this.db.experiments.get(args.id) ?? null;\n  }\n\n  async listExperiments(args: ListExperimentsInput): Promise<ListExperimentsOutput> {\n    let experiments = Array.from(this.db.experiments.values());\n\n    // Apply filters\n    if (args.datasetId) {\n      experiments = experiments.filter(r => r.datasetId === args.datasetId);\n    }\n    if (args.targetType) {\n      experiments = experiments.filter(r => r.targetType === args.targetType);\n    }\n    if (args.targetId) {\n      experiments = experiments.filter(r => r.targetId === args.targetId);\n    }\n    if (args.agentVersion) {\n      experiments = experiments.filter(r => r.agentVersion === args.agentVersion);\n    }\n    if (args.status) {\n      experiments = experiments.filter(r => r.status === args.status);\n    }\n\n    // Sort by createdAt descending (newest first)\n    experiments.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n\n    const { page, perPage: perPageInput } = args.pagination;\n    const perPage = normalizePerPage(perPageInput, 100);\n    const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const end = perPageInput === false ? experiments.length : start + perPage;\n\n    return {\n      experiments: experiments.slice(start, end),\n      pagination: {\n        total: experiments.length,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : experiments.length > end,\n      },\n    };\n  }\n\n  async deleteExperiment(args: { id: string }): Promise<void> {\n    this.db.experiments.delete(args.id);\n    // Also delete associated results\n    for (const [resultId, result] of this.db.experimentResults) {\n      if (result.experimentId === args.id) {\n        this.db.experimentResults.delete(resultId);\n      }\n    }\n  }\n\n  // Results (per-item)\n  async addExperimentResult(input: AddExperimentResultInput): Promise<ExperimentResult> {\n    const now = new Date();\n    const result: ExperimentResult = {\n      id: input.id ?? crypto.randomUUID(),\n      experimentId: input.experimentId,\n      itemId: input.itemId,\n      itemDatasetVersion: input.itemDatasetVersion,\n      input: input.input,\n      output: input.output,\n      groundTruth: input.groundTruth,\n      error: input.error,\n      startedAt: input.startedAt,\n      completedAt: input.completedAt,\n      retryCount: input.retryCount,\n      traceId: input.traceId ?? null,\n      status: input.status ?? null,\n      tags: input.tags ?? null,\n      createdAt: now,\n    };\n    this.db.experimentResults.set(result.id, result);\n    return result;\n  }\n\n  async updateExperimentResult(input: UpdateExperimentResultInput): Promise<ExperimentResult> {\n    const existing = this.db.experimentResults.get(input.id);\n    if (!existing) {\n      throw new Error(`Experiment result not found: ${input.id}`);\n    }\n    if (input.experimentId && existing.experimentId !== input.experimentId) {\n      throw new Error(`Experiment result ${input.id} does not belong to experiment ${input.experimentId}`);\n    }\n    const updated: ExperimentResult = {\n      ...existing,\n      status: input.status !== undefined ? input.status : existing.status,\n      tags: input.tags !== undefined ? input.tags : existing.tags,\n    };\n    this.db.experimentResults.set(input.id, updated);\n    return updated;\n  }\n\n  async getExperimentResultById(args: { id: string }): Promise<ExperimentResult | null> {\n    return this.db.experimentResults.get(args.id) ?? null;\n  }\n\n  async listExperimentResults(args: ListExperimentResultsInput): Promise<ListExperimentResultsOutput> {\n    let results = Array.from(this.db.experimentResults.values()).filter(r => r.experimentId === args.experimentId);\n\n    // Apply filters\n    if (args.traceId) {\n      results = results.filter(r => r.traceId === args.traceId);\n    }\n    if (args.status) {\n      results = results.filter(r => r.status === args.status);\n    }\n\n    // Sort by startedAt ascending (execution order)\n    results.sort((a, b) => a.startedAt.getTime() - b.startedAt.getTime());\n\n    const { page, perPage: perPageInput } = args.pagination;\n    const perPage = normalizePerPage(perPageInput, 100);\n    const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const end = perPageInput === false ? results.length : start + perPage;\n\n    return {\n      results: results.slice(start, end),\n      pagination: {\n        total: results.length,\n        page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : results.length > end,\n      },\n    };\n  }\n\n  async deleteExperimentResults(args: { experimentId: string }): Promise<void> {\n    for (const [resultId, result] of this.db.experimentResults) {\n      if (result.experimentId === args.experimentId) {\n        this.db.experimentResults.delete(resultId);\n      }\n    }\n  }\n\n  async getReviewSummary(): Promise<ExperimentReviewCounts[]> {\n    const counts = new Map<string, ExperimentReviewCounts>();\n\n    for (const result of this.db.experimentResults.values()) {\n      let entry = counts.get(result.experimentId);\n      if (!entry) {\n        entry = { experimentId: result.experimentId, total: 0, needsReview: 0, reviewed: 0, complete: 0 };\n        counts.set(result.experimentId, entry);\n      }\n      entry.total++;\n      if (result.status === 'needs-review') entry.needsReview++;\n      else if (result.status === 'reviewed') entry.reviewed++;\n      else if (result.status === 'complete') entry.complete++;\n    }\n\n    return Array.from(counts.values());\n  }\n}\n","import type { ScoreRowData } from '../../evals/types';\nimport type { StorageThreadType } from '../../memory/types';\nimport type {\n  StorageAgentType,\n  StorageMCPClientType,\n  StorageMCPServerType,\n  StorageMessageType,\n  StoragePromptBlockType,\n  StorageResourceType,\n  StorageScorerDefinitionType,\n  StorageWorkspaceType,\n  StorageSkillType,\n  StorageWorkflowRun,\n  ObservationalMemoryRecord,\n  DatasetRecord,\n  DatasetItemRow,\n  DatasetVersion,\n  Experiment,\n  ExperimentResult,\n} from '../types';\nimport type { AgentVersion } from './agents';\nimport type { MCPClientVersion } from './mcp-clients';\nimport type { MCPServerVersion } from './mcp-servers';\nimport type { TraceEntry } from './observability';\nimport type { FeedbackRecord } from './observability/feedback';\nimport type { LogRecord } from './observability/logs';\nimport type { MetricRecord } from './observability/metrics';\nimport type { ScoreRecord } from './observability/scores';\nimport type { PromptBlockVersion } from './prompt-blocks';\nimport type { ScorerDefinitionVersion } from './scorer-definitions';\nimport type { SkillVersion } from './skills';\nimport type { WorkspaceVersion } from './workspaces';\n\n/**\n * InMemoryDB is a thin database layer for in-memory storage.\n * It holds all the Maps that store data, similar to how a real database\n * connection (pg-promise client, libsql client) is shared across domains.\n *\n * Each domain receives a reference to this db and operates on the relevant Maps.\n */\nexport class InMemoryDB {\n  readonly threads = new Map<string, StorageThreadType>();\n  readonly messages = new Map<string, StorageMessageType>();\n  readonly resources = new Map<string, StorageResourceType>();\n  readonly workflows = new Map<string, StorageWorkflowRun>();\n  readonly scores = new Map<string, ScoreRowData>();\n  readonly traces = new Map<string, TraceEntry>();\n  readonly metricRecords: MetricRecord[] = [];\n  readonly logRecords: LogRecord[] = [];\n  readonly scoreRecords: ScoreRecord[] = [];\n  readonly feedbackRecords: FeedbackRecord[] = [];\n  readonly agents = new Map<string, StorageAgentType>();\n  readonly agentVersions = new Map<string, AgentVersion>();\n  readonly promptBlocks = new Map<string, StoragePromptBlockType>();\n  readonly promptBlockVersions = new Map<string, PromptBlockVersion>();\n  readonly scorerDefinitions = new Map<string, StorageScorerDefinitionType>();\n  readonly scorerDefinitionVersions = new Map<string, ScorerDefinitionVersion>();\n  readonly mcpClients = new Map<string, StorageMCPClientType>();\n  readonly mcpClientVersions = new Map<string, MCPClientVersion>();\n  readonly mcpServers = new Map<string, StorageMCPServerType>();\n  readonly mcpServerVersions = new Map<string, MCPServerVersion>();\n  readonly workspaces = new Map<string, StorageWorkspaceType>();\n  readonly workspaceVersions = new Map<string, WorkspaceVersion>();\n  readonly skills = new Map<string, StorageSkillType>();\n  readonly skillVersions = new Map<string, SkillVersion>();\n  /** Observational memory records, keyed by resourceId, each holding array of records (generations) */\n  readonly observationalMemory = new Map<string, ObservationalMemoryRecord[]>();\n\n  // Dataset domain maps\n  readonly datasets = new Map<string, DatasetRecord>();\n  readonly datasetItems = new Map<string, DatasetItemRow[]>();\n  readonly datasetVersions = new Map<string, DatasetVersion>();\n\n  // Experiment domain maps\n  readonly experiments = new Map<string, Experiment>();\n  readonly experimentResults = new Map<string, ExperimentResult>();\n\n  /**\n   * Clears all data from all collections.\n   * Useful for testing.\n   */\n  clear(): void {\n    this.threads.clear();\n    this.messages.clear();\n    this.resources.clear();\n    this.workflows.clear();\n    this.scores.clear();\n    this.traces.clear();\n    this.metricRecords.length = 0;\n    this.logRecords.length = 0;\n    this.scoreRecords.length = 0;\n    this.feedbackRecords.length = 0;\n    this.agents.clear();\n    this.agentVersions.clear();\n    this.promptBlocks.clear();\n    this.promptBlockVersions.clear();\n    this.scorerDefinitions.clear();\n    this.scorerDefinitionVersions.clear();\n    this.mcpClients.clear();\n    this.mcpClientVersions.clear();\n    this.mcpServers.clear();\n    this.mcpServerVersions.clear();\n    this.workspaces.clear();\n    this.workspaceVersions.clear();\n    this.skills.clear();\n    this.skillVersions.clear();\n    this.observationalMemory.clear();\n    this.datasets.clear();\n    this.datasetItems.clear();\n    this.datasetVersions.clear();\n    this.experiments.clear();\n    this.experimentResults.clear();\n  }\n}\n","import type {\n  StorageMCPClientType,\n  StorageMCPClientSnapshotType,\n  StorageResolvedMCPClientType,\n  StorageCreateMCPClientInput,\n  StorageUpdateMCPClientInput,\n  StorageListMCPClientsInput,\n  StorageListMCPClientsOutput,\n  StorageListMCPClientsResolvedOutput,\n} from '../../types';\nimport { VersionedStorageDomain } from '../versioned';\nimport type { VersionBase, CreateVersionInputBase, ListVersionsInputBase, ListVersionsOutputBase } from '../versioned';\n\n// ============================================================================\n// MCP Client Version Types\n// ============================================================================\n\n/**\n * Represents a stored version of an MCP client's content.\n * Client fields are top-level on the version row (no nested snapshot object).\n */\nexport interface MCPClientVersion extends StorageMCPClientSnapshotType, VersionBase {\n  /** ID of the MCP client this version belongs to */\n  mcpClientId: string;\n}\n\n/**\n * Input for creating a new MCP client version.\n * Client fields are top-level (no nested snapshot object).\n */\nexport interface CreateMCPClientVersionInput extends StorageMCPClientSnapshotType, CreateVersionInputBase {\n  /** ID of the MCP client this version belongs to */\n  mcpClientId: string;\n}\n\n/**\n * Sort direction for version listings.\n */\nexport type MCPClientVersionSortDirection = 'ASC' | 'DESC';\n\n/**\n * Fields that can be used for ordering version listings.\n */\nexport type MCPClientVersionOrderBy = 'versionNumber' | 'createdAt';\n\n/**\n * Input for listing MCP client versions with pagination and sorting.\n */\nexport interface ListMCPClientVersionsInput extends ListVersionsInputBase {\n  /** ID of the MCP client to list versions for */\n  mcpClientId: string;\n}\n\n/**\n * Output for listing MCP client versions with pagination info.\n */\nexport interface ListMCPClientVersionsOutput extends ListVersionsOutputBase<MCPClientVersion> {}\n\n// ============================================================================\n// MCPClientsStorage Base Class\n// ============================================================================\n\nexport abstract class MCPClientsStorage extends VersionedStorageDomain<\n  StorageMCPClientType,\n  StorageMCPClientSnapshotType,\n  StorageResolvedMCPClientType,\n  MCPClientVersion,\n  CreateMCPClientVersionInput,\n  ListMCPClientVersionsInput,\n  ListMCPClientVersionsOutput,\n  { mcpClient: StorageCreateMCPClientInput },\n  StorageUpdateMCPClientInput,\n  StorageListMCPClientsInput | undefined,\n  StorageListMCPClientsOutput,\n  StorageListMCPClientsResolvedOutput\n> {\n  protected readonly listKey = 'mcpClients';\n  protected readonly versionMetadataFields = [\n    'id',\n    'mcpClientId',\n    'versionNumber',\n    'changedFields',\n    'changeMessage',\n    'createdAt',\n  ] satisfies (keyof MCPClientVersion)[];\n\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'MCP_CLIENTS',\n    });\n  }\n}\n","import { deepEqual } from '../../../utils';\nimport { normalizePerPage, calculatePagination } from '../../base';\nimport type {\n  StorageMCPClientType,\n  StorageCreateMCPClientInput,\n  StorageUpdateMCPClientInput,\n  StorageListMCPClientsInput,\n  StorageListMCPClientsOutput,\n  ThreadOrderBy,\n  ThreadSortDirection,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport type {\n  MCPClientVersion,\n  CreateMCPClientVersionInput,\n  ListMCPClientVersionsInput,\n  ListMCPClientVersionsOutput,\n  MCPClientVersionOrderBy,\n  MCPClientVersionSortDirection,\n} from './base';\nimport { MCPClientsStorage } from './base';\n\nexport class InMemoryMCPClientsStorage extends MCPClientsStorage {\n  private db: InMemoryDB;\n\n  constructor({ db }: { db: InMemoryDB }) {\n    super();\n    this.db = db;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.db.mcpClients.clear();\n    this.db.mcpClientVersions.clear();\n  }\n\n  // ==========================================================================\n  // MCP Client CRUD Methods\n  // ==========================================================================\n\n  async getById(id: string): Promise<StorageMCPClientType | null> {\n    const config = this.db.mcpClients.get(id);\n    return config ? this.deepCopyConfig(config) : null;\n  }\n\n  async create(input: { mcpClient: StorageCreateMCPClientInput }): Promise<StorageMCPClientType> {\n    const { mcpClient } = input;\n\n    if (this.db.mcpClients.has(mcpClient.id)) {\n      throw new Error(`MCP client with id ${mcpClient.id} already exists`);\n    }\n\n    const now = new Date();\n    const newConfig: StorageMCPClientType = {\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\n    this.db.mcpClients.set(mcpClient.id, newConfig);\n\n    // Extract config fields from the flat input (everything except record fields)\n    const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = mcpClient;\n\n    // Create version 1 from the config\n    const versionId = crypto.randomUUID();\n    await this.createVersion({\n      id: versionId,\n      mcpClientId: mcpClient.id,\n      versionNumber: 1,\n      ...snapshotConfig,\n      changedFields: Object.keys(snapshotConfig),\n      changeMessage: 'Initial version',\n    });\n\n    // Return the thin record\n    return this.deepCopyConfig(newConfig);\n  }\n\n  async update(input: StorageUpdateMCPClientInput): Promise<StorageMCPClientType> {\n    const { id, ...updates } = input;\n\n    const existingConfig = this.db.mcpClients.get(id);\n    if (!existingConfig) {\n      throw new Error(`MCP client with id ${id} not found`);\n    }\n\n    // Separate metadata fields from config fields\n    const { authorId, activeVersionId, metadata, status } = updates;\n\n    // Update metadata fields on the record\n    const updatedConfig: StorageMCPClientType = {\n      ...existingConfig,\n      ...(authorId !== undefined && { authorId }),\n      ...(activeVersionId !== undefined && { activeVersionId }),\n      ...(status !== undefined && { status: status as StorageMCPClientType['status'] }),\n      ...(metadata !== undefined && {\n        metadata: { ...existingConfig.metadata, ...metadata },\n      }),\n      updatedAt: new Date(),\n    };\n\n    // Save the updated record\n    this.db.mcpClients.set(id, updatedConfig);\n    return this.deepCopyConfig(updatedConfig);\n  }\n\n  async delete(id: string): Promise<void> {\n    // Idempotent delete\n    this.db.mcpClients.delete(id);\n    // Also delete all versions for this client\n    await this.deleteVersionsByParentId(id);\n  }\n\n  async list(args?: StorageListMCPClientsInput): Promise<StorageListMCPClientsOutput> {\n    const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {};\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 100)\n    const perPage = normalizePerPage(perPageInput, 100);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // Prevent unreasonably large page values\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Get all MCP clients and apply filters\n    let configs = Array.from(this.db.mcpClients.values());\n\n    // Filter by status\n    if (status) {\n      configs = configs.filter(config => config.status === status);\n    }\n\n    // Filter by authorId if provided\n    if (authorId !== undefined) {\n      configs = configs.filter(config => config.authorId === authorId);\n    }\n\n    // Filter by metadata if provided (AND logic)\n    if (metadata && Object.keys(metadata).length > 0) {\n      configs = configs.filter(config => {\n        if (!config.metadata) return false;\n        return Object.entries(metadata).every(([key, value]) => deepEqual(config.metadata![key], value));\n      });\n    }\n\n    // Sort filtered configs\n    const sortedConfigs = this.sortConfigs(configs, field, direction);\n\n    // Deep clone to avoid mutation\n    const clonedConfigs = sortedConfigs.map(config => this.deepCopyConfig(config));\n\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    return {\n      mcpClients: clonedConfigs.slice(offset, offset + perPage),\n      total: clonedConfigs.length,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < clonedConfigs.length,\n    };\n  }\n\n  // ==========================================================================\n  // MCP Client Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateMCPClientVersionInput): Promise<MCPClientVersion> {\n    // Check if version with this ID already exists\n    if (this.db.mcpClientVersions.has(input.id)) {\n      throw new Error(`Version with id ${input.id} already exists`);\n    }\n\n    // Check for duplicate (mcpClientId, versionNumber) pair\n    for (const version of this.db.mcpClientVersions.values()) {\n      if (version.mcpClientId === input.mcpClientId && version.versionNumber === input.versionNumber) {\n        throw new Error(`Version number ${input.versionNumber} already exists for MCP client ${input.mcpClientId}`);\n      }\n    }\n\n    const version: MCPClientVersion = {\n      ...input,\n      createdAt: new Date(),\n    };\n\n    // Deep clone before storing\n    this.db.mcpClientVersions.set(input.id, this.deepCopyVersion(version));\n    return this.deepCopyVersion(version);\n  }\n\n  async getVersion(id: string): Promise<MCPClientVersion | null> {\n    const version = this.db.mcpClientVersions.get(id);\n    return version ? this.deepCopyVersion(version) : null;\n  }\n\n  async getVersionByNumber(mcpClientId: string, versionNumber: number): Promise<MCPClientVersion | null> {\n    for (const version of this.db.mcpClientVersions.values()) {\n      if (version.mcpClientId === mcpClientId && version.versionNumber === versionNumber) {\n        return this.deepCopyVersion(version);\n      }\n    }\n    return null;\n  }\n\n  async getLatestVersion(mcpClientId: string): Promise<MCPClientVersion | null> {\n    let latest: MCPClientVersion | null = null;\n    for (const version of this.db.mcpClientVersions.values()) {\n      if (version.mcpClientId === mcpClientId) {\n        if (!latest || version.versionNumber > latest.versionNumber) {\n          latest = version;\n        }\n      }\n    }\n    return latest ? this.deepCopyVersion(latest) : null;\n  }\n\n  async listVersions(input: ListMCPClientVersionsInput): Promise<ListMCPClientVersionsOutput> {\n    const { mcpClientId, page = 0, perPage: perPageInput, orderBy } = input;\n    const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n    // Normalize perPage (false -> MAX_SAFE_INTEGER, 0 -> 0, undefined -> 20)\n    const perPage = normalizePerPage(perPageInput, 20);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Filter versions by mcpClientId\n    let versions = Array.from(this.db.mcpClientVersions.values()).filter(v => v.mcpClientId === mcpClientId);\n\n    // Sort versions\n    versions = this.sortVersions(versions, field, direction);\n\n    // Deep clone\n    const clonedVersions = versions.map(v => this.deepCopyVersion(v));\n\n    const total = clonedVersions.length;\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const paginatedVersions = clonedVersions.slice(offset, offset + perPage);\n\n    return {\n      versions: paginatedVersions,\n      total,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < total,\n    };\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    this.db.mcpClientVersions.delete(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    const idsToDelete: string[] = [];\n    for (const [id, version] of this.db.mcpClientVersions.entries()) {\n      if (version.mcpClientId === entityId) {\n        idsToDelete.push(id);\n      }\n    }\n\n    for (const id of idsToDelete) {\n      this.db.mcpClientVersions.delete(id);\n    }\n  }\n\n  async countVersions(mcpClientId: string): Promise<number> {\n    let count = 0;\n    for (const version of this.db.mcpClientVersions.values()) {\n      if (version.mcpClientId === mcpClientId) {\n        count++;\n      }\n    }\n    return count;\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  private deepCopyConfig(config: StorageMCPClientType): StorageMCPClientType {\n    return {\n      ...config,\n      metadata: config.metadata ? { ...config.metadata } : config.metadata,\n    };\n  }\n\n  private deepCopyVersion(version: MCPClientVersion): MCPClientVersion {\n    return {\n      ...version,\n      servers: version.servers ? JSON.parse(JSON.stringify(version.servers)) : version.servers,\n      changedFields: version.changedFields ? [...version.changedFields] : version.changedFields,\n    };\n  }\n\n  private sortConfigs(\n    configs: StorageMCPClientType[],\n    field: ThreadOrderBy,\n    direction: ThreadSortDirection,\n  ): StorageMCPClientType[] {\n    return configs.sort((a, b) => {\n      const aValue = a[field].getTime();\n      const bValue = b[field].getTime();\n\n      return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n    });\n  }\n\n  private sortVersions(\n    versions: MCPClientVersion[],\n    field: MCPClientVersionOrderBy,\n    direction: MCPClientVersionSortDirection,\n  ): MCPClientVersion[] {\n    return versions.sort((a, b) => {\n      let aVal: number;\n      let bVal: number;\n\n      if (field === 'createdAt') {\n        aVal = a.createdAt.getTime();\n        bVal = b.createdAt.getTime();\n      } else {\n        // versionNumber\n        aVal = a.versionNumber;\n        bVal = b.versionNumber;\n      }\n\n      return direction === 'ASC' ? aVal - bVal : bVal - aVal;\n    });\n  }\n}\n","import type {\n  StorageMCPServerType,\n  StorageMCPServerSnapshotType,\n  StorageResolvedMCPServerType,\n  StorageCreateMCPServerInput,\n  StorageUpdateMCPServerInput,\n  StorageListMCPServersInput,\n  StorageListMCPServersOutput,\n  StorageListMCPServersResolvedOutput,\n} from '../../types';\nimport { VersionedStorageDomain } from '../versioned';\nimport type { VersionBase, CreateVersionInputBase, ListVersionsInputBase, ListVersionsOutputBase } from '../versioned';\n\n// ============================================================================\n// MCP Server Version Types\n// ============================================================================\n\n/**\n * Represents a stored version of an MCP server's content.\n * Server fields are top-level on the version row (no nested snapshot object).\n */\nexport interface MCPServerVersion extends StorageMCPServerSnapshotType, VersionBase {\n  /** ID of the MCP server this version belongs to */\n  mcpServerId: string;\n}\n\n/**\n * Input for creating a new MCP server version.\n * Server fields are top-level (no nested snapshot object).\n */\nexport interface CreateMCPServerVersionInput extends StorageMCPServerSnapshotType, CreateVersionInputBase {\n  /** ID of the MCP server this version belongs to */\n  mcpServerId: string;\n}\n\n/**\n * Sort direction for version listings.\n */\nexport type MCPServerVersionSortDirection = 'ASC' | 'DESC';\n\n/**\n * Fields that can be used for ordering version listings.\n */\nexport type MCPServerVersionOrderBy = 'versionNumber' | 'createdAt';\n\n/**\n * Input for listing MCP server versions with pagination and sorting.\n */\nexport interface ListMCPServerVersionsInput extends ListVersionsInputBase {\n  /** ID of the MCP server to list versions for */\n  mcpServerId: string;\n}\n\n/**\n * Output for listing MCP server versions with pagination info.\n */\nexport interface ListMCPServerVersionsOutput extends ListVersionsOutputBase<MCPServerVersion> {}\n\n// ============================================================================\n// MCPServersStorage Base Class\n// ============================================================================\n\nexport abstract class MCPServersStorage extends VersionedStorageDomain<\n  StorageMCPServerType,\n  StorageMCPServerSnapshotType,\n  StorageResolvedMCPServerType,\n  MCPServerVersion,\n  CreateMCPServerVersionInput,\n  ListMCPServerVersionsInput,\n  ListMCPServerVersionsOutput,\n  { mcpServer: StorageCreateMCPServerInput },\n  StorageUpdateMCPServerInput,\n  StorageListMCPServersInput | undefined,\n  StorageListMCPServersOutput,\n  StorageListMCPServersResolvedOutput\n> {\n  protected readonly listKey = 'mcpServers';\n  protected readonly versionMetadataFields = [\n    'id',\n    'mcpServerId',\n    'versionNumber',\n    'changedFields',\n    'changeMessage',\n    'createdAt',\n  ] satisfies (keyof MCPServerVersion)[];\n\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'MCP_SERVERS',\n    });\n  }\n}\n","import { deepEqual } from '../../../utils';\nimport { normalizePerPage, calculatePagination } from '../../base';\nimport type {\n  StorageMCPServerType,\n  StorageCreateMCPServerInput,\n  StorageUpdateMCPServerInput,\n  StorageListMCPServersInput,\n  StorageListMCPServersOutput,\n  ThreadOrderBy,\n  ThreadSortDirection,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport type {\n  MCPServerVersion,\n  CreateMCPServerVersionInput,\n  ListMCPServerVersionsInput,\n  ListMCPServerVersionsOutput,\n  MCPServerVersionOrderBy,\n  MCPServerVersionSortDirection,\n} from './base';\nimport { MCPServersStorage } from './base';\n\nexport class InMemoryMCPServersStorage extends MCPServersStorage {\n  private db: InMemoryDB;\n\n  constructor({ db }: { db: InMemoryDB }) {\n    super();\n    this.db = db;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.db.mcpServers.clear();\n    this.db.mcpServerVersions.clear();\n  }\n\n  // ==========================================================================\n  // MCP Server CRUD Methods\n  // ==========================================================================\n\n  async getById(id: string): Promise<StorageMCPServerType | null> {\n    const config = this.db.mcpServers.get(id);\n    return config ? this.deepCopyConfig(config) : null;\n  }\n\n  async create(input: { mcpServer: StorageCreateMCPServerInput }): Promise<StorageMCPServerType> {\n    const { mcpServer } = input;\n\n    if (this.db.mcpServers.has(mcpServer.id)) {\n      throw new Error(`MCP server with id ${mcpServer.id} already exists`);\n    }\n\n    const now = new Date();\n    const newConfig: StorageMCPServerType = {\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\n    this.db.mcpServers.set(mcpServer.id, newConfig);\n\n    // Extract config fields from the flat input (everything except record fields)\n    const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = mcpServer;\n\n    // Create version 1 from the config\n    const versionId = crypto.randomUUID();\n    await this.createVersion({\n      id: versionId,\n      mcpServerId: mcpServer.id,\n      versionNumber: 1,\n      ...snapshotConfig,\n      changedFields: Object.keys(snapshotConfig),\n      changeMessage: 'Initial version',\n    });\n\n    // Return the thin record\n    return this.deepCopyConfig(newConfig);\n  }\n\n  async update(input: StorageUpdateMCPServerInput): Promise<StorageMCPServerType> {\n    const { id, ...updates } = input;\n\n    const existingConfig = this.db.mcpServers.get(id);\n    if (!existingConfig) {\n      throw new Error(`MCP server with id ${id} not found`);\n    }\n\n    // Separate metadata fields from config fields\n    const { authorId, activeVersionId, metadata, status } = updates;\n\n    // Update metadata fields on the record\n    const updatedConfig: StorageMCPServerType = {\n      ...existingConfig,\n      ...(authorId !== undefined && { authorId }),\n      ...(activeVersionId !== undefined && { activeVersionId }),\n      ...(status !== undefined && { status: status as StorageMCPServerType['status'] }),\n      ...(metadata !== undefined && {\n        metadata: { ...existingConfig.metadata, ...metadata },\n      }),\n      updatedAt: new Date(),\n    };\n\n    // Save the updated record\n    this.db.mcpServers.set(id, updatedConfig);\n    return this.deepCopyConfig(updatedConfig);\n  }\n\n  async delete(id: string): Promise<void> {\n    // Idempotent delete\n    this.db.mcpServers.delete(id);\n    // Also delete all versions for this server\n    await this.deleteVersionsByParentId(id);\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    // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 100)\n    const perPage = normalizePerPage(perPageInput, 100);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // Prevent unreasonably large page values\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Get all MCP servers and apply filters\n    let configs = Array.from(this.db.mcpServers.values());\n\n    // Filter by status\n    if (status) {\n      configs = configs.filter(config => config.status === status);\n    }\n\n    // Filter by authorId if provided\n    if (authorId !== undefined) {\n      configs = configs.filter(config => config.authorId === authorId);\n    }\n\n    // Filter by metadata if provided (AND logic)\n    if (metadata && Object.keys(metadata).length > 0) {\n      configs = configs.filter(config => {\n        if (!config.metadata) return false;\n        return Object.entries(metadata).every(([key, value]) => deepEqual(config.metadata![key], value));\n      });\n    }\n\n    // Sort filtered configs\n    const sortedConfigs = this.sortConfigs(configs, field, direction);\n\n    // Deep clone to avoid mutation\n    const clonedConfigs = sortedConfigs.map(config => this.deepCopyConfig(config));\n\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    return {\n      mcpServers: clonedConfigs.slice(offset, offset + perPage),\n      total: clonedConfigs.length,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < clonedConfigs.length,\n    };\n  }\n\n  // ==========================================================================\n  // MCP Server Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateMCPServerVersionInput): Promise<MCPServerVersion> {\n    // Check if version with this ID already exists\n    if (this.db.mcpServerVersions.has(input.id)) {\n      throw new Error(`Version with id ${input.id} already exists`);\n    }\n\n    // Check for duplicate (mcpServerId, versionNumber) pair\n    for (const version of this.db.mcpServerVersions.values()) {\n      if (version.mcpServerId === input.mcpServerId && version.versionNumber === input.versionNumber) {\n        throw new Error(`Version number ${input.versionNumber} already exists for MCP server ${input.mcpServerId}`);\n      }\n    }\n\n    const version: MCPServerVersion = {\n      ...input,\n      createdAt: new Date(),\n    };\n\n    // Deep clone before storing\n    this.db.mcpServerVersions.set(input.id, this.deepCopyVersion(version));\n    return this.deepCopyVersion(version);\n  }\n\n  async getVersion(id: string): Promise<MCPServerVersion | null> {\n    const version = this.db.mcpServerVersions.get(id);\n    return version ? this.deepCopyVersion(version) : null;\n  }\n\n  async getVersionByNumber(mcpServerId: string, versionNumber: number): Promise<MCPServerVersion | null> {\n    for (const version of this.db.mcpServerVersions.values()) {\n      if (version.mcpServerId === mcpServerId && version.versionNumber === versionNumber) {\n        return this.deepCopyVersion(version);\n      }\n    }\n    return null;\n  }\n\n  async getLatestVersion(mcpServerId: string): Promise<MCPServerVersion | null> {\n    let latest: MCPServerVersion | null = null;\n    for (const version of this.db.mcpServerVersions.values()) {\n      if (version.mcpServerId === mcpServerId) {\n        if (!latest || version.versionNumber > latest.versionNumber) {\n          latest = version;\n        }\n      }\n    }\n    return latest ? this.deepCopyVersion(latest) : null;\n  }\n\n  async listVersions(input: ListMCPServerVersionsInput): Promise<ListMCPServerVersionsOutput> {\n    const { mcpServerId, page = 0, perPage: perPageInput, orderBy } = input;\n    const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n    // Normalize perPage (false -> MAX_SAFE_INTEGER, 0 -> 0, undefined -> 20)\n    const perPage = normalizePerPage(perPageInput, 20);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Filter versions by mcpServerId\n    let versions = Array.from(this.db.mcpServerVersions.values()).filter(v => v.mcpServerId === mcpServerId);\n\n    // Sort versions\n    versions = this.sortVersions(versions, field, direction);\n\n    // Deep clone\n    const clonedVersions = versions.map(v => this.deepCopyVersion(v));\n\n    const total = clonedVersions.length;\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const paginatedVersions = clonedVersions.slice(offset, offset + perPage);\n\n    return {\n      versions: paginatedVersions,\n      total,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < total,\n    };\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    this.db.mcpServerVersions.delete(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    const idsToDelete: string[] = [];\n    for (const [id, version] of this.db.mcpServerVersions.entries()) {\n      if (version.mcpServerId === entityId) {\n        idsToDelete.push(id);\n      }\n    }\n\n    for (const id of idsToDelete) {\n      this.db.mcpServerVersions.delete(id);\n    }\n  }\n\n  async countVersions(mcpServerId: string): Promise<number> {\n    let count = 0;\n    for (const version of this.db.mcpServerVersions.values()) {\n      if (version.mcpServerId === mcpServerId) {\n        count++;\n      }\n    }\n    return count;\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  private deepCopyConfig(config: StorageMCPServerType): StorageMCPServerType {\n    return {\n      ...config,\n      metadata: config.metadata ? { ...config.metadata } : config.metadata,\n    };\n  }\n\n  private deepCopyVersion(version: MCPServerVersion): MCPServerVersion {\n    return {\n      ...version,\n      tools: version.tools ? JSON.parse(JSON.stringify(version.tools)) : version.tools,\n      agents: version.agents ? JSON.parse(JSON.stringify(version.agents)) : version.agents,\n      workflows: version.workflows ? JSON.parse(JSON.stringify(version.workflows)) : version.workflows,\n      repository: version.repository ? { ...version.repository } : version.repository,\n      changedFields: version.changedFields ? [...version.changedFields] : version.changedFields,\n    };\n  }\n\n  private sortConfigs(\n    configs: StorageMCPServerType[],\n    field: ThreadOrderBy,\n    direction: ThreadSortDirection,\n  ): StorageMCPServerType[] {\n    return configs.sort((a, b) => {\n      const aValue = a[field].getTime();\n      const bValue = b[field].getTime();\n\n      return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n    });\n  }\n\n  private sortVersions(\n    versions: MCPServerVersion[],\n    field: MCPServerVersionOrderBy,\n    direction: MCPServerVersionSortDirection,\n  ): MCPServerVersion[] {\n    return versions.sort((a, b) => {\n      let aVal: number;\n      let bVal: number;\n\n      if (field === 'createdAt') {\n        aVal = a.createdAt.getTime();\n        bVal = b.createdAt.getTime();\n      } else {\n        // versionNumber\n        aVal = a.versionNumber;\n        bVal = b.versionNumber;\n      }\n\n      return direction === 'ASC' ? aVal - bVal : bVal - aVal;\n    });\n  }\n}\n","import type { MastraMessageContentV2 } from '../../../agent';\nimport type { MastraDBMessage, StorageThreadType } from '../../../memory/types';\nimport type {\n  StorageResourceType,\n  ThreadOrderBy,\n  ThreadSortDirection,\n  StorageListMessagesInput,\n  StorageListMessagesByResourceIdInput,\n  StorageListMessagesOutput,\n  StorageListThreadsInput,\n  StorageListThreadsOutput,\n  StorageOrderBy,\n  StorageCloneThreadInput,\n  StorageCloneThreadOutput,\n  ObservationalMemoryRecord,\n  ObservationalMemoryHistoryOptions,\n  CreateObservationalMemoryInput,\n  UpdateActiveObservationsInput,\n  UpdateBufferedObservationsInput,\n  UpdateBufferedReflectionInput,\n  SwapBufferedToActiveInput,\n  SwapBufferedToActiveResult,\n  SwapBufferedReflectionToActiveInput,\n  CreateReflectionGenerationInput,\n  UpdateObservationalMemoryConfigInput,\n} from '../../types';\nimport { StorageDomain } from '../base';\n\nfunction isPlainObj(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n// Constants for metadata key validation\nconst SAFE_METADATA_KEY_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\nconst MAX_METADATA_KEY_LENGTH = 128;\nconst DISALLOWED_METADATA_KEYS = new Set(['__proto__', 'prototype', 'constructor']);\n\nexport abstract class MemoryStorage extends StorageDomain {\n  /**\n   * Whether this storage adapter supports Observational Memory.\n   * Adapters that implement OM methods should set this to true.\n   * Defaults to false for backwards compatibility with custom adapters.\n   */\n  readonly supportsObservationalMemory?: boolean = false;\n\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'MEMORY',\n    });\n  }\n\n  abstract getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null>;\n\n  abstract saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType>;\n\n  abstract updateThread({\n    id,\n    title,\n    metadata,\n  }: {\n    id: string;\n    title: string;\n    metadata: Record<string, unknown>;\n  }): Promise<StorageThreadType>;\n\n  abstract deleteThread({ threadId }: { threadId: string }): Promise<void>;\n\n  abstract listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput>;\n\n  /**\n   * List messages by resource ID only (across all threads).\n   * Used by Observational Memory and LongMemEval for resource-scoped queries.\n   *\n   * @param args - Resource ID and pagination/filtering options\n   * @returns Paginated list of messages for the resource\n   */\n  async listMessagesByResourceId(_args: StorageListMessagesByResourceIdInput): Promise<StorageListMessagesOutput> {\n    throw new Error(\n      `Resource-scoped message listing is not implemented by this storage adapter (${this.constructor.name}). ` +\n        `Use an adapter that supports Observational Memory (pg, libsql, mongodb) or disable observational memory.`,\n    );\n  }\n\n  abstract listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }>;\n\n  abstract saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }>;\n\n  abstract updateMessages(args: {\n    messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n      id: string;\n      content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n    })[];\n  }): Promise<MastraDBMessage[]>;\n\n  async deleteMessages(_messageIds: string[]): Promise<void> {\n    throw new Error(\n      `Message deletion is not supported by this storage adapter (${this.constructor.name}). ` +\n        `The deleteMessages method needs to be implemented in the storage adapter.`,\n    );\n  }\n\n  /**\n   * List threads with optional filtering by resourceId and metadata.\n   *\n   * @param args - Filter, pagination, and ordering options\n   * @param args.filter - Optional filters for resourceId and/or metadata\n   * @param args.filter.resourceId - Optional resource ID to filter by\n   * @param args.filter.metadata - Optional metadata key-value pairs to filter by (AND logic)\n   * @returns Paginated list of threads matching the filters\n   */\n  abstract listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput>;\n\n  /**\n   * Clone a thread and its messages to create a new independent thread.\n   * The cloned thread will have clone metadata stored in its metadata field.\n   *\n   * @param args - Clone configuration options\n   * @returns The newly created thread and the cloned messages\n   */\n  async cloneThread(_args: StorageCloneThreadInput): Promise<StorageCloneThreadOutput> {\n    throw new Error(\n      `Thread cloning is not implemented by this storage adapter (${this.constructor.name}). ` +\n        `The cloneThread method needs to be implemented in the storage adapter.`,\n    );\n  }\n\n  async getResourceById(_: { resourceId: string }): Promise<StorageResourceType | null> {\n    throw new Error(\n      `Resource working memory is not implemented by this storage adapter (${this.constructor.name}). ` +\n        `This is likely a bug - all Mastra storage adapters should implement resource support. ` +\n        `Please report this issue at https://github.com/mastra-ai/mastra/issues`,\n    );\n  }\n\n  async saveResource(_: { resource: StorageResourceType }): Promise<StorageResourceType> {\n    throw new Error(\n      `Resource working memory is not implemented by this storage adapter (${this.constructor.name}). ` +\n        `This is likely a bug - all Mastra storage adapters should implement resource support. ` +\n        `Please report this issue at https://github.com/mastra-ai/mastra/issues`,\n    );\n  }\n\n  async updateResource(_: {\n    resourceId: string;\n    workingMemory?: string;\n    metadata?: Record<string, unknown>;\n  }): Promise<StorageResourceType> {\n    throw new Error(\n      `Resource working memory is not implemented by this storage adapter (${this.constructor.name}). ` +\n        `This is likely a bug - all Mastra storage adapters should implement resource support. ` +\n        `Please report this issue at https://github.com/mastra-ai/mastra/issues`,\n    );\n  }\n\n  protected parseOrderBy(\n    orderBy?: StorageOrderBy,\n    defaultDirection: ThreadSortDirection = 'DESC',\n  ): { field: ThreadOrderBy; direction: ThreadSortDirection } {\n    return {\n      field: orderBy?.field && orderBy.field in THREAD_ORDER_BY_SET ? orderBy.field : 'createdAt',\n      direction:\n        orderBy?.direction && orderBy.direction in THREAD_THREAD_SORT_DIRECTION_SET\n          ? orderBy.direction\n          : defaultDirection,\n    };\n  }\n\n  // ============================================\n  // Observational Memory Methods\n  // ============================================\n\n  /**\n   * Get the current observational memory record for a thread/resource.\n   * Returns the most recent active record.\n   */\n  async getObservationalMemory(\n    _threadId: string | null,\n    _resourceId: string,\n  ): Promise<ObservationalMemoryRecord | null> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Get observational memory history (previous generations).\n   * Returns records in reverse chronological order (newest first).\n   */\n  async getObservationalMemoryHistory(\n    _threadId: string | null,\n    _resourceId: string,\n    _limit?: number,\n    _options?: ObservationalMemoryHistoryOptions,\n  ): Promise<ObservationalMemoryRecord[]> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Create a new observational memory record.\n   * Called when starting observations for a new thread/resource.\n   */\n  async initializeObservationalMemory(_input: CreateObservationalMemoryInput): Promise<ObservationalMemoryRecord> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Update active observations.\n   * Called when observations are created and immediately activated (no buffering).\n   */\n  async updateActiveObservations(_input: UpdateActiveObservationsInput): Promise<void> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  // ============================================\n  // Buffering Methods (for async observation/reflection)\n  // These methods support async buffering when `bufferTokens` is configured.\n  // ============================================\n\n  /**\n   * Update buffered observations.\n   * Called when observations are created asynchronously via `bufferTokens`.\n   */\n  async updateBufferedObservations(_input: UpdateBufferedObservationsInput): Promise<void> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Swap buffered observations to active.\n   * Atomic operation that:\n   * 1. Appends bufferedObservations → activeObservations (based on activationRatio)\n   * 2. Moves activated bufferedMessageIds → observedMessageIds\n   * 3. Keeps remaining buffered content if activationRatio < 100\n   * 4. Updates lastObservedAt\n   *\n   * Returns info about what was activated for UI feedback.\n   */\n  async swapBufferedToActive(_input: SwapBufferedToActiveInput): Promise<SwapBufferedToActiveResult> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Create a new generation from a reflection.\n   * Creates a new record with:\n   * - originType: 'reflection'\n   * - activeObservations containing the reflection\n   * - generationCount incremented from the current record\n   */\n  async createReflectionGeneration(_input: CreateReflectionGenerationInput): Promise<ObservationalMemoryRecord> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Update buffered reflection (async reflection in progress).\n   * Called when reflection runs asynchronously via `bufferTokens`.\n   */\n  async updateBufferedReflection(_input: UpdateBufferedReflectionInput): Promise<void> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Swap buffered reflection to active observations.\n   * Creates a new generation where activeObservations = bufferedReflection + unreflected observations.\n   * The `tokenCount` in input is the processor-computed token count for the combined content.\n   */\n  async swapBufferedReflectionToActive(\n    _input: SwapBufferedReflectionToActiveInput,\n  ): Promise<ObservationalMemoryRecord> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Set the isReflecting flag.\n   */\n  async setReflectingFlag(_id: string, _isReflecting: boolean): Promise<void> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Set the isObserving flag.\n   */\n  async setObservingFlag(_id: string, _isObserving: boolean): Promise<void> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Set the isBufferingObservation flag and update lastBufferedAtTokens.\n   * Called when async observation buffering starts (true) or ends/fails (false).\n   * @param id - Record ID\n   * @param isBuffering - Whether buffering is in progress\n   * @param lastBufferedAtTokens - The pending token count at which this buffer was triggered (only set when isBuffering=true)\n   */\n  async setBufferingObservationFlag(_id: string, _isBuffering: boolean, _lastBufferedAtTokens?: number): Promise<void> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Set the isBufferingReflection flag.\n   * Called when async reflection buffering starts (true) or ends/fails (false).\n   */\n  async setBufferingReflectionFlag(_id: string, _isBuffering: boolean): Promise<void> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Insert a fully-formed observational memory record.\n   * Used by thread cloning to copy OM state with remapped IDs.\n   */\n  async insertObservationalMemoryRecord(_record: ObservationalMemoryRecord): Promise<void> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Clear all observational memory for a thread/resource.\n   * Removes all records and history.\n   */\n  async clearObservationalMemory(_threadId: string | null, _resourceId: string): Promise<void> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Set the pending message token count.\n   * Called at the end of each OM processing step to persist the current\n   * context window token count so the UI can display it on page load.\n   */\n  async setPendingMessageTokens(_id: string, _tokenCount: number): Promise<void> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Update the config of an existing observational memory record.\n   * The provided config is deep-merged into the record's existing config.\n   */\n  async updateObservationalMemoryConfig(_input: UpdateObservationalMemoryConfigInput): Promise<void> {\n    throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n  }\n\n  /**\n   * Deep-merge two plain objects. Available for subclasses to merge\n   * partial config overrides into existing record configs.\n   */\n  protected deepMergeConfig(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n    const output: Record<string, unknown> = { ...target };\n    for (const key of Object.keys(source)) {\n      const tVal = target[key];\n      const sVal = source[key];\n      if (isPlainObj(tVal) && isPlainObj(sVal)) {\n        output[key] = this.deepMergeConfig(tVal, sVal);\n      } else if (sVal !== undefined) {\n        output[key] = sVal;\n      }\n    }\n    return output;\n  }\n\n  /**\n   * Validates metadata keys to prevent SQL injection attacks and prototype pollution.\n   * Keys must start with a letter or underscore, followed by alphanumeric characters or underscores.\n   * @param metadata - The metadata object to validate\n   * @throws Error if any key contains invalid characters or is a disallowed key\n   */\n  protected validateMetadataKeys(metadata: Record<string, unknown> | undefined): void {\n    if (!metadata) return;\n\n    for (const key of Object.keys(metadata)) {\n      // First check for disallowed prototype pollution keys\n      if (DISALLOWED_METADATA_KEYS.has(key)) {\n        throw new Error(`Invalid metadata key: \"${key}\".`);\n      }\n\n      // Then check pattern\n      if (!SAFE_METADATA_KEY_PATTERN.test(key)) {\n        throw new Error(\n          `Invalid metadata key: \"${key}\". Keys must start with a letter or underscore and contain only alphanumeric characters and underscores.`,\n        );\n      }\n\n      // Also limit key length to prevent potential issues\n      if (key.length > MAX_METADATA_KEY_LENGTH) {\n        throw new Error(`Metadata key \"${key}\" exceeds maximum length of ${MAX_METADATA_KEY_LENGTH} characters.`);\n      }\n    }\n  }\n\n  /**\n   * Validates pagination parameters and returns safe offset.\n   * @param page - Page number (0-indexed)\n   * @param perPage - Items per page (0 is allowed and returns empty results)\n   * @throws Error if page is negative, perPage is negative/invalid, or offset would overflow\n   */\n  protected validatePagination(page: number, perPage: number): void {\n    if (!Number.isFinite(page) || !Number.isSafeInteger(page) || page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // perPage: 0 is allowed (returns empty results), negative values are rejected\n    if (!Number.isFinite(perPage) || !Number.isSafeInteger(perPage) || perPage < 0) {\n      throw new Error('perPage must be >= 0');\n    }\n\n    // Skip overflow check when perPage is 0 (no offset needed)\n    if (perPage === 0) {\n      return;\n    }\n\n    // Prevent overflow when calculating offset\n    const offset = page * perPage;\n    if (!Number.isSafeInteger(offset) || offset > Number.MAX_SAFE_INTEGER) {\n      throw new Error('page value too large');\n    }\n  }\n\n  /**\n   * Validates pagination input before normalization.\n   * Use this when accepting raw perPageInput (number | false) from callers.\n   *\n   * When perPage is false (fetch all), page must be 0 since pagination is disabled.\n   * When perPage is a number, delegates to validatePagination for full validation.\n   *\n   * @param page - Page number (0-indexed)\n   * @param perPageInput - Items per page as number, or false to fetch all results\n   * @throws Error if perPageInput is false and page !== 0\n   * @throws Error if perPageInput is invalid (not false or a non-negative safe integer)\n   * @throws Error if page is invalid or offset would overflow\n   */\n  protected validatePaginationInput(page: number, perPageInput: number | false): void {\n    // Validate perPageInput type first\n    if (perPageInput !== false) {\n      if (typeof perPageInput !== 'number' || !Number.isFinite(perPageInput) || !Number.isSafeInteger(perPageInput)) {\n        throw new Error('perPage must be false or a safe integer');\n      }\n      if (perPageInput < 0) {\n        throw new Error('perPage must be >= 0');\n      }\n    }\n\n    // When fetching all (perPage: false), only page 0 is valid\n    if (perPageInput === false) {\n      if (page !== 0) {\n        throw new Error('page must be 0 when perPage is false');\n      }\n      // Still validate page is a valid integer\n      if (!Number.isFinite(page) || !Number.isSafeInteger(page)) {\n        throw new Error('page must be >= 0');\n      }\n      return;\n    }\n\n    // For numeric perPage, delegate to existing validation\n    this.validatePagination(page, perPageInput);\n  }\n}\n\nconst THREAD_ORDER_BY_SET: Record<ThreadOrderBy, true> = {\n  createdAt: true,\n  updatedAt: true,\n};\n\nconst THREAD_THREAD_SORT_DIRECTION_SET: Record<ThreadSortDirection, true> = {\n  ASC: true,\n  DESC: true,\n};\n","import { MessageList } from '../../../agent/message-list';\nimport type { MastraDBMessage, StorageThreadType } from '../../../memory/types';\nimport { normalizePerPage, calculatePagination } from '../../base';\nimport type {\n  StorageMessageType,\n  StorageResourceType,\n  ThreadOrderBy,\n  ThreadSortDirection,\n  StorageListMessagesInput,\n  StorageListMessagesByResourceIdInput,\n  StorageListMessagesOutput,\n  StorageListThreadsInput,\n  StorageListThreadsOutput,\n  StorageCloneThreadInput,\n  StorageCloneThreadOutput,\n  ThreadCloneMetadata,\n  ObservationalMemoryRecord,\n  ObservationalMemoryHistoryOptions,\n  BufferedObservationChunk,\n  CreateObservationalMemoryInput,\n  UpdateActiveObservationsInput,\n  UpdateBufferedObservationsInput,\n  UpdateBufferedReflectionInput,\n  SwapBufferedToActiveInput,\n  SwapBufferedToActiveResult,\n  SwapBufferedReflectionToActiveInput,\n  CreateReflectionGenerationInput,\n  UpdateObservationalMemoryConfigInput,\n} from '../../types';\nimport { filterByDateRange, jsonValueEquals, safelyParseJSON } from '../../utils';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { MemoryStorage } from './base';\n\nexport class InMemoryMemory extends MemoryStorage {\n  readonly supportsObservationalMemory = true;\n  private db: InMemoryDB;\n\n  constructor({ db }: { db: InMemoryDB }) {\n    super();\n    this.db = db;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.db.threads.clear();\n    this.db.messages.clear();\n    this.db.resources.clear();\n    this.db.observationalMemory.clear();\n  }\n\n  async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n    const thread = this.db.threads.get(threadId);\n    return thread ? { ...thread, metadata: thread.metadata ? { ...thread.metadata } : thread.metadata } : null;\n  }\n\n  async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n    const key = thread.id;\n    this.db.threads.set(key, thread);\n    return thread;\n  }\n\n  async updateThread({\n    id,\n    title,\n    metadata,\n  }: {\n    id: string;\n    title: string;\n    metadata: Record<string, unknown>;\n  }): Promise<StorageThreadType> {\n    const thread = this.db.threads.get(id);\n\n    if (!thread) {\n      throw new Error(`Thread with id ${id} not found`);\n    }\n\n    if (thread) {\n      thread.title = title;\n      thread.metadata = { ...thread.metadata, ...metadata };\n      thread.updatedAt = new Date();\n    }\n    return thread;\n  }\n\n  async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n    this.db.threads.delete(threadId);\n\n    this.db.messages.forEach((msg, key) => {\n      if (msg.thread_id === threadId) {\n        this.db.messages.delete(key);\n      }\n    });\n  }\n\n  async listMessages({\n    threadId,\n    resourceId: optionalResourceId,\n    include,\n    filter,\n    perPage: perPageInput,\n    page = 0,\n    orderBy,\n  }: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n    // Normalize threadId to array\n    const threadIds = Array.isArray(threadId) ? threadId : [threadId];\n\n    if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {\n      throw new Error('threadId must be a non-empty string or array of non-empty strings');\n    }\n\n    const threadIdSet = new Set(threadIds);\n\n    const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n    // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 40)\n    const perPage = normalizePerPage(perPageInput, 40);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // Prevent unreasonably large page values that could cause performance issues\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Calculate offset from page\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    // Step 1: Get messages matching threadId(s) and optionally resourceId\n    let threadMessages = Array.from(this.db.messages.values()).filter((msg: any) => {\n      // Message must be in one of the specified threads\n      if (threadIdSet && !threadIdSet.has(msg.thread_id)) return false;\n      // If optionalResourceId provided, message must match it\n      if (optionalResourceId && msg.resourceId !== optionalResourceId) return false;\n      return true;\n    });\n\n    // Apply date filtering\n    threadMessages = filterByDateRange(threadMessages, (msg: any) => new Date(msg.createdAt), filter?.dateRange);\n\n    // Sort thread messages before pagination\n    threadMessages.sort((a: any, b: any) => {\n      const isDateField = field === 'createdAt' || field === 'updatedAt';\n      const aValue = isDateField ? new Date(a[field]).getTime() : a[field];\n      const bValue = isDateField ? new Date(b[field]).getTime() : b[field];\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    // Get total count of thread messages (for pagination metadata)\n    const totalThreadMessages = threadMessages.length;\n\n    // Apply pagination to thread messages\n    const start = offset;\n    const end = start + perPage;\n    const paginatedThreadMessages = threadMessages.slice(start, end);\n\n    // Convert paginated thread messages to MastraDBMessage\n    const messages: MastraDBMessage[] = [];\n    const messageIds = new Set<string>();\n\n    for (const msg of paginatedThreadMessages) {\n      const convertedMessage = this.parseStoredMessage(msg);\n      messages.push(convertedMessage);\n      messageIds.add(msg.id);\n    }\n\n    // Step 2: Add included messages with context (if any), excluding duplicates\n    if (include && include.length > 0) {\n      for (const includeItem of include) {\n        const targetMessage = this.db.messages.get(includeItem.id);\n        if (targetMessage) {\n          // Convert StorageMessageType to MastraDBMessage\n          const convertedMessage = {\n            id: targetMessage.id,\n            threadId: targetMessage.thread_id,\n            content: safelyParseJSON(targetMessage.content),\n            role: targetMessage.role as 'user' | 'assistant' | 'system' | 'tool',\n            type: targetMessage.type,\n            createdAt: targetMessage.createdAt,\n            resourceId: targetMessage.resourceId,\n          } as MastraDBMessage;\n\n          // Only add if not already in messages array (deduplication)\n          if (!messageIds.has(convertedMessage.id)) {\n            messages.push(convertedMessage);\n            messageIds.add(convertedMessage.id);\n          }\n\n          // Add previous messages if requested\n          if (includeItem.withPreviousMessages) {\n            const allThreadMessages = Array.from(this.db.messages.values())\n              .filter((msg: any) => msg.thread_id === (includeItem.threadId || threadId))\n              .sort((a: any, b: any) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n\n            const targetIndex = allThreadMessages.findIndex(msg => msg.id === includeItem.id);\n            if (targetIndex !== -1) {\n              const startIndex = Math.max(0, targetIndex - (includeItem.withPreviousMessages || 0));\n              for (let i = startIndex; i < targetIndex; i++) {\n                const message = allThreadMessages[i];\n                if (message && !messageIds.has(message.id)) {\n                  const convertedPrevMessage = {\n                    id: message.id,\n                    threadId: message.thread_id,\n                    content: safelyParseJSON(message.content),\n                    role: message.role as 'user' | 'assistant' | 'system' | 'tool',\n                    type: message.type,\n                    createdAt: message.createdAt,\n                    resourceId: message.resourceId,\n                  } as MastraDBMessage;\n                  messages.push(convertedPrevMessage);\n                  messageIds.add(message.id);\n                }\n              }\n            }\n          }\n\n          // Add next messages if requested\n          if (includeItem.withNextMessages) {\n            const allThreadMessages = Array.from(this.db.messages.values())\n              .filter((msg: any) => msg.thread_id === (includeItem.threadId || threadId))\n              .sort((a: any, b: any) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n\n            const targetIndex = allThreadMessages.findIndex(msg => msg.id === includeItem.id);\n            if (targetIndex !== -1) {\n              const endIndex = Math.min(\n                allThreadMessages.length,\n                targetIndex + (includeItem.withNextMessages || 0) + 1,\n              );\n              for (let i = targetIndex + 1; i < endIndex; i++) {\n                const message = allThreadMessages[i];\n                if (message && !messageIds.has(message.id)) {\n                  const convertedNextMessage = {\n                    id: message.id,\n                    threadId: message.thread_id,\n                    content: safelyParseJSON(message.content),\n                    role: message.role as 'user' | 'assistant' | 'system' | 'tool',\n                    type: message.type,\n                    createdAt: message.createdAt,\n                    resourceId: message.resourceId,\n                  } as MastraDBMessage;\n                  messages.push(convertedNextMessage);\n                  messageIds.add(message.id);\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    // Sort all messages (paginated + included) for final output\n    messages.sort((a: any, b: any) => {\n      const isDateField = field === 'createdAt' || field === 'updatedAt';\n      const aValue = isDateField ? new Date(a[field]).getTime() : a[field];\n      const bValue = isDateField ? new Date(b[field]).getTime() : b[field];\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    // Calculate hasMore\n    let hasMore;\n    if (include && include.length > 0) {\n      // When using include, check if we've returned all messages from the thread\n      // because include might bring in messages beyond the pagination window\n      const returnedThreadMessageIds = new Set(messages.filter(m => m.threadId === threadId).map(m => m.id));\n      hasMore = returnedThreadMessageIds.size < totalThreadMessages;\n    } else {\n      // Standard pagination: check if there are more pages\n      hasMore = end < totalThreadMessages;\n    }\n\n    return {\n      messages,\n      total: totalThreadMessages,\n      page,\n      perPage: perPageForResponse,\n      hasMore,\n    };\n  }\n\n  async listMessagesByResourceId({\n    resourceId,\n    filter,\n    perPage: perPageInput,\n    page = 0,\n    orderBy,\n  }: StorageListMessagesByResourceIdInput): Promise<StorageListMessagesOutput> {\n    const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n    // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 40)\n    const perPage = normalizePerPage(perPageInput, 40);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // Prevent unreasonably large page values that could cause performance issues\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    // Get all messages matching the resourceId (across all threads)\n    let messages = Array.from(this.db.messages.values()).filter((msg: any) => msg.resourceId === resourceId);\n\n    // Apply date filtering\n    messages = filterByDateRange(messages, (msg: any) => new Date(msg.createdAt), filter?.dateRange);\n\n    // Sort messages\n    messages.sort((a: any, b: any) => {\n      const isDateField = field === 'createdAt' || field === 'updatedAt';\n      const aValue = isDateField ? new Date(a[field]).getTime() : a[field];\n      const bValue = isDateField ? new Date(b[field]).getTime() : b[field];\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    // Get total count for pagination\n    const total = messages.length;\n\n    // Apply pagination\n    const paginatedMessages = messages.slice(offset, offset + perPage);\n\n    const list = new MessageList().add(\n      paginatedMessages.map(m => this.parseStoredMessage(m)),\n      'memory',\n    );\n\n    const hasMore = offset + paginatedMessages.length < total;\n\n    return {\n      messages: list.get.all.db(),\n      total,\n      page,\n      perPage: perPageForResponse,\n      hasMore,\n    };\n  }\n\n  protected parseStoredMessage(message: StorageMessageType): MastraDBMessage {\n    const { resourceId, content, role, thread_id, ...rest } = message;\n\n    // Parse content using safelyParseJSON utility\n    let parsedContent = safelyParseJSON(content);\n\n    // If the result is a plain string (V1 format), wrap it in V2 structure\n    if (typeof parsedContent === 'string') {\n      parsedContent = {\n        format: 2,\n        content: parsedContent,\n        parts: [{ type: 'text', text: parsedContent }],\n      };\n    }\n\n    return {\n      ...rest,\n      threadId: thread_id,\n      ...(message.resourceId && { resourceId: message.resourceId }),\n      content: parsedContent,\n      role: role as MastraDBMessage['role'],\n    } satisfies MastraDBMessage;\n  }\n\n  async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n    const rawMessages = messageIds.map(id => this.db.messages.get(id)).filter(message => !!message);\n\n    const list = new MessageList().add(\n      rawMessages.map(m => this.parseStoredMessage(m)),\n      'memory',\n    );\n    return { messages: list.get.all.db() };\n  }\n\n  async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n    const { messages } = args;\n    // Simulate error handling for testing - check before saving\n    if (messages.some(msg => msg.id === 'error-message' || msg.resourceId === null)) {\n      throw new Error('Simulated error for testing');\n    }\n\n    // Update thread timestamps for each unique threadId\n    const threadIds = new Set(messages.map(msg => msg.threadId).filter((id): id is string => Boolean(id)));\n    for (const threadId of threadIds) {\n      const thread = this.db.threads.get(threadId);\n      if (thread) {\n        thread.updatedAt = new Date();\n      }\n    }\n\n    for (const message of messages) {\n      const key = message.id;\n      // Convert MastraDBMessage to StorageMessageType\n      const storageMessage: StorageMessageType = {\n        id: message.id,\n        thread_id: message.threadId || '',\n        content: JSON.stringify(message.content),\n        role: message.role || 'user',\n        type: message.type || 'text',\n        createdAt: message.createdAt,\n        resourceId: message.resourceId || null,\n      };\n      this.db.messages.set(key, storageMessage);\n    }\n\n    const list = new MessageList().add(messages, 'memory');\n    return { messages: list.get.all.db() };\n  }\n\n  async updateMessages(args: { messages: (Partial<MastraDBMessage> & { id: string })[] }): Promise<MastraDBMessage[]> {\n    const updatedMessages: MastraDBMessage[] = [];\n    for (const update of args.messages) {\n      const storageMsg = this.db.messages.get(update.id);\n      if (!storageMsg) continue;\n\n      // Track old threadId for possible move\n      const oldThreadId = storageMsg.thread_id;\n      const newThreadId = update.threadId || oldThreadId;\n      let threadIdChanged = false;\n      if (update.threadId && update.threadId !== oldThreadId) {\n        threadIdChanged = true;\n      }\n\n      // Update fields\n      if (update.role !== undefined) storageMsg.role = update.role;\n      if (update.type !== undefined) storageMsg.type = update.type;\n      if (update.createdAt !== undefined) storageMsg.createdAt = update.createdAt;\n      if (update.resourceId !== undefined) storageMsg.resourceId = update.resourceId;\n      // Deep merge content if present\n      if (update.content !== undefined) {\n        let oldContent = safelyParseJSON(storageMsg.content);\n        let newContent = update.content;\n        if (typeof newContent === 'object' && typeof oldContent === 'object') {\n          // Deep merge for metadata/content fields\n          newContent = { ...oldContent, ...newContent };\n          if (oldContent.metadata && newContent.metadata) {\n            newContent.metadata = { ...oldContent.metadata, ...newContent.metadata };\n          }\n        }\n        storageMsg.content = JSON.stringify(newContent);\n      }\n      // Handle threadId change\n      if (threadIdChanged) {\n        storageMsg.thread_id = newThreadId;\n        // Update updatedAt for both threads, ensuring strictly greater and not equal\n        const base = Date.now();\n        let oldThreadNewTime: number | undefined;\n        const oldThread = this.db.threads.get(oldThreadId);\n        if (oldThread) {\n          const prev = new Date(oldThread.updatedAt).getTime();\n          oldThreadNewTime = Math.max(base, prev + 1);\n          oldThread.updatedAt = new Date(oldThreadNewTime);\n        }\n        const newThread = this.db.threads.get(newThreadId);\n        if (newThread) {\n          const prev = new Date(newThread.updatedAt).getTime();\n          let newThreadNewTime = Math.max(base + 1, prev + 1);\n          if (oldThreadNewTime !== undefined && newThreadNewTime <= oldThreadNewTime) {\n            newThreadNewTime = oldThreadNewTime + 1;\n          }\n          newThread.updatedAt = new Date(newThreadNewTime);\n        }\n      } else {\n        // Only update the thread's updatedAt if not a move\n        const thread = this.db.threads.get(oldThreadId);\n        if (thread) {\n          const prev = new Date(thread.updatedAt).getTime();\n          let newTime = Date.now();\n          if (newTime <= prev) newTime = prev + 1;\n          thread.updatedAt = new Date(newTime);\n        }\n      }\n      // Save the updated message\n      this.db.messages.set(update.id, storageMsg);\n      // Return as MastraDBMessage\n      updatedMessages.push({\n        id: storageMsg.id,\n        threadId: storageMsg.thread_id,\n        content: safelyParseJSON(storageMsg.content),\n        role: storageMsg.role === 'user' || storageMsg.role === 'assistant' ? storageMsg.role : 'user',\n        type: storageMsg.type,\n        createdAt: storageMsg.createdAt,\n        resourceId: storageMsg.resourceId === null ? undefined : storageMsg.resourceId,\n      });\n    }\n    return updatedMessages;\n  }\n\n  async deleteMessages(messageIds: string[]): Promise<void> {\n    if (!messageIds || messageIds.length === 0) {\n      return;\n    }\n\n    // Collect thread IDs to update\n    const threadIds = new Set<string>();\n\n    for (const messageId of messageIds) {\n      const message = this.db.messages.get(messageId);\n      if (message && message.thread_id) {\n        threadIds.add(message.thread_id);\n      }\n      // Delete the message\n      this.db.messages.delete(messageId);\n    }\n\n    // Update thread timestamps\n    const now = new Date();\n    for (const threadId of threadIds) {\n      const thread = this.db.threads.get(threadId);\n      if (thread) {\n        thread.updatedAt = now;\n      }\n    }\n  }\n\n  async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n    const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    // Validate pagination input before normalization\n    // This ensures page === 0 when perPageInput === false\n    this.validatePaginationInput(page, perPageInput ?? 100);\n\n    const perPage = normalizePerPage(perPageInput, 100);\n\n    // Start with all threads\n    let threads = Array.from(this.db.threads.values());\n\n    // Apply resourceId filter if provided\n    if (filter?.resourceId) {\n      threads = threads.filter((t: any) => t.resourceId === filter.resourceId);\n    }\n\n    // Validate metadata keys before filtering\n    this.validateMetadataKeys(filter?.metadata);\n\n    // Apply metadata filter if provided (AND logic - all key-value pairs must match)\n    if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n      threads = threads.filter(thread => {\n        if (!thread.metadata) return false;\n        return Object.entries(filter.metadata!).every(([key, value]) => jsonValueEquals(thread.metadata![key], value));\n      });\n    }\n\n    const sortedThreads = this.sortThreads(threads, field, direction);\n    const clonedThreads = sortedThreads.map(thread => ({\n      ...thread,\n      metadata: thread.metadata ? { ...thread.metadata } : thread.metadata,\n    })) as StorageThreadType[];\n\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    return {\n      threads: clonedThreads.slice(offset, offset + perPage),\n      total: clonedThreads.length,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < clonedThreads.length,\n    };\n  }\n\n  async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n    const resource = this.db.resources.get(resourceId);\n    return resource\n      ? { ...resource, metadata: resource.metadata ? { ...resource.metadata } : resource.metadata }\n      : null;\n  }\n\n  async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n    this.db.resources.set(resource.id, resource);\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    let resource = this.db.resources.get(resourceId);\n\n    if (!resource) {\n      // Create new resource if it doesn't exist\n      resource = {\n        id: resourceId,\n        workingMemory,\n        metadata: metadata || {},\n        createdAt: new Date(),\n        updatedAt: new Date(),\n      };\n    } else {\n      resource = {\n        ...resource,\n        workingMemory: workingMemory !== undefined ? workingMemory : resource.workingMemory,\n        metadata: {\n          ...resource.metadata,\n          ...metadata,\n        },\n        updatedAt: new Date(),\n      };\n    }\n\n    this.db.resources.set(resourceId, resource);\n    return resource;\n  }\n\n  async cloneThread(args: StorageCloneThreadInput): Promise<StorageCloneThreadOutput> {\n    const { sourceThreadId, newThreadId: providedThreadId, resourceId, title, metadata, options } = args;\n\n    // Get the source thread\n    const sourceThread = this.db.threads.get(sourceThreadId);\n    if (!sourceThread) {\n      throw new Error(`Source thread with id ${sourceThreadId} not found`);\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    if (this.db.threads.has(newThreadId)) {\n      throw new Error(`Thread with id ${newThreadId} already exists`);\n    }\n\n    // Get messages from the source thread\n    let sourceMessages = Array.from(this.db.messages.values())\n      .filter((msg: StorageMessageType) => msg.thread_id === sourceThreadId)\n      .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n\n    // Apply message filters if provided\n    if (options?.messageFilter) {\n      const { startDate, endDate, messageIds } = options.messageFilter;\n\n      if (messageIds && messageIds.length > 0) {\n        const messageIdSet = new Set(messageIds);\n        sourceMessages = sourceMessages.filter(msg => messageIdSet.has(msg.id));\n      }\n\n      if (startDate) {\n        sourceMessages = sourceMessages.filter(msg => new Date(msg.createdAt) >= startDate);\n      }\n\n      if (endDate) {\n        sourceMessages = sourceMessages.filter(msg => new Date(msg.createdAt) <= endDate);\n      }\n    }\n\n    // Apply message limit (take from the end to get most recent)\n    if (options?.messageLimit && options.messageLimit > 0 && sourceMessages.length > options.messageLimit) {\n      sourceMessages = sourceMessages.slice(-options.messageLimit);\n    }\n\n    const now = new Date();\n\n    // Determine the last message ID for clone metadata\n    const lastMessageId = sourceMessages.length > 0 ? sourceMessages[sourceMessages.length - 1]!.id : undefined;\n\n    // Create clone metadata\n    const cloneMetadata: ThreadCloneMetadata = {\n      sourceThreadId,\n      clonedAt: now,\n      ...(lastMessageId && { lastMessageId }),\n    };\n\n    // Create the new thread\n    const newThread: StorageThreadType = {\n      id: newThreadId,\n      resourceId: resourceId || sourceThread.resourceId,\n      title: title || (sourceThread.title ? `Clone of ${sourceThread.title}` : undefined),\n      metadata: {\n        ...metadata,\n        clone: cloneMetadata,\n      },\n      createdAt: now,\n      updatedAt: now,\n    };\n\n    // Save the new thread\n    this.db.threads.set(newThreadId, newThread);\n\n    // Clone messages with new IDs\n    const clonedMessages: MastraDBMessage[] = [];\n    const messageIdMap: Record<string, string> = {};\n    for (const sourceMsg of sourceMessages) {\n      const newMessageId = crypto.randomUUID();\n      messageIdMap[sourceMsg.id] = newMessageId;\n      const parsedContent = safelyParseJSON(sourceMsg.content);\n\n      // Create storage message\n      const newStorageMessage: StorageMessageType = {\n        id: newMessageId,\n        thread_id: newThreadId,\n        content: sourceMsg.content,\n        role: sourceMsg.role,\n        type: sourceMsg.type,\n        createdAt: sourceMsg.createdAt,\n        resourceId: resourceId || sourceMsg.resourceId,\n      };\n\n      this.db.messages.set(newMessageId, newStorageMessage);\n\n      // Create MastraDBMessage for return\n      clonedMessages.push({\n        id: newMessageId,\n        threadId: newThreadId,\n        content: parsedContent,\n        role: sourceMsg.role as MastraDBMessage['role'],\n        type: sourceMsg.type,\n        createdAt: sourceMsg.createdAt,\n        resourceId: resourceId || sourceMsg.resourceId || undefined,\n      });\n    }\n\n    return {\n      thread: newThread,\n      clonedMessages,\n      messageIdMap,\n    };\n  }\n\n  private sortThreads(threads: any[], field: ThreadOrderBy, direction: ThreadSortDirection): any[] {\n    return threads.sort((a, b) => {\n      const isDateField = field === 'createdAt' || field === 'updatedAt';\n      const aValue = isDateField ? new Date(a[field]).getTime() : a[field];\n      const bValue = isDateField ? new Date(b[field]).getTime() : b[field];\n\n      if (typeof aValue === 'number' && typeof bValue === 'number') {\n        if (direction === 'ASC') {\n          return aValue - bValue;\n        } else {\n          return bValue - aValue;\n        }\n      }\n      return direction === 'ASC'\n        ? String(aValue).localeCompare(String(bValue))\n        : String(bValue).localeCompare(String(aValue));\n    });\n  }\n\n  // ============================================\n  // Observational Memory Implementation\n  // ============================================\n\n  private getObservationalMemoryKey(threadId: string | null, resourceId: string): string {\n    if (threadId) {\n      return `thread:${threadId}`;\n    }\n    return `resource:${resourceId}`;\n  }\n\n  async getObservationalMemory(threadId: string | null, resourceId: string): Promise<ObservationalMemoryRecord | null> {\n    const key = this.getObservationalMemoryKey(threadId, resourceId);\n    const records = this.db.observationalMemory.get(key);\n    return records?.[0] ?? null;\n  }\n\n  async getObservationalMemoryHistory(\n    threadId: string | null,\n    resourceId: string,\n    limit?: number,\n    options?: ObservationalMemoryHistoryOptions,\n  ): Promise<ObservationalMemoryRecord[]> {\n    const key = this.getObservationalMemoryKey(threadId, resourceId);\n    let records = this.db.observationalMemory.get(key) ?? [];\n\n    if (options?.from) {\n      records = records.filter(r => r.createdAt >= options.from!);\n    }\n    if (options?.to) {\n      records = records.filter(r => r.createdAt <= options.to!);\n    }\n    if (options?.offset != null) {\n      records = records.slice(options.offset);\n    }\n\n    return limit != null ? records.slice(0, limit) : records;\n  }\n\n  async initializeObservationalMemory(input: CreateObservationalMemoryInput): Promise<ObservationalMemoryRecord> {\n    const { threadId, resourceId, scope, config, observedTimezone } = input;\n    const key = this.getObservationalMemoryKey(threadId, resourceId);\n    const now = new Date();\n\n    const record: ObservationalMemoryRecord = {\n      id: crypto.randomUUID(),\n      scope,\n      threadId,\n      resourceId,\n      // Timestamps at top level\n      createdAt: now,\n      updatedAt: now,\n      // lastObservedAt starts undefined - all messages are \"unobserved\" initially\n      // This ensures historical data (like LongMemEval fixtures) works correctly\n      lastObservedAt: undefined,\n      originType: 'initial',\n      generationCount: 0,\n      activeObservations: '',\n      // Buffering (for async observation/reflection)\n      bufferedObservations: undefined,\n      bufferedReflection: undefined,\n      // Message tracking\n      // Note: Message ID tracking removed in favor of cursor-based lastObservedAt\n      // Token tracking\n      totalTokensObserved: 0,\n      observationTokenCount: 0,\n      pendingMessageTokens: 0,\n      // State flags\n      isReflecting: false,\n      isObserving: false,\n      isBufferingObservation: false,\n      isBufferingReflection: false,\n      lastBufferedAtTokens: 0,\n      lastBufferedAtTime: null,\n      // Configuration\n      config,\n      // Timezone used for observation date formatting\n      observedTimezone,\n      // Extensible metadata (optional)\n      metadata: {},\n    };\n\n    // Add as first record (most recent)\n    const existing = this.db.observationalMemory.get(key) ?? [];\n    this.db.observationalMemory.set(key, [record, ...existing]);\n\n    return record;\n  }\n\n  async insertObservationalMemoryRecord(record: ObservationalMemoryRecord): Promise<void> {\n    const key = this.getObservationalMemoryKey(record.threadId, record.resourceId);\n    const existing = this.db.observationalMemory.get(key) ?? [];\n    // Insert in order by generationCount descending (newest first)\n    let inserted = false;\n    for (let i = 0; i < existing.length; i++) {\n      if (record.generationCount >= existing[i]!.generationCount) {\n        existing.splice(i, 0, record);\n        inserted = true;\n        break;\n      }\n    }\n    if (!inserted) existing.push(record);\n    this.db.observationalMemory.set(key, existing);\n  }\n\n  async updateActiveObservations(input: UpdateActiveObservationsInput): Promise<void> {\n    const { id, observations, tokenCount, lastObservedAt, observedMessageIds } = input;\n    const record = this.findObservationalMemoryRecordById(id);\n    if (!record) {\n      throw new Error(`Observational memory record not found: ${id}`);\n    }\n\n    record.activeObservations = observations;\n    record.observationTokenCount = tokenCount;\n    record.totalTokensObserved += tokenCount;\n    // Reset pending tokens since we've now observed them\n    record.pendingMessageTokens = 0;\n\n    // Update timestamps (top-level, not in metadata)\n    record.lastObservedAt = lastObservedAt;\n    record.updatedAt = new Date();\n\n    // Store observed message IDs as safeguard against re-observation\n    if (observedMessageIds) {\n      record.observedMessageIds = observedMessageIds;\n    }\n  }\n\n  async updateBufferedObservations(input: UpdateBufferedObservationsInput): Promise<void> {\n    const { id, chunk } = input;\n    const record = this.findObservationalMemoryRecordById(id);\n    if (!record) {\n      throw new Error(`Observational memory record not found: ${id}`);\n    }\n\n    // Create a new chunk with generated id and timestamp\n    const newChunk: BufferedObservationChunk = {\n      id: `ombuf-${crypto.randomUUID()}`,\n      cycleId: chunk.cycleId,\n      observations: chunk.observations,\n      tokenCount: chunk.tokenCount,\n      messageIds: chunk.messageIds,\n      messageTokens: chunk.messageTokens,\n      lastObservedAt: chunk.lastObservedAt,\n      createdAt: new Date(),\n      suggestedContinuation: chunk.suggestedContinuation,\n      currentTask: chunk.currentTask,\n      threadTitle: chunk.threadTitle,\n    };\n\n    // Add chunk to the array\n    const existingChunks = Array.isArray(record.bufferedObservationChunks) ? record.bufferedObservationChunks : [];\n    record.bufferedObservationChunks = [...existingChunks, newChunk];\n\n    if (input.lastBufferedAtTime) {\n      record.lastBufferedAtTime = input.lastBufferedAtTime;\n    }\n\n    record.updatedAt = new Date();\n  }\n\n  async swapBufferedToActive(input: SwapBufferedToActiveInput): Promise<SwapBufferedToActiveResult> {\n    const { id, activationRatio, lastObservedAt } = input;\n    const record = this.findObservationalMemoryRecordById(id);\n    if (!record) {\n      throw new Error(`Observational memory record not found: ${id}`);\n    }\n\n    // Use caller-provided refreshed chunks (with up-to-date token weights) for\n    // activation math, falling back to persisted chunks otherwise.\n    // Keep refreshed chunks local — don't overwrite the stored buffer.\n    const persistedChunks = Array.isArray(record.bufferedObservationChunks) ? record.bufferedObservationChunks : [];\n    const chunks = Array.isArray(input.bufferedChunks) ? input.bufferedChunks : persistedChunks;\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: how many message tokens to remove so that\n    // (1 - activationRatio) * threshold worth of raw messages remain.\n    // e.g., ratio=0.8, threshold=5000, pending=6000 → remove 6000 - 1000 = 5000\n    const retentionFloor = input.messageTokensThreshold * (1 - 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 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    let chunksToActivate: number;\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    const activatedChunks = chunks.slice(0, chunksToActivate);\n    const remainingChunks = chunks.slice(chunksToActivate);\n\n    // Combine activated chunks into content\n    const activatedContent = activatedChunks.map(c => c.observations).join('\\n\\n');\n    const activatedTokens = activatedChunks.reduce((sum, c) => sum + c.tokenCount, 0);\n    const activatedMessageTokens = activatedChunks.reduce((sum, c) => sum + (c.messageTokens ?? 0), 0);\n    const activatedMessageCount = activatedChunks.reduce((sum, c) => sum + c.messageIds.length, 0);\n    const activatedCycleIds = activatedChunks.map(c => c.cycleId).filter((id): id is string => !!id);\n    const activatedMessageIds = activatedChunks.flatMap(c => c.messageIds);\n\n    // Derive lastObservedAt from the latest activated chunk, or use provided value\n    const latestChunk = activatedChunks[activatedChunks.length - 1];\n    const derivedLastObservedAt =\n      lastObservedAt ?? (latestChunk?.lastObservedAt ? new Date(latestChunk.lastObservedAt) : new Date());\n\n    // Append activated content to active observations with message boundary for cache stability\n    if (record.activeObservations) {\n      const boundary = `\\n\\n--- message boundary (${derivedLastObservedAt.toISOString()}) ---\\n\\n`;\n      record.activeObservations = `${record.activeObservations}${boundary}${activatedContent}`;\n    } else {\n      record.activeObservations = activatedContent;\n    }\n\n    // Update observation token count\n    record.observationTokenCount = (record.observationTokenCount ?? 0) + activatedTokens;\n\n    // Decrement pending message tokens (clamped to zero)\n    record.pendingMessageTokens = Math.max(0, (record.pendingMessageTokens ?? 0) - activatedMessageTokens);\n\n    // NOTE: We intentionally do NOT add activatedMessageIds to record.observedMessageIds.\n    // observedMessageIds is used by getUnobservedMessages to filter future messages.\n    // Since AI SDK may reuse message IDs for new content, adding them here would\n    // permanently block new content from being observed. Instead, we return\n    // activatedMessageIds so the caller can remove them from messageList directly.\n\n    // Update buffered state with remaining chunks\n    record.bufferedObservationChunks = remainingChunks.length > 0 ? remainingChunks : undefined;\n\n    // Update timestamps\n    record.lastObservedAt = derivedLastObservedAt;\n    record.updatedAt = new Date();\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  }\n\n  async createReflectionGeneration(input: CreateReflectionGenerationInput): Promise<ObservationalMemoryRecord> {\n    const { currentRecord, reflection, tokenCount } = input;\n    const key = this.getObservationalMemoryKey(currentRecord.threadId, currentRecord.resourceId);\n    const now = new Date();\n\n    const newRecord: ObservationalMemoryRecord = {\n      id: crypto.randomUUID(),\n      scope: currentRecord.scope,\n      threadId: currentRecord.threadId,\n      resourceId: currentRecord.resourceId,\n      // Timestamps at top level\n      createdAt: now,\n      updatedAt: now,\n      lastObservedAt: currentRecord.lastObservedAt ?? now, // Carry over from observation (which always runs before reflection)\n      originType: 'reflection',\n      generationCount: currentRecord.generationCount + 1,\n      activeObservations: reflection,\n      config: currentRecord.config,\n      totalTokensObserved: currentRecord.totalTokensObserved,\n      observationTokenCount: tokenCount,\n      pendingMessageTokens: 0,\n      isReflecting: false,\n      isObserving: false,\n      isBufferingObservation: false,\n      isBufferingReflection: false,\n      lastBufferedAtTokens: 0,\n      lastBufferedAtTime: null,\n      // Timezone used for observation date formatting\n      observedTimezone: currentRecord.observedTimezone,\n      // Extensible metadata (optional)\n      metadata: {},\n    };\n\n    // Add as first record (most recent)\n    const existing = this.db.observationalMemory.get(key) ?? [];\n    this.db.observationalMemory.set(key, [newRecord, ...existing]);\n\n    return newRecord;\n  }\n\n  async updateBufferedReflection(input: UpdateBufferedReflectionInput): Promise<void> {\n    const { id, reflection, tokenCount, inputTokenCount, reflectedObservationLineCount } = input;\n    const record = this.findObservationalMemoryRecordById(id);\n    if (!record) {\n      throw new Error(`Observational memory record not found: ${id}`);\n    }\n\n    const existing = record.bufferedReflection || '';\n    record.bufferedReflection = existing ? `${existing}\\n\\n${reflection}` : reflection;\n    record.bufferedReflectionTokens = (record.bufferedReflectionTokens || 0) + tokenCount;\n    record.bufferedReflectionInputTokens = (record.bufferedReflectionInputTokens || 0) + inputTokenCount;\n    record.reflectedObservationLineCount = reflectedObservationLineCount;\n    record.updatedAt = new Date();\n  }\n\n  async swapBufferedReflectionToActive(input: SwapBufferedReflectionToActiveInput): Promise<ObservationalMemoryRecord> {\n    const { currentRecord } = input;\n    const record = this.findObservationalMemoryRecordById(currentRecord.id);\n    if (!record) {\n      throw new Error(`Observational memory record not found: ${currentRecord.id}`);\n    }\n\n    if (!record.bufferedReflection) {\n      throw new Error('No buffered reflection to swap');\n    }\n\n    const bufferedReflection = record.bufferedReflection;\n    const reflectedLineCount = record.reflectedObservationLineCount ?? 0;\n\n    // Split current activeObservations by the boundary line count.\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 ?? '';\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 ? `${bufferedReflection}\\n\\n${unreflectedContent}` : bufferedReflection;\n\n    // Create a 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: record,\n      reflection: newObservations,\n      tokenCount: input.tokenCount,\n    });\n\n    // Clear buffered state on old record\n    record.bufferedReflection = undefined;\n    record.bufferedReflectionTokens = undefined;\n    record.bufferedReflectionInputTokens = undefined;\n    record.reflectedObservationLineCount = undefined;\n\n    return newRecord;\n  }\n\n  async setReflectingFlag(id: string, isReflecting: boolean): Promise<void> {\n    const record = this.findObservationalMemoryRecordById(id);\n    if (!record) {\n      throw new Error(`Observational memory record not found: ${id}`);\n    }\n\n    record.isReflecting = isReflecting;\n    record.updatedAt = new Date();\n  }\n\n  async setObservingFlag(id: string, isObserving: boolean): Promise<void> {\n    const record = this.findObservationalMemoryRecordById(id);\n    if (!record) {\n      throw new Error(`Observational memory record not found: ${id}`);\n    }\n\n    record.isObserving = isObserving;\n    record.updatedAt = new Date();\n  }\n\n  async setBufferingObservationFlag(id: string, isBuffering: boolean, lastBufferedAtTokens?: number): Promise<void> {\n    const record = this.findObservationalMemoryRecordById(id);\n    if (!record) {\n      throw new Error(`Observational memory record not found: ${id}`);\n    }\n\n    record.isBufferingObservation = isBuffering;\n    if (lastBufferedAtTokens !== undefined) {\n      record.lastBufferedAtTokens = lastBufferedAtTokens;\n    }\n    record.updatedAt = new Date();\n  }\n\n  async setBufferingReflectionFlag(id: string, isBuffering: boolean): Promise<void> {\n    const record = this.findObservationalMemoryRecordById(id);\n    if (!record) {\n      throw new Error(`Observational memory record not found: ${id}`);\n    }\n\n    record.isBufferingReflection = isBuffering;\n    record.updatedAt = new Date();\n  }\n\n  async clearObservationalMemory(threadId: string | null, resourceId: string): Promise<void> {\n    const key = this.getObservationalMemoryKey(threadId, resourceId);\n    this.db.observationalMemory.delete(key);\n  }\n\n  async setPendingMessageTokens(id: string, tokenCount: number): Promise<void> {\n    const record = this.findObservationalMemoryRecordById(id);\n    if (!record) {\n      throw new Error(`Observational memory record not found: ${id}`);\n    }\n\n    record.pendingMessageTokens = tokenCount;\n    record.updatedAt = new Date();\n  }\n\n  async updateObservationalMemoryConfig(input: UpdateObservationalMemoryConfigInput): Promise<void> {\n    const record = this.findObservationalMemoryRecordById(input.id);\n    if (!record) {\n      throw new Error(`Observational memory record not found: ${input.id}`);\n    }\n\n    record.config = this.deepMergeConfig(record.config as Record<string, unknown>, input.config);\n    record.updatedAt = new Date();\n  }\n\n  /**\n   * Helper to find an observational memory record by ID across all keys\n   */\n  private findObservationalMemoryRecordById(id: string): ObservationalMemoryRecord | null {\n    for (const records of this.db.observationalMemory.values()) {\n      const record = records.find(r => r.id === id);\n      if (record) return record;\n    }\n    return null;\n  }\n}\n","import type {\n  StoragePromptBlockType,\n  StoragePromptBlockSnapshotType,\n  StorageResolvedPromptBlockType,\n  StorageCreatePromptBlockInput,\n  StorageUpdatePromptBlockInput,\n  StorageListPromptBlocksInput,\n  StorageListPromptBlocksOutput,\n  StorageListPromptBlocksResolvedOutput,\n} from '../../types';\nimport { VersionedStorageDomain } from '../versioned';\nimport type { VersionBase, CreateVersionInputBase, ListVersionsInputBase, ListVersionsOutputBase } from '../versioned';\n\n// ============================================================================\n// Prompt Block Version Types\n// ============================================================================\n\n/**\n * Represents a stored version of a prompt block's content.\n * Config fields are top-level on the version row (no nested snapshot object).\n */\nexport interface PromptBlockVersion extends StoragePromptBlockSnapshotType, VersionBase {\n  /** ID of the prompt block this version belongs to */\n  blockId: string;\n}\n\n/**\n * Input for creating a new prompt block version.\n * Config fields are top-level (no nested snapshot object).\n */\nexport interface CreatePromptBlockVersionInput extends StoragePromptBlockSnapshotType, CreateVersionInputBase {\n  /** ID of the prompt block this version belongs to */\n  blockId: string;\n}\n\n/**\n * Sort direction for version listings.\n */\nexport type PromptBlockVersionSortDirection = 'ASC' | 'DESC';\n\n/**\n * Fields that can be used for ordering version listings.\n */\nexport type PromptBlockVersionOrderBy = 'versionNumber' | 'createdAt';\n\n/**\n * Input for listing prompt block versions with pagination and sorting.\n */\nexport interface ListPromptBlockVersionsInput extends ListVersionsInputBase {\n  /** ID of the prompt block to list versions for */\n  blockId: string;\n}\n\n/**\n * Output for listing prompt block versions with pagination info.\n */\nexport interface ListPromptBlockVersionsOutput extends ListVersionsOutputBase<PromptBlockVersion> {}\n\n// ============================================================================\n// PromptBlocksStorage Base Class\n// ============================================================================\n\nexport abstract class PromptBlocksStorage extends VersionedStorageDomain<\n  StoragePromptBlockType,\n  StoragePromptBlockSnapshotType,\n  StorageResolvedPromptBlockType,\n  PromptBlockVersion,\n  CreatePromptBlockVersionInput,\n  ListPromptBlockVersionsInput,\n  ListPromptBlockVersionsOutput,\n  { promptBlock: StorageCreatePromptBlockInput },\n  StorageUpdatePromptBlockInput,\n  StorageListPromptBlocksInput | undefined,\n  StorageListPromptBlocksOutput,\n  StorageListPromptBlocksResolvedOutput\n> {\n  protected readonly listKey = 'promptBlocks';\n  protected readonly versionMetadataFields = [\n    'id',\n    'blockId',\n    'versionNumber',\n    'changedFields',\n    'changeMessage',\n    'createdAt',\n  ] satisfies (keyof PromptBlockVersion)[];\n\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'PROMPT_BLOCKS',\n    });\n  }\n}\n","import { deepEqual } from '../../../utils';\nimport { normalizePerPage, calculatePagination } from '../../base';\nimport type {\n  StoragePromptBlockType,\n  StorageCreatePromptBlockInput,\n  StorageUpdatePromptBlockInput,\n  StorageListPromptBlocksInput,\n  StorageListPromptBlocksOutput,\n  ThreadOrderBy,\n  ThreadSortDirection,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport type {\n  PromptBlockVersion,\n  CreatePromptBlockVersionInput,\n  ListPromptBlockVersionsInput,\n  ListPromptBlockVersionsOutput,\n  PromptBlockVersionOrderBy,\n  PromptBlockVersionSortDirection,\n} from './base';\nimport { PromptBlocksStorage } from './base';\n\nexport class InMemoryPromptBlocksStorage extends PromptBlocksStorage {\n  private db: InMemoryDB;\n\n  constructor({ db }: { db: InMemoryDB }) {\n    super();\n    this.db = db;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.db.promptBlocks.clear();\n    this.db.promptBlockVersions.clear();\n  }\n\n  // ==========================================================================\n  // Prompt Block CRUD Methods\n  // ==========================================================================\n\n  async getById(id: string): Promise<StoragePromptBlockType | null> {\n    const block = this.db.promptBlocks.get(id);\n    return block ? this.deepCopyBlock(block) : null;\n  }\n\n  async create(input: { promptBlock: StorageCreatePromptBlockInput }): Promise<StoragePromptBlockType> {\n    const { promptBlock } = input;\n\n    if (this.db.promptBlocks.has(promptBlock.id)) {\n      throw new Error(`Prompt block with id ${promptBlock.id} already exists`);\n    }\n\n    const now = new Date();\n    const newBlock: StoragePromptBlockType = {\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\n    this.db.promptBlocks.set(promptBlock.id, newBlock);\n\n    // Extract config fields from the flat input (everything except block-record fields)\n    const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = promptBlock;\n\n    // Create version 1 from the config\n    const versionId = crypto.randomUUID();\n    await this.createVersion({\n      id: versionId,\n      blockId: promptBlock.id,\n      versionNumber: 1,\n      ...snapshotConfig,\n      changedFields: Object.keys(snapshotConfig),\n      changeMessage: 'Initial version',\n    });\n\n    // Return the thin block record\n    return this.deepCopyBlock(newBlock);\n  }\n\n  async update(input: StorageUpdatePromptBlockInput): Promise<StoragePromptBlockType> {\n    const { id, ...updates } = input;\n\n    const existingBlock = this.db.promptBlocks.get(id);\n    if (!existingBlock) {\n      throw new Error(`Prompt block with id ${id} not found`);\n    }\n\n    // Separate metadata fields from config fields\n    const { authorId, activeVersionId, metadata, status } = updates;\n\n    // Update metadata fields on the block record\n    const updatedBlock: StoragePromptBlockType = {\n      ...existingBlock,\n      ...(authorId !== undefined && { authorId }),\n      ...(activeVersionId !== undefined && { activeVersionId }),\n      ...(status !== undefined && { status: status as StoragePromptBlockType['status'] }),\n      ...(metadata !== undefined && {\n        metadata: { ...existingBlock.metadata, ...metadata },\n      }),\n      updatedAt: new Date(),\n    };\n\n    // Save the updated block record\n    this.db.promptBlocks.set(id, updatedBlock);\n    return this.deepCopyBlock(updatedBlock);\n  }\n\n  async delete(id: string): Promise<void> {\n    // Idempotent delete\n    this.db.promptBlocks.delete(id);\n    // Also delete all versions for this block\n    await this.deleteVersionsByParentId(id);\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    // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 100)\n    const perPage = normalizePerPage(perPageInput, 100);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // Prevent unreasonably large page values\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Get all blocks and apply filters\n    let blocks = Array.from(this.db.promptBlocks.values());\n\n    // Filter by status\n    if (status) {\n      blocks = blocks.filter(block => block.status === status);\n    }\n\n    // Filter by authorId if provided\n    if (authorId !== undefined) {\n      blocks = blocks.filter(block => block.authorId === authorId);\n    }\n\n    // Filter by metadata if provided (AND logic)\n    if (metadata && Object.keys(metadata).length > 0) {\n      blocks = blocks.filter(block => {\n        if (!block.metadata) return false;\n        return Object.entries(metadata).every(([key, value]) => deepEqual(block.metadata![key], value));\n      });\n    }\n\n    // Sort filtered blocks\n    const sortedBlocks = this.sortBlocks(blocks, field, direction);\n\n    // Deep clone blocks to avoid mutation\n    const clonedBlocks = sortedBlocks.map(block => this.deepCopyBlock(block));\n\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    return {\n      promptBlocks: clonedBlocks.slice(offset, offset + perPage),\n      total: clonedBlocks.length,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < clonedBlocks.length,\n    };\n  }\n\n  // ==========================================================================\n  // Prompt Block Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreatePromptBlockVersionInput): Promise<PromptBlockVersion> {\n    // Check if version with this ID already exists\n    if (this.db.promptBlockVersions.has(input.id)) {\n      throw new Error(`Version with id ${input.id} already exists`);\n    }\n\n    // Check for duplicate (blockId, versionNumber) pair\n    for (const version of this.db.promptBlockVersions.values()) {\n      if (version.blockId === input.blockId && version.versionNumber === input.versionNumber) {\n        throw new Error(`Version number ${input.versionNumber} already exists for prompt block ${input.blockId}`);\n      }\n    }\n\n    const version: PromptBlockVersion = {\n      ...input,\n      createdAt: new Date(),\n    };\n\n    // Deep clone before storing\n    this.db.promptBlockVersions.set(input.id, this.deepCopyVersion(version));\n    return this.deepCopyVersion(version);\n  }\n\n  async getVersion(id: string): Promise<PromptBlockVersion | null> {\n    const version = this.db.promptBlockVersions.get(id);\n    return version ? this.deepCopyVersion(version) : null;\n  }\n\n  async getVersionByNumber(blockId: string, versionNumber: number): Promise<PromptBlockVersion | null> {\n    for (const version of this.db.promptBlockVersions.values()) {\n      if (version.blockId === blockId && version.versionNumber === versionNumber) {\n        return this.deepCopyVersion(version);\n      }\n    }\n    return null;\n  }\n\n  async getLatestVersion(blockId: string): Promise<PromptBlockVersion | null> {\n    let latest: PromptBlockVersion | null = null;\n    for (const version of this.db.promptBlockVersions.values()) {\n      if (version.blockId === blockId) {\n        if (!latest || version.versionNumber > latest.versionNumber) {\n          latest = version;\n        }\n      }\n    }\n    return latest ? this.deepCopyVersion(latest) : null;\n  }\n\n  async listVersions(input: ListPromptBlockVersionsInput): Promise<ListPromptBlockVersionsOutput> {\n    const { blockId, page = 0, perPage: perPageInput, orderBy } = input;\n    const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n    // Normalize perPage (false -> MAX_SAFE_INTEGER, 0 -> 0, undefined -> 20)\n    const perPage = normalizePerPage(perPageInput, 20);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Filter versions by blockId\n    let versions = Array.from(this.db.promptBlockVersions.values()).filter(v => v.blockId === blockId);\n\n    // Sort versions\n    versions = this.sortVersions(versions, field, direction);\n\n    // Deep clone\n    const clonedVersions = versions.map(v => this.deepCopyVersion(v));\n\n    const total = clonedVersions.length;\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const paginatedVersions = clonedVersions.slice(offset, offset + perPage);\n\n    return {\n      versions: paginatedVersions,\n      total,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < total,\n    };\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    this.db.promptBlockVersions.delete(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    const idsToDelete: string[] = [];\n    for (const [id, version] of this.db.promptBlockVersions.entries()) {\n      if (version.blockId === entityId) {\n        idsToDelete.push(id);\n      }\n    }\n\n    for (const id of idsToDelete) {\n      this.db.promptBlockVersions.delete(id);\n    }\n  }\n\n  async countVersions(blockId: string): Promise<number> {\n    let count = 0;\n    for (const version of this.db.promptBlockVersions.values()) {\n      if (version.blockId === blockId) {\n        count++;\n      }\n    }\n    return count;\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  private deepCopyBlock(block: StoragePromptBlockType): StoragePromptBlockType {\n    return {\n      ...block,\n      metadata: block.metadata ? { ...block.metadata } : block.metadata,\n    };\n  }\n\n  private deepCopyVersion(version: PromptBlockVersion): PromptBlockVersion {\n    return {\n      ...version,\n      rules: version.rules ? JSON.parse(JSON.stringify(version.rules)) : version.rules,\n      changedFields: version.changedFields ? [...version.changedFields] : version.changedFields,\n    };\n  }\n\n  private sortBlocks(\n    blocks: StoragePromptBlockType[],\n    field: ThreadOrderBy,\n    direction: ThreadSortDirection,\n  ): StoragePromptBlockType[] {\n    return blocks.sort((a, b) => {\n      const aValue = a[field].getTime();\n      const bValue = b[field].getTime();\n\n      return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n    });\n  }\n\n  private sortVersions(\n    versions: PromptBlockVersion[],\n    field: PromptBlockVersionOrderBy,\n    direction: PromptBlockVersionSortDirection,\n  ): PromptBlockVersion[] {\n    return versions.sort((a, b) => {\n      let aVal: number;\n      let bVal: number;\n\n      if (field === 'createdAt') {\n        aVal = a.createdAt.getTime();\n        bVal = b.createdAt.getTime();\n      } else {\n        // versionNumber\n        aVal = a.versionNumber;\n        bVal = b.versionNumber;\n      }\n\n      return direction === 'ASC' ? aVal - bVal : bVal - aVal;\n    });\n  }\n}\n","import type {\n  StorageScorerDefinitionType,\n  StorageScorerDefinitionSnapshotType,\n  StorageResolvedScorerDefinitionType,\n  StorageCreateScorerDefinitionInput,\n  StorageUpdateScorerDefinitionInput,\n  StorageListScorerDefinitionsInput,\n  StorageListScorerDefinitionsOutput,\n  StorageListScorerDefinitionsResolvedOutput,\n} from '../../types';\nimport { VersionedStorageDomain } from '../versioned';\nimport type { VersionBase, CreateVersionInputBase, ListVersionsInputBase, ListVersionsOutputBase } from '../versioned';\n\n// ============================================================================\n// Scorer Definition Version Types\n// ============================================================================\n\n/**\n * Represents a stored version of a scorer definition's content.\n * Config fields are top-level on the version row (no nested snapshot object).\n */\nexport interface ScorerDefinitionVersion extends StorageScorerDefinitionSnapshotType, VersionBase {\n  /** ID of the scorer definition this version belongs to */\n  scorerDefinitionId: string;\n}\n\n/**\n * Input for creating a new scorer definition version.\n * Config fields are top-level (no nested snapshot object).\n */\nexport interface CreateScorerDefinitionVersionInput\n  extends StorageScorerDefinitionSnapshotType, CreateVersionInputBase {\n  /** ID of the scorer definition this version belongs to */\n  scorerDefinitionId: string;\n}\n\n/**\n * Sort direction for version listings.\n */\nexport type ScorerDefinitionVersionSortDirection = 'ASC' | 'DESC';\n\n/**\n * Fields that can be used for ordering version listings.\n */\nexport type ScorerDefinitionVersionOrderBy = 'versionNumber' | 'createdAt';\n\n/**\n * Input for listing scorer definition versions with pagination and sorting.\n */\nexport interface ListScorerDefinitionVersionsInput extends ListVersionsInputBase {\n  /** ID of the scorer definition to list versions for */\n  scorerDefinitionId: string;\n}\n\n/**\n * Output for listing scorer definition versions with pagination info.\n */\nexport interface ListScorerDefinitionVersionsOutput extends ListVersionsOutputBase<ScorerDefinitionVersion> {}\n\n// ============================================================================\n// ScorerDefinitionsStorage Base Class\n// ============================================================================\n\nexport abstract class ScorerDefinitionsStorage extends VersionedStorageDomain<\n  StorageScorerDefinitionType,\n  StorageScorerDefinitionSnapshotType,\n  StorageResolvedScorerDefinitionType,\n  ScorerDefinitionVersion,\n  CreateScorerDefinitionVersionInput,\n  ListScorerDefinitionVersionsInput,\n  ListScorerDefinitionVersionsOutput,\n  { scorerDefinition: StorageCreateScorerDefinitionInput },\n  StorageUpdateScorerDefinitionInput,\n  StorageListScorerDefinitionsInput | undefined,\n  StorageListScorerDefinitionsOutput,\n  StorageListScorerDefinitionsResolvedOutput\n> {\n  protected readonly listKey = 'scorerDefinitions';\n  protected readonly versionMetadataFields = [\n    'id',\n    'scorerDefinitionId',\n    'versionNumber',\n    'changedFields',\n    'changeMessage',\n    'createdAt',\n  ] satisfies (keyof ScorerDefinitionVersion)[];\n\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'SCORER_DEFINITIONS',\n    });\n  }\n}\n","import { deepEqual } from '../../../utils';\nimport { normalizePerPage, calculatePagination } from '../../base';\nimport type {\n  StorageScorerDefinitionType,\n  StorageCreateScorerDefinitionInput,\n  StorageUpdateScorerDefinitionInput,\n  StorageListScorerDefinitionsInput,\n  StorageListScorerDefinitionsOutput,\n  ThreadOrderBy,\n  ThreadSortDirection,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport type {\n  ScorerDefinitionVersion,\n  CreateScorerDefinitionVersionInput,\n  ListScorerDefinitionVersionsInput,\n  ListScorerDefinitionVersionsOutput,\n  ScorerDefinitionVersionOrderBy,\n  ScorerDefinitionVersionSortDirection,\n} from './base';\nimport { ScorerDefinitionsStorage } from './base';\n\nexport class InMemoryScorerDefinitionsStorage extends ScorerDefinitionsStorage {\n  private db: InMemoryDB;\n\n  constructor({ db }: { db: InMemoryDB }) {\n    super();\n    this.db = db;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.db.scorerDefinitions.clear();\n    this.db.scorerDefinitionVersions.clear();\n  }\n\n  // ==========================================================================\n  // Scorer Definition CRUD Methods\n  // ==========================================================================\n\n  async getById(id: string): Promise<StorageScorerDefinitionType | null> {\n    const scorer = this.db.scorerDefinitions.get(id);\n    return scorer ? this.deepCopyScorer(scorer) : null;\n  }\n\n  async create(input: { scorerDefinition: StorageCreateScorerDefinitionInput }): Promise<StorageScorerDefinitionType> {\n    const { scorerDefinition } = input;\n\n    if (this.db.scorerDefinitions.has(scorerDefinition.id)) {\n      throw new Error(`Scorer definition with id ${scorerDefinition.id} already exists`);\n    }\n\n    const now = new Date();\n    const newScorer: StorageScorerDefinitionType = {\n      id: scorerDefinition.id,\n      status: 'draft',\n      activeVersionId: undefined,\n      authorId: scorerDefinition.authorId,\n      metadata: scorerDefinition.metadata,\n      createdAt: now,\n      updatedAt: now,\n    };\n\n    this.db.scorerDefinitions.set(scorerDefinition.id, newScorer);\n\n    // Extract config fields from the flat input (everything except scorer-record fields)\n    const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = scorerDefinition;\n\n    // Create version 1 from the config\n    const versionId = crypto.randomUUID();\n    await this.createVersion({\n      id: versionId,\n      scorerDefinitionId: scorerDefinition.id,\n      versionNumber: 1,\n      ...snapshotConfig,\n      changedFields: Object.keys(snapshotConfig),\n      changeMessage: 'Initial version',\n    });\n\n    // Return the thin scorer record\n    return this.deepCopyScorer(newScorer);\n  }\n\n  async update(input: StorageUpdateScorerDefinitionInput): Promise<StorageScorerDefinitionType> {\n    const { id, ...updates } = input;\n\n    const existingScorer = this.db.scorerDefinitions.get(id);\n    if (!existingScorer) {\n      throw new Error(`Scorer definition with id ${id} not found`);\n    }\n\n    // Separate metadata fields from config fields\n    const { authorId, activeVersionId, metadata, status } = updates;\n\n    // Update metadata fields on the scorer record\n    const updatedScorer: StorageScorerDefinitionType = {\n      ...existingScorer,\n      ...(authorId !== undefined && { authorId }),\n      ...(activeVersionId !== undefined && { activeVersionId }),\n      ...(status !== undefined && { status: status as StorageScorerDefinitionType['status'] }),\n      ...(metadata !== undefined && {\n        metadata: { ...existingScorer.metadata, ...metadata },\n      }),\n      updatedAt: new Date(),\n    };\n\n    // Save the updated scorer record\n    this.db.scorerDefinitions.set(id, updatedScorer);\n    return this.deepCopyScorer(updatedScorer);\n  }\n\n  async delete(id: string): Promise<void> {\n    // Idempotent delete\n    this.db.scorerDefinitions.delete(id);\n    // Also delete all versions for this scorer definition\n    await this.deleteVersionsByParentId(id);\n  }\n\n  async list(args?: StorageListScorerDefinitionsInput): Promise<StorageListScorerDefinitionsOutput> {\n    const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {};\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 100)\n    const perPage = normalizePerPage(perPageInput, 100);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // Prevent unreasonably large page values\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Get all scorer definitions and apply filters\n    let scorers = Array.from(this.db.scorerDefinitions.values());\n\n    // Filter by status\n    if (status) {\n      scorers = scorers.filter(scorer => scorer.status === status);\n    }\n\n    // Filter by authorId if provided\n    if (authorId !== undefined) {\n      scorers = scorers.filter(scorer => scorer.authorId === authorId);\n    }\n\n    // Filter by metadata if provided (AND logic)\n    if (metadata && Object.keys(metadata).length > 0) {\n      scorers = scorers.filter(scorer => {\n        if (!scorer.metadata) return false;\n        return Object.entries(metadata).every(([key, value]) => deepEqual(scorer.metadata![key], value));\n      });\n    }\n\n    // Sort filtered scorer definitions\n    const sortedScorers = this.sortScorers(scorers, field, direction);\n\n    // Deep clone scorers to avoid mutation\n    const clonedScorers = sortedScorers.map(scorer => this.deepCopyScorer(scorer));\n\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    return {\n      scorerDefinitions: clonedScorers.slice(offset, offset + perPage),\n      total: clonedScorers.length,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < clonedScorers.length,\n    };\n  }\n\n  // ==========================================================================\n  // Scorer Definition Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateScorerDefinitionVersionInput): Promise<ScorerDefinitionVersion> {\n    // Check if version with this ID already exists\n    if (this.db.scorerDefinitionVersions.has(input.id)) {\n      throw new Error(`Version with id ${input.id} already exists`);\n    }\n\n    // Check for duplicate (scorerDefinitionId, versionNumber) pair\n    for (const version of this.db.scorerDefinitionVersions.values()) {\n      if (version.scorerDefinitionId === input.scorerDefinitionId && version.versionNumber === input.versionNumber) {\n        throw new Error(\n          `Version number ${input.versionNumber} already exists for scorer definition ${input.scorerDefinitionId}`,\n        );\n      }\n    }\n\n    const version: ScorerDefinitionVersion = {\n      ...input,\n      createdAt: new Date(),\n    };\n\n    // Deep clone before storing\n    this.db.scorerDefinitionVersions.set(input.id, this.deepCopyVersion(version));\n    return this.deepCopyVersion(version);\n  }\n\n  async getVersion(id: string): Promise<ScorerDefinitionVersion | null> {\n    const version = this.db.scorerDefinitionVersions.get(id);\n    return version ? this.deepCopyVersion(version) : null;\n  }\n\n  async getVersionByNumber(scorerDefinitionId: string, versionNumber: number): Promise<ScorerDefinitionVersion | null> {\n    for (const version of this.db.scorerDefinitionVersions.values()) {\n      if (version.scorerDefinitionId === scorerDefinitionId && version.versionNumber === versionNumber) {\n        return this.deepCopyVersion(version);\n      }\n    }\n    return null;\n  }\n\n  async getLatestVersion(scorerDefinitionId: string): Promise<ScorerDefinitionVersion | null> {\n    let latest: ScorerDefinitionVersion | null = null;\n    for (const version of this.db.scorerDefinitionVersions.values()) {\n      if (version.scorerDefinitionId === scorerDefinitionId) {\n        if (!latest || version.versionNumber > latest.versionNumber) {\n          latest = version;\n        }\n      }\n    }\n    return latest ? this.deepCopyVersion(latest) : null;\n  }\n\n  async listVersions(input: ListScorerDefinitionVersionsInput): Promise<ListScorerDefinitionVersionsOutput> {\n    const { scorerDefinitionId, page = 0, perPage: perPageInput, orderBy } = input;\n    const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n    // Normalize perPage (false -> MAX_SAFE_INTEGER, 0 -> 0, undefined -> 20)\n    const perPage = normalizePerPage(perPageInput, 20);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Filter versions by scorerDefinitionId\n    let versions = Array.from(this.db.scorerDefinitionVersions.values()).filter(\n      v => v.scorerDefinitionId === scorerDefinitionId,\n    );\n\n    // Sort versions\n    versions = this.sortVersions(versions, field, direction);\n\n    // Deep clone\n    const clonedVersions = versions.map(v => this.deepCopyVersion(v));\n\n    const total = clonedVersions.length;\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const paginatedVersions = clonedVersions.slice(offset, offset + perPage);\n\n    return {\n      versions: paginatedVersions,\n      total,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < total,\n    };\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    this.db.scorerDefinitionVersions.delete(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    const idsToDelete: string[] = [];\n    for (const [id, version] of this.db.scorerDefinitionVersions.entries()) {\n      if (version.scorerDefinitionId === entityId) {\n        idsToDelete.push(id);\n      }\n    }\n\n    for (const id of idsToDelete) {\n      this.db.scorerDefinitionVersions.delete(id);\n    }\n  }\n\n  async countVersions(scorerDefinitionId: string): Promise<number> {\n    let count = 0;\n    for (const version of this.db.scorerDefinitionVersions.values()) {\n      if (version.scorerDefinitionId === scorerDefinitionId) {\n        count++;\n      }\n    }\n    return count;\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  private deepCopyScorer(scorer: StorageScorerDefinitionType): StorageScorerDefinitionType {\n    return {\n      ...scorer,\n      metadata: scorer.metadata ? { ...scorer.metadata } : scorer.metadata,\n    };\n  }\n\n  private deepCopyVersion(version: ScorerDefinitionVersion): ScorerDefinitionVersion {\n    return {\n      ...version,\n      model: version.model ? JSON.parse(JSON.stringify(version.model)) : version.model,\n      scoreRange: version.scoreRange ? JSON.parse(JSON.stringify(version.scoreRange)) : version.scoreRange,\n      presetConfig: version.presetConfig ? JSON.parse(JSON.stringify(version.presetConfig)) : version.presetConfig,\n      defaultSampling: version.defaultSampling\n        ? JSON.parse(JSON.stringify(version.defaultSampling))\n        : version.defaultSampling,\n      changedFields: version.changedFields ? [...version.changedFields] : version.changedFields,\n    };\n  }\n\n  private sortScorers(\n    scorers: StorageScorerDefinitionType[],\n    field: ThreadOrderBy,\n    direction: ThreadSortDirection,\n  ): StorageScorerDefinitionType[] {\n    return scorers.sort((a, b) => {\n      const aValue = a[field].getTime();\n      const bValue = b[field].getTime();\n\n      return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n    });\n  }\n\n  private sortVersions(\n    versions: ScorerDefinitionVersion[],\n    field: ScorerDefinitionVersionOrderBy,\n    direction: ScorerDefinitionVersionSortDirection,\n  ): ScorerDefinitionVersion[] {\n    return versions.sort((a, b) => {\n      let aVal: number;\n      let bVal: number;\n\n      if (field === 'createdAt') {\n        aVal = a.createdAt.getTime();\n        bVal = b.createdAt.getTime();\n      } else {\n        // versionNumber\n        aVal = a.versionNumber;\n        bVal = b.versionNumber;\n      }\n\n      return direction === 'ASC' ? aVal - bVal : bVal - aVal;\n    });\n  }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '../../../evals/types';\nimport type { StoragePagination } from '../../types';\nimport { StorageDomain } from '../base';\n\nexport abstract class ScoresStorage extends StorageDomain {\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'SCORES',\n    });\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    // Default no-op - subclasses override\n  }\n\n  abstract getScoreById({ id }: { id: string }): Promise<ScoreRowData | null>;\n\n  abstract saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }>;\n\n  abstract listScoresByScorerId({\n    scorerId,\n    pagination,\n    entityId,\n    entityType,\n    source,\n  }: {\n    scorerId: string;\n    pagination: StoragePagination;\n    entityId?: string;\n    entityType?: string;\n    source?: ScoringSource;\n  }): Promise<ListScoresResponse>;\n\n  abstract listScoresByRunId({\n    runId,\n    pagination,\n  }: {\n    runId: string;\n    pagination: StoragePagination;\n  }): Promise<ListScoresResponse>;\n\n  abstract listScoresByEntityId({\n    entityId,\n    entityType,\n    pagination,\n  }: {\n    pagination: StoragePagination;\n    entityId: string;\n    entityType: string;\n  }): Promise<ListScoresResponse>;\n\n  async listScoresBySpan({\n    traceId,\n    spanId,\n    pagination: _pagination,\n  }: {\n    traceId: string;\n    spanId: string;\n    pagination: StoragePagination;\n  }): Promise<ListScoresResponse> {\n    throw new MastraError({\n      id: 'SCORES_STORAGE_GET_SCORES_BY_SPAN_NOT_IMPLEMENTED',\n      domain: ErrorDomain.STORAGE,\n      category: ErrorCategory.SYSTEM,\n      details: { traceId, spanId },\n    });\n  }\n}\n","import type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '../../../evals/types';\nimport { calculatePagination, normalizePerPage } from '../../base';\nimport type { StoragePagination } from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { ScoresStorage } from './base';\n\nexport class ScoresInMemory extends ScoresStorage {\n  private db: InMemoryDB;\n\n  constructor({ db }: { db: InMemoryDB }) {\n    super();\n    this.db = db;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.db.scores.clear();\n  }\n\n  async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n    return this.db.scores.get(id) ?? null;\n  }\n\n  async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n    const newScore = { id: crypto.randomUUID(), createdAt: new Date(), updatedAt: new Date(), ...score };\n    this.db.scores.set(newScore.id, newScore);\n    return { score: newScore };\n  }\n\n  async listScoresByScorerId({\n    scorerId,\n    pagination,\n    entityId,\n    entityType,\n    source,\n  }: {\n    scorerId: string;\n    pagination: StoragePagination;\n    entityId?: string;\n    entityType?: string;\n    source?: ScoringSource;\n  }): Promise<ListScoresResponse> {\n    const scores = Array.from(this.db.scores.values()).filter(score => {\n      let baseFilter = score.scorerId === scorerId;\n\n      if (entityId) {\n        baseFilter = baseFilter && score.entityId === entityId;\n      }\n\n      if (entityType) {\n        baseFilter = baseFilter && score.entityType === entityType;\n      }\n\n      if (source) {\n        baseFilter = baseFilter && score.source === source;\n      }\n\n      return baseFilter;\n    });\n\n    const { page, perPage: perPageInput } = pagination;\n    const perPage = normalizePerPage(perPageInput, Number.MAX_SAFE_INTEGER);\n    const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const end = perPageInput === false ? scores.length : start + perPage;\n\n    return {\n      scores: scores.slice(start, end),\n      pagination: {\n        total: scores.length,\n        page: page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : scores.length > end,\n      },\n    };\n  }\n\n  async listScoresByRunId({\n    runId,\n    pagination,\n  }: {\n    runId: string;\n    pagination: StoragePagination;\n  }): Promise<ListScoresResponse> {\n    const scores = Array.from(this.db.scores.values()).filter(score => score.runId === runId);\n\n    const { page, perPage: perPageInput } = pagination;\n    const perPage = normalizePerPage(perPageInput, Number.MAX_SAFE_INTEGER); // false → MAX_SAFE_INTEGER\n    const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const end = perPageInput === false ? scores.length : start + perPage;\n\n    return {\n      scores: scores.slice(start, end),\n      pagination: {\n        total: scores.length,\n        page: page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : scores.length > end,\n      },\n    };\n  }\n\n  async listScoresByEntityId({\n    entityId,\n    entityType,\n    pagination,\n  }: {\n    entityId: string;\n    entityType: string;\n    pagination: StoragePagination;\n  }): Promise<ListScoresResponse> {\n    const scores = Array.from(this.db.scores.values()).filter(score => {\n      const baseFilter = score.entityId === entityId && score.entityType === entityType;\n\n      return baseFilter;\n    });\n\n    const { page, perPage: perPageInput } = pagination;\n    const perPage = normalizePerPage(perPageInput, Number.MAX_SAFE_INTEGER);\n    const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const end = perPageInput === false ? scores.length : start + perPage;\n\n    return {\n      scores: scores.slice(start, end),\n      pagination: {\n        total: scores.length,\n        page: page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : scores.length > end,\n      },\n    };\n  }\n\n  async listScoresBySpan({\n    traceId,\n    spanId,\n    pagination,\n  }: {\n    traceId: string;\n    spanId: string;\n    pagination: StoragePagination;\n  }): Promise<ListScoresResponse> {\n    const scores = Array.from(this.db.scores.values()).filter(\n      score => score.traceId === traceId && score.spanId === spanId,\n    );\n    scores.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n    const { page, perPage: perPageInput } = pagination;\n    const perPage = normalizePerPage(perPageInput, Number.MAX_SAFE_INTEGER);\n    const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const end = perPageInput === false ? scores.length : start + perPage;\n\n    return {\n      scores: scores.slice(start, end),\n      pagination: {\n        total: scores.length,\n        page: page,\n        perPage: perPageForResponse,\n        hasMore: perPageInput === false ? false : scores.length > end,\n      },\n    };\n  }\n}\n","import type {\n  StorageSkillType,\n  StorageSkillSnapshotType,\n  StorageResolvedSkillType,\n  StorageCreateSkillInput,\n  StorageUpdateSkillInput,\n  StorageListSkillsInput,\n  StorageListSkillsOutput,\n  StorageListSkillsResolvedOutput,\n} from '../../types';\nimport { VersionedStorageDomain } from '../versioned';\nimport type { VersionBase, CreateVersionInputBase, ListVersionsInputBase, ListVersionsOutputBase } from '../versioned';\n\n// ============================================================================\n// Skill Version Types\n// ============================================================================\n\n/**\n * Represents a stored version of a skill's definition.\n * Definition fields are top-level on the version row (no nested snapshot object).\n */\nexport interface SkillVersion extends StorageSkillSnapshotType, VersionBase {\n  /** ID of the skill this version belongs to */\n  skillId: string;\n}\n\n/**\n * Input for creating a new skill version.\n * Definition fields are top-level (no nested snapshot object).\n */\nexport interface CreateSkillVersionInput extends StorageSkillSnapshotType, CreateVersionInputBase {\n  /** ID of the skill this version belongs to */\n  skillId: string;\n}\n\n/**\n * Sort direction for version listings.\n */\nexport type SkillVersionSortDirection = 'ASC' | 'DESC';\n\n/**\n * Fields that can be used for ordering version listings.\n */\nexport type SkillVersionOrderBy = 'versionNumber' | 'createdAt';\n\n/**\n * Input for listing skill versions with pagination and sorting.\n */\nexport interface ListSkillVersionsInput extends ListVersionsInputBase {\n  /** ID of the skill to list versions for */\n  skillId: string;\n}\n\n/**\n * Output for listing skill versions with pagination info.\n */\nexport interface ListSkillVersionsOutput extends ListVersionsOutputBase<SkillVersion> {}\n\n// ============================================================================\n// SkillsStorage Base Class\n// ============================================================================\n\nexport abstract class SkillsStorage extends VersionedStorageDomain<\n  StorageSkillType,\n  StorageSkillSnapshotType,\n  StorageResolvedSkillType,\n  SkillVersion,\n  CreateSkillVersionInput,\n  ListSkillVersionsInput,\n  ListSkillVersionsOutput,\n  { skill: StorageCreateSkillInput },\n  StorageUpdateSkillInput,\n  StorageListSkillsInput | undefined,\n  StorageListSkillsOutput,\n  StorageListSkillsResolvedOutput\n> {\n  protected readonly listKey = 'skills';\n  protected readonly versionMetadataFields = [\n    'id',\n    'skillId',\n    'versionNumber',\n    'changedFields',\n    'changeMessage',\n    'createdAt',\n  ] satisfies (keyof SkillVersion)[];\n\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'SKILLS',\n    });\n  }\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { normalizePerPage, calculatePagination } from '../../base';\nimport type {\n  StorageSkillType,\n  StorageCreateSkillInput,\n  StorageUpdateSkillInput,\n  StorageListSkillsInput,\n  StorageListSkillsOutput,\n  ThreadOrderBy,\n  ThreadSortDirection,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport type {\n  SkillVersion,\n  CreateSkillVersionInput,\n  ListSkillVersionsInput,\n  ListSkillVersionsOutput,\n  SkillVersionOrderBy,\n  SkillVersionSortDirection,\n} from './base';\nimport { SkillsStorage } from './base';\n\nexport class InMemorySkillsStorage extends SkillsStorage {\n  private db: InMemoryDB;\n\n  constructor({ db }: { db: InMemoryDB }) {\n    super();\n    this.db = db;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.db.skills.clear();\n    this.db.skillVersions.clear();\n  }\n\n  // ==========================================================================\n  // Skill CRUD Methods\n  // ==========================================================================\n\n  async getById(id: string): Promise<StorageSkillType | null> {\n    const config = this.db.skills.get(id);\n    return config ? this.deepCopyConfig(config) : null;\n  }\n\n  async create(input: { skill: StorageCreateSkillInput }): Promise<StorageSkillType> {\n    const { skill } = input;\n\n    if (this.db.skills.has(skill.id)) {\n      throw new Error(`Skill with id ${skill.id} already exists`);\n    }\n\n    const now = new Date();\n    const newConfig: StorageSkillType = {\n      id: skill.id,\n      status: 'draft',\n      activeVersionId: undefined,\n      authorId: skill.authorId,\n      createdAt: now,\n      updatedAt: now,\n    };\n\n    this.db.skills.set(skill.id, newConfig);\n\n    // Extract config fields from the flat input (everything except record fields)\n    const { id: _id, authorId: _authorId, ...snapshotConfig } = skill;\n\n    // Create version 1 from the config\n    const versionId = randomUUID();\n    try {\n      await this.createVersion({\n        id: versionId,\n        skillId: skill.id,\n        versionNumber: 1,\n        ...snapshotConfig,\n        changedFields: Object.keys(snapshotConfig),\n        changeMessage: 'Initial version',\n      });\n    } catch (error) {\n      // Roll back the orphaned skill record\n      this.db.skills.delete(skill.id);\n      throw error;\n    }\n\n    // Return the thin record\n    return this.deepCopyConfig(newConfig);\n  }\n\n  async update(input: StorageUpdateSkillInput): Promise<StorageSkillType> {\n    const { id, ...updates } = input;\n\n    const existingConfig = this.db.skills.get(id);\n    if (!existingConfig) {\n      throw new Error(`Skill with id ${id} not found`);\n    }\n\n    // Separate metadata fields from config fields\n    const { authorId, activeVersionId, status, ...configFields } = updates;\n\n    // Config field names from StorageSkillSnapshotType\n    const configFieldNames = [\n      'name',\n      'description',\n      'instructions',\n      'license',\n      'compatibility',\n      'source',\n      'references',\n      'scripts',\n      'assets',\n      'metadata',\n      'tree',\n    ];\n\n    // Check if any config fields are present in the update\n    const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n    // Update metadata fields on the record\n    const updatedConfig: StorageSkillType = {\n      ...existingConfig,\n      ...(authorId !== undefined && { authorId }),\n      ...(activeVersionId !== undefined && { activeVersionId }),\n      ...(status !== undefined && { status: status as StorageSkillType['status'] }),\n      updatedAt: new Date(),\n    };\n\n    // Auto-set status to 'published' when activeVersionId is set, only if status is not explicitly provided\n    if (activeVersionId !== undefined && status === undefined) {\n      updatedConfig.status = 'published';\n    }\n\n    // If config fields are being updated, create a new version\n    if (hasConfigUpdate) {\n      // Get the latest version to use as base\n      const latestVersion = await this.getLatestVersion(id);\n      if (!latestVersion) {\n        throw new Error(`No versions found for skill ${id}`);\n      }\n\n      // Extract config from latest version\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      // Merge updates into latest config\n      const newConfig = {\n        ...latestConfig,\n        ...configFields,\n      };\n\n      // Identify which fields changed\n      const changedFields = configFieldNames.filter(\n        field =>\n          field in configFields &&\n          JSON.stringify(configFields[field as keyof typeof configFields]) !==\n            JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n      );\n\n      // Only create a new version if something actually changed\n      if (changedFields.length > 0) {\n        const newVersionId = randomUUID();\n        const newVersionNumber = latestVersion.versionNumber + 1;\n\n        await this.createVersion({\n          id: newVersionId,\n          skillId: id,\n          versionNumber: newVersionNumber,\n          ...newConfig,\n          changedFields,\n          changeMessage: `Updated ${changedFields.join(', ')}`,\n        });\n      }\n    }\n\n    // Save the updated record\n    this.db.skills.set(id, updatedConfig);\n    return this.deepCopyConfig(updatedConfig);\n  }\n\n  async delete(id: string): Promise<void> {\n    // Idempotent delete\n    this.db.skills.delete(id);\n    // Also delete all versions for this skill\n    await this.deleteVersionsByParentId(id);\n  }\n\n  async list(args?: StorageListSkillsInput): Promise<StorageListSkillsOutput> {\n    const { page = 0, perPage: perPageInput, orderBy, authorId, metadata } = args || {};\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 100)\n    const perPage = normalizePerPage(perPageInput, 100);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // Prevent unreasonably large page values\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Get all skills and apply filters\n    let configs = Array.from(this.db.skills.values());\n\n    // Filter by authorId if provided\n    if (authorId !== undefined) {\n      configs = configs.filter(config => config.authorId === authorId);\n    }\n\n    // Filter by metadata if provided (AND logic) — skills don't have metadata on the record,\n    // but we support the filter interface for consistency\n    if (metadata && Object.keys(metadata).length > 0) {\n      configs = configs.filter(_config => {\n        // StorageSkillType doesn't have metadata on the thin record\n        return false;\n      });\n    }\n\n    // Sort filtered configs\n    const sortedConfigs = this.sortConfigs(configs, field, direction);\n\n    // Deep clone to avoid mutation\n    const clonedConfigs = sortedConfigs.map(config => this.deepCopyConfig(config));\n\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    return {\n      skills: clonedConfigs.slice(offset, offset + perPage),\n      total: clonedConfigs.length,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < clonedConfigs.length,\n    };\n  }\n\n  // ==========================================================================\n  // Skill Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateSkillVersionInput): Promise<SkillVersion> {\n    // Check if version with this ID already exists\n    if (this.db.skillVersions.has(input.id)) {\n      throw new Error(`Version with id ${input.id} already exists`);\n    }\n\n    // Check for duplicate (skillId, versionNumber) pair\n    for (const version of this.db.skillVersions.values()) {\n      if (version.skillId === input.skillId && version.versionNumber === input.versionNumber) {\n        throw new Error(`Version number ${input.versionNumber} already exists for skill ${input.skillId}`);\n      }\n    }\n\n    const version: SkillVersion = {\n      ...input,\n      createdAt: new Date(),\n    };\n\n    // Deep clone before storing\n    this.db.skillVersions.set(input.id, this.deepCopyVersion(version));\n    return this.deepCopyVersion(version);\n  }\n\n  async getVersion(id: string): Promise<SkillVersion | null> {\n    const version = this.db.skillVersions.get(id);\n    return version ? this.deepCopyVersion(version) : null;\n  }\n\n  async getVersionByNumber(skillId: string, versionNumber: number): Promise<SkillVersion | null> {\n    for (const version of this.db.skillVersions.values()) {\n      if (version.skillId === skillId && version.versionNumber === versionNumber) {\n        return this.deepCopyVersion(version);\n      }\n    }\n    return null;\n  }\n\n  async getLatestVersion(skillId: string): Promise<SkillVersion | null> {\n    let latest: SkillVersion | null = null;\n    for (const version of this.db.skillVersions.values()) {\n      if (version.skillId === skillId) {\n        if (!latest || version.versionNumber > latest.versionNumber) {\n          latest = version;\n        }\n      }\n    }\n    return latest ? this.deepCopyVersion(latest) : null;\n  }\n\n  async listVersions(input: ListSkillVersionsInput): Promise<ListSkillVersionsOutput> {\n    const { skillId, page = 0, perPage: perPageInput, orderBy } = input;\n    const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n    // Normalize perPage (false -> MAX_SAFE_INTEGER, 0 -> 0, undefined -> 20)\n    const perPage = normalizePerPage(perPageInput, 20);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Filter versions by skillId\n    let versions = Array.from(this.db.skillVersions.values()).filter(v => v.skillId === skillId);\n\n    // Sort versions\n    versions = this.sortVersions(versions, field, direction);\n\n    // Deep clone\n    const clonedVersions = versions.map(v => this.deepCopyVersion(v));\n\n    const total = clonedVersions.length;\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const paginatedVersions = clonedVersions.slice(offset, offset + perPage);\n\n    return {\n      versions: paginatedVersions,\n      total,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < total,\n    };\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    this.db.skillVersions.delete(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    const idsToDelete: string[] = [];\n    for (const [id, version] of this.db.skillVersions.entries()) {\n      if (version.skillId === entityId) {\n        idsToDelete.push(id);\n      }\n    }\n\n    for (const id of idsToDelete) {\n      this.db.skillVersions.delete(id);\n    }\n  }\n\n  async countVersions(skillId: string): Promise<number> {\n    let count = 0;\n    for (const version of this.db.skillVersions.values()) {\n      if (version.skillId === skillId) {\n        count++;\n      }\n    }\n    return count;\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  private deepCopyConfig(config: StorageSkillType): StorageSkillType {\n    return {\n      ...config,\n    };\n  }\n\n  private deepCopyVersion(version: SkillVersion): SkillVersion {\n    return structuredClone(version);\n  }\n\n  private sortConfigs(\n    configs: StorageSkillType[],\n    field: ThreadOrderBy,\n    direction: ThreadSortDirection,\n  ): StorageSkillType[] {\n    return configs.sort((a, b) => {\n      const aValue = a[field].getTime();\n      const bValue = b[field].getTime();\n\n      return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n    });\n  }\n\n  private sortVersions(\n    versions: SkillVersion[],\n    field: SkillVersionOrderBy,\n    direction: SkillVersionSortDirection,\n  ): SkillVersion[] {\n    return versions.sort((a, b) => {\n      let aVal: number;\n      let bVal: number;\n\n      if (field === 'createdAt') {\n        aVal = a.createdAt.getTime();\n        bVal = b.createdAt.getTime();\n      } else {\n        // versionNumber\n        aVal = a.versionNumber;\n        bVal = b.versionNumber;\n      }\n\n      return direction === 'ASC' ? aVal - bVal : bVal - aVal;\n    });\n  }\n}\n","/**\n * Types and utilities for evented workflow execution.\n */\n\n/**\n * String key used to mark pending forEach iterations.\n * Using a string key (not Symbol) ensures the marker survives JSON serialization\n * which is critical for distributed execution where state is persisted to storage\n * and loaded by different engine instances.\n */\nexport const PENDING_MARKER_KEY = '__mastra_pending__' as const;\n\n/**\n * Type for the pending marker object used in forEach iteration tracking.\n */\nexport type PendingMarker = { [PENDING_MARKER_KEY]: true };\n\n/**\n * Creates a new pending marker object.\n * Used to mark forEach iterations that are about to be resumed.\n */\nexport function createPendingMarker(): PendingMarker {\n  return { [PENDING_MARKER_KEY]: true };\n}\n\n/**\n * Type guard to check if a value is a pending marker.\n * Works correctly after JSON serialization/deserialization.\n * @param val - The value to check\n * @returns True if the value is a PendingMarker\n */\nexport function isPendingMarker(val: unknown): val is PendingMarker {\n  return (\n    val !== null &&\n    typeof val === 'object' &&\n    PENDING_MARKER_KEY in val &&\n    (val as Record<string, unknown>)[PENDING_MARKER_KEY] === true\n  );\n}\n","import type { StepResult, WorkflowRunState } from '../../../workflows';\nimport type { UpdateWorkflowStateOptions, WorkflowRun, WorkflowRuns, StorageListWorkflowRunsInput } from '../../types';\nimport { StorageDomain } from '../base';\n\nexport abstract class WorkflowsStorage extends StorageDomain {\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'WORKFLOWS',\n    });\n  }\n\n  abstract supportsConcurrentUpdates(): boolean;\n\n  abstract 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\n  abstract updateWorkflowState({\n    workflowName,\n    runId,\n    opts,\n  }: {\n    workflowName: string;\n    runId: string;\n    opts: UpdateWorkflowStateOptions;\n  }): Promise<WorkflowRunState | undefined>;\n\n  abstract persistWorkflowSnapshot(_: {\n    workflowName: string;\n    runId: string;\n    resourceId?: string;\n    snapshot: WorkflowRunState;\n    createdAt?: Date;\n    updatedAt?: Date;\n  }): Promise<void>;\n\n  abstract loadWorkflowSnapshot({\n    workflowName,\n    runId,\n  }: {\n    workflowName: string;\n    runId: string;\n  }): Promise<WorkflowRunState | null>;\n\n  abstract listWorkflowRuns(args?: StorageListWorkflowRunsInput): Promise<WorkflowRuns>;\n\n  abstract getWorkflowRunById(args: { runId: string; workflowName?: string }): Promise<WorkflowRun | null>;\n\n  abstract deleteWorkflowRunById(args: { runId: string; workflowName: string }): Promise<void>;\n}\n","import type { StepResult, WorkflowRunState } from '../../../workflows';\nimport { isPendingMarker } from '../../../workflows/evented/types';\nimport { normalizePerPage } from '../../base';\nimport type {\n  StorageWorkflowRun,\n  WorkflowRun,\n  WorkflowRuns,\n  StorageListWorkflowRunsInput,\n  UpdateWorkflowStateOptions,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { WorkflowsStorage } from './base';\n\nexport class WorkflowsInMemory extends WorkflowsStorage {\n  private db: InMemoryDB;\n\n  constructor({ db }: { db: InMemoryDB }) {\n    super();\n    this.db = db;\n  }\n\n  supportsConcurrentUpdates(): boolean {\n    return true;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.db.workflows.clear();\n  }\n\n  private getWorkflowKey(workflowName: string, runId: string): string {\n    return `${workflowName}-${runId}`;\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    const key = this.getWorkflowKey(workflowName, runId);\n    const run = this.db.workflows.get(key);\n\n    if (!run) {\n      return {};\n    }\n\n    let snapshot: WorkflowRunState;\n    if (!run.snapshot) {\n      snapshot = {\n        context: {},\n        activePaths: [],\n        activeStepsPath: {},\n        timestamp: Date.now(),\n        suspendedPaths: {},\n        resumeLabels: {},\n        serializedStepGraph: [],\n        value: {},\n        waitingPaths: {},\n        status: 'pending',\n        runId: run.run_id,\n      } as WorkflowRunState;\n\n      this.db.workflows.set(key, {\n        ...run,\n        snapshot,\n      });\n    } else {\n      snapshot = typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : run.snapshot;\n    }\n\n    if (!snapshot || !snapshot?.context) {\n      throw new Error(`Snapshot not found for runId ${runId}`);\n    }\n\n    // For foreach steps with array outputs, merge the arrays atomically\n    // This handles concurrent iteration completions\n    const existingResult = snapshot.context[stepId];\n    if (\n      existingResult &&\n      'output' in existingResult &&\n      Array.isArray(existingResult.output) &&\n      result &&\n      typeof result === 'object' &&\n      'output' in result &&\n      Array.isArray(result.output)\n    ) {\n      const existingOutput = existingResult.output as unknown[];\n      const newOutput = result.output as unknown[];\n      // ForEach iteration result merge logic:\n      //\n      // When forEach runs with concurrency > 1, multiple iterations execute in parallel.\n      // Each iteration writes its result to the same output array. We need to merge carefully:\n      //\n      // - null in newOutput means \"iteration started but not finished\" - keep existing result\n      // - non-null in newOutput means \"iteration completed\" - use the new result\n      // - PendingMarker ({ __mastra_pending__: true }) means \"force reset to null\"\n      //\n      // The PendingMarker is needed for bulk resume: when resuming suspended iterations,\n      // we must reset them to null before re-running. Without the marker, the merge logic\n      // would preserve the old suspended result (since null means \"keep existing\").\n      //\n      // Why a string key instead of Symbol? Symbols don't survive JSON serialization.\n      // In distributed execution where state is persisted to storage and loaded by\n      // different engine instances, a Symbol marker would be silently dropped.\n      const mergedOutput = [...existingOutput];\n      for (let i = 0; i < Math.max(existingOutput.length, newOutput.length); i++) {\n        if (i < newOutput.length) {\n          const newVal = newOutput[i];\n          if (isPendingMarker(newVal)) {\n            // PendingMarker: force reset to null (for bulk resume of suspended iterations)\n            mergedOutput[i] = null;\n          } else if (newVal !== null) {\n            // Completed result: always use the new value\n            mergedOutput[i] = newVal;\n          }\n          // null: iteration in progress, keep existing result (from spread above)\n        }\n        // Index beyond newOutput length: keep existing (from spread above)\n      }\n      snapshot.context[stepId] = {\n        ...existingResult,\n        ...(result as any),\n        output: mergedOutput,\n      };\n    } else {\n      snapshot.context[stepId] = result;\n    }\n    snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };\n\n    this.db.workflows.set(key, {\n      ...run,\n      snapshot: snapshot,\n    });\n\n    return JSON.parse(JSON.stringify(snapshot.context));\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    const key = this.getWorkflowKey(workflowName, runId);\n    const run = this.db.workflows.get(key);\n\n    if (!run) {\n      return;\n    }\n\n    let snapshot: WorkflowRunState;\n    if (!run.snapshot) {\n      snapshot = {\n        context: {},\n        activePaths: [],\n        activeStepsPath: {},\n        timestamp: Date.now(),\n        suspendedPaths: {},\n        resumeLabels: {},\n        serializedStepGraph: [],\n        value: {},\n        waitingPaths: {},\n        status: 'pending',\n        runId: run.run_id,\n      } as WorkflowRunState;\n\n      this.db.workflows.set(key, {\n        ...run,\n        snapshot,\n      });\n    } else {\n      snapshot = typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : run.snapshot;\n    }\n\n    if (!snapshot || !snapshot?.context) {\n      throw new Error(`Snapshot not found for runId ${runId}`);\n    }\n\n    snapshot = { ...snapshot, ...opts };\n    this.db.workflows.set(key, {\n      ...run,\n      snapshot: snapshot,\n    });\n\n    return snapshot;\n  }\n\n  async persistWorkflowSnapshot({\n    workflowName,\n    runId,\n    resourceId,\n    snapshot,\n    createdAt,\n    updatedAt,\n  }: {\n    workflowName: string;\n    runId: string;\n    resourceId?: string;\n    snapshot: WorkflowRunState;\n    createdAt?: Date;\n    updatedAt?: Date;\n  }): Promise<void> {\n    const key = this.getWorkflowKey(workflowName, runId);\n    const now = new Date();\n    const data: StorageWorkflowRun = {\n      workflow_name: workflowName,\n      run_id: runId,\n      resourceId,\n      snapshot,\n      createdAt: createdAt ?? now,\n      updatedAt: updatedAt ?? now,\n    };\n\n    this.db.workflows.set(key, data);\n  }\n\n  async loadWorkflowSnapshot({\n    workflowName,\n    runId,\n  }: {\n    workflowName: string;\n    runId: string;\n  }): Promise<WorkflowRunState | null> {\n    const key = this.getWorkflowKey(workflowName, runId);\n    const run = this.db.workflows.get(key);\n\n    if (!run) {\n      return null;\n    }\n\n    const snapshot = typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : run.snapshot;\n    // Return a deep copy to prevent mutation\n    return snapshot ? JSON.parse(JSON.stringify(snapshot)) : null;\n  }\n\n  async listWorkflowRuns({\n    workflowName,\n    fromDate,\n    toDate,\n    perPage,\n    page,\n    resourceId,\n    status,\n  }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n    if (page !== undefined && page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    let runs = Array.from(this.db.workflows.values());\n\n    if (workflowName) runs = runs.filter((run: any) => run.workflow_name === workflowName);\n    if (status) {\n      runs = runs.filter((run: any) => {\n        let snapshot: WorkflowRunState | string = run?.snapshot!;\n\n        if (!snapshot) {\n          return false;\n        }\n\n        if (typeof snapshot === 'string') {\n          try {\n            snapshot = JSON.parse(snapshot) as WorkflowRunState;\n          } catch {\n            return false;\n          }\n        } else {\n          snapshot = JSON.parse(JSON.stringify(snapshot)) as WorkflowRunState;\n        }\n\n        return snapshot.status === status;\n      });\n    }\n\n    if (fromDate && toDate) {\n      runs = runs.filter(\n        (run: any) =>\n          new Date(run.createdAt).getTime() >= fromDate.getTime() &&\n          new Date(run.createdAt).getTime() <= toDate.getTime(),\n      );\n    } else if (fromDate) {\n      runs = runs.filter((run: any) => new Date(run.createdAt).getTime() >= fromDate.getTime());\n    } else if (toDate) {\n      runs = runs.filter((run: any) => new Date(run.createdAt).getTime() <= toDate.getTime());\n    }\n    if (resourceId) runs = runs.filter((run: any) => run.resourceId === resourceId);\n\n    const total = runs.length;\n\n    // Sort by createdAt\n    runs.sort((a: any, b: any) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n    // Apply pagination\n    if (perPage !== undefined && page !== undefined) {\n      // Use MAX_SAFE_INTEGER as default to maintain \"no pagination\" behavior when undefined\n      const normalizedPerPage = normalizePerPage(perPage, Number.MAX_SAFE_INTEGER);\n      const offset = page * normalizedPerPage;\n      const start = offset;\n      const end = start + normalizedPerPage;\n      runs = runs.slice(start, end);\n    }\n\n    // Deserialize snapshot if it's a string\n    const parsedRuns = runs.map((run: any) => ({\n      ...run,\n      snapshot: typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : JSON.parse(JSON.stringify(run.snapshot)),\n      createdAt: new Date(run.createdAt),\n      updatedAt: new Date(run.updatedAt),\n      runId: run.run_id,\n      workflowName: run.workflow_name,\n      resourceId: run.resourceId,\n    }));\n\n    return { runs: parsedRuns as WorkflowRun[], total };\n  }\n\n  async getWorkflowRunById({\n    runId,\n    workflowName,\n  }: {\n    runId: string;\n    workflowName?: string;\n  }): Promise<WorkflowRun | null> {\n    const runs = Array.from(this.db.workflows.values()).filter((r: any) => r.run_id === runId);\n    let run = runs.find((r: any) => r.workflow_name === workflowName);\n\n    if (!run) return null;\n\n    // Return a deep copy to prevent mutation\n    const parsedRun = {\n      ...run,\n      snapshot: typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : JSON.parse(JSON.stringify(run.snapshot)),\n      createdAt: new Date(run.createdAt),\n      updatedAt: new Date(run.updatedAt),\n      runId: run.run_id,\n      workflowName: run.workflow_name,\n      resourceId: run.resourceId,\n    };\n\n    return parsedRun as WorkflowRun;\n  }\n\n  async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n    const key = this.getWorkflowKey(workflowName, runId);\n    this.db.workflows.delete(key);\n  }\n}\n","import type {\n  StorageWorkspaceType,\n  StorageWorkspaceSnapshotType,\n  StorageResolvedWorkspaceType,\n  StorageCreateWorkspaceInput,\n  StorageUpdateWorkspaceInput,\n  StorageListWorkspacesInput,\n  StorageListWorkspacesOutput,\n  StorageListWorkspacesResolvedOutput,\n} from '../../types';\nimport { VersionedStorageDomain } from '../versioned';\nimport type { VersionBase, CreateVersionInputBase, ListVersionsInputBase, ListVersionsOutputBase } from '../versioned';\n\n// ============================================================================\n// Workspace Version Types\n// ============================================================================\n\n/**\n * Represents a stored version of a workspace's configuration.\n * Config fields are top-level on the version row (no nested snapshot object).\n */\nexport interface WorkspaceVersion extends StorageWorkspaceSnapshotType, VersionBase {\n  /** ID of the workspace this version belongs to */\n  workspaceId: string;\n}\n\n/**\n * Input for creating a new workspace version.\n * Config fields are top-level (no nested snapshot object).\n */\nexport interface CreateWorkspaceVersionInput extends StorageWorkspaceSnapshotType, CreateVersionInputBase {\n  /** ID of the workspace this version belongs to */\n  workspaceId: string;\n}\n\n/**\n * Sort direction for version listings.\n */\nexport type WorkspaceVersionSortDirection = 'ASC' | 'DESC';\n\n/**\n * Fields that can be used for ordering version listings.\n */\nexport type WorkspaceVersionOrderBy = 'versionNumber' | 'createdAt';\n\n/**\n * Input for listing workspace versions with pagination and sorting.\n */\nexport interface ListWorkspaceVersionsInput extends ListVersionsInputBase {\n  /** ID of the workspace to list versions for */\n  workspaceId: string;\n}\n\n/**\n * Output for listing workspace versions with pagination info.\n */\nexport interface ListWorkspaceVersionsOutput extends ListVersionsOutputBase<WorkspaceVersion> {}\n\n// ============================================================================\n// WorkspacesStorage Base Class\n// ============================================================================\n\nexport abstract class WorkspacesStorage extends VersionedStorageDomain<\n  StorageWorkspaceType,\n  StorageWorkspaceSnapshotType,\n  StorageResolvedWorkspaceType,\n  WorkspaceVersion,\n  CreateWorkspaceVersionInput,\n  ListWorkspaceVersionsInput,\n  ListWorkspaceVersionsOutput,\n  { workspace: StorageCreateWorkspaceInput },\n  StorageUpdateWorkspaceInput,\n  StorageListWorkspacesInput | undefined,\n  StorageListWorkspacesOutput,\n  StorageListWorkspacesResolvedOutput\n> {\n  protected readonly listKey = 'workspaces';\n  protected readonly versionMetadataFields = [\n    'id',\n    'workspaceId',\n    'versionNumber',\n    'changedFields',\n    'changeMessage',\n    'createdAt',\n  ] satisfies (keyof WorkspaceVersion)[];\n\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'WORKSPACES',\n    });\n  }\n}\n","import { deepEqual } from '../../../utils';\nimport { normalizePerPage, calculatePagination } from '../../base';\nimport type {\n  StorageWorkspaceType,\n  StorageCreateWorkspaceInput,\n  StorageUpdateWorkspaceInput,\n  StorageListWorkspacesInput,\n  StorageListWorkspacesOutput,\n  ThreadOrderBy,\n  ThreadSortDirection,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport type {\n  WorkspaceVersion,\n  CreateWorkspaceVersionInput,\n  ListWorkspaceVersionsInput,\n  ListWorkspaceVersionsOutput,\n  WorkspaceVersionOrderBy,\n  WorkspaceVersionSortDirection,\n} from './base';\nimport { WorkspacesStorage } from './base';\n\nexport class InMemoryWorkspacesStorage extends WorkspacesStorage {\n  private db: InMemoryDB;\n\n  constructor({ db }: { db: InMemoryDB }) {\n    super();\n    this.db = db;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.db.workspaces.clear();\n    this.db.workspaceVersions.clear();\n  }\n\n  // ==========================================================================\n  // Workspace CRUD Methods\n  // ==========================================================================\n\n  async getById(id: string): Promise<StorageWorkspaceType | null> {\n    const config = this.db.workspaces.get(id);\n    return config ? this.deepCopyConfig(config) : null;\n  }\n\n  async create(input: { workspace: StorageCreateWorkspaceInput }): Promise<StorageWorkspaceType> {\n    const { workspace } = input;\n\n    if (this.db.workspaces.has(workspace.id)) {\n      throw new Error(`Workspace with id ${workspace.id} already exists`);\n    }\n\n    const now = new Date();\n    const newConfig: StorageWorkspaceType = {\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\n    this.db.workspaces.set(workspace.id, newConfig);\n\n    // Extract config fields from the flat input (everything except record fields)\n    const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = workspace;\n\n    // Create version 1 from the config\n    const versionId = crypto.randomUUID();\n    await this.createVersion({\n      id: versionId,\n      workspaceId: workspace.id,\n      versionNumber: 1,\n      ...snapshotConfig,\n      changedFields: Object.keys(snapshotConfig),\n      changeMessage: 'Initial version',\n    });\n\n    // Return the thin record\n    return this.deepCopyConfig(newConfig);\n  }\n\n  async update(input: StorageUpdateWorkspaceInput): Promise<StorageWorkspaceType> {\n    const { id, ...updates } = input;\n\n    const existingConfig = this.db.workspaces.get(id);\n    if (!existingConfig) {\n      throw new Error(`Workspace with id ${id} not found`);\n    }\n\n    // Separate metadata fields from config fields\n    const { authorId, activeVersionId, metadata, status, ...configFields } = updates;\n\n    // Config field names from StorageWorkspaceSnapshotType\n    const configFieldNames = [\n      'name',\n      'description',\n      'filesystem',\n      'sandbox',\n      'mounts',\n      'search',\n      'skills',\n      'tools',\n      'autoSync',\n      'operationTimeout',\n    ];\n\n    // Check if any config fields are present in the update\n    const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n    // Update metadata fields on the record\n    const updatedConfig: StorageWorkspaceType = {\n      ...existingConfig,\n      ...(authorId !== undefined && { authorId }),\n      ...(activeVersionId !== undefined && { activeVersionId }),\n      ...(status !== undefined && { status: status as StorageWorkspaceType['status'] }),\n      ...(metadata !== undefined && {\n        metadata: { ...existingConfig.metadata, ...metadata },\n      }),\n      updatedAt: new Date(),\n    };\n\n    // Auto-set status to 'published' when activeVersionId is set, only if status is not explicitly provided\n    if (activeVersionId !== undefined && status === undefined) {\n      updatedConfig.status = 'published';\n    }\n\n    // If config fields are being updated, create a new version\n    if (hasConfigUpdate) {\n      // Get the latest version to use as base\n      const latestVersion = await this.getLatestVersion(id);\n      if (!latestVersion) {\n        throw new Error(`No versions found for workspace ${id}`);\n      }\n\n      // Extract config from latest version\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      // Merge updates into latest config\n      const newConfig = {\n        ...latestConfig,\n        ...configFields,\n      };\n\n      // Identify which fields changed\n      const changedFields = configFieldNames.filter(\n        field =>\n          field in configFields &&\n          JSON.stringify(configFields[field as keyof typeof configFields]) !==\n            JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n      );\n\n      // Only create a new version if something actually changed\n      if (changedFields.length > 0) {\n        const newVersionId = crypto.randomUUID();\n        const newVersionNumber = latestVersion.versionNumber + 1;\n\n        await this.createVersion({\n          id: newVersionId,\n          workspaceId: id,\n          versionNumber: newVersionNumber,\n          ...newConfig,\n          changedFields,\n          changeMessage: `Updated ${changedFields.join(', ')}`,\n        });\n      }\n    }\n\n    // Save the updated record\n    this.db.workspaces.set(id, updatedConfig);\n    return this.deepCopyConfig(updatedConfig);\n  }\n\n  async delete(id: string): Promise<void> {\n    // Idempotent delete\n    this.db.workspaces.delete(id);\n    // Also delete all versions for this workspace\n    await this.deleteVersionsByParentId(id);\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    // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 100)\n    const perPage = normalizePerPage(perPageInput, 100);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // Prevent unreasonably large page values\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Get all workspaces and apply filters\n    let configs = Array.from(this.db.workspaces.values());\n\n    // Filter by authorId if provided\n    if (authorId !== undefined) {\n      configs = configs.filter(config => config.authorId === authorId);\n    }\n\n    // Filter by metadata if provided (AND logic)\n    if (metadata && Object.keys(metadata).length > 0) {\n      configs = configs.filter(config => {\n        if (!config.metadata) return false;\n        return Object.entries(metadata).every(([key, value]) => deepEqual(config.metadata![key], value));\n      });\n    }\n\n    // Sort filtered configs\n    const sortedConfigs = this.sortConfigs(configs, field, direction);\n\n    // Deep clone to avoid mutation\n    const clonedConfigs = sortedConfigs.map(config => this.deepCopyConfig(config));\n\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    return {\n      workspaces: clonedConfigs.slice(offset, offset + perPage),\n      total: clonedConfigs.length,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < clonedConfigs.length,\n    };\n  }\n\n  // ==========================================================================\n  // Workspace Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateWorkspaceVersionInput): Promise<WorkspaceVersion> {\n    // Check if version with this ID already exists\n    if (this.db.workspaceVersions.has(input.id)) {\n      throw new Error(`Version with id ${input.id} already exists`);\n    }\n\n    // Check for duplicate (workspaceId, versionNumber) pair\n    for (const version of this.db.workspaceVersions.values()) {\n      if (version.workspaceId === input.workspaceId && version.versionNumber === input.versionNumber) {\n        throw new Error(`Version number ${input.versionNumber} already exists for workspace ${input.workspaceId}`);\n      }\n    }\n\n    const version: WorkspaceVersion = {\n      ...input,\n      createdAt: new Date(),\n    };\n\n    // Deep clone before storing\n    this.db.workspaceVersions.set(input.id, this.deepCopyVersion(version));\n    return this.deepCopyVersion(version);\n  }\n\n  async getVersion(id: string): Promise<WorkspaceVersion | null> {\n    const version = this.db.workspaceVersions.get(id);\n    return version ? this.deepCopyVersion(version) : null;\n  }\n\n  async getVersionByNumber(workspaceId: string, versionNumber: number): Promise<WorkspaceVersion | null> {\n    for (const version of this.db.workspaceVersions.values()) {\n      if (version.workspaceId === workspaceId && version.versionNumber === versionNumber) {\n        return this.deepCopyVersion(version);\n      }\n    }\n    return null;\n  }\n\n  async getLatestVersion(workspaceId: string): Promise<WorkspaceVersion | null> {\n    let latest: WorkspaceVersion | null = null;\n    for (const version of this.db.workspaceVersions.values()) {\n      if (version.workspaceId === workspaceId) {\n        if (!latest || version.versionNumber > latest.versionNumber) {\n          latest = version;\n        }\n      }\n    }\n    return latest ? this.deepCopyVersion(latest) : null;\n  }\n\n  async listVersions(input: ListWorkspaceVersionsInput): Promise<ListWorkspaceVersionsOutput> {\n    const { workspaceId, page = 0, perPage: perPageInput, orderBy } = input;\n    const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n    // Normalize perPage (false -> MAX_SAFE_INTEGER, 0 -> 0, undefined -> 20)\n    const perPage = normalizePerPage(perPageInput, 20);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Filter versions by workspaceId\n    let versions = Array.from(this.db.workspaceVersions.values()).filter(v => v.workspaceId === workspaceId);\n\n    // Sort versions\n    versions = this.sortVersions(versions, field, direction);\n\n    // Deep clone\n    const clonedVersions = versions.map(v => this.deepCopyVersion(v));\n\n    const total = clonedVersions.length;\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const paginatedVersions = clonedVersions.slice(offset, offset + perPage);\n\n    return {\n      versions: paginatedVersions,\n      total,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < total,\n    };\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    this.db.workspaceVersions.delete(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    const idsToDelete: string[] = [];\n    for (const [id, version] of this.db.workspaceVersions.entries()) {\n      if (version.workspaceId === entityId) {\n        idsToDelete.push(id);\n      }\n    }\n\n    for (const id of idsToDelete) {\n      this.db.workspaceVersions.delete(id);\n    }\n  }\n\n  async countVersions(workspaceId: string): Promise<number> {\n    let count = 0;\n    for (const version of this.db.workspaceVersions.values()) {\n      if (version.workspaceId === workspaceId) {\n        count++;\n      }\n    }\n    return count;\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  private deepCopyConfig(config: StorageWorkspaceType): StorageWorkspaceType {\n    return {\n      ...config,\n      metadata: config.metadata ? { ...config.metadata } : config.metadata,\n    };\n  }\n\n  private deepCopyVersion(version: WorkspaceVersion): WorkspaceVersion {\n    return structuredClone(version);\n  }\n\n  private sortConfigs(\n    configs: StorageWorkspaceType[],\n    field: ThreadOrderBy,\n    direction: ThreadSortDirection,\n  ): StorageWorkspaceType[] {\n    return configs.sort((a, b) => {\n      const aValue = a[field].getTime();\n      const bValue = b[field].getTime();\n\n      return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n    });\n  }\n\n  private sortVersions(\n    versions: WorkspaceVersion[],\n    field: WorkspaceVersionOrderBy,\n    direction: WorkspaceVersionSortDirection,\n  ): WorkspaceVersion[] {\n    return versions.sort((a, b) => {\n      let aVal: number;\n      let bVal: number;\n\n      if (field === 'createdAt') {\n        aVal = a.createdAt.getTime();\n        bVal = b.createdAt.getTime();\n      } else {\n        // versionNumber\n        aVal = a.versionNumber;\n        bVal = b.versionNumber;\n      }\n\n      return direction === 'ASC' ? aVal - bVal : bVal - aVal;\n    });\n  }\n}\n","import { MastraCompositeStore } from './base';\nimport type { StorageDomains } from './base';\nimport { InMemoryAgentsStorage } from './domains/agents/inmemory';\nimport { InMemoryBlobStore } from './domains/blobs/inmemory';\nimport { DatasetsInMemory } from './domains/datasets/inmemory';\nimport { ExperimentsInMemory } from './domains/experiments/inmemory';\nimport { InMemoryDB } from './domains/inmemory-db';\nimport { InMemoryMCPClientsStorage } from './domains/mcp-clients/inmemory';\nimport { InMemoryMCPServersStorage } from './domains/mcp-servers/inmemory';\nimport { InMemoryMemory } from './domains/memory/inmemory';\nimport { ObservabilityInMemory } from './domains/observability/inmemory';\nimport { InMemoryPromptBlocksStorage } from './domains/prompt-blocks/inmemory';\nimport { InMemoryScorerDefinitionsStorage } from './domains/scorer-definitions/inmemory';\nimport { ScoresInMemory } from './domains/scores/inmemory';\nimport { InMemorySkillsStorage } from './domains/skills/inmemory';\nimport { WorkflowsInMemory } from './domains/workflows/inmemory';\nimport { InMemoryWorkspacesStorage } from './domains/workspaces/inmemory';\n/**\n * In-memory storage implementation for testing and development.\n *\n * All data is stored in memory and will be lost when the process ends.\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * const storage = new InMemoryStore();\n *\n * // Access memory domain\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Access workflows domain\n * const workflows = await storage.getStore('workflows');\n * await workflows?.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n * ```\n */\nexport class InMemoryStore extends MastraCompositeStore {\n  stores: StorageDomains;\n\n  /**\n   * Internal database layer shared across all domains.\n   * This is an implementation detail - domains interact with this\n   * rather than managing their own data structures.\n   */\n  #db: InMemoryDB;\n\n  constructor({ id = 'in-memory' }: { id?: string } = {}) {\n    super({ id, name: 'InMemoryStorage' });\n    // InMemoryStore doesn't need async initialization\n    this.hasInitialized = Promise.resolve(true);\n\n    // Create internal db layer - shared across all domains\n    this.#db = new InMemoryDB();\n\n    // Create all domain instances with the shared db\n    this.stores = {\n      memory: new InMemoryMemory({ db: this.#db }),\n      workflows: new WorkflowsInMemory({ db: this.#db }),\n      scores: new ScoresInMemory({ db: this.#db }),\n      observability: new ObservabilityInMemory({ db: this.#db }),\n      agents: new InMemoryAgentsStorage({ db: this.#db }),\n      datasets: new DatasetsInMemory({ db: this.#db }),\n      experiments: new ExperimentsInMemory({ db: this.#db }),\n      promptBlocks: new InMemoryPromptBlocksStorage({ db: this.#db }),\n      scorerDefinitions: new InMemoryScorerDefinitionsStorage({ db: this.#db }),\n      mcpClients: new InMemoryMCPClientsStorage({ db: this.#db }),\n      mcpServers: new InMemoryMCPServersStorage({ db: this.#db }),\n      workspaces: new InMemoryWorkspacesStorage({ db: this.#db }),\n      skills: new InMemorySkillsStorage({ db: this.#db }),\n      blobs: new InMemoryBlobStore(),\n    };\n  }\n\n  /**\n   * Clears all data from the in-memory database.\n   * Useful for testing.\n   * @deprecated Use dangerouslyClearAll() on individual domains instead.\n   */\n  clear(): void {\n    this.#db.clear();\n  }\n}\n\nexport const MockStore = InMemoryStore;\n","import { execFile } from 'node:child_process';\nimport { realpathSync } from 'node:fs';\nimport { relative } from 'node:path';\n\n/**\n * A single Git commit entry parsed from `git log` output.\n */\nexport interface GitCommit {\n  /** Full commit SHA */\n  hash: string;\n  /** Commit author date as a Date object */\n  date: Date;\n  /** Author name */\n  author: string;\n  /** Commit subject line */\n  message: string;\n}\n\n/**\n * Read-only utility for reading Git history of filesystem-stored JSON files.\n *\n * All operations are performed by shelling out to the `git` CLI via\n * `child_process.execFile` (no third-party dependencies). This class never\n * writes to Git — the user manages their own commits.\n *\n * Designed as a singleton shared across all domain helpers via a static field\n * on `FilesystemVersionedHelpers`.\n */\nexport class GitHistory {\n  /** Cache: dir → repo root (string) or `false` if not a repo. */\n  private repoRootCache = new Map<string, string | false>();\n\n  /** Cache: `dir:filename:limit` → ordered commits (newest first). */\n  private commitCache = new Map<string, GitCommit[]>();\n\n  /** Cache: `dir:commitHash:filename` → parsed JSON. */\n  private snapshotCache = new Map<string, Record<string, Record<string, unknown>>>();\n\n  // ===========================================================================\n  // Public API\n  // ===========================================================================\n\n  /**\n   * Returns `true` if `dir` is inside a Git repository.\n   * Result is cached after the first call per directory.\n   */\n  async isGitRepo(dir: string): Promise<boolean> {\n    const cached = this.repoRootCache.get(dir);\n    if (cached === false) return false;\n    if (typeof cached === 'string') return true;\n\n    try {\n      const root = (await this.exec(dir, ['rev-parse', '--show-toplevel'])).trim();\n      this.repoRootCache.set(dir, root);\n      return true;\n    } catch {\n      this.repoRootCache.set(dir, false);\n      return false;\n    }\n  }\n\n  /**\n   * Get the list of commits that touched a specific file, newest first.\n   * Returns an empty array if Git is unavailable or the file has no history.\n   *\n   * @param dir      Absolute path to the storage directory\n   * @param filename The JSON filename relative to `dir` (e.g., 'agents.json')\n   * @param limit    Maximum number of commits to retrieve\n   */\n  async getFileHistory(dir: string, filename: string, limit: number = 50): Promise<GitCommit[]> {\n    const cacheKey = `${dir}:${filename}:${limit}`;\n    if (this.commitCache.has(cacheKey)) {\n      return this.commitCache.get(cacheKey)!;\n    }\n\n    if (!(await this.isGitRepo(dir))) {\n      this.commitCache.set(cacheKey, []);\n      return [];\n    }\n\n    try {\n      // `filename` is already relative to `dir`, and `exec` runs with `cwd: dir`,\n      // so `git log -- <filename>` resolves correctly.\n      const raw = await this.exec(dir, [\n        'log',\n        `--max-count=${limit}`,\n        '--format=%H|%aI|%aN|%s',\n        '--follow',\n        '--',\n        filename,\n      ]);\n\n      const commits: GitCommit[] = [];\n      for (const line of raw.split('\\n')) {\n        const trimmed = line.trim();\n        if (!trimmed) continue;\n\n        const pipeIdx1 = trimmed.indexOf('|');\n        const pipeIdx2 = trimmed.indexOf('|', pipeIdx1 + 1);\n        const pipeIdx3 = trimmed.indexOf('|', pipeIdx2 + 1);\n\n        if (pipeIdx1 === -1 || pipeIdx2 === -1 || pipeIdx3 === -1) continue;\n\n        commits.push({\n          hash: trimmed.slice(0, pipeIdx1),\n          date: new Date(trimmed.slice(pipeIdx1 + 1, pipeIdx2)),\n          author: trimmed.slice(pipeIdx2 + 1, pipeIdx3),\n          message: trimmed.slice(pipeIdx3 + 1),\n        });\n      }\n\n      this.commitCache.set(cacheKey, commits);\n      return commits;\n    } catch {\n      this.commitCache.set(cacheKey, []);\n      return [];\n    }\n  }\n\n  /**\n   * Read and parse a JSON file at a specific Git commit.\n   * Returns the parsed entity map, or `null` if the file didn't exist at that commit.\n   *\n   * @param dir        Absolute path to the storage directory\n   * @param commitHash Full or abbreviated commit SHA\n   * @param filename   The JSON filename relative to `dir` (e.g., 'agents.json')\n   */\n  async getFileAtCommit<T = Record<string, Record<string, unknown>>>(\n    dir: string,\n    commitHash: string,\n    filename: string,\n  ): Promise<T | null> {\n    const cacheKey = `${dir}:${commitHash}:${filename}`;\n    if (this.snapshotCache.has(cacheKey)) {\n      return this.snapshotCache.get(cacheKey)! as T;\n    }\n\n    if (!(await this.isGitRepo(dir))) return null;\n\n    try {\n      const relPath = this.relativeToRepo(dir, filename);\n      const raw = await this.exec(dir, ['show', `${commitHash}:${relPath}`]);\n      const parsed = JSON.parse(raw) as Record<string, Record<string, unknown>>;\n      this.snapshotCache.set(cacheKey, parsed);\n      return parsed as T;\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Invalidate all caches. Call after external operations that change Git state\n   * (e.g., the user commits or pulls).\n   */\n  invalidateCache(): void {\n    this.repoRootCache.clear();\n    this.commitCache.clear();\n    this.snapshotCache.clear();\n  }\n\n  // ===========================================================================\n  // Internals\n  // ===========================================================================\n\n  /**\n   * Get the relative path from the Git repo root to a file in the storage directory.\n   */\n  private relativeToRepo(dir: string, filename: string): string {\n    const root = this.repoRootCache.get(dir);\n    if (!root) {\n      throw new Error(`Not a git repository: ${dir}`);\n    }\n    // Resolve symlinks so that macOS /var → /private/var differences don't break relative()\n    const realRoot = realpathSync(root);\n    const realDir = realpathSync(dir);\n    const relDir = relative(realRoot, realDir);\n    return relDir ? `${relDir}/${filename}` : filename;\n  }\n\n  /**\n   * Execute a git command and return stdout.\n   */\n  private exec(cwd: string, args: string[]): Promise<string> {\n    return new Promise((resolve, reject) => {\n      execFile('git', args, { cwd, maxBuffer: 10 * 1024 * 1024 }, (error, stdout) => {\n        if (error) reject(error);\n        else resolve(stdout);\n      });\n    });\n  }\n}\n","import { normalizePerPage, calculatePagination } from './base';\nimport type {\n  VersionBase,\n  ListVersionsInputBase,\n  ListVersionsOutputBase,\n  VersionedEntityBase,\n} from './domains/versioned';\n\nimport type { FilesystemDB } from './filesystem-db';\nimport { GitHistory } from './git-history';\nimport type { StorageOrderBy } from './types';\n\n/**\n * Prefix for version IDs that come from git history.\n * These versions are read-only and cannot be deleted.\n */\nconst GIT_VERSION_PREFIX = 'git-';\n\n/**\n * Configuration for a filesystem-backed versioned storage domain.\n */\nexport interface FilesystemVersionedConfig {\n  /** The FilesystemDB instance for I/O */\n  db: FilesystemDB;\n  /** Filename for the entities JSON file (e.g., 'agents.json') */\n  entitiesFile: string;\n  /** The key name of the parent FK field on versions (e.g., 'agentId') */\n  parentIdField: string;\n  /** Name for logging/error messages */\n  name: string;\n  /**\n   * Fields that are version metadata (not part of the snapshot config).\n   * These are stripped when writing to disk.\n   * e.g., ['id', 'agentId', 'versionNumber', 'changedFields', 'changeMessage', 'createdAt']\n   */\n  versionMetadataFields: string[];\n  /** Maximum number of git commits to load per file (default: 50) */\n  gitHistoryLimit?: number;\n}\n\n/**\n * Generic helpers for filesystem-backed versioned storage domains.\n *\n * Versions are kept entirely in memory. Only the published snapshot config\n * (the clean primitive configuration) is persisted to the on-disk JSON file.\n * This means the JSON files are human-readable, Git-friendly, and contain\n * no version metadata like `changedFields` or `changeMessage`.\n *\n * When the storage directory is inside a git repository, committed versions\n * of the JSON file are automatically loaded as read-only version history.\n * Each git commit that touched the file becomes a version record, giving\n * users a full published history in the version panel — powered by git.\n *\n * On-disk format for `agents.json`:\n * ```json\n * {\n *   \"my-agent-id\": {\n *     \"name\": \"My Agent\",\n *     \"instructions\": \"Be helpful\",\n *     \"model\": { \"provider\": \"openai\", \"name\": \"gpt-4\" }\n *   }\n * }\n * ```\n */\nexport class FilesystemVersionedHelpers<\n  TEntity extends VersionedEntityBase & { createdAt: Date; updatedAt: Date; status: string },\n  TVersion extends VersionBase,\n> {\n  readonly db: FilesystemDB;\n  readonly entitiesFile: string;\n  readonly parentIdField: string;\n  readonly name: string;\n  readonly versionMetadataFields: string[];\n  private readonly gitHistoryLimit: number;\n\n  /**\n   * In-memory entity records (thin metadata), keyed by entity ID.\n   */\n  private entities = new Map<string, TEntity>();\n\n  /**\n   * In-memory version records, keyed by version ID.\n   * Includes both in-memory/hydrated versions and git-based versions (metadata only).\n   */\n  private versions = new Map<string, TVersion>();\n\n  /**\n   * Whether we've loaded from disk yet.\n   */\n  private hydrated = false;\n\n  /**\n   * Git history utility instance (shared across all helpers).\n   */\n  private static gitHistory = new GitHistory();\n\n  /**\n   * Promise that resolves when git history has been loaded.\n   * null means git history loading hasn't been triggered yet.\n   */\n  private gitHistoryPromise: Promise<void> | null = null;\n\n  /**\n   * The highest version number from git history, per entity ID.\n   * Used to assign version numbers to new in-memory versions that continue\n   * after the git history.\n   */\n  private gitVersionCounts = new Map<string, number>();\n\n  constructor(config: FilesystemVersionedConfig) {\n    this.db = config.db;\n    this.entitiesFile = config.entitiesFile;\n    this.parentIdField = config.parentIdField;\n    this.name = config.name;\n    this.versionMetadataFields = config.versionMetadataFields;\n    this.gitHistoryLimit = config.gitHistoryLimit ?? 50;\n  }\n\n  /**\n   * Check if a version ID represents a git-based version.\n   */\n  static isGitVersion(id: string): boolean {\n    return id.startsWith(GIT_VERSION_PREFIX);\n  }\n\n  /**\n   * Hydrate in-memory state from the on-disk JSON file.\n   * For each entry on disk, creates an in-memory entity (status: 'published')\n   * and a synthetic version with the snapshot config.\n   *\n   * Also kicks off async git history loading in the background.\n   * Version numbers for hydrated entities are assigned as 1 initially,\n   * but will be reassigned after git history loads.\n   */\n  hydrate(): void {\n    if (this.hydrated) return;\n    this.hydrated = true;\n\n    const diskData = this.db.readDomain<Record<string, unknown>>(this.entitiesFile);\n\n    for (const [entityId, snapshotConfig] of Object.entries(diskData)) {\n      if (!snapshotConfig || typeof snapshotConfig !== 'object') continue;\n\n      const versionId = `hydrated-${entityId}-v1`;\n      const now = new Date();\n\n      // Create a synthetic entity record\n      const entity = {\n        id: entityId,\n        status: 'published',\n        activeVersionId: versionId,\n        createdAt: now,\n        updatedAt: now,\n      } as TEntity;\n\n      this.entities.set(entityId, entity);\n\n      // Create a synthetic version with the snapshot config.\n      // Version number starts at 1 but may be bumped after git history loads.\n      const version = {\n        id: versionId,\n        [this.parentIdField]: entityId,\n        versionNumber: 1,\n        ...snapshotConfig,\n        createdAt: now,\n      } as TVersion;\n\n      this.versions.set(versionId, version);\n    }\n\n    // Kick off async git history loading (fire and forget)\n    this.gitHistoryPromise = this.loadGitHistory();\n  }\n\n  /**\n   * Ensure git history has been loaded before proceeding.\n   * Call this in version-related methods to ensure git versions are available.\n   */\n  private async ensureGitHistory(): Promise<void> {\n    this.hydrate();\n    if (this.gitHistoryPromise) {\n      await this.gitHistoryPromise;\n    }\n  }\n\n  /**\n   * Load git commit history for the domain's JSON file.\n   * Creates read-only version records (metadata + snapshot config) for each\n   * commit where an entity existed. Reassigns version numbers for\n   * hydrated (current disk) versions to sit on top of git history.\n   */\n  private async loadGitHistory(): Promise<void> {\n    const git = FilesystemVersionedHelpers.gitHistory;\n    const dir = this.db.dir;\n\n    // Check if we're in a git repo\n    const isRepo = await git.isGitRepo(dir);\n    if (!isRepo) return;\n\n    // Get commit history for this domain's file\n    const commits = await git.getFileHistory(dir, this.entitiesFile, this.gitHistoryLimit);\n    if (commits.length === 0) return;\n\n    // Process commits from oldest to newest so version numbers are sequential\n    const orderedCommits = [...commits].reverse();\n\n    // Track per-entity version counts from git\n    const entityVersionCount = new Map<string, number>();\n    // Track previous snapshot per entity to skip unchanged entries\n    const previousSnapshots = new Map<string, string>();\n\n    for (let i = 0; i < orderedCommits.length; i++) {\n      const commit = orderedCommits[i]!;\n\n      // Load the file content at this commit\n      const fileContent = await git.getFileAtCommit<Record<string, Record<string, unknown>>>(\n        dir,\n        commit.hash,\n        this.entitiesFile,\n      );\n      if (!fileContent) continue;\n\n      // Create a version record for each entity that actually changed in this commit\n      for (const [entityId, snapshotConfig] of Object.entries(fileContent)) {\n        if (!snapshotConfig || typeof snapshotConfig !== 'object') continue;\n\n        // Skip if entity data is unchanged from the previous commit\n        const serialized = JSON.stringify(snapshotConfig);\n        if (previousSnapshots.get(entityId) === serialized) continue;\n        previousSnapshots.set(entityId, serialized);\n\n        const count = (entityVersionCount.get(entityId) ?? 0) + 1;\n        entityVersionCount.set(entityId, count);\n\n        const versionId = `${GIT_VERSION_PREFIX}${commit.hash}-${entityId}`;\n\n        // Skip if we somehow already have this version\n        if (this.versions.has(versionId)) continue;\n\n        const version = {\n          id: versionId,\n          [this.parentIdField]: entityId,\n          versionNumber: count,\n          changeMessage: commit.message,\n          ...snapshotConfig,\n          createdAt: commit.date,\n        } as TVersion;\n\n        this.versions.set(versionId, version);\n      }\n    }\n\n    // Save the max git version count per entity\n    this.gitVersionCounts = entityVersionCount;\n\n    // Reassign version numbers for hydrated (current disk) versions\n    // so they sit on top of git history\n    for (const [entityId, gitCount] of entityVersionCount) {\n      const hydratedVersionId = `hydrated-${entityId}-v1`;\n      const version = this.versions.get(hydratedVersionId);\n      if (version) {\n        (version as Record<string, unknown>).versionNumber = gitCount + 1;\n      }\n    }\n  }\n\n  // ==========================================================================\n  // Disk persistence — only published snapshot configs\n  // ==========================================================================\n\n  /**\n   * Write the published snapshot config for an entity to disk.\n   * Strips all entity metadata and version metadata fields, leaving only\n   * the clean primitive configuration.\n   */\n  private persistToDisk(): void {\n    const diskData: Record<string, Record<string, unknown>> = {};\n\n    for (const [entityId, entity] of this.entities) {\n      if (entity.status !== 'published' || !entity.activeVersionId) continue;\n\n      const version = this.versions.get(entity.activeVersionId);\n      if (!version) continue;\n\n      const snapshotConfig = this.extractSnapshotConfig(version);\n      diskData[entityId] = snapshotConfig;\n    }\n\n    this.db.writeDomain(this.entitiesFile, diskData);\n  }\n\n  /**\n   * Extract the snapshot config from a version, stripping version metadata fields.\n   */\n  private extractSnapshotConfig(version: TVersion): Record<string, unknown> {\n    const metadataSet = new Set(this.versionMetadataFields);\n    const result: Record<string, unknown> = {};\n\n    for (const [key, value] of Object.entries(version)) {\n      if (!metadataSet.has(key)) {\n        result[key] = value;\n      }\n    }\n\n    return result;\n  }\n\n  // ==========================================================================\n  // Entity CRUD\n  // ==========================================================================\n\n  async getById(id: string): Promise<TEntity | null> {\n    this.hydrate();\n    return this.entities.has(id) ? structuredClone(this.entities.get(id)!) : null;\n  }\n\n  async createEntity(id: string, entity: TEntity): Promise<TEntity> {\n    this.hydrate();\n    if (this.entities.has(id)) {\n      throw new Error(`${this.name}: entity with id ${id} already exists`);\n    }\n    this.entities.set(id, structuredClone(entity));\n    return structuredClone(entity);\n  }\n\n  async updateEntity(id: string, updates: Record<string, unknown>): Promise<TEntity> {\n    this.hydrate();\n    const existing = this.entities.get(id);\n    if (!existing) {\n      throw new Error(`${this.name}: entity with id ${id} not found`);\n    }\n\n    const updated = { ...existing } as Record<string, unknown>;\n\n    for (const [key, value] of Object.entries(updates)) {\n      if (key === 'id') continue;\n      if (value === undefined) continue;\n\n      if (key === 'metadata' && typeof value === 'object' && value !== null) {\n        updated['metadata'] = {\n          ...((updated['metadata'] as Record<string, unknown> | undefined) ?? {}),\n          ...(value as Record<string, unknown>),\n        };\n      } else {\n        updated[key] = value;\n      }\n    }\n    updated['updatedAt'] = new Date();\n\n    const updatedEntity = updated as TEntity;\n    this.entities.set(id, structuredClone(updatedEntity));\n\n    // Persist to disk when publication state changes:\n    // - entity becomes published (write to disk)\n    // - entity was published but status changed (remove from disk)\n    const wasPublished = existing.status === 'published';\n    const isPublished = updatedEntity.status === 'published' && updatedEntity.activeVersionId;\n    if (isPublished || (wasPublished && updates['status'] !== undefined)) {\n      this.persistToDisk();\n    }\n\n    return structuredClone(updatedEntity);\n  }\n\n  async deleteEntity(id: string): Promise<void> {\n    this.hydrate();\n    this.entities.delete(id);\n    await this.deleteVersionsByParentId(id);\n    this.persistToDisk();\n  }\n\n  async listEntities(args: {\n    page?: number;\n    perPage?: number | false;\n    orderBy?: StorageOrderBy;\n    filters?: Record<string, unknown>;\n    listKey: string;\n  }): Promise<Record<string, unknown>> {\n    this.hydrate();\n    const { page = 0, perPage: perPageInput, orderBy, filters, listKey } = args;\n\n    const perPage = normalizePerPage(perPageInput, 100);\n    if (page < 0) throw new Error('page must be >= 0');\n\n    let entities = Array.from(this.entities.values());\n\n    // Apply filters\n    if (filters) {\n      for (const [key, value] of Object.entries(filters)) {\n        if (value === undefined) continue;\n        if (key === 'metadata' && typeof value === 'object' && value !== null) {\n          entities = entities.filter(e => {\n            const meta = (e as Record<string, unknown>)['metadata'] as Record<string, unknown> | undefined;\n            if (!meta) return false;\n            return Object.entries(value as Record<string, unknown>).every(\n              ([k, v]) => JSON.stringify(meta[k]) === JSON.stringify(v),\n            );\n          });\n        } else {\n          entities = entities.filter(e => (e as Record<string, unknown>)[key] === value);\n        }\n      }\n    }\n\n    // Sort\n    const field = (orderBy?.field as string) ?? 'createdAt';\n    const direction = (orderBy?.direction as string) ?? 'DESC';\n    entities.sort((a, b) => {\n      const aVal = new Date((a as Record<string, unknown>)[field] as string | Date).getTime();\n      const bVal = new Date((b as Record<string, unknown>)[field] as string | Date).getTime();\n      return direction === 'ASC' ? aVal - bVal : bVal - aVal;\n    });\n\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    return {\n      [listKey]: entities.slice(offset, offset + perPage),\n      total: entities.length,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < entities.length,\n    };\n  }\n\n  // ==========================================================================\n  // Version Methods (in-memory + git history)\n  // ==========================================================================\n\n  async createVersion(input: TVersion): Promise<TVersion> {\n    await this.ensureGitHistory();\n    if (this.versions.has(input.id)) {\n      throw new Error(`${this.name}: version with id ${input.id} already exists`);\n    }\n\n    const parentId = (input as Record<string, unknown>)[this.parentIdField] as string;\n\n    // Check for duplicate (parentId, versionNumber) pair\n    for (const v of this.versions.values()) {\n      if ((v as Record<string, unknown>)[this.parentIdField] === parentId && v.versionNumber === input.versionNumber) {\n        throw new Error(`${this.name}: version number ${input.versionNumber} already exists for entity ${parentId}`);\n      }\n    }\n\n    const version: TVersion = {\n      ...input,\n      createdAt: new Date(),\n    } as TVersion;\n\n    this.versions.set(input.id, structuredClone(version));\n    return structuredClone(version);\n  }\n\n  async getVersion(id: string): Promise<TVersion | null> {\n    await this.ensureGitHistory();\n    return this.versions.has(id) ? structuredClone(this.versions.get(id)!) : null;\n  }\n\n  async getVersionByNumber(entityId: string, versionNumber: number): Promise<TVersion | null> {\n    await this.ensureGitHistory();\n    for (const v of this.versions.values()) {\n      if ((v as Record<string, unknown>)[this.parentIdField] === entityId && v.versionNumber === versionNumber) {\n        return structuredClone(v);\n      }\n    }\n    return null;\n  }\n\n  async getLatestVersion(entityId: string): Promise<TVersion | null> {\n    await this.ensureGitHistory();\n    let latest: TVersion | null = null;\n    for (const v of this.versions.values()) {\n      if ((v as Record<string, unknown>)[this.parentIdField] === entityId) {\n        if (!latest || v.versionNumber > latest.versionNumber) {\n          latest = v;\n        }\n      }\n    }\n    return latest ? structuredClone(latest) : null;\n  }\n\n  async listVersions(input: ListVersionsInputBase, parentIdField: string): Promise<ListVersionsOutputBase<TVersion>> {\n    await this.ensureGitHistory();\n    const { page = 0, perPage: perPageInput, orderBy } = input;\n    const entityId = (input as Record<string, unknown>)[parentIdField] as string;\n\n    const perPage = normalizePerPage(perPageInput, 20);\n    if (page < 0) throw new Error('page must be >= 0');\n\n    let versions = Array.from(this.versions.values()).filter(\n      v => (v as Record<string, unknown>)[this.parentIdField] === entityId,\n    );\n\n    // Sort\n    const field = (orderBy?.field as string) ?? 'versionNumber';\n    const direction = (orderBy?.direction as string) ?? 'DESC';\n    versions.sort((a, b) => {\n      const aVal = field === 'createdAt' ? new Date(a.createdAt).getTime() : a.versionNumber;\n      const bVal = field === 'createdAt' ? new Date(b.createdAt).getTime() : b.versionNumber;\n      return direction === 'ASC' ? aVal - bVal : bVal - aVal;\n    });\n\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    return {\n      versions: versions.slice(offset, offset + perPage),\n      total: versions.length,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < versions.length,\n    };\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    await this.ensureGitHistory();\n    // Git-based versions are read-only\n    if (FilesystemVersionedHelpers.isGitVersion(id)) return;\n    this.versions.delete(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    await this.ensureGitHistory();\n    for (const [versionId, version] of this.versions) {\n      if ((version as Record<string, unknown>)[this.parentIdField] === entityId) {\n        // Skip git-based versions (read-only)\n        if (FilesystemVersionedHelpers.isGitVersion(versionId)) continue;\n        this.versions.delete(versionId);\n      }\n    }\n  }\n\n  async countVersions(entityId: string): Promise<number> {\n    await this.ensureGitHistory();\n    let count = 0;\n    for (const v of this.versions.values()) {\n      if ((v as Record<string, unknown>)[this.parentIdField] === entityId) {\n        count++;\n      }\n    }\n    return count;\n  }\n\n  async getNextVersionNumber(entityId: string): Promise<number> {\n    await this.ensureGitHistory();\n    return this._getNextVersionNumber(entityId);\n  }\n\n  private _getNextVersionNumber(entityId: string): number {\n    const gitCount = this.gitVersionCounts.get(entityId) ?? 0;\n    let maxVersion = gitCount;\n    for (const v of this.versions.values()) {\n      if ((v as Record<string, unknown>)[this.parentIdField] === entityId) {\n        maxVersion = Math.max(maxVersion, v.versionNumber);\n      }\n    }\n    return maxVersion + 1;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.entities.clear();\n    this.versions.clear();\n    this.gitVersionCounts.clear();\n    this.gitHistoryPromise = null;\n    this.hydrated = false;\n    this.db.clearDomain(this.entitiesFile);\n  }\n}\n","import type { FilesystemDB } from '../../filesystem-db';\nimport { FilesystemVersionedHelpers } from '../../filesystem-versioned';\nimport type {\n  StorageAgentType,\n  StorageCreateAgentInput,\n  StorageUpdateAgentInput,\n  StorageListAgentsInput,\n  StorageListAgentsOutput,\n} from '../../types';\nimport type { AgentVersion, CreateVersionInput, ListVersionsInput, ListVersionsOutput } from './base';\nimport { AgentsStorage } from './base';\n\n/**\n * Fields persisted for filesystem-stored agents.\n * Only fields that `applyStoredOverrides` actually uses plus the\n * minimum required by the storage schema (`name`, `model`).\n */\nconst PERSISTED_SNAPSHOT_FIELDS = new Set([\n  'name',\n  'instructions',\n  'model',\n  'tools',\n  'integrationTools',\n  'mcpClients',\n  'requestContextSchema',\n]);\n\nfunction stripUnusedFields<T extends Record<string, unknown>>(obj: T): T {\n  const result = {} as Record<string, unknown>;\n  for (const [key, value] of Object.entries(obj)) {\n    if (PERSISTED_SNAPSHOT_FIELDS.has(key)) {\n      result[key] = value;\n    }\n  }\n  return result as T;\n}\n\nexport class FilesystemAgentsStorage extends AgentsStorage {\n  private helpers: FilesystemVersionedHelpers<StorageAgentType, AgentVersion>;\n\n  constructor({ db }: { db: FilesystemDB }) {\n    super();\n    this.helpers = new FilesystemVersionedHelpers({\n      db,\n      entitiesFile: 'agents.json',\n      parentIdField: 'agentId',\n      name: 'FilesystemAgentsStorage',\n      versionMetadataFields: ['id', 'agentId', 'versionNumber', 'changedFields', 'changeMessage', 'createdAt'],\n    });\n  }\n\n  override async init(): Promise<void> {\n    await this.helpers.db.init();\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.helpers.dangerouslyClearAll();\n  }\n\n  async getById(id: string): Promise<StorageAgentType | null> {\n    return this.helpers.getById(id);\n  }\n\n  async create(input: { agent: StorageCreateAgentInput }): Promise<StorageAgentType> {\n    const { agent } = input;\n    const now = new Date();\n    const entity: StorageAgentType = {\n      id: agent.id,\n      status: 'draft',\n      activeVersionId: undefined,\n      authorId: agent.authorId,\n      metadata: agent.metadata,\n      createdAt: now,\n      updatedAt: now,\n    };\n\n    await this.helpers.createEntity(agent.id, entity);\n\n    const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = agent;\n    const filtered = stripUnusedFields(snapshotConfig);\n    const versionId = crypto.randomUUID();\n    await this.createVersion({\n      id: versionId,\n      agentId: agent.id,\n      versionNumber: 1,\n      ...filtered,\n      changedFields: Object.keys(filtered),\n      changeMessage: 'Initial version',\n    } as CreateVersionInput);\n\n    return structuredClone(entity);\n  }\n\n  async update(input: StorageUpdateAgentInput): Promise<StorageAgentType> {\n    const { id, ...updates } = input;\n    // Strip snapshot config fields that don't belong on the entity record\n    const entityUpdates: Record<string, unknown> = {};\n    const entityFields = new Set(['authorId', 'metadata', 'activeVersionId', 'status']);\n    for (const [key, value] of Object.entries(updates)) {\n      if (entityFields.has(key)) {\n        entityUpdates[key] = value;\n      }\n    }\n    return this.helpers.updateEntity(id, entityUpdates);\n  }\n\n  async delete(id: string): Promise<void> {\n    await this.helpers.deleteEntity(id);\n  }\n\n  async list(args?: StorageListAgentsInput): Promise<StorageListAgentsOutput> {\n    const { page, perPage, orderBy, authorId, metadata, status } = args || {};\n    const result = await this.helpers.listEntities({\n      page,\n      perPage,\n      orderBy,\n      listKey: 'agents',\n      filters: { authorId, metadata, status },\n    });\n    return result as unknown as StorageListAgentsOutput;\n  }\n\n  async createVersion(input: CreateVersionInput): Promise<AgentVersion> {\n    const { id, agentId, versionNumber, changedFields, changeMessage, ...snapshotFields } = input;\n    const filtered = stripUnusedFields(snapshotFields as Record<string, unknown>);\n    return this.helpers.createVersion({\n      id,\n      agentId,\n      versionNumber,\n      changedFields,\n      changeMessage,\n      ...filtered,\n    } as AgentVersion);\n  }\n\n  async getVersion(id: string): Promise<AgentVersion | null> {\n    return this.helpers.getVersion(id);\n  }\n\n  async getVersionByNumber(agentId: string, versionNumber: number): Promise<AgentVersion | null> {\n    return this.helpers.getVersionByNumber(agentId, versionNumber);\n  }\n\n  async getLatestVersion(agentId: string): Promise<AgentVersion | null> {\n    return this.helpers.getLatestVersion(agentId);\n  }\n\n  async listVersions(input: ListVersionsInput): Promise<ListVersionsOutput> {\n    const result = await this.helpers.listVersions(input, 'agentId');\n    return result as ListVersionsOutput;\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    await this.helpers.deleteVersion(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    await this.helpers.deleteVersionsByParentId(entityId);\n  }\n\n  async countVersions(agentId: string): Promise<number> {\n    return this.helpers.countVersions(agentId);\n  }\n}\n","import type { FilesystemDB } from '../../filesystem-db';\nimport { FilesystemVersionedHelpers } from '../../filesystem-versioned';\nimport type {\n  StorageMCPClientType,\n  StorageCreateMCPClientInput,\n  StorageUpdateMCPClientInput,\n  StorageListMCPClientsInput,\n  StorageListMCPClientsOutput,\n} from '../../types';\nimport type {\n  MCPClientVersion,\n  CreateMCPClientVersionInput,\n  ListMCPClientVersionsInput,\n  ListMCPClientVersionsOutput,\n} from './base';\nimport { MCPClientsStorage } from './base';\n\nexport class FilesystemMCPClientsStorage extends MCPClientsStorage {\n  private helpers: FilesystemVersionedHelpers<StorageMCPClientType, MCPClientVersion>;\n\n  constructor({ db }: { db: FilesystemDB }) {\n    super();\n    this.helpers = new FilesystemVersionedHelpers({\n      db,\n      entitiesFile: 'mcp-clients.json',\n      parentIdField: 'mcpClientId',\n      name: 'FilesystemMCPClientsStorage',\n      versionMetadataFields: ['id', 'mcpClientId', 'versionNumber', 'changedFields', 'changeMessage', 'createdAt'],\n    });\n  }\n\n  override async init(): Promise<void> {\n    await this.helpers.db.init();\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.helpers.dangerouslyClearAll();\n  }\n\n  async getById(id: string): Promise<StorageMCPClientType | null> {\n    return this.helpers.getById(id);\n  }\n\n  async create(input: { mcpClient: StorageCreateMCPClientInput }): Promise<StorageMCPClientType> {\n    const { mcpClient } = input;\n    const now = new Date();\n    const entity: StorageMCPClientType = {\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\n    await this.helpers.createEntity(mcpClient.id, entity);\n\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: Object.keys(snapshotConfig),\n      changeMessage: 'Initial version',\n    } as CreateMCPClientVersionInput);\n\n    return structuredClone(entity);\n  }\n\n  async update(input: StorageUpdateMCPClientInput): Promise<StorageMCPClientType> {\n    const { id, ...updates } = input;\n    return this.helpers.updateEntity(id, updates);\n  }\n\n  async delete(id: string): Promise<void> {\n    await this.helpers.deleteEntity(id);\n  }\n\n  async list(args?: StorageListMCPClientsInput): Promise<StorageListMCPClientsOutput> {\n    const { page, perPage, orderBy, authorId, metadata, status } = args || {};\n    const result = await this.helpers.listEntities({\n      page,\n      perPage,\n      orderBy,\n      listKey: 'mcpClients',\n      filters: { authorId, metadata, status },\n    });\n    return result as unknown as StorageListMCPClientsOutput;\n  }\n\n  async createVersion(input: CreateMCPClientVersionInput): Promise<MCPClientVersion> {\n    return this.helpers.createVersion(input as MCPClientVersion);\n  }\n\n  async getVersion(id: string): Promise<MCPClientVersion | null> {\n    return this.helpers.getVersion(id);\n  }\n\n  async getVersionByNumber(mcpClientId: string, versionNumber: number): Promise<MCPClientVersion | null> {\n    return this.helpers.getVersionByNumber(mcpClientId, versionNumber);\n  }\n\n  async getLatestVersion(mcpClientId: string): Promise<MCPClientVersion | null> {\n    return this.helpers.getLatestVersion(mcpClientId);\n  }\n\n  async listVersions(input: ListMCPClientVersionsInput): Promise<ListMCPClientVersionsOutput> {\n    const result = await this.helpers.listVersions(input, 'mcpClientId');\n    return result as ListMCPClientVersionsOutput;\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    await this.helpers.deleteVersion(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    await this.helpers.deleteVersionsByParentId(entityId);\n  }\n\n  async countVersions(mcpClientId: string): Promise<number> {\n    return this.helpers.countVersions(mcpClientId);\n  }\n}\n","import type { FilesystemDB } from '../../filesystem-db';\nimport { FilesystemVersionedHelpers } from '../../filesystem-versioned';\nimport type {\n  StorageMCPServerType,\n  StorageCreateMCPServerInput,\n  StorageUpdateMCPServerInput,\n  StorageListMCPServersInput,\n  StorageListMCPServersOutput,\n} from '../../types';\nimport type {\n  MCPServerVersion,\n  CreateMCPServerVersionInput,\n  ListMCPServerVersionsInput,\n  ListMCPServerVersionsOutput,\n} from './base';\nimport { MCPServersStorage } from './base';\n\nexport class FilesystemMCPServersStorage extends MCPServersStorage {\n  private helpers: FilesystemVersionedHelpers<StorageMCPServerType, MCPServerVersion>;\n\n  constructor({ db }: { db: FilesystemDB }) {\n    super();\n    this.helpers = new FilesystemVersionedHelpers({\n      db,\n      entitiesFile: 'mcp-servers.json',\n      parentIdField: 'mcpServerId',\n      name: 'FilesystemMCPServersStorage',\n      versionMetadataFields: ['id', 'mcpServerId', 'versionNumber', 'changedFields', 'changeMessage', 'createdAt'],\n    });\n  }\n\n  override async init(): Promise<void> {\n    await this.helpers.db.init();\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.helpers.dangerouslyClearAll();\n  }\n\n  async getById(id: string): Promise<StorageMCPServerType | null> {\n    return this.helpers.getById(id);\n  }\n\n  async create(input: { mcpServer: StorageCreateMCPServerInput }): Promise<StorageMCPServerType> {\n    const { mcpServer } = input;\n    const now = new Date();\n    const entity: StorageMCPServerType = {\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\n    await this.helpers.createEntity(mcpServer.id, entity);\n\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: Object.keys(snapshotConfig),\n      changeMessage: 'Initial version',\n    } as CreateMCPServerVersionInput);\n\n    return structuredClone(entity);\n  }\n\n  async update(input: StorageUpdateMCPServerInput): Promise<StorageMCPServerType> {\n    const { id, ...updates } = input;\n    return this.helpers.updateEntity(id, updates);\n  }\n\n  async delete(id: string): Promise<void> {\n    await this.helpers.deleteEntity(id);\n  }\n\n  async list(args?: StorageListMCPServersInput): Promise<StorageListMCPServersOutput> {\n    const { page, perPage, orderBy, authorId, metadata, status } = args || {};\n    const result = await this.helpers.listEntities({\n      page,\n      perPage,\n      orderBy,\n      listKey: 'mcpServers',\n      filters: { authorId, metadata, status },\n    });\n    return result as unknown as StorageListMCPServersOutput;\n  }\n\n  async createVersion(input: CreateMCPServerVersionInput): Promise<MCPServerVersion> {\n    return this.helpers.createVersion(input as MCPServerVersion);\n  }\n\n  async getVersion(id: string): Promise<MCPServerVersion | null> {\n    return this.helpers.getVersion(id);\n  }\n\n  async getVersionByNumber(mcpServerId: string, versionNumber: number): Promise<MCPServerVersion | null> {\n    return this.helpers.getVersionByNumber(mcpServerId, versionNumber);\n  }\n\n  async getLatestVersion(mcpServerId: string): Promise<MCPServerVersion | null> {\n    return this.helpers.getLatestVersion(mcpServerId);\n  }\n\n  async listVersions(input: ListMCPServerVersionsInput): Promise<ListMCPServerVersionsOutput> {\n    const result = await this.helpers.listVersions(input, 'mcpServerId');\n    return result as ListMCPServerVersionsOutput;\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    await this.helpers.deleteVersion(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    await this.helpers.deleteVersionsByParentId(entityId);\n  }\n\n  async countVersions(mcpServerId: string): Promise<number> {\n    return this.helpers.countVersions(mcpServerId);\n  }\n}\n","import type { FilesystemDB } from '../../filesystem-db';\nimport { FilesystemVersionedHelpers } from '../../filesystem-versioned';\nimport type {\n  StoragePromptBlockType,\n  StorageCreatePromptBlockInput,\n  StorageUpdatePromptBlockInput,\n  StorageListPromptBlocksInput,\n  StorageListPromptBlocksOutput,\n} from '../../types';\nimport type {\n  PromptBlockVersion,\n  CreatePromptBlockVersionInput,\n  ListPromptBlockVersionsInput,\n  ListPromptBlockVersionsOutput,\n} from './base';\nimport { PromptBlocksStorage } from './base';\n\nexport class FilesystemPromptBlocksStorage extends PromptBlocksStorage {\n  private helpers: FilesystemVersionedHelpers<StoragePromptBlockType, PromptBlockVersion>;\n\n  constructor({ db }: { db: FilesystemDB }) {\n    super();\n    this.helpers = new FilesystemVersionedHelpers({\n      db,\n      entitiesFile: 'prompt-blocks.json',\n      parentIdField: 'blockId',\n      name: 'FilesystemPromptBlocksStorage',\n      versionMetadataFields: ['id', 'blockId', 'versionNumber', 'changedFields', 'changeMessage', 'createdAt'],\n    });\n  }\n\n  override async init(): Promise<void> {\n    await this.helpers.db.init();\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.helpers.dangerouslyClearAll();\n  }\n\n  async getById(id: string): Promise<StoragePromptBlockType | null> {\n    return this.helpers.getById(id);\n  }\n\n  async create(input: { promptBlock: StorageCreatePromptBlockInput }): Promise<StoragePromptBlockType> {\n    const { promptBlock } = input;\n    const now = new Date();\n    const entity: StoragePromptBlockType = {\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\n    await this.helpers.createEntity(promptBlock.id, entity);\n\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: Object.keys(snapshotConfig),\n      changeMessage: 'Initial version',\n    } as CreatePromptBlockVersionInput);\n\n    return structuredClone(entity);\n  }\n\n  async update(input: StorageUpdatePromptBlockInput): Promise<StoragePromptBlockType> {\n    const { id, ...updates } = input;\n    return this.helpers.updateEntity(id, updates);\n  }\n\n  async delete(id: string): Promise<void> {\n    await this.helpers.deleteEntity(id);\n  }\n\n  async list(args?: StorageListPromptBlocksInput): Promise<StorageListPromptBlocksOutput> {\n    const { page, perPage, orderBy, authorId, metadata, status } = args || {};\n    const result = await this.helpers.listEntities({\n      page,\n      perPage,\n      orderBy,\n      listKey: 'promptBlocks',\n      filters: { authorId, metadata, status },\n    });\n    return result as unknown as StorageListPromptBlocksOutput;\n  }\n\n  async createVersion(input: CreatePromptBlockVersionInput): Promise<PromptBlockVersion> {\n    return this.helpers.createVersion(input as PromptBlockVersion);\n  }\n\n  async getVersion(id: string): Promise<PromptBlockVersion | null> {\n    return this.helpers.getVersion(id);\n  }\n\n  async getVersionByNumber(blockId: string, versionNumber: number): Promise<PromptBlockVersion | null> {\n    return this.helpers.getVersionByNumber(blockId, versionNumber);\n  }\n\n  async getLatestVersion(blockId: string): Promise<PromptBlockVersion | null> {\n    return this.helpers.getLatestVersion(blockId);\n  }\n\n  async listVersions(input: ListPromptBlockVersionsInput): Promise<ListPromptBlockVersionsOutput> {\n    const result = await this.helpers.listVersions(input, 'blockId');\n    return result as ListPromptBlockVersionsOutput;\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    await this.helpers.deleteVersion(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    await this.helpers.deleteVersionsByParentId(entityId);\n  }\n\n  async countVersions(blockId: string): Promise<number> {\n    return this.helpers.countVersions(blockId);\n  }\n}\n","import type { FilesystemDB } from '../../filesystem-db';\nimport { FilesystemVersionedHelpers } from '../../filesystem-versioned';\nimport type {\n  StorageScorerDefinitionType,\n  StorageCreateScorerDefinitionInput,\n  StorageUpdateScorerDefinitionInput,\n  StorageListScorerDefinitionsInput,\n  StorageListScorerDefinitionsOutput,\n} from '../../types';\nimport type {\n  ScorerDefinitionVersion,\n  CreateScorerDefinitionVersionInput,\n  ListScorerDefinitionVersionsInput,\n  ListScorerDefinitionVersionsOutput,\n} from './base';\nimport { ScorerDefinitionsStorage } from './base';\n\nexport class FilesystemScorerDefinitionsStorage extends ScorerDefinitionsStorage {\n  private helpers: FilesystemVersionedHelpers<StorageScorerDefinitionType, ScorerDefinitionVersion>;\n\n  constructor({ db }: { db: FilesystemDB }) {\n    super();\n    this.helpers = new FilesystemVersionedHelpers({\n      db,\n      entitiesFile: 'scorer-definitions.json',\n      parentIdField: 'scorerDefinitionId',\n      name: 'FilesystemScorerDefinitionsStorage',\n      versionMetadataFields: [\n        'id',\n        'scorerDefinitionId',\n        'versionNumber',\n        'changedFields',\n        'changeMessage',\n        'createdAt',\n      ],\n    });\n  }\n\n  override async init(): Promise<void> {\n    await this.helpers.db.init();\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.helpers.dangerouslyClearAll();\n  }\n\n  async getById(id: string): Promise<StorageScorerDefinitionType | null> {\n    return this.helpers.getById(id);\n  }\n\n  async create(input: { scorerDefinition: StorageCreateScorerDefinitionInput }): Promise<StorageScorerDefinitionType> {\n    const { scorerDefinition } = input;\n    const now = new Date();\n    const entity: StorageScorerDefinitionType = {\n      id: scorerDefinition.id,\n      status: 'draft',\n      activeVersionId: undefined,\n      authorId: scorerDefinition.authorId,\n      metadata: scorerDefinition.metadata,\n      createdAt: now,\n      updatedAt: now,\n    };\n\n    await this.helpers.createEntity(scorerDefinition.id, entity);\n\n    const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = scorerDefinition;\n    const versionId = crypto.randomUUID();\n    await this.createVersion({\n      id: versionId,\n      scorerDefinitionId: scorerDefinition.id,\n      versionNumber: 1,\n      ...snapshotConfig,\n      changedFields: Object.keys(snapshotConfig),\n      changeMessage: 'Initial version',\n    } as CreateScorerDefinitionVersionInput);\n\n    return structuredClone(entity);\n  }\n\n  async update(input: StorageUpdateScorerDefinitionInput): Promise<StorageScorerDefinitionType> {\n    const { id, ...updates } = input;\n    return this.helpers.updateEntity(id, updates);\n  }\n\n  async delete(id: string): Promise<void> {\n    await this.helpers.deleteEntity(id);\n  }\n\n  async list(args?: StorageListScorerDefinitionsInput): Promise<StorageListScorerDefinitionsOutput> {\n    const { page, perPage, orderBy, authorId, metadata, status } = args || {};\n    const result = await this.helpers.listEntities({\n      page,\n      perPage,\n      orderBy,\n      listKey: 'scorerDefinitions',\n      filters: { authorId, metadata, status },\n    });\n    return result as unknown as StorageListScorerDefinitionsOutput;\n  }\n\n  async createVersion(input: CreateScorerDefinitionVersionInput): Promise<ScorerDefinitionVersion> {\n    return this.helpers.createVersion(input as ScorerDefinitionVersion);\n  }\n\n  async getVersion(id: string): Promise<ScorerDefinitionVersion | null> {\n    return this.helpers.getVersion(id);\n  }\n\n  async getVersionByNumber(scorerDefinitionId: string, versionNumber: number): Promise<ScorerDefinitionVersion | null> {\n    return this.helpers.getVersionByNumber(scorerDefinitionId, versionNumber);\n  }\n\n  async getLatestVersion(scorerDefinitionId: string): Promise<ScorerDefinitionVersion | null> {\n    return this.helpers.getLatestVersion(scorerDefinitionId);\n  }\n\n  async listVersions(input: ListScorerDefinitionVersionsInput): Promise<ListScorerDefinitionVersionsOutput> {\n    const result = await this.helpers.listVersions(input, 'scorerDefinitionId');\n    return result as ListScorerDefinitionVersionsOutput;\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    await this.helpers.deleteVersion(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    await this.helpers.deleteVersionsByParentId(entityId);\n  }\n\n  async countVersions(scorerDefinitionId: string): Promise<number> {\n    return this.helpers.countVersions(scorerDefinitionId);\n  }\n}\n","import type { FilesystemDB } from '../../filesystem-db';\nimport { FilesystemVersionedHelpers } from '../../filesystem-versioned';\nimport type {\n  StorageSkillType,\n  StorageCreateSkillInput,\n  StorageUpdateSkillInput,\n  StorageListSkillsInput,\n  StorageListSkillsOutput,\n} from '../../types';\nimport type { SkillVersion, CreateSkillVersionInput, ListSkillVersionsInput, ListSkillVersionsOutput } from './base';\nimport { SkillsStorage } from './base';\n\nexport class FilesystemSkillsStorage extends SkillsStorage {\n  private helpers: FilesystemVersionedHelpers<StorageSkillType, SkillVersion>;\n\n  constructor({ db }: { db: FilesystemDB }) {\n    super();\n    this.helpers = new FilesystemVersionedHelpers({\n      db,\n      entitiesFile: 'skills.json',\n      parentIdField: 'skillId',\n      name: 'FilesystemSkillsStorage',\n      versionMetadataFields: ['id', 'skillId', 'versionNumber', 'changedFields', 'changeMessage', 'createdAt'],\n    });\n  }\n\n  override async init(): Promise<void> {\n    await this.helpers.db.init();\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.helpers.dangerouslyClearAll();\n  }\n\n  async getById(id: string): Promise<StorageSkillType | null> {\n    return this.helpers.getById(id);\n  }\n\n  async create(input: { skill: StorageCreateSkillInput }): Promise<StorageSkillType> {\n    const { skill } = input;\n    const now = new Date();\n    const entity: StorageSkillType = {\n      id: skill.id,\n      status: 'draft',\n      activeVersionId: undefined,\n      authorId: skill.authorId,\n      createdAt: now,\n      updatedAt: now,\n    };\n\n    await this.helpers.createEntity(skill.id, entity);\n\n    // Skills don't have metadata on the thin record, so only exclude id and authorId\n    const { id: _id, authorId: _authorId, ...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: Object.keys(snapshotConfig),\n      changeMessage: 'Initial version',\n    });\n\n    return structuredClone(entity);\n  }\n\n  async update(input: StorageUpdateSkillInput): Promise<StorageSkillType> {\n    const { id, ...updates } = input;\n\n    const existing = await this.helpers.getById(id);\n    if (!existing) {\n      throw new Error(`FilesystemSkillsStorage: skill with id ${id} not found`);\n    }\n\n    const { authorId, activeVersionId, status, ...configFields } = updates;\n\n    // Config field names from StorageSkillSnapshotType\n    const configFieldNames = [\n      'name',\n      'description',\n      'instructions',\n      'license',\n      'compatibility',\n      'source',\n      'references',\n      'scripts',\n      'assets',\n      'metadata',\n      'tree',\n    ];\n\n    const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n    // Update metadata fields on the record\n    const updatedEntity: StorageSkillType = {\n      ...existing,\n      ...(authorId !== undefined && { authorId }),\n      ...(activeVersionId !== undefined && { activeVersionId }),\n      ...(status !== undefined && { status: status as StorageSkillType['status'] }),\n      updatedAt: new Date(),\n    };\n\n    // Auto-set status to 'published' when activeVersionId is set without explicit status\n    if (activeVersionId !== undefined && status === undefined) {\n      updatedEntity.status = 'published';\n    }\n\n    // If config fields are being updated, create a new version\n    if (hasConfigUpdate) {\n      const latestVersion = await this.getLatestVersion(id);\n      if (!latestVersion) {\n        throw new Error(`No versions found for skill ${id}`);\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 = {\n        ...latestConfig,\n        ...configFields,\n      };\n\n      const changedFields = configFieldNames.filter(\n        field =>\n          field in configFields &&\n          JSON.stringify(configFields[field as keyof typeof configFields]) !==\n            JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n      );\n\n      if (changedFields.length > 0) {\n        const newVersionId = crypto.randomUUID();\n        const newVersionNumber = latestVersion.versionNumber + 1;\n\n        await this.createVersion({\n          id: newVersionId,\n          skillId: id,\n          versionNumber: newVersionNumber,\n          ...newConfig,\n          changedFields,\n          changeMessage: `Updated ${changedFields.join(', ')}`,\n        });\n      }\n    }\n\n    // Build the entity-level updates for the helpers\n    const entityUpdates: Record<string, unknown> = {\n      ...(authorId !== undefined && { authorId }),\n      ...(activeVersionId !== undefined && { activeVersionId }),\n      ...(status !== undefined && { status }),\n    };\n    if (activeVersionId !== undefined && status === undefined) {\n      entityUpdates.status = 'published';\n    }\n    return await this.helpers.updateEntity(id, entityUpdates);\n  }\n\n  async delete(id: string): Promise<void> {\n    await this.helpers.deleteEntity(id);\n  }\n\n  async list(args?: StorageListSkillsInput): Promise<StorageListSkillsOutput> {\n    const { page, perPage, orderBy, authorId, metadata } = args || {};\n    const result = await this.helpers.listEntities({\n      page,\n      perPage,\n      orderBy,\n      listKey: 'skills',\n      filters: { authorId, metadata },\n    });\n    return result as unknown as StorageListSkillsOutput;\n  }\n\n  async createVersion(input: CreateSkillVersionInput): Promise<SkillVersion> {\n    return this.helpers.createVersion(input as SkillVersion);\n  }\n\n  async getVersion(id: string): Promise<SkillVersion | null> {\n    return this.helpers.getVersion(id);\n  }\n\n  async getVersionByNumber(skillId: string, versionNumber: number): Promise<SkillVersion | null> {\n    return this.helpers.getVersionByNumber(skillId, versionNumber);\n  }\n\n  async getLatestVersion(skillId: string): Promise<SkillVersion | null> {\n    return this.helpers.getLatestVersion(skillId);\n  }\n\n  async listVersions(input: ListSkillVersionsInput): Promise<ListSkillVersionsOutput> {\n    const result = await this.helpers.listVersions(input, 'skillId');\n    return result as ListSkillVersionsOutput;\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    await this.helpers.deleteVersion(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    await this.helpers.deleteVersionsByParentId(entityId);\n  }\n\n  async countVersions(skillId: string): Promise<number> {\n    return this.helpers.countVersions(skillId);\n  }\n}\n","import type { FilesystemDB } from '../../filesystem-db';\nimport { FilesystemVersionedHelpers } from '../../filesystem-versioned';\nimport type {\n  StorageWorkspaceType,\n  StorageCreateWorkspaceInput,\n  StorageUpdateWorkspaceInput,\n  StorageListWorkspacesInput,\n  StorageListWorkspacesOutput,\n} from '../../types';\nimport type {\n  WorkspaceVersion,\n  CreateWorkspaceVersionInput,\n  ListWorkspaceVersionsInput,\n  ListWorkspaceVersionsOutput,\n} from './base';\nimport { WorkspacesStorage } from './base';\n\nexport class FilesystemWorkspacesStorage extends WorkspacesStorage {\n  private helpers: FilesystemVersionedHelpers<StorageWorkspaceType, WorkspaceVersion>;\n\n  constructor({ db }: { db: FilesystemDB }) {\n    super();\n    this.helpers = new FilesystemVersionedHelpers({\n      db,\n      entitiesFile: 'workspaces.json',\n      parentIdField: 'workspaceId',\n      name: 'FilesystemWorkspacesStorage',\n      versionMetadataFields: ['id', 'workspaceId', 'versionNumber', 'changedFields', 'changeMessage', 'createdAt'],\n    });\n  }\n\n  override async init(): Promise<void> {\n    await this.helpers.db.init();\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.helpers.dangerouslyClearAll();\n  }\n\n  async getById(id: string): Promise<StorageWorkspaceType | null> {\n    return this.helpers.getById(id);\n  }\n\n  async create(input: { workspace: StorageCreateWorkspaceInput }): Promise<StorageWorkspaceType> {\n    const { workspace } = input;\n    const now = new Date();\n    const entity: StorageWorkspaceType = {\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\n    await this.helpers.createEntity(workspace.id, entity);\n\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: Object.keys(snapshotConfig),\n      changeMessage: 'Initial version',\n    } as CreateWorkspaceVersionInput);\n\n    return structuredClone(entity);\n  }\n\n  async update(input: StorageUpdateWorkspaceInput): Promise<StorageWorkspaceType> {\n    const { id, ...updates } = input;\n    return this.helpers.updateEntity(id, updates);\n  }\n\n  async delete(id: string): Promise<void> {\n    await this.helpers.deleteEntity(id);\n  }\n\n  async list(args?: StorageListWorkspacesInput): Promise<StorageListWorkspacesOutput> {\n    const { page, perPage, orderBy, authorId, metadata } = args || {};\n    const result = await this.helpers.listEntities({\n      page,\n      perPage,\n      orderBy,\n      listKey: 'workspaces',\n      filters: { authorId, metadata },\n    });\n    return result as unknown as StorageListWorkspacesOutput;\n  }\n\n  async createVersion(input: CreateWorkspaceVersionInput): Promise<WorkspaceVersion> {\n    return this.helpers.createVersion(input as WorkspaceVersion);\n  }\n\n  async getVersion(id: string): Promise<WorkspaceVersion | null> {\n    return this.helpers.getVersion(id);\n  }\n\n  async getVersionByNumber(workspaceId: string, versionNumber: number): Promise<WorkspaceVersion | null> {\n    return this.helpers.getVersionByNumber(workspaceId, versionNumber);\n  }\n\n  async getLatestVersion(workspaceId: string): Promise<WorkspaceVersion | null> {\n    return this.helpers.getLatestVersion(workspaceId);\n  }\n\n  async listVersions(input: ListWorkspaceVersionsInput): Promise<ListWorkspaceVersionsOutput> {\n    const result = await this.helpers.listVersions(input, 'workspaceId');\n    return result as ListWorkspaceVersionsOutput;\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    await this.helpers.deleteVersion(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    await this.helpers.deleteVersionsByParentId(entityId);\n  }\n\n  async countVersions(workspaceId: string): Promise<number> {\n    return this.helpers.countVersions(workspaceId);\n  }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, readdirSync, statSync, rmSync } from 'node:fs';\nimport { join, dirname, relative, resolve, sep } from 'node:path';\n\n/**\n * FilesystemDB is a thin I/O layer for filesystem-based storage.\n * It manages reading/writing JSON files in a directory, similar to how\n * InMemoryDB holds Maps for in-memory storage.\n *\n * Each editor domain gets its own JSON file (e.g., `agents.json`, `prompt-blocks.json`).\n * Skills use a real file tree under `skills/` instead of JSON.\n */\nexport class FilesystemDB {\n  readonly dir: string;\n\n  /** In-memory cache of parsed domain data, keyed by filename */\n  private cache = new Map<string, Record<string, unknown>>();\n\n  private initialized = false;\n\n  constructor(dir: string) {\n    this.dir = dir;\n  }\n\n  /**\n   * Initialize the storage directory. Called once; subsequent calls are no-ops.\n   */\n  async init(): Promise<void> {\n    if (this.initialized) return;\n    this.ensureDir();\n    this.initialized = true;\n  }\n\n  /**\n   * Ensure the storage directory and skills subdirectory exist.\n   */\n  ensureDir(): void {\n    if (!existsSync(this.dir)) {\n      mkdirSync(this.dir, { recursive: true });\n    }\n    const skillsDir = join(this.dir, 'skills');\n    if (!existsSync(skillsDir)) {\n      mkdirSync(skillsDir, { recursive: true });\n    }\n  }\n\n  // ==========================================================================\n  // Domain-level JSON operations\n  // ==========================================================================\n\n  /**\n   * Read a domain JSON file and return its entity map.\n   * Uses in-memory cache; reads from disk on first access.\n   */\n  readDomain<T = Record<string, unknown>>(filename: string): Record<string, T> {\n    if (this.cache.has(filename)) {\n      return this.cache.get(filename) as Record<string, T>;\n    }\n\n    const filePath = join(this.dir, filename);\n    let data: Record<string, T> = {};\n\n    if (existsSync(filePath)) {\n      try {\n        const raw = readFileSync(filePath, 'utf-8');\n        data = JSON.parse(raw, dateReviver) as Record<string, T>;\n      } catch {\n        // If the file is corrupted, start fresh\n        data = {};\n      }\n    }\n\n    this.cache.set(filename, data as Record<string, unknown>);\n    return data;\n  }\n\n  /**\n   * Write a domain's full entity map to its JSON file.\n   * Uses atomic write (write to .tmp, then rename) to prevent corruption.\n   */\n  writeDomain<T = Record<string, unknown>>(filename: string, data: Record<string, T>): void {\n    this.cache.set(filename, data as Record<string, unknown>);\n\n    const filePath = join(this.dir, filename);\n    const tmpPath = filePath + '.tmp';\n\n    // Ensure parent directory exists\n    const parentDir = dirname(filePath);\n    if (!existsSync(parentDir)) {\n      mkdirSync(parentDir, { recursive: true });\n    }\n\n    writeFileSync(tmpPath, JSON.stringify(data, null, 2), 'utf-8');\n    renameSync(tmpPath, filePath);\n  }\n\n  /**\n   * Clear all data from a domain JSON file.\n   */\n  clearDomain(filename: string): void {\n    this.writeDomain(filename, {});\n  }\n\n  /**\n   * Invalidate the in-memory cache for a domain, forcing a re-read from disk on next access.\n   */\n  invalidateCache(filename?: string): void {\n    if (filename) {\n      this.cache.delete(filename);\n    } else {\n      this.cache.clear();\n    }\n  }\n\n  // ==========================================================================\n  // Entity-level convenience methods (used by FilesystemVersionedHelpers)\n  // ==========================================================================\n\n  /**\n   * Get a single entity by ID from a domain JSON file.\n   */\n  get<T>(filename: string, id: string): T | null {\n    const data = this.readDomain<T>(filename);\n    return data[id] ?? null;\n  }\n\n  /**\n   * Get all entities from a domain JSON file as an array.\n   */\n  getAll<T>(filename: string): T[] {\n    const data = this.readDomain<T>(filename);\n    return Object.values(data);\n  }\n\n  /**\n   * Set (create or update) an entity in a domain JSON file.\n   */\n  set<T>(filename: string, id: string, entity: T): void {\n    const data = this.readDomain<T>(filename);\n    data[id] = entity;\n    this.writeDomain(filename, data);\n  }\n\n  /**\n   * Remove an entity by ID from a domain JSON file. No-op if not found.\n   */\n  remove(filename: string, id: string): void {\n    const data = this.readDomain(filename);\n    if (id in data) {\n      delete data[id];\n      this.writeDomain(filename, data);\n    }\n  }\n\n  // =========================================================================\n  // Skills directory operations (real file tree, not JSON)\n  // =========================================================================\n\n  /**\n   * Get the path to a skill's directory.\n   */\n  skillDir(skillName: string): string {\n    const skillsBase = join(this.dir, 'skills');\n    const dir = resolve(skillsBase, skillName);\n    if (!dir.startsWith(skillsBase + sep) && dir !== skillsBase) {\n      throw new Error(`Path traversal detected: skill name \"${skillName}\" escapes skills directory`);\n    }\n    return dir;\n  }\n\n  /**\n   * Resolve a file path within a skill directory, throwing if it escapes.\n   */\n  private safeSkillPath(skillName: string, relativePath: string): string {\n    const base = this.skillDir(skillName);\n    const resolved = resolve(base, relativePath);\n    if (!resolved.startsWith(base + sep) && resolved !== base) {\n      throw new Error(`Path traversal detected: \"${relativePath}\" escapes skill directory`);\n    }\n    return resolved;\n  }\n\n  /**\n   * List all files in a skill's directory, returning relative paths.\n   */\n  listSkillFiles(skillName: string): string[] {\n    const dir = this.skillDir(skillName);\n    if (!existsSync(dir)) return [];\n    return walkDir(dir).map(abs => relative(dir, abs).split(sep).join('/'));\n  }\n\n  /**\n   * Read a file from a skill's directory.\n   */\n  readSkillFile(skillName: string, relativePath: string): Buffer | null {\n    const filePath = this.safeSkillPath(skillName, relativePath);\n    if (!existsSync(filePath)) return null;\n    try {\n      return readFileSync(filePath);\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Write a file to a skill's directory.\n   */\n  writeSkillFile(skillName: string, relativePath: string, content: Buffer | string): void {\n    const filePath = this.safeSkillPath(skillName, relativePath);\n    const parentDir = dirname(filePath);\n    if (!existsSync(parentDir)) {\n      mkdirSync(parentDir, { recursive: true });\n    }\n    writeFileSync(filePath, content);\n  }\n\n  /**\n   * Delete a skill's entire directory.\n   */\n  deleteSkillDir(skillName: string): void {\n    const dir = this.skillDir(skillName);\n    if (existsSync(dir)) {\n      rmSync(dir, { recursive: true, force: true });\n    }\n  }\n}\n\n/**\n * JSON reviver that converts ISO date strings back to Date objects.\n */\nfunction dateReviver(_key: string, value: unknown): unknown {\n  if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(value)) {\n    const d = new Date(value);\n    if (!isNaN(d.getTime())) return d;\n  }\n  return value;\n}\n\n/**\n * Recursively walk a directory and return all file paths.\n */\nfunction walkDir(dir: string): string[] {\n  const results: string[] = [];\n  for (const entry of readdirSync(dir)) {\n    const fullPath = join(dir, entry);\n    const stat = statSync(fullPath);\n    if (stat.isDirectory()) {\n      results.push(...walkDir(fullPath));\n    } else {\n      results.push(fullPath);\n    }\n  }\n  return results;\n}\n","import { resolve } from 'node:path';\n\nimport { MastraCompositeStore } from './base';\nimport type { StorageDomains } from './base';\nimport { FilesystemAgentsStorage } from './domains/agents/filesystem';\nimport { FilesystemMCPClientsStorage } from './domains/mcp-clients/filesystem';\nimport { FilesystemMCPServersStorage } from './domains/mcp-servers/filesystem';\nimport { FilesystemPromptBlocksStorage } from './domains/prompt-blocks/filesystem';\nimport { FilesystemScorerDefinitionsStorage } from './domains/scorer-definitions/filesystem';\nimport { FilesystemSkillsStorage } from './domains/skills/filesystem';\nimport { FilesystemWorkspacesStorage } from './domains/workspaces/filesystem';\nimport { FilesystemDB } from './filesystem-db';\n\nexport interface FilesystemStoreConfig {\n  /**\n   * Directory to store JSON files in.\n   * Defaults to `.mastra-storage/` relative to `process.cwd()`.\n   */\n  dir?: string;\n}\n\n/**\n * Filesystem-based storage adapter for the Mastra Editor.\n *\n * Stores editor primitives (agents, prompt blocks, scorer definitions,\n * MCP clients, MCP servers, workspaces, skills) as JSON files on disk.\n * This enables Git-based version tracking instead of database-based versioning.\n *\n * Only implements the 7 editor domains — other domains (memory, workflows, scores,\n * observability, datasets, experiments, blobs) are left undefined and should be\n * provided by a separate store via the `editor` shorthand on `MastraCompositeStore`.\n *\n * @example\n * ```typescript\n * import { FilesystemStore, MastraCompositeStore } from '@mastra/core/storage';\n *\n * const storage = new MastraCompositeStore({\n *   id: 'my-storage',\n *   default: postgresStore,\n *   editor: new FilesystemStore({ dir: '.mastra-storage' }),\n * });\n * ```\n */\nexport class FilesystemStore extends MastraCompositeStore {\n  #db: FilesystemDB;\n  #dir: string;\n\n  constructor(config: FilesystemStoreConfig = {}) {\n    const dir = resolve(config.dir ?? '.mastra-storage');\n\n    super({ id: 'filesystem', name: 'FilesystemStore' });\n\n    this.#dir = dir;\n    this.#db = new FilesystemDB(dir);\n\n    // Only editor domains are provided; other domains (workflows, scores, memory, etc.)\n    // should come from a default store when using the `editor` shorthand on MastraCompositeStore.\n    this.stores = {\n      agents: new FilesystemAgentsStorage({ db: this.#db }),\n      promptBlocks: new FilesystemPromptBlocksStorage({ db: this.#db }),\n      scorerDefinitions: new FilesystemScorerDefinitionsStorage({ db: this.#db }),\n      mcpClients: new FilesystemMCPClientsStorage({ db: this.#db }),\n      mcpServers: new FilesystemMCPServersStorage({ db: this.#db }),\n      workspaces: new FilesystemWorkspacesStorage({ db: this.#db }),\n      skills: new FilesystemSkillsStorage({ db: this.#db }),\n    } as unknown as StorageDomains;\n  }\n\n  /**\n   * The absolute path to the storage directory.\n   */\n  get dir(): string {\n    return this.#dir;\n  }\n}\n","import { MastraBase } from '../../../base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport type { TABLE_NAMES } from '../../constants';\nimport type { StorageColumn, CreateIndexOptions, IndexInfo, StorageIndexStats } from '../../types';\n\nexport abstract class StoreOperations extends MastraBase {\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'OPERATIONS',\n    });\n  }\n\n  abstract hasColumn(table: string, column: string): Promise<boolean>;\n\n  protected getSqlType(type: StorageColumn['type']): string {\n    switch (type) {\n      case 'text':\n        return 'TEXT';\n      case 'timestamp':\n        return 'TIMESTAMP';\n      case 'float':\n        return 'FLOAT';\n      case 'integer':\n        return 'INTEGER';\n      case 'bigint':\n        return 'BIGINT';\n      case 'jsonb':\n        return 'JSONB';\n      default:\n        return 'TEXT';\n    }\n  }\n\n  protected getDefaultValue(type: StorageColumn['type']): string {\n    switch (type) {\n      case 'text':\n      case 'uuid':\n        return \"DEFAULT ''\";\n      case 'timestamp':\n        return \"DEFAULT '1970-01-01 00:00:00'\";\n      case 'integer':\n      case 'bigint':\n      case 'float':\n        return 'DEFAULT 0';\n      case 'jsonb':\n        return \"DEFAULT '{}'\";\n      default:\n        return \"DEFAULT ''\";\n    }\n  }\n\n  abstract createTable({ tableName }: { tableName: TABLE_NAMES; schema: Record<string, StorageColumn> }): Promise<void>;\n\n  abstract clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void>;\n\n  abstract dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void>;\n\n  abstract alterTable(args: {\n    tableName: TABLE_NAMES;\n    schema: Record<string, StorageColumn>;\n    ifNotExists: string[];\n  }): Promise<void>;\n\n  abstract insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void>;\n\n  abstract batchInsert({\n    tableName,\n    records,\n  }: {\n    tableName: TABLE_NAMES;\n    records: Record<string, any>[];\n  }): Promise<void>;\n\n  abstract load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<R | null>;\n\n  /**\n   * DATABASE INDEX MANAGEMENT\n   * Optional methods for database index management.\n   * Storage adapters can override these to provide index management capabilities.\n   */\n\n  /**\n   * Creates a database index on specified columns\n   * @throws {MastraError} if not supported by the storage adapter\n   */\n  async createIndex(_options: CreateIndexOptions): Promise<void> {\n    throw new MastraError({\n      id: 'MASTRA_STORAGE_CREATE_INDEX_NOT_SUPPORTED',\n      domain: ErrorDomain.STORAGE,\n      category: ErrorCategory.SYSTEM,\n      text: `Index management is not supported by this storage adapter`,\n    });\n  }\n\n  /**\n   * Drops a database index by name\n   * @throws {MastraError} if not supported by the storage adapter\n   */\n  async dropIndex(_indexName: string): Promise<void> {\n    throw new MastraError({\n      id: 'MASTRA_STORAGE_DROP_INDEX_NOT_SUPPORTED',\n      domain: ErrorDomain.STORAGE,\n      category: ErrorCategory.SYSTEM,\n      text: `Index management is not supported by this storage adapter`,\n    });\n  }\n\n  /**\n   * Lists database indexes for a table or all tables\n   * @throws {MastraError} if not supported by the storage adapter\n   */\n  async listIndexes(_tableName?: string): Promise<IndexInfo[]> {\n    throw new MastraError({\n      id: 'MASTRA_STORAGE_LIST_INDEXES_NOT_SUPPORTED',\n      domain: ErrorDomain.STORAGE,\n      category: ErrorCategory.SYSTEM,\n      text: `Index management is not supported by this storage adapter`,\n    });\n  }\n\n  /**\n   * Gets detailed statistics for a specific index\n   * @throws {MastraError} if not supported by the storage adapter\n   */\n  async describeIndex(_indexName: string): Promise<StorageIndexStats> {\n    throw new MastraError({\n      id: 'MASTRA_STORAGE_DESCRIBE_INDEX_NOT_SUPPORTED',\n      domain: ErrorDomain.STORAGE,\n      category: ErrorCategory.SYSTEM,\n      text: `Index management is not supported by this storage adapter`,\n    });\n  }\n\n  /**\n   * Returns definitions for automatic performance indexes\n   * Storage adapters can override this to define indexes that should be created during initialization\n   * @returns Array of index definitions to create automatically\n   */\n  protected getAutomaticIndexDefinitions(): CreateIndexOptions[] {\n    return [];\n  }\n}\n","import { TABLE_WORKFLOW_SNAPSHOT } from '../../constants';\nimport type { TABLE_NAMES, TABLE_OBSERVATIONAL_MEMORY } from '../../constants';\nimport type { StorageColumn } from '../../types';\nimport { StoreOperations } from './base';\n\n// InMemory storage supports all tables including observational memory\ntype InMemoryTableNames = TABLE_NAMES | typeof TABLE_OBSERVATIONAL_MEMORY;\n\nexport class StoreOperationsInMemory extends StoreOperations {\n  data: Record<InMemoryTableNames, Map<string, Record<string, any>>>;\n\n  constructor() {\n    super();\n    this.data = {\n      mastra_workflow_snapshot: new Map(),\n      mastra_messages: new Map(),\n      mastra_threads: new Map(),\n      mastra_traces: new Map(),\n      mastra_resources: new Map(),\n      mastra_scorers: new Map(),\n      mastra_ai_spans: new Map(),\n      mastra_agents: new Map(),\n      mastra_agent_versions: new Map(),\n      mastra_observational_memory: new Map(),\n      mastra_prompt_blocks: new Map(),\n      mastra_prompt_block_versions: new Map(),\n      mastra_scorer_definitions: new Map(),\n      mastra_scorer_definition_versions: new Map(),\n      mastra_mcp_clients: new Map(),\n      mastra_mcp_client_versions: new Map(),\n      mastra_mcp_servers: new Map(),\n      mastra_mcp_server_versions: new Map(),\n      mastra_workspaces: new Map(),\n      mastra_workspace_versions: new Map(),\n      mastra_skills: new Map(),\n      mastra_skill_versions: new Map(),\n      mastra_skill_blobs: new Map(),\n      mastra_datasets: new Map(),\n      mastra_dataset_items: new Map(),\n      mastra_dataset_versions: new Map(),\n      mastra_experiments: new Map(),\n      mastra_experiment_results: new Map(),\n    };\n  }\n\n  getDatabase() {\n    return this.data;\n  }\n\n  async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n    const table = this.data[tableName];\n    let key = record.id;\n    if ([TABLE_WORKFLOW_SNAPSHOT].includes(tableName) && !record.id && record.run_id) {\n      key = record.workflow_name ? `${record.workflow_name}-${record.run_id}` : record.run_id;\n      record.id = key;\n    } else if (!record.id) {\n      key = `auto-${Date.now()}-${Math.random()}`;\n      record.id = key;\n    }\n    table.set(key, record);\n  }\n\n  async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n    const table = this.data[tableName];\n    for (const record of records) {\n      let key = record.id;\n      if ([TABLE_WORKFLOW_SNAPSHOT].includes(tableName) && !record.id && record.run_id) {\n        key = record.run_id;\n        record.id = key;\n      } else if (!record.id) {\n        key = `auto-${Date.now()}-${Math.random()}`;\n        record.id = key;\n      }\n      table.set(key, record);\n    }\n  }\n\n  async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n    const table = this.data[tableName];\n\n    const records = Array.from(table.values());\n\n    return records.filter(record => Object.keys(keys).every(key => record[key] === keys[key]))?.[0] as R | null;\n  }\n\n  async createTable({\n    tableName,\n    schema: _schema,\n  }: {\n    tableName: TABLE_NAMES;\n    schema: Record<string, StorageColumn>;\n  }): Promise<void> {\n    this.data[tableName] = new Map();\n  }\n\n  async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n    this.data[tableName].clear();\n  }\n\n  async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n    this.data[tableName].clear();\n  }\n\n  async alterTable({\n    tableName: _tableName,\n    schema: _schema,\n  }: {\n    tableName: TABLE_NAMES;\n    schema: Record<string, StorageColumn>;\n    ifNotExists: string[];\n  }): Promise<void> {}\n\n  async hasColumn(_table: string, _column: string): Promise<boolean> {\n    return true;\n  }\n}\n"]}