{"version":3,"sources":["../src/storage/base.ts","../src/storage/domains/base.ts","../src/storage/domains/versioned.ts","../src/storage/git-history.ts","../src/storage/filesystem-versioned.ts"],"names":["MastraBase","realpathSync","relative","execFile"],"mappings":"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","file":"chunk-3VBF5IP7.cjs","sourcesContent":["import { MastraBase } from '../base';\n\nimport type {\n  AgentsStorage,\n  PromptBlocksStorage,\n  ScorerDefinitionsStorage,\n  MCPClientsStorage,\n  MCPServersStorage,\n  WorkspacesStorage,\n  SkillsStorage,\n  FavoritesStorage,\n  ScoresStorage,\n  WorkflowsStorage,\n  MemoryStorage,\n  ObservabilityStorage,\n  BlobStore,\n  DatasetsStorage,\n  ExperimentsStorage,\n  BackgroundTasksStorage,\n  SchedulesStorage,\n  ChannelsStorage,\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  channels?: ChannelsStorage;\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  favorites?: FavoritesStorage;\n  blobs?: BlobStore;\n  backgroundTasks?: BackgroundTasksStorage;\n  schedules?: SchedulesStorage;\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  'favorites',\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  /**\n   * Retained references to the parent stores supplied via composition. `init()`\n   * delegates to these so the parent's own `init()` logic (pragmas, ordered\n   * DDL, init coalescing, etc.) runs instead of being bypassed by the\n   * composite iterating the inner domains in parallel — which was the cause\n   * of the SQLITE_BUSY / \"no such table\" races reported in issue #16782.\n   */\n  protected parentDefault?: MastraCompositeStore;\n  protected parentEditor?: MastraCompositeStore;\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      // Retain the parent store refs so init() can delegate to their own\n      // init() — see field doc above and init() below.\n      this.parentDefault = config.default;\n      this.parentEditor = config.editor;\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        favorites: resolve('favorites'),\n        blobs: resolve('blobs'),\n        backgroundTasks: resolve('backgroundTasks'),\n        schedules: resolve('schedules'),\n        channels: resolve('channels'),\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   *\n   * When a parent store was supplied via `default` or `editor`, delegate to\n   * its own `init()` first. Each adapter owns its `init()` contract — it may\n   * apply connection-level setup, run migrations, enforce DDL ordering, or\n   * coalesce concurrent callers. Calling each domain's `init()` directly\n   * against the parent's shared client would bypass all of that and can\n   * corrupt or partially create schema (see issue #16782 for the SQLite\n   * symptom).\n   *\n   * Any remaining domains that did NOT come from a parent (e.g. supplied via\n   * the explicit `domains` override pointing at a different store) are then\n   * initialized individually — but only the ones the parents didn't already\n   * cover, so we never double-init the same domain instance.\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    this.hasInitialized = this.#runInit();\n    await this.hasInitialized;\n  }\n\n  async #runInit(): Promise<boolean> {\n    // 1. Delegate to parent stores. Each parent owns its own init contract\n    //    (setup, migrations, sequencing, coalescing). Dedupe by identity so\n    //    a store passed as both `default` and `editor` only gets init()'d once.\n    const uniqueParents = new Set<MastraCompositeStore>();\n    if (this.parentDefault) uniqueParents.add(this.parentDefault);\n    if (this.parentEditor) uniqueParents.add(this.parentEditor);\n    await Promise.all([...uniqueParents].map(parent => parent.init()));\n\n    // 2. Build a set of domain instances the parents already initialized so\n    //    we don't init them a second time below.\n    const alreadyInitialized = new Set<unknown>();\n    const addParentDomains = (parent?: MastraCompositeStore) => {\n      if (!parent?.stores) return;\n      for (const domain of Object.values(parent.stores)) {\n        if (domain) alreadyInitialized.add(domain);\n      }\n    };\n    addParentDomains(this.parentDefault);\n    addParentDomains(this.parentEditor);\n\n    // 3. Init any remaining domains (typically those provided via the\n    //    explicit `domains` override pointing at a different store, or those\n    //    set directly by a subclass).\n    const initTasks: Promise<void>[] = [];\n    const maybeInit = (domain: { init(): Promise<void> } | undefined) => {\n      if (!domain || alreadyInitialized.has(domain)) return;\n      initTasks.push(domain.init());\n      alreadyInitialized.add(domain);\n    };\n\n    if (this.stores) {\n      maybeInit(this.stores.memory);\n      maybeInit(this.stores.workflows);\n      maybeInit(this.stores.scores);\n      maybeInit(this.stores.observability);\n      maybeInit(this.stores.agents);\n      maybeInit(this.stores.datasets);\n      maybeInit(this.stores.experiments);\n      maybeInit(this.stores.promptBlocks);\n      maybeInit(this.stores.scorerDefinitions);\n      maybeInit(this.stores.mcpClients);\n      maybeInit(this.stores.mcpServers);\n      maybeInit(this.stores.workspaces);\n      maybeInit(this.stores.skills);\n      maybeInit(this.stores.favorites);\n      maybeInit(this.stores.blobs);\n      maybeInit(this.stores.backgroundTasks);\n      maybeInit(this.stores.schedules);\n      maybeInit(this.stores.channels);\n    }\n\n    await Promise.all(initTasks);\n    return true;\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 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 { 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"]}