{"version":3,"sources":["../../../src/adapters/react/hooks/useQuery.ts","../../../src/config/CollectionModeConfig.ts","../../../src/adapters/remote/d1Client.ts","../../../src/adapters/react/CollectionModeContext.tsx","../../../src/adapters/react/hooks/useLocalCollectionQuery.ts","../../../src/adapters/remote/queryKeys.ts","../../../src/adapters/react/hooks/useRemoteQuery.ts","../../../src/adapters/react/hooks/useCollectionQuery.ts","../../../src/adapters/react/hooks/useMutation.ts","../../../src/adapters/react/hooks/createCollectionHooks.ts","../../../src/utils/id.ts","../../../src/core/VirtualCollectionAdapter.ts","../../../src/core/EncryptedCollectionAdapter.ts","../../../src/core/SchemaRegistry.ts","../../../src/adapters/react/hooks/useLocalRecords.ts","../../../src/adapters/react/hooks/useRemoteMutation.ts","../../../src/adapters/react/hooks/useRecords.ts","../../../src/adapters/react/hooks/useLocalAnyCollection.ts","../../../src/adapters/react/hooks/useAnyCollection.ts"],"names":["useState","useEffect","createContext","useMemo","jsx","QueryClientProvider","useContext","useTanstackQuery","useCallback","nanoid","decryptFields","encryptFields","useRef","useTanstackMutation","registryCache","getOrCreateRegistry","EMPTY_DATA"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\nimport { useEffect, useState } from 'react'\nimport type { QueryOperator } from '../../../core/operators/QueryOperator'\nimport type { QueryResult } from '../../../core/operators/types'\n\n/** Stable empty result for null operators — avoids allocating per render */\nconst EMPTY_RESULT: QueryResult<never> = { data: [], isLoading: false, error: null }\n\n/** Stable loading result for operator transitions — avoids allocating per render */\nconst LOADING_RESULT: QueryResult<never> = { data: [], isLoading: true, error: null }\n\n/**\n * React hook for framework-agnostic QueryOperator\n *\n * Subscribes to a QueryOperator's observable and manages state with React hooks.\n * Handles null operators gracefully and cleans up subscriptions on unmount.\n *\n * @param queryOperator - QueryOperator instance or null\n * @returns QueryResult with data, isLoading, and error\n *\n * @example\n * ```tsx\n * function TaskList() {\n *   const db = useDatabase();\n *   const queryOperator = useMemo(() => {\n *     if (!db) return null;\n *     const taskOps = new TaskOperator(db);\n *     return taskOps.query({ orgId: 'org_123', status: 'in_progress' });\n *   }, [db]);\n *\n *   const result = useQuery(queryOperator);\n *\n *   if (result.isLoading) return <div>Loading...</div>;\n *   if (result.error) return <div>Error: {result.error.message}</div>;\n *\n *   return (\n *     <ul>\n *       {result.data.map(task => (\n *         <li key={task.id}>{task.title}</li>\n *       ))}\n *     </ul>\n *   );\n * }\n * ```\n */\nexport function useQuery<T>(queryOperator: QueryOperator<T> | null): QueryResult<T> {\n  // Bundle the result together with the operator that produced it so we can\n  // detect operator transitions purely from React state (no refs needed).\n  const [state, setState] = useState<{\n    result: QueryResult<T>\n    operator: QueryOperator<T> | null\n  }>({\n    result: { data: [], isLoading: true, error: null },\n    operator: null,\n  })\n\n  useEffect(() => {\n    if (!queryOperator) {\n      return\n    }\n\n    // Subscribe to operator's observable — setState only in callbacks\n    const subscription = queryOperator.observable.subscribe({\n      next: result => setState({ result, operator: queryOperator }),\n      error: error =>\n        setState({\n          result: { data: [], isLoading: false, error },\n          operator: queryOperator,\n        }),\n    })\n\n    // Cleanup subscription on unmount or when operator changes\n    return () => {\n      subscription.unsubscribe()\n      queryOperator.destroy()\n    }\n  }, [queryOperator])\n\n  // Null operator: no data, not loading\n  if (!queryOperator) {\n    return EMPTY_RESULT as QueryResult<T>\n  }\n\n  // Operator changed but subscription hasn't emitted yet: show loading.\n  // This prevents stale { data: oldResults, isLoading: false } from being\n  // visible between cleanup and the new subscription's first emission,\n  // which would cause consumers like OrgWorkspaceContext to prematurely\n  // mark restore as attempted.\n  if (state.operator !== queryOperator) {\n    return LOADING_RESULT as QueryResult<T>\n  }\n\n  return state.result\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Collection storage mode configuration.\n *\n * Determines whether each collection is served from local RxDB (IndexedDB)\n * or remote D1 REST API. Community tier routes 19 collections to remote;\n * premium tier keeps all 32 local.\n */\n\nexport type CollectionMode = 'local' | 'remote'\n\nexport interface CollectionModeConfig {\n  /** Base URL for D1 REST API (remote collections) */\n  apiBaseUrl: string\n  /** Auth token getter for remote requests */\n  getAuthToken: () => Promise<string>\n  /** Default mode when collection not explicitly listed */\n  defaultMode: CollectionMode\n  /** Per-collection mode overrides */\n  collections: Record<string, CollectionMode>\n  /** react-query defaults for remote collections */\n  remoteDefaults?: {\n    staleTime?: number // default: 30_000 (30s)\n    refetchInterval?: number // default: false (manual)\n    gcTime?: number // default: 300_000 (5min)\n  }\n}\n\n/**\n * Resolve the storage mode for a given collection.\n *\n * Checks explicit per-collection overrides first, then falls back to defaultMode.\n */\nexport function getCollectionMode(\n  config: CollectionModeConfig,\n  name: string,\n): CollectionMode {\n  return config.collections[name] ?? config.defaultMode\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * D1 REST API client for remote collection access.\n *\n * Provides typed query/get/set methods matching the D1 REST endpoint\n * conventions. Used by remote hooks to fetch and mutate collection data\n * when a collection is in 'remote' mode (community tier).\n */\n\nimport type { CollectionModeConfig } from '../../config/CollectionModeConfig'\n\nexport interface D1QueryParams {\n  selector?: Record<string, unknown>\n  sort?: Array<Record<string, 'asc' | 'desc'>>\n  limit?: number\n  skip?: number\n}\n\nexport class D1Client {\n  constructor(private readonly config: CollectionModeConfig) {}\n\n  async query<T = Record<string, unknown>>(\n    collection: string,\n    params: D1QueryParams = {},\n  ): Promise<T[]> {\n    const res = await this.fetch(`/${collection}-rest/v1/query`, {\n      method: 'POST',\n      body: JSON.stringify(params),\n    })\n    const json = await res.json()\n    return (json as { results?: T[] }).results ?? []\n  }\n\n  async get<T = Record<string, unknown>>(\n    collection: string,\n    ids: string[],\n  ): Promise<T[]> {\n    const res = await this.fetch(`/${collection}-rest/v1/get`, {\n      method: 'POST',\n      body: JSON.stringify({ ids }),\n    })\n    const json = await res.json()\n    return (json as { results?: T[] }).results ?? []\n  }\n\n  async set<T = Record<string, unknown>>(\n    collection: string,\n    doc: Partial<T>,\n  ): Promise<T> {\n    const res = await this.fetch(`/${collection}-rest/v1/set`, {\n      method: 'POST',\n      body: JSON.stringify(doc),\n    })\n    return res.json() as Promise<T>\n  }\n\n  private async fetch(path: string, init: RequestInit): Promise<Response> {\n    const token = await this.config.getAuthToken()\n    const res = await globalThis.fetch(`${this.config.apiBaseUrl}${path}`, {\n      ...init,\n      headers: {\n        'Content-Type': 'application/json',\n        Authorization: `Bearer ${token}`,\n        ...init.headers,\n      },\n    })\n    if (!res.ok) {\n      throw new D1ClientError(res.status, await res.text(), path)\n    }\n    return res\n  }\n}\n\nexport class D1ClientError extends Error {\n  constructor(\n    public readonly status: number,\n    public readonly body: string,\n    public readonly path: string,\n  ) {\n    super(`D1 REST ${status}: ${path}`)\n    this.name = 'D1ClientError'\n  }\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * React context provider for collection storage mode configuration.\n *\n * Wraps QueryClientProvider and exposes a D1Client instance plus\n * a mode resolver. When the provider is not mounted, useCollectionMode()\n * returns null — all hooks fall back to the existing local-only RxDB path.\n */\n\nimport React, { createContext, useContext, useMemo } from 'react'\nimport { QueryClientProvider, QueryClient } from '@tanstack/react-query'\nimport type { CollectionModeConfig, CollectionMode } from '../../config/CollectionModeConfig'\nimport { getCollectionMode } from '../../config/CollectionModeConfig'\nimport { D1Client } from '../remote/d1Client'\n\nexport interface CollectionModeContextValue {\n  config: CollectionModeConfig\n  queryClient: QueryClient\n  client: D1Client\n  getMode: (collectionName: string) => CollectionMode\n}\n\nconst CollectionModeContext = createContext<CollectionModeContextValue | null>(null)\n\nexport interface CollectionModeProviderProps {\n  config: CollectionModeConfig\n  queryClient: QueryClient\n  children: React.ReactNode\n}\n\nexport function CollectionModeProvider({\n  config,\n  queryClient,\n  children,\n}: CollectionModeProviderProps) {\n  const client = useMemo(\n    () => new D1Client(config),\n    [config.apiBaseUrl, config.getAuthToken],\n  )\n\n  const value = useMemo<CollectionModeContextValue>(\n    () => ({\n      config,\n      queryClient,\n      client,\n      getMode: (name: string) => getCollectionMode(config, name),\n    }),\n    [config, queryClient, client],\n  )\n\n  return (\n    <QueryClientProvider client={queryClient}>\n      <CollectionModeContext.Provider value={value}>\n        {children}\n      </CollectionModeContext.Provider>\n    </QueryClientProvider>\n  )\n}\n\n/**\n * Access the collection mode context.\n *\n * Returns `null` when the provider is not mounted — consumers should\n * treat null as \"all collections are local\" for backward compatibility.\n */\nexport function useCollectionMode(): CollectionModeContextValue | null {\n  return useContext(CollectionModeContext)\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Local-only implementation of useCollectionQuery backed by RxDB.\n *\n * Queries a native RxDB collection by name with an optional query builder.\n * Extracted from useCollectionQuery for mode routing.\n */\n\nimport { useEffect, useState } from 'react';\n\n/**\n * React hook for querying an RxDB collection by name (local path only).\n *\n * Replaces `useRxData` from rxdb-hooks. Takes a database instance, collection\n * name, and optional query builder function. Subscribes to the resulting RxDB\n * query observable and returns reactive results.\n *\n * @param db - RxDatabase instance (or null/undefined)\n * @param collectionName - Name of the RxDB collection to query\n * @param queryBuilder - Optional function that receives the RxCollection and returns an RxQuery.\n *   If omitted, queries all documents via `collection.find()`.\n *   Return `null` or `undefined` to skip the query (returns empty data, not loading).\n * @returns Object with `data`, `isLoading`, and `error`\n */\nexport function useLocalCollectionQuery<T = Record<string, unknown>>(\n  db: any,\n  collectionName: string,\n  queryBuilder?: (collection: any) => any\n): { data: T[]; isLoading: boolean; error: Error | null } {\n  const [data, setData] = useState<T[]>([]);\n  const [isLoading, setIsLoading] = useState(true);\n  const [error, setError] = useState<Error | null>(null);\n\n  useEffect(() => {\n    if (!db) {\n      setData([]);\n      setIsLoading(false);\n      setError(null);\n      return undefined;\n    }\n\n    const collection = db.collections?.[collectionName];\n    if (!collection) {\n      setData([]);\n      setIsLoading(false);\n      setError(null);\n      return undefined;\n    }\n\n    setIsLoading(true);\n    setError(null);\n\n    try {\n      const query = queryBuilder\n        ? queryBuilder(collection)\n        : collection.find();\n\n      // queryBuilder returned null/undefined — skip query, return empty\n      if (!query) {\n        setData([]);\n        setIsLoading(false);\n        return undefined;\n      }\n\n      const subscription = query.$.subscribe({\n        next: (docs: any[]) => {\n          const mapped = docs.map((d: any) =>\n            (typeof d.toJSON === 'function' ? d.toJSON() : d) as T\n          );\n          setData(mapped);\n          setIsLoading(false);\n        },\n        error: (err: Error) => {\n          setError(err);\n          setIsLoading(false);\n        },\n      });\n\n      return () => subscription.unsubscribe();\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n      setIsLoading(false);\n      return undefined;\n    }\n  }, [db, collectionName, queryBuilder]);\n\n  return { data, isLoading, error };\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Query key factory for @tanstack/react-query cache management.\n *\n * Follows the query key factory pattern so that cache invalidation\n * can target all queries for a collection, a specific query shape,\n * or a single document.\n */\n\nimport type { D1QueryParams } from './d1Client'\n\nexport const collectionKeys = {\n  all:    (name: string) => [name] as const,\n  query:  (name: string, params: D1QueryParams) => [name, 'query', params] as const,\n  get:    (name: string, ids: string[]) => [name, 'get', ids] as const,\n  single: (name: string, id: string) => [name, 'single', id] as const,\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Remote query hook backed by D1 REST + @tanstack/react-query.\n *\n * Returns the same `{ data, isLoading, error }` shape as local RxDB hooks\n * so consumers can switch between local and remote without API changes.\n */\n\nimport { useEffect, useState } from 'react'\nimport { useQuery as useTanstackQuery } from '@tanstack/react-query'\nimport { useCollectionMode } from '../CollectionModeContext'\nimport { collectionKeys } from '../../remote/queryKeys'\nimport type { D1QueryParams } from '../../remote/d1Client'\n\nexport interface UseRemoteQueryOptions {\n  selector?: Record<string, unknown>\n  sort?: Array<Record<string, 'asc' | 'desc'>>\n  limit?: number\n  skip?: number\n  staleTime?: number\n  refetchInterval?: number | false\n  enabled?: boolean\n}\n\nexport interface UseRemoteQueryResult<T> {\n  data: T[]\n  isLoading: boolean\n  error: Error | null\n}\n\nexport function useRemoteQuery<T = Record<string, unknown>>(\n  collectionName: string,\n  options: UseRemoteQueryOptions = {},\n): UseRemoteQueryResult<T> {\n  const ctx = useCollectionMode()\n  if (!ctx) throw new Error('useRemoteQuery requires CollectionModeProvider')\n\n  const { client, config } = ctx\n  const { selector, sort, limit, skip, enabled = true } = options\n\n  const params: D1QueryParams = { selector: selector ?? {}, sort, limit, skip }\n\n  const result = useTanstackQuery({\n    queryKey: collectionKeys.query(collectionName, params),\n    queryFn: () => client.query<T>(collectionName, params),\n    staleTime: options.staleTime ?? config.remoteDefaults?.staleTime ?? 30_000,\n    refetchInterval: options.refetchInterval ?? config.remoteDefaults?.refetchInterval ?? false,\n    enabled,\n  })\n\n  return {\n    data: result.data ?? [],\n    isLoading: result.isLoading,\n    error: result.error,\n  }\n}\n\n/**\n * Conditional variant safe to use without a CollectionModeProvider.\n *\n * Uses useState/useEffect directly (no tanstack hooks) so it maintains\n * a consistent hook count regardless of whether a provider is mounted.\n * When the provider IS mounted, uses QueryClient imperatively for caching.\n * When `collectionName` is null or no provider exists, returns empty data.\n */\nexport function useRemoteQueryConditional<T = Record<string, unknown>>(\n  collectionName: string | null,\n  options?: UseRemoteQueryOptions,\n): UseRemoteQueryResult<T> {\n  const ctx = useCollectionMode()\n  const isActive = ctx !== null && collectionName !== null && (options?.enabled ?? true)\n\n  const [data, setData] = useState<T[]>([])\n  const [isLoading, setIsLoading] = useState(false)\n  const [error, setError] = useState<Error | null>(null)\n\n  const selectorKey = JSON.stringify(options?.selector ?? {})\n  const sortKey = JSON.stringify(options?.sort ?? [])\n  const { limit, skip } = options ?? {}\n\n  useEffect(() => {\n    if (!isActive || !ctx || !collectionName) {\n      setData([])\n      setIsLoading(false)\n      setError(null)\n      return\n    }\n\n    let cancelled = false\n    setIsLoading(true)\n    setError(null)\n\n    const params: D1QueryParams = {\n      selector: options?.selector ?? {},\n      sort: options?.sort,\n      limit,\n      skip,\n    }\n\n    ctx.client\n      .query<T>(collectionName, params)\n      .then((result: T[]) => {\n        if (!cancelled) {\n          setData(result)\n          setIsLoading(false)\n        }\n      })\n      .catch((err: unknown) => {\n        if (!cancelled) {\n          setError(err instanceof Error ? err : new Error(String(err)))\n          setIsLoading(false)\n        }\n      })\n\n    return () => {\n      cancelled = true\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps -- selector/sort serialized as keys\n  }, [isActive, ctx, collectionName, selectorKey, sortKey, limit, skip])\n\n  return { data, isLoading, error }\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Collection query hook with mode routing.\n *\n * Delegates to either local RxDB (useLocalCollectionQuery) or remote D1\n * based on the CollectionModeProvider context.\n *\n * When no provider is mounted, all collections route to local (backward compatible).\n *\n * NOTE: The `queryBuilder` callback is a local-only concept (it receives an\n * RxCollection). When the collection is in remote mode, the hook fetches all\n * documents from the remote API without applying the queryBuilder.\n */\n\nimport { useCollectionMode } from '../CollectionModeContext';\nimport { useLocalCollectionQuery } from './useLocalCollectionQuery';\nimport { useRemoteQueryConditional } from './useRemoteQuery';\n\n/**\n * React hook for querying a collection by name.\n *\n * Routes to local RxDB or remote D1 based on CollectionModeProvider context.\n * When no provider is mounted, all collections route to local.\n *\n * @param db - RxDatabase instance (or null/undefined)\n * @param collectionName - Name of the collection to query\n * @param queryBuilder - Optional function that receives the RxCollection and returns an RxQuery.\n *   Only used in local mode. In remote mode, all documents are fetched.\n * @returns Object with `data`, `isLoading`, and `error`\n *\n * @example\n * ```tsx\n * function ProjectSelect({ orgId }: { orgId: string }) {\n *   const { db } = useDatabase();\n *   const queryBuilder = useCallback(\n *     (collection: RxCollection) =>\n *       collection.find({ selector: { orgId, archived: false } }),\n *     [orgId]\n *   );\n *   const { data, isLoading } = useCollectionQuery(db, 'projects', queryBuilder);\n *\n *   if (isLoading) return <div>Loading...</div>;\n *   return (\n *     <select>\n *       {data.map(p => <option key={p.id} value={p.id}>{p.title}</option>)}\n *     </select>\n *   );\n * }\n * ```\n */\nexport function useCollectionQuery<T = Record<string, unknown>>(\n  db: any,\n  collectionName: string,\n  queryBuilder?: (collection: any) => any\n): { data: T[]; isLoading: boolean; error: Error | null } {\n  const modeCtx = useCollectionMode();\n  const mode = modeCtx?.getMode(collectionName) ?? 'local';\n  const isRemote = mode === 'remote';\n\n  // Both hooks always called (rules of hooks), only one is active.\n  const localResult = useLocalCollectionQuery<T>(\n    isRemote ? null : db,\n    collectionName,\n    queryBuilder\n  );\n\n  const remoteResult = useRemoteQueryConditional<T>(\n    isRemote ? collectionName : null\n  );\n\n  return isRemote ? remoteResult : localResult;\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\nimport { useEffect, useState, useCallback } from 'react';\nimport type { MutationOperator, MutationState } from '../../../core/operators/MutationOperator';\n\n/**\n * Return type for useMutation hook\n */\nexport interface UseMutationResult<TData, TVariables> {\n  /** Execute mutation with variables */\n  mutate: (variables: TVariables) => void;\n  /** Execute mutation with variables and return Promise */\n  mutateAsync: (variables: TVariables) => Promise<TData>;\n  /** True while mutation is executing */\n  isLoading: boolean;\n  /** Error object if mutation failed */\n  error: Error | null;\n  /** Result data from successful mutation */\n  data: TData | null;\n  /** Reset mutation state to initial values */\n  reset: () => void;\n}\n\n/**\n * React hook for framework-agnostic MutationOperator\n *\n * Subscribes to a MutationOperator's state and provides mutation functions.\n * Handles null operators gracefully and cleans up subscriptions on unmount.\n *\n * @param mutationOperator - MutationOperator instance or null\n * @returns UseMutationResult with mutate functions and state\n *\n * @example\n * ```tsx\n * function CreateTaskForm() {\n *   const db = useDatabase();\n *   const mutationOperator = useMemo(() => {\n *     if (!db) return null;\n *     const taskOps = new TaskOperator(db);\n *     return taskOps.createMutation();\n *   }, [db]);\n *\n *   const { mutate, isLoading, error, data } = useMutation(mutationOperator);\n *\n *   const handleSubmit = (e) => {\n *     e.preventDefault();\n *     mutate({\n *       title: 'New Task',\n *       description: 'Task description',\n *       orgId: 'org_123',\n *       userId: 'user_456',\n *       projectId: 'proj_789',\n *       milestoneId: 'mile_101'\n *     });\n *   };\n *\n *   if (isLoading) return <div>Creating task...</div>;\n *   if (error) return <div>Error: {error.message}</div>;\n *   if (data) return <div>Task created: {data.id}</div>;\n *\n *   return <form onSubmit={handleSubmit}>...</form>;\n * }\n * ```\n */\nexport function useMutation<TData, TVariables>(\n  mutationOperator: MutationOperator<TData, TVariables> | null\n): UseMutationResult<TData, TVariables> {\n  const [state, setState] = useState<MutationState<TData>>({\n    data: null,\n    isLoading: false,\n    error: null,\n  });\n\n  useEffect(() => {\n    // If no operator provided, reset to initial state\n    if (!mutationOperator) {\n      setState({\n        data: null,\n        isLoading: false,\n        error: null,\n      });\n      return;\n    }\n\n    // Subscribe to operator's state observable\n    const subscription = mutationOperator.state$.subscribe({\n      next: setState,\n    });\n\n    // Cleanup subscription on unmount or when operator changes\n    // Note: We only unsubscribe here. The operator lifecycle is managed\n    // by the parent component that created it.\n    return () => {\n      subscription.unsubscribe();\n    };\n  }, [mutationOperator]);\n\n  /**\n   * Execute mutation without returning Promise (fire-and-forget)\n   */\n  const mutate = useCallback(\n    (variables: TVariables) => {\n      if (!mutationOperator) {\n        console.warn('useMutation: Cannot mutate without mutation operator');\n        return;\n      }\n\n      mutationOperator.execute(variables).catch((error) => {\n        // Error is already handled by operator and state is updated\n        console.error('Mutation error:', error);\n      });\n    },\n    [mutationOperator]\n  );\n\n  /**\n   * Execute mutation and return Promise for async/await usage\n   */\n  const mutateAsync = useCallback(\n    async (variables: TVariables): Promise<TData> => {\n      if (!mutationOperator) {\n        throw new Error('useMutation: Cannot mutate without mutation operator');\n      }\n\n      return mutationOperator.execute(variables);\n    },\n    [mutationOperator]\n  );\n\n  /**\n   * Reset mutation state to initial values\n   */\n  const reset = useCallback(() => {\n    if (mutationOperator) {\n      mutationOperator.reset();\n    }\n  }, [mutationOperator]);\n\n  return {\n    mutate,\n    mutateAsync,\n    isLoading: state.isLoading,\n    error: state.error,\n    data: state.data,\n    reset,\n  };\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\nimport { useMemo } from 'react'\nimport { useQuery } from './useQuery'\nimport { useMutation } from './useMutation'\nimport type { QueryOperator } from '../../../core/operators/QueryOperator'\nimport type { MutationOperator } from '../../../core/operators/MutationOperator'\nimport type { UseMutationResult } from './useMutation'\nimport type { QueryResult } from '../../../core/operators/types'\n\n/**\n * Query options accepted by Operator.query() methods.\n */\nexport interface CollectionQueryOptions {\n  sort?: string\n  limit?: number\n  skip?: number\n}\n\n/**\n * Minimum interface any Operator class passed to createCollectionHooks must satisfy.\n */\nexport interface CollectionOperatorInterface<TModel, TFilters, TCreate, TUpdate> {\n  query(filters: TFilters, options?: CollectionQueryOptions): QueryOperator<TModel>\n  createMutation(): MutationOperator<TModel, TCreate>\n  updateMutation(): MutationOperator<TModel, TUpdate>\n  deleteMutation(): MutationOperator<void, string>\n}\n\n/**\n * Constructor type for classes implementing CollectionOperatorInterface.\n */\nexport type CollectionOperatorClass<TModel, TFilters, TCreate, TUpdate> = new (\n  db: any\n) => CollectionOperatorInterface<TModel, TFilters, TCreate, TUpdate>\n\n/**\n * The four hooks returned by createCollectionHooks.\n */\nexport interface CollectionHooks<TModel, TFilters, TCreate, TUpdate> {\n  /**\n   * Query hook. Returns { data, isLoading, error }.\n   * Returns empty/not-loading when db or filters is null/undefined.\n   */\n  useItems: (db: any, filters: TFilters, options?: CollectionQueryOptions) => QueryResult<TModel>\n  /** Create mutation hook. Returns UseMutationResult. */\n  useCreate: (db: any) => UseMutationResult<TModel, TCreate>\n  /** Update mutation hook. Returns UseMutationResult. */\n  useUpdate: (db: any) => UseMutationResult<TModel, TUpdate>\n  /** Soft-delete mutation hook. Returns UseMutationResult<void, string>. */\n  useDelete: (db: any) => UseMutationResult<void, string>\n}\n\n/**\n * Factory that creates React hooks for a collection operator class.\n *\n * Replaces per-entity boilerplate hook files (useProjects.ts, useMilestones.ts,\n * etc.) by generating a typed hook set from any operator class that satisfies\n * CollectionOperatorInterface.\n *\n * The returned hooks accept `db` as their first argument (Layer 1 pattern).\n * App-level code wraps them calling useDatabase() internally (Layer 2 pattern).\n *\n * @param OperatorClass - Any operator class constructor (e.g., ProjectOperator)\n * @returns { useItems, useCreate, useUpdate, useDelete }\n *\n * @example\n * ```ts\n * import { createCollectionHooks, MilestoneOperator } from '@epicdm/flowstate-collections/react'\n * import { useDatabase, useOrgWorkspace } from '@epicdm/flowstate-app-framework'\n *\n * const { useItems, useCreate, useUpdate, useDelete } = createCollectionHooks(MilestoneOperator)\n *\n * export function useProjectMilestones(projectId: string) {\n *   const { db } = useDatabase()\n *   const { currentOrgId } = useOrgWorkspace()\n *   return useItems(db, { orgId: currentOrgId, projectId, archived: false })\n * }\n *\n * export function useCreateMilestone() {\n *   const { db } = useDatabase()\n *   return useCreate(db)\n * }\n * ```\n */\nexport function createCollectionHooks<TModel, TFilters, TCreate, TUpdate>(\n  OperatorClass: CollectionOperatorClass<TModel, TFilters, TCreate, TUpdate>\n): CollectionHooks<TModel, TFilters, TCreate, TUpdate> {\n  function useItems(\n    db: any,\n    filters: TFilters,\n    options?: CollectionQueryOptions\n  ): QueryResult<TModel> {\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    const queryOperator = useMemo(() => {\n      if (!db || !filters) return null\n      try {\n        return new OperatorClass(db).query(filters, options)\n      } catch {\n        return null\n      }\n      // JSON.stringify is intentional — filters and options are plain objects\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [db, JSON.stringify(filters), JSON.stringify(options)])\n\n    return useQuery<TModel>(queryOperator)\n  }\n\n  function useCreate(db: any): UseMutationResult<TModel, TCreate> {\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    const mutationOperator = useMemo(\n      () => (db ? new OperatorClass(db).createMutation() : null),\n      [db]\n    )\n    return useMutation<TModel, TCreate>(mutationOperator)\n  }\n\n  function useUpdate(db: any): UseMutationResult<TModel, TUpdate> {\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    const mutationOperator = useMemo(\n      () => (db ? new OperatorClass(db).updateMutation() : null),\n      [db]\n    )\n    return useMutation<TModel, TUpdate>(mutationOperator)\n  }\n\n  function useDelete(db: any): UseMutationResult<void, string> {\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    const mutationOperator = useMemo(\n      () => (db ? new OperatorClass(db).deleteMutation() : null),\n      [db]\n    )\n    return useMutation<void, string>(mutationOperator)\n  }\n\n  return { useItems, useCreate, useUpdate, useDelete }\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * @fileoverview ID generation utilities for all collections\n * @module @epicdm/db-collections/utils/id\n */\n\nimport { nanoid } from 'nanoid'\n\n// Fallback ID generator for environments without crypto.getRandomValues (SSR)\nconst fallbackId = (size: number = 10): string => {\n  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-'\n  let id = ''\n  for (let i = 0; i < size; i++) {\n    id += chars.charAt(Math.floor(Math.random() * chars.length))\n  }\n  return id\n}\n\n// Safe nanoid that falls back when crypto is unavailable\nexport const safeNanoid = (size: number = 10): string => {\n  try {\n    // Check if crypto.getRandomValues is available\n    if (\n      typeof globalThis !== 'undefined' &&\n      globalThis.crypto &&\n      typeof globalThis.crypto.getRandomValues === 'function'\n    ) {\n      return nanoid(size)\n    }\n    return fallbackId(size)\n  } catch {\n    return fallbackId(size)\n  }\n}\n\n/**\n * Canonical mapping from entity type to ID prefix.\n * This is the source of truth for all ID prefixes.\n * Each prefix must be unique and exactly 4 characters long.\n *\n * When adding a new entity type:\n * 1. Add it here with a unique prefix\n * 2. Also update ID_PREFIX_TO_COLLECTION to include the new prefix\n * 3. Use createId('entitytype') to generate IDs\n */\nexport const ENTITY_TO_PREFIX: Record<string, string> = {\n  // Financial entities (singular and plural forms)\n  finaccount: 'fina',\n  finaccounts: 'fina',\n  finbudget: 'finb',\n  finbudgets: 'finb',\n  fincategory: 'finc',\n  fincategories: 'finc',\n  finscheduledtransaction: 'fins',\n  finscheduledtransactions: 'fins',\n  fintransaction: 'fint',\n  fintransactions: 'fint',\n  finincomestatement: 'fini',\n  finincomestatements: 'fini',\n\n  // Business accounting entities (singular and plural forms)\n  chartofaccount: 'choa',\n  chartofaccounts: 'choa',\n  journalentry: 'jrnl',\n  journalentries: 'jrnl',\n  journalline: 'jrln',\n  journallines: 'jrln',\n  fiscalperiod: 'fisc',\n  fiscalperiods: 'fisc',\n  vendor: 'vend',\n  vendors: 'vend',\n  vendorbill: 'vbil',\n  vendorbills: 'vbil',\n  bankreconciliation: 'brcn',\n  bankreconciliations: 'brcn',\n  taxrate: 'taxr',\n  taxrates: 'taxr',\n\n  // Core entities\n  approval: 'appr',\n  approvals: 'appr',\n  attribute: 'attr',\n  attributes: 'attr',\n  client: 'clie',\n  clients: 'clie',\n  codebase: 'code',\n  codebases: 'code',\n  contact: 'cont',\n  contacts: 'cont',\n  conversation: 'conv',\n  conversations: 'conv',\n  discussion: 'disc',\n  discussions: 'disc',\n  document: 'docu',\n  documents: 'docu',\n  flow: 'flow',\n  flows: 'flow',\n  goal: 'goal',\n  goals: 'goal',\n  message: 'mess',\n  messages: 'mess',\n  milestone: 'mile',\n  milestones: 'mile',\n  opportunity: 'oppo',\n  opportunities: 'oppo',\n  org: 'org_',\n  orgs: 'org_',\n  project: 'proj',\n  projects: 'proj',\n  session: 'sess',\n  sessions: 'sess',\n  task: 'task',\n  tasks: 'task',\n  template: 'temp',\n  templates: 'temp',\n  timeentry: 'time',\n  timeentries: 'time',\n  user: 'use_',\n  users: 'use_',\n  variables: 'vari',\n  workspace: 'work',\n  workspaces: 'work',\n  syncconfig: 'sync',\n  syncconfigs: 'sync',\n\n  // Product entities (singular and plural forms)\n  product: 'prod',\n  products: 'prod',\n  initiative: 'init',\n  initiatives: 'init',\n  roadmap: 'road',\n  roadmaps: 'road',\n  productgoal: 'pgoa',\n  productgoals: 'pgoa',\n  productproject: 'ppro',\n  productprojects: 'ppro',\n  productteammember: 'ptmb',\n  productteammembers: 'ptmb',\n  activity: 'acti',\n  activities: 'acti',\n  teammember: 'team',\n  teammembers: 'team',\n  metric: 'metr',\n  metrics: 'metr',\n\n  // Process entities (singular and plural forms)\n  process: 'proc',\n  processes: 'proc',\n  processstep: 'step',\n  processsteps: 'step',\n  processexecution: 'exec',\n  processexecutions: 'exec',\n  steptemplate: 'stpl',\n  steptemplates: 'stpl',\n\n  // Theme entities (singular and plural forms)\n  orgtheme: 'othr',\n  orgthemes: 'othr',\n\n  // Business Plan entities (singular and plural forms)\n  businessplan: 'bpln',\n  businessplans: 'bpln',\n  marketanalysis: 'mkan',\n  marketanalyses: 'mkan',\n  competitor: 'comp',\n  competitors: 'comp',\n  businessplanteammember: 'bptm',\n  businessplanteammembers: 'bptm',\n\n  // Marketing entities (singular and plural forms)\n  offer: 'offr',\n  offers: 'offr',\n  campaign: 'camp',\n  campaigns: 'camp',\n  audience: 'audc',\n  audiences: 'audc',\n  leadmagnet: 'lead',\n  leadmagnets: 'lead',\n  campaigncontact: 'ccnt',\n  campaigncontacts: 'ccnt',\n  campaignproduct: 'cprd',\n  campaignproducts: 'cprd',\n\n  // Sales entities (singular and plural forms)\n  deal: 'deal',\n  deals: 'deal',\n  pipeline: 'pipe',\n  pipelines: 'pipe',\n  pipelinestage: 'stge',\n  pipelinestages: 'stge',\n  quote: 'quot',\n  quotes: 'quot',\n  invoice: 'invc',\n  invoices: 'invc',\n  lineitem: 'item',\n  lineitems: 'item',\n  dealproduct: 'dprd',\n  dealproducts: 'dprd',\n  dealproject: 'dpro',\n  dealprojects: 'dpro',\n\n  // BizDev entities (singular and plural forms)\n  partnership: 'part',\n  partnerships: 'part',\n\n  // Recurrence entities\n  recurrence: 'recu',\n  recurrences: 'recu',\n\n  // Process sub-entities\n  edge: 'edge',\n  edges: 'edge',\n  comment: 'cmnt',\n  comments: 'cmnt',\n\n  // Cashflow grouping entities\n  categorygroup: 'cgrp',\n  categorygroups: 'cgrp',\n\n  // Chat entities\n  attachment: 'atch',\n  attachments: 'atch',\n\n  // Schema-in-DB entities\n  schema: 'schm',\n  schemas: 'schm',\n  record: 'rec_',\n  records: 'rec_',\n  relation: 'reln',\n  relations: 'reln',\n\n  // Vault entities (singular and plural forms)\n  vault: 'vaut',\n  vaults: 'vaut',\n  vaultitem: 'vait',\n  vaultitems: 'vait',\n  servicekey: 'skey',\n  servicekeys: 'skey',\n\n  // Git connection entities (Phase 3 — provider-agnostic auth handles)\n  git_connection: 'gitc',\n  git_connections: 'gitc',\n\n  // Git VCA entities (Phase 5 — provider-agnostic records-table collections)\n  // Note: 'comments' uses 'gcm_' (git comment) to avoid collision with existing 'cmnt' (generic comment)\n  // Note: 'commits' uses 'cmt_' — chosen before 'gcm_' was assigned to comments\n  pullrequest: 'prq_',\n  pullrequests: 'prq_',\n  commit: 'cmt_',\n  commits: 'cmt_',\n  branch: 'brn_',\n  branches: 'brn_',\n  release: 'rel_',\n  releases: 'rel_',\n  workflow_run: 'wfr_',\n  workflow_runs: 'wfr_',\n  git_comment: 'gcm_',\n  git_comments: 'gcm_',\n  review: 'grv_',\n  reviews: 'grv_',\n  review_comment: 'grc_',\n  review_comments: 'grc_',\n  git_project_link: 'gpl_',\n  git_project_links: 'gpl_',\n  connector_webhook_event: 'cwe_',\n  connector_webhook_events: 'cwe_',\n\n  // Worker entities (singular and plural forms)\n  // Note: 'work' prefix is taken by workspaces, so workers use 'wrkr'\n  worker: 'wrkr',\n  workers: 'wrkr',\n\n  // App snapshot entities (singular and plural forms)\n  appsnapshot: 'asnp',\n  appsnapshots: 'asnp',\n\n  // RBAC entities (singular and plural forms)\n  // Note: 'acl' prefix uses 'acl_' (4 chars with trailing underscore) to stay 4 chars\n  role: 'role',\n  roles: 'role',\n  rolemembership: 'rmem',\n  rolememberships: 'rmem',\n  acl: 'acl_',\n  acls: 'acl_',\n  revokedtoken: 'rtok',\n  revokedtokens: 'rtok',\n  revocationepoch: 'repc',\n  revocationepochs: 'repc',\n  invitation: 'invt',\n  invitations: 'invt',\n\n  // ZK encryption entities\n  encryptionkey: 'ekey',\n  encryptionkeys: 'ekey',\n  userkey: 'ukey',\n  userkeys: 'ukey',\n  vaultmembership: 'vmem',\n  vaultmemberships: 'vmem',\n\n  // Discord entities (singular and plural forms)\n  discord_mapping: 'dmap',\n  discord_mappings: 'dmap',\n  discord_channel: 'dchn',\n  discord_channels: 'dchn',\n\n  // Entity assignment junction\n  entityassignment: 'easn',\n  entityassignments: 'easn',\n\n  // Orchestration entities (singular and plural forms)\n  proposal: 'prps',\n  proposals: 'prps',\n  mission: 'misn',\n  missions: 'misn',\n  mission_step: 'mstp',\n  mission_steps: 'mstp',\n  agent_event: 'aevt',\n  agent_events: 'aevt',\n  trigger_rule: 'trul',\n  trigger_rules: 'trul',\n  ops_policy: 'opol',\n  agent_affinity: 'aaff',\n  agent_affinities: 'aaff',\n\n  // Finance VCA aliases (short names used by virtual collection seeds)\n  account: 'fina',\n  accounts: 'fina',\n  budget: 'finb',\n  budgets: 'finb',\n  transaction: 'fint',\n  transactions: 'fint',\n  scheduledtransaction: 'fins',\n  scheduledtransactions: 'fins',\n  incomestatement: 'fini',\n  incomestatements: 'fini',\n\n  // Sales entities (additional)\n  paymentplan: 'ppln',\n  paymentplans: 'ppln',\n\n  // Support entities (singular and plural forms)\n  ticket: 'tikt',\n  tickets: 'tikt',\n  feedbackitem: 'fbki',\n  feedbackitems: 'fbki',\n  kbarticle: 'kbar',\n  kbarticles: 'kbar',\n  healthscore: 'hlsc',\n  healthscores: 'hlsc',\n  integration: 'intg',\n  integrations: 'intg',\n\n  // Content entities (singular and plural forms)\n  contentpiece: 'cpce',\n  contentpieces: 'cpce',\n  contentpillar: 'cpil',\n  contentpillars: 'cpil',\n  hooktemplate: 'htpl',\n  hooktemplates: 'htpl',\n  conversioncode: 'cvcn',\n  conversioncodes: 'cvcn',\n  contentfunnel: 'cfun',\n  contentfunnels: 'cfun',\n  persuasiontemplate: 'prtl',\n  persuasiontemplates: 'prtl',\n  outreachtarget: 'otrg',\n  outreachtargets: 'otrg',\n\n  // Accounting entities (additional)\n  budgetitem: 'bdit',\n  budgetitems: 'bdit',\n\n  // Logging entities (singular and plural forms)\n  // Note: 'log' is only 3 chars, so prefix uses trailing underscore like 'org_', 'rec_', 'use_'\n  log: 'log_',\n  logs: 'log_',\n}\n\n/**\n * Generate a unique ID for an entity type.\n * Format: {prefix}_{nanoid} where prefix is looked up from ENTITY_TO_PREFIX.\n *\n * @param entityType - The entity type (e.g., 'task', 'project', 'goal')\n * @returns A unique ID string (e.g., 'task_abc123xyz0')\n * @throws Error if entityType is not registered in ENTITY_TO_PREFIX\n *\n * @example\n * createId('task')     // 'task_abc123xyz0'\n * createId('project')  // 'proj_xyz789abc1'\n * createId('goal')     // 'goal_def456ghi2'\n */\nexport const createId = (entityType: string): string => {\n  const prefix = ENTITY_TO_PREFIX[entityType]\n  if (!prefix) {\n    throw new Error(\n      `Unknown entity type: \"${entityType}\". Add it to ENTITY_TO_PREFIX in db-collections/src/utils/id.ts`\n    )\n  }\n  return `${prefix}_${safeNanoid(10)}`\n}\n\n/**\n * Map of ID prefixes to collection names.\n * Manually maintained; must be kept in sync with ENTITY_TO_PREFIX.\n * Used to determine the entity type from an ID string.\n */\nexport const ID_PREFIX_TO_COLLECTION: Record<string, string> = {\n  // Manually maintained mapping from ID prefix to collection name (keep in sync with ENTITY_TO_PREFIX)\n  fina: 'finaccounts',\n  finb: 'finbudgets',\n  finc: 'fincategories',\n  fins: 'finscheduledtransactions',\n  fint: 'fintransactions',\n  fini: 'finincomestatements',\n  choa: 'chartofaccounts',\n  jrnl: 'journalentries',\n  jrln: 'journallines',\n  fisc: 'fiscalperiods',\n  vend: 'vendors',\n  vbil: 'vendorbills',\n  brcn: 'bankreconciliations',\n  taxr: 'taxrates',\n  appr: 'approvals',\n  attr: 'attributes',\n  clie: 'clients',\n  code: 'codebases',\n  cont: 'contacts',\n  conv: 'conversations',\n  disc: 'discussions',\n  docu: 'documents',\n  flow: 'flows',\n  goal: 'goals',\n  mess: 'messages',\n  mile: 'milestones',\n  oppo: 'opportunities',\n  org_: 'orgs',\n  proj: 'projects',\n  sess: 'sessions',\n  task: 'tasks',\n  temp: 'templates',\n  time: 'timeentries',\n  use_: 'users',\n  vari: 'variables',\n  work: 'workspaces',\n  sync: 'syncconfigs',\n  prod: 'products',\n  init: 'initiatives',\n  road: 'roadmaps',\n  pgoa: 'productgoals',\n  ppro: 'productprojects',\n  ptmb: 'productteammembers',\n  acti: 'activities',\n  team: 'teammembers',\n  metr: 'metrics',\n  proc: 'processes',\n  step: 'processsteps',\n  exec: 'processexecutions',\n  stpl: 'steptemplates',\n  othr: 'orgthemes',\n  bpln: 'businessplans',\n  mkan: 'marketanalyses',\n  comp: 'competitors',\n  bptm: 'businessplanteammembers',\n  offr: 'offers',\n  camp: 'campaigns',\n  audc: 'audiences',\n  lead: 'leadmagnets',\n  ccnt: 'campaigncontacts',\n  cprd: 'campaignproducts',\n  deal: 'deals',\n  pipe: 'pipelines',\n  stge: 'pipelinestages',\n  quot: 'quotes',\n  invc: 'invoices',\n  item: 'lineitems',\n  dprd: 'dealproducts',\n  dpro: 'dealprojects',\n  part: 'partnerships',\n  recu: 'recurrences',\n  edge: 'edges',\n  cmnt: 'comments',\n  cgrp: 'categorygroups',\n  atch: 'attachments',\n  schm: 'schemas',\n  rec_: 'records',\n  reln: 'relations',\n  vaut: 'vaults',\n  vait: 'vaultitems',\n  skey: 'servicekeys',\n  gitc: 'git_connections',\n  // Git VCA entities (Phase 5)\n  prq_: 'pullrequests',\n  cmt_: 'commits',\n  brn_: 'branches',\n  rel_: 'releases',\n  wfr_: 'workflow_runs',\n  gcm_: 'git_comments',\n  grv_: 'reviews',\n  grc_: 'review_comments',\n  gpl_: 'git_project_links',\n  cwe_: 'connector_webhook_events',\n  wrkr: 'workers',\n  asnp: 'appsnapshots',\n  // RBAC entities\n  role: 'roles',\n  rmem: 'rolememberships',\n  acl_: 'acl',\n  rtok: 'revokedtokens',\n  repc: 'revocationepochs',\n  invt: 'invitations',\n  // ZK encryption entities\n  ekey: 'encryptionkeys',\n  ukey: 'userkeys',\n  vmem: 'vaultmemberships',\n  // Discord entities\n  dmap: 'discord_mappings',\n  dchn: 'discord_channels',\n  // Entity assignment junction\n  easn: 'entityassignments',\n  // Orchestration entities\n  prps: 'proposals',\n  misn: 'missions',\n  mstp: 'mission_steps',\n  aevt: 'agent_events',\n  trul: 'trigger_rules',\n  opol: 'ops_policy',\n  aaff: 'agent_affinities',\n  // Sales entities (additional)\n  ppln: 'paymentplans',\n  // Support entities\n  tikt: 'tickets',\n  fbki: 'feedbackitems',\n  kbar: 'kbarticles',\n  hlsc: 'healthscores',\n  intg: 'integrations',\n  // Content entities\n  cpce: 'contentpieces',\n  cpil: 'contentpillars',\n  htpl: 'hooktemplates',\n  cvcn: 'conversioncodes',\n  cfun: 'contentfunnels',\n  prtl: 'persuasiontemplates',\n  otrg: 'outreachtargets',\n  // Accounting entities (additional)\n  bdit: 'budgetitems',\n  // Logging entities\n  // Note: 'log' is 3 chars, so prefix uses trailing underscore (same pattern as org_, rec_, use_)\n  log_: 'logs',\n}\n\n/**\n * Legacy 3-character prefix mapping for backward compatibility.\n * The mobile app's createId used name.substring(0, 3) instead of 4-char prefixes,\n * producing IDs like 'tas_xxx' instead of 'task_xxx'. This map allows the system\n * to recognize those legacy IDs. Format: 3-char prefix + '_' = 4-char lookup key.\n */\nconst LEGACY_3CHAR_PREFIX_TO_COLLECTION: Record<string, string> = {\n  tas_: 'tasks',\n  pro_: 'projects',\n  mil_: 'milestones',\n  goa_: 'goals',\n  dis_: 'discussions',\n  doc_: 'documents',\n  wor_: 'workspaces',\n  org_: 'orgs',\n  use_: 'users',\n  flo_: 'flows',\n  mes_: 'messages',\n  ses_: 'sessions',\n  tem_: 'templates',\n  tim_: 'timeentries',\n  cli_: 'clients',\n  con_: 'contacts',\n  opp_: 'opportunities',\n  att_: 'attributes',\n  app_: 'approvals',\n  var_: 'variables',\n  cod_: 'codebases',\n}\n\n/**\n * Get the collection name from an entity ID by parsing its prefix.\n * IDs are generated with format: `{prefix}_{nanoid}` where prefix is from ENTITY_TO_PREFIX.\n *\n * @param id - The entity ID (e.g., 'task_abc123', 'proj_xyz789', 'mile_def456')\n * @returns The collection name (e.g., 'tasks', 'projects', 'milestones') or null if unknown\n *\n * @example\n * getCollectionFromId('task_abc123') // returns 'tasks'\n * getCollectionFromId('proj_xyz789') // returns 'projects'\n * getCollectionFromId('mile_def456') // returns 'milestones'\n * getCollectionFromId('unknown_123') // returns null\n */\nexport const getCollectionFromId = (id: string): string | null => {\n  if (!id || typeof id !== 'string') return null\n\n  const prefix = id.substring(0, 4)\n  // Try standard 4-char prefix first, then fall back to legacy 3-char prefix mapping\n  return ID_PREFIX_TO_COLLECTION[prefix] || LEGACY_3CHAR_PREFIX_TO_COLLECTION[prefix] || null\n}\n\n/**\n * Get the entity type (singular form) from an entity ID.\n * This is useful for display purposes and polymorphic relationships.\n *\n * @param id - The entity ID (e.g., 'task_abc123', 'proj_xyz789')\n * @returns The entity type (e.g., 'task', 'project', 'milestone') or null if unknown\n *\n * @example\n * getEntityTypeFromId('task_abc123') // returns 'task'\n * getEntityTypeFromId('proj_xyz789') // returns 'project'\n * getEntityTypeFromId('mile_def456') // returns 'milestone'\n */\nexport const getEntityTypeFromId = (id: string): string | null => {\n  const collection = getCollectionFromId(id)\n  if (!collection) return null\n\n  // Map collection names to singular entity types\n  const collectionToEntityType: Record<string, string> = {\n    finaccounts: 'finaccount',\n    approvals: 'approval',\n    attributes: 'attribute',\n    finbudgets: 'finbudget',\n    fincategories: 'fincategory',\n    clients: 'client',\n    codebases: 'codebase',\n    contacts: 'contact',\n    conversations: 'conversation',\n    discussions: 'discussion',\n    flows: 'flow',\n    goals: 'goal',\n    logs: 'log',\n    messages: 'message',\n    milestones: 'milestone',\n    opportunities: 'opportunity',\n    orgs: 'org',\n    products: 'product',\n    initiatives: 'initiative',\n    projects: 'project',\n    roadmaps: 'roadmap',\n    finscheduledtransactions: 'finscheduledtransaction',\n    sessions: 'session',\n    documents: 'document',\n    tasks: 'task',\n    templates: 'template',\n    timeentries: 'timeentry',\n    fintransactions: 'fintransaction',\n    finincomestatements: 'finincomestatement',\n    chartofaccounts: 'chartofaccount',\n    journalentries: 'journalentry',\n    journallines: 'journalline',\n    fiscalperiods: 'fiscalperiod',\n    vendors: 'vendor',\n    vendorbills: 'vendorbill',\n    bankreconciliations: 'bankreconciliation',\n    taxrates: 'taxrate',\n    users: 'user',\n    variables: 'variables',\n    workspaces: 'workspace',\n    syncconfigs: 'syncconfig',\n    processes: 'process',\n    processsteps: 'processstep',\n    processexecutions: 'processexecution',\n    steptemplates: 'steptemplate',\n    orgthemes: 'orgtheme',\n    productgoals: 'productgoal',\n    productprojects: 'productproject',\n    productteammembers: 'productteammember',\n    activities: 'activity',\n    teammembers: 'teammember',\n    metrics: 'metric',\n    businessplans: 'businessplan',\n    marketanalyses: 'marketanalysis',\n    competitors: 'competitor',\n    businessplanteammembers: 'businessplanteammember',\n    offers: 'offer',\n    campaigns: 'campaign',\n    audiences: 'audience',\n    leadmagnets: 'leadmagnet',\n    campaigncontacts: 'campaigncontact',\n    campaignproducts: 'campaignproduct',\n    deals: 'deal',\n    pipelines: 'pipeline',\n    pipelinestages: 'pipelinestage',\n    quotes: 'quote',\n    invoices: 'invoice',\n    lineitems: 'lineitem',\n    dealproducts: 'dealproduct',\n    dealprojects: 'dealproject',\n    partnerships: 'partnership',\n    recurrences: 'recurrence',\n    edges: 'edge',\n    comments: 'comment',\n    categorygroups: 'categorygroup',\n    attachments: 'attachment',\n    schemas: 'schema',\n    records: 'record',\n    relations: 'relation',\n    vaults: 'vault',\n    vaultitems: 'vaultitem',\n    servicekeys: 'servicekey',\n    git_connections: 'git_connection',\n    // Git VCA collections (Phase 5)\n    pullrequests: 'pullrequest',\n    commits: 'commit',\n    branches: 'branch',\n    releases: 'release',\n    workflow_runs: 'workflow_run',\n    git_comments: 'git_comment',\n    reviews: 'review',\n    review_comments: 'review_comment',\n    git_project_links: 'git_project_link',\n    connector_webhook_events: 'connector_webhook_event',\n    workers: 'worker',\n    appsnapshots: 'appsnapshot',\n    // RBAC collections\n    roles: 'role',\n    rolememberships: 'rolemembership',\n    acl: 'acl',\n    revokedtokens: 'revokedtoken',\n    revocationepochs: 'revocationepoch',\n    // ZK encryption entities\n    encryptionkeys: 'encryptionkey',\n    userkeys: 'userkey',\n    vaultmemberships: 'vaultmembership',\n    // Discord collections\n    discord_mappings: 'discord_mapping',\n    discord_channels: 'discord_channel',\n    // Entity assignment junction\n    entityassignments: 'entityassignment',\n    // Orchestration collections\n    proposals: 'proposal',\n    missions: 'mission',\n    mission_steps: 'mission_step',\n    agent_events: 'agent_event',\n    trigger_rules: 'trigger_rule',\n    ops_policy: 'ops_policy',\n    agent_affinities: 'agent_affinity',\n    // Sales collections (additional)\n    paymentplans: 'paymentplan',\n    // Support collections\n    tickets: 'ticket',\n    feedbackitems: 'feedbackitem',\n    kbarticles: 'kbarticle',\n    healthscores: 'healthscore',\n    integrations: 'integration',\n    // Content collections\n    contentpieces: 'contentpiece',\n    contentpillars: 'contentpillar',\n    hooktemplates: 'hooktemplate',\n    conversioncodes: 'conversioncode',\n    contentfunnels: 'contentfunnel',\n    persuasiontemplates: 'persuasiontemplate',\n    outreachtargets: 'outreachtarget',\n    // Accounting collections (additional)\n    budgetitems: 'budgetitem',\n  }\n\n  return collectionToEntityType[collection] || null\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { SchemaModel } from '../models/Schema'\nimport type { RecordModel } from '../models/Record'\nimport { createId, safeNanoid } from '../utils/id'\n\n/** Minimal query interface — only .exec() is used by the adapter.\n *  The REST CollectionAccessorAdapter does not support chainable\n *  .skip()/.limit()/.sort() so the VCA applies those client-side.\n *\n *  Returns `unknown[]` because RxDB documents have `.toJSON()` while\n *  REST responses are plain objects — {@link VirtualCollectionAdapter.toPlainObject}\n *  normalizes both at runtime. */\ninterface ExecutableQuery {\n  exec(): Promise<unknown[]>\n}\n\n/**\n * Structural interface for the subset of RxCollection methods used by the adapter.\n *\n * All operations are collection-level (not document-level) so the adapter\n * works with both RxDB local collections and REST client wrappers.\n */\nexport interface RecordCollection {\n  find(query: {\n    selector: Record<string, unknown>\n    sort?: Array<Record<string, string>>\n  }): ExecutableQuery\n  findOne(query: { selector: Record<string, unknown> }): {\n    exec(): Promise<Record<string, unknown> | null>\n  }\n  insert(doc: Partial<RecordModel>): Promise<Record<string, unknown>>\n  /** Update a document by ID. Returns the updated document. */\n  update(id: string, patch: Record<string, unknown>): Promise<Record<string, unknown>>\n  /** Delete a document by ID. */\n  delete(id: string): Promise<boolean>\n  /**\n   * Execute an aggregate query against the collection.\n   * Only supported by REST-backed implementations (D1 worker).\n   * RxDB local collections do not implement this method.\n   *\n   * @param spec - The AggregateRequest payload forwarded verbatim to the worker.\n   * @returns An object with a `documents` array of result rows.\n   */\n  aggregate?(spec: Record<string, unknown>): Promise<{ documents: Record<string, unknown>[] }>\n}\n\n/** Structural interface for the schemas collection used by SchemaRegistry. */\nexport interface SchemaCollection {\n  find(query: { selector: Record<string, unknown> }): {\n    exec(): Promise<Array<{ toJSON(): Record<string, unknown> }>>\n  }\n  findOne(query: { selector: Record<string, unknown> }): {\n    exec(): Promise<{ toJSON(): Record<string, unknown> } | null>\n  }\n}\n\n/**\n * Fields stored as top-level columns on RecordModel.\n * Used to distinguish between fields queried/sorted at root level\n * vs those that go into the `data` bag.\n *\n * This set must exactly match the properties declared in the RecordModel\n * interface (packages/db-collections/src/models/Record.ts). When a new\n * column is added to RecordModel / the Drizzle schema, add it here too.\n *\n * Why explicit enumeration rather than deriving from Record.schema.properties\n * at runtime: VCA is instantiated in contexts (browser, REST, test) where\n * importing the Record model would create a circular dependency or require\n * a live RxDB collection reference that is not available at construction\n * time. A compile-time constant is simpler and easier to audit.\n */\nconst TOP_LEVEL_FIELDS = new Set([\n  'id',\n  'schemaId',\n  'orgId',\n  'workspaceId',\n  'userId',\n  'createdAt',\n  'updatedAt',\n  'metadata',\n  'extended',\n  'title',\n  'status',\n  'parentId',\n  'parentCollection',\n  'data',\n  'archived',\n  'completed',\n  'completedAt',\n  'startedAt',\n  'sortOrder',\n  'assigneeId',\n  'priority',\n  'dueAt',\n  'amount',\n  'version',\n  'tenantId',\n])\n\n/**\n * Immutable fields that callers must never overwrite on an existing document.\n * These are silently dropped from update() and upsert() patch payloads.\n */\nconst IMMUTABLE_FIELDS = new Set([\n  'id',\n  'schemaId',\n  'orgId',\n  'workspaceId',\n  'userId',\n  'createdAt',\n])\n\n/**\n * Wraps the generic `records` RxCollection and scopes all operations\n * to a specific schemaId. Provides the same CRUD interface that consumers\n * expect from a dedicated collection.\n */\nexport class VirtualCollectionAdapter {\n  constructor(\n    private recordsCollection: RecordCollection,\n    private schemaDefinition: SchemaModel\n  ) {}\n\n  /**\n   * Safely extract a plain object from an RxDB document or REST response.\n   * RxDB documents have `.toJSON()`, REST clients return plain objects.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private toPlainObject(doc: any): Record<string, unknown> {\n    return (typeof doc.toJSON === 'function' ? doc.toJSON() : doc) as Record<string, unknown>\n  }\n\n  get name(): string {\n    return this.schemaDefinition.name\n  }\n\n  get schemaId(): string {\n    return this.schemaDefinition.id\n  }\n\n  /**\n   * Map a flat document (as callers provide) into the RecordModel storage format.\n   *\n   * Any field present in TOP_LEVEL_FIELDS is written directly to the record\n   * object. Everything else is packed into the `data` bag.\n   *\n   * Using TOP_LEVEL_FIELDS as the single source of truth means that schema\n   * columns added to RecordModel (e.g. `extended`, `sortOrder`, `priority`)\n   * are automatically promoted without needing a matching change here.\n   */\n  mapToRecord(flatDoc: Record<string, unknown>): Partial<RecordModel> {\n    const record: Partial<RecordModel> = {\n      schemaId: this.schemaDefinition.id,\n      archived: false,\n    }\n\n    const data: Record<string, unknown> = {}\n\n    for (const [key, value] of Object.entries(flatDoc)) {\n      if (TOP_LEVEL_FIELDS.has(key)) {\n        // Promote to a real RecordModel column. The schemaId injected above\n        // takes precedence — callers must not pass a different schemaId.\n        if (key !== 'schemaId') {\n          ;(record as Record<string, unknown>)[key] = value\n        }\n      } else {\n        data[key] = value\n      }\n    }\n\n    // `title` and `archived` must always be present (required by the schema).\n    if (record.title === undefined) record.title = ''\n    record.data = data\n    return record\n  }\n\n  /**\n   * Map a RecordModel back to a flat document (as callers expect).\n   * Merges `data` fields to top level alongside standard fields.\n   */\n  mapFromRecord(record: RecordModel): Record<string, unknown> {\n    // Destructure to exclude RxDB internals and schemaId from the flat output\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    const { data, schemaId, _rev, _meta, _deleted, _attachments, ...rest } =\n      record as unknown as Record<string, unknown>\n    return {\n      ...rest,\n      ...((data as Record<string, unknown>) ?? {}),\n    }\n  }\n\n  /**\n   * Rewrite a selector to scope it to this schema.\n   * Only includes top-level RecordModel fields that RxDB can query directly.\n   * Data-bag fields are omitted — use {@link extractDataFilter} to get them\n   * for client-side filtering after the query returns.\n   */\n  rewriteSelector(selector: Record<string, unknown>, isNested = false): Record<string, unknown> {\n    // Only inject schemaId at the top level. Nested sub-selectors (inside\n    // $and/$or) inherit the top-level constraint and must not duplicate it.\n    const rewritten: Record<string, unknown> = isNested\n      ? {}\n      : { schemaId: this.schemaDefinition.id }\n\n    for (const [key, value] of Object.entries(selector)) {\n      if (key.startsWith('$')) {\n        if (Array.isArray(value)) {\n          const items = value\n            .map((item: Record<string, unknown>) =>\n              typeof item === 'object' ? this.rewriteSelector(item, true) : item\n            )\n            .filter(\n              (item: unknown) =>\n                typeof item !== 'object' || Object.keys(item as Record<string, unknown>).length > 0\n            )\n          if (items.length > 0) {\n            rewritten[key] = items\n          }\n        } else {\n          rewritten[key] = value\n        }\n      } else if (TOP_LEVEL_FIELDS.has(key)) {\n        rewritten[key] = value\n      }\n      // Data-bag fields are intentionally omitted from the RxDB query.\n      // RxDB cannot query into the generic `data` object. Use\n      // extractDataFilter() + matchesDataFilter() for client-side filtering.\n    }\n\n    return rewritten\n  }\n\n  /**\n   * Extract data-bag field conditions from a selector for client-side filtering.\n   * Returns field conditions that are NOT top-level RecordModel fields and NOT\n   * logical operators ($and/$or).\n   *\n   * Note: data-bag fields inside $and/$or are not extracted — they are silently\n   * dropped from the RxDB query. For complex logical queries on data-bag fields,\n   * fetch all records for the schema and filter entirely client-side.\n   */\n  extractDataFilter(selector: Record<string, unknown>): Record<string, unknown> {\n    const filter: Record<string, unknown> = {}\n    for (const [key, value] of Object.entries(selector)) {\n      if (!key.startsWith('$') && !TOP_LEVEL_FIELDS.has(key)) {\n        filter[key] = value\n      }\n    }\n    return filter\n  }\n\n  /**\n   * Rewrite sort criteria, keeping only top-level RecordModel fields.\n   * Data-bag field sorts are omitted — use {@link extractClientSort} to get\n   * them for client-side sorting.\n   */\n  rewriteSort(sort: Array<Record<string, string>>): Array<Record<string, string>> {\n    return sort\n      .map(sortItem => {\n        if (typeof sortItem !== 'object' || sortItem === null || Array.isArray(sortItem)) {\n          return {}\n        }\n        const rewritten: Record<string, string> = {}\n        for (const [field, direction] of Object.entries(sortItem)) {\n          if (TOP_LEVEL_FIELDS.has(field)) {\n            rewritten[field] = direction\n          }\n        }\n        return rewritten\n      })\n      .filter(item => Object.keys(item).length > 0)\n  }\n\n  /**\n   * Extract data-bag field sorts for client-side sorting.\n   */\n  extractClientSort(sort: Array<Record<string, string>>): Array<Record<string, string>> {\n    return sort\n      .map(sortItem => {\n        const clientSort: Record<string, string> = {}\n        for (const [field, direction] of Object.entries(sortItem)) {\n          if (!TOP_LEVEL_FIELDS.has(field)) {\n            clientSort[field] = direction\n          }\n        }\n        return clientSort\n      })\n      .filter(item => Object.keys(item).length > 0)\n  }\n\n  /**\n   * Test whether a flat (mapped) document matches data-bag filter conditions.\n   * Supports direct equality and common MongoDB-style operators.\n   */\n  static matchesDataFilter(doc: Record<string, unknown>, filter: Record<string, unknown>): boolean {\n    for (const [key, condition] of Object.entries(filter)) {\n      const value = doc[key]\n      if (typeof condition === 'object' && condition !== null && !Array.isArray(condition)) {\n        const ops = condition as Record<string, unknown>\n        for (const [op, expected] of Object.entries(ops)) {\n          switch (op) {\n            case '$eq':\n              if (value !== expected) return false\n              break\n            case '$ne':\n              if (value === expected) return false\n              break\n            case '$gt':\n              if (!((value as number) > (expected as number))) return false\n              break\n            case '$gte':\n              if (!((value as number) >= (expected as number))) return false\n              break\n            case '$lt':\n              if (!((value as number) < (expected as number))) return false\n              break\n            case '$lte':\n              if (!((value as number) <= (expected as number))) return false\n              break\n            case '$in':\n              if (!Array.isArray(expected) || !expected.includes(value)) return false\n              break\n            case '$nin':\n              if (Array.isArray(expected) && expected.includes(value)) return false\n              break\n            case '$exists':\n              if (expected ? value === undefined : value !== undefined) return false\n              break\n            default:\n              break\n          }\n        }\n      } else {\n        // Direct equality: { isAgent: true }\n        if (value !== condition) return false\n      }\n    }\n    return true\n  }\n\n  /**\n   * Sort flat (mapped) documents by data-bag field criteria client-side.\n   */\n  static applyClientSort<T extends Record<string, unknown>>(\n    docs: T[],\n    sort: Array<Record<string, string>>\n  ): T[] {\n    if (sort.length === 0) return docs\n    return [...docs].sort((a, b) => {\n      for (const sortItem of sort) {\n        for (const [field, direction] of Object.entries(sortItem)) {\n          const aVal = a[field]\n          const bVal = b[field]\n          let cmp: number\n          if (typeof aVal === 'number' && typeof bVal === 'number') {\n            cmp = aVal - bVal\n          } else {\n            cmp = String(aVal ?? '').localeCompare(String(bVal ?? ''))\n          }\n          if (cmp !== 0) return direction === 'desc' ? -cmp : cmp\n        }\n      }\n      return 0\n    })\n  }\n\n  /** Query records scoped to this schema */\n  async find(\n    options: {\n      selector?: Record<string, unknown>\n      limit?: number\n      skip?: number\n      sort?: Array<Record<string, string>>\n    } = {}\n  ): Promise<Record<string, unknown>[]> {\n    const { selector = {}, limit, skip, sort } = options\n\n    const dataFilter = this.extractDataFilter(selector)\n    const hasDataFilter = Object.keys(dataFilter).length > 0\n\n    // Only pass selector to the DB query. Sort, skip, and limit are applied\n    // client-side for consistent behavior across RxDB and REST transports\n    // (the REST CollectionAccessorAdapter ignores sort/skip/limit in queries).\n    const query = this.recordsCollection.find({\n      selector: this.rewriteSelector(selector),\n    })\n    const docs = await query.exec()\n    let results = docs.map((doc: unknown) =>\n      this.mapFromRecord(this.toPlainObject(doc) as unknown as RecordModel)\n    )\n\n    if (hasDataFilter) {\n      results = results.filter(doc => VirtualCollectionAdapter.matchesDataFilter(doc, dataFilter))\n    }\n\n    // Apply full sort client-side — works on flat (mapped) documents where\n    // both top-level and data-bag fields are accessible at the top level.\n    if (sort && sort.length > 0) {\n      results = VirtualCollectionAdapter.applyClientSort(results, sort)\n    }\n\n    if (skip) results = results.slice(skip)\n    if (limit) results = results.slice(0, limit)\n\n    return results\n  }\n\n  /** Get a single record by ID */\n  async findOne(id: string): Promise<Record<string, unknown> | null> {\n    const doc = await this.recordsCollection\n      .findOne({\n        selector: { id, schemaId: this.schemaDefinition.id },\n      })\n      .exec()\n\n    return doc ? this.mapFromRecord(this.toPlainObject(doc) as unknown as RecordModel) : null\n  }\n\n  /**\n   * Generate an ID for a new record using the schema-declared prefix.\n   * Resolution order:\n   * 1. `metadata.idPrefix` from the schema definition (e.g. 'deal')\n   * 2. `createId(schemaName)` via ENTITY_TO_PREFIX lookup\n   * 3. `createId('records')` as last resort\n   */\n  private generateId(): string {\n    const meta = this.schemaDefinition.metadata as Record<string, unknown> | undefined\n    if (typeof meta?.idPrefix === 'string' && meta.idPrefix.length > 0) {\n      return `${meta.idPrefix}_${safeNanoid(10)}`\n    }\n    try {\n      return createId(this.schemaDefinition.name)\n    } catch {\n      return createId('records')\n    }\n  }\n\n  /** Insert a new record */\n  async insert(flatDoc: Record<string, unknown>): Promise<Record<string, unknown>> {\n    const id = (flatDoc.id as string) || this.generateId()\n    const docWithId = { ...flatDoc, id }\n    const record = this.mapToRecord(docWithId)\n\n    // Ensure required fields are present on the record object.\n    // mapToRecord propagates id via the contextFields loop, but we set it\n    // explicitly as a safeguard against any propagation issue.\n    if (!record.id) record.id = id\n    const now = new Date().toISOString()\n    if (!record.createdAt) record.createdAt = now\n    if (!record.updatedAt) record.updatedAt = now\n\n    // The Record schema marks `status`, `parentId`, `assigneeId`, and\n    // `workspaceId` as required (they're indexed for project/task-shaped\n    // queries). Connector-pulled rows and most simple virtual collections\n    // have no semantic counterpart for these fields. Default to empty\n    // strings so the records-table schema validates without forcing every\n    // virtual-collection caller to construct a project shape they don't\n    // need. Empty strings are valid per the schema's `type: 'string'`\n    // declaration; indexes treat them as standard tokens.\n    const r = record as Record<string, unknown>\n    if (r.status === undefined) r.status = ''\n    if (r.parentId === undefined) r.parentId = ''\n    if (r.assigneeId === undefined) r.assigneeId = ''\n    if (r.workspaceId === undefined) r.workspaceId = ''\n\n    const doc = await this.recordsCollection.insert(record)\n    return this.mapFromRecord(this.toPlainObject(doc) as unknown as RecordModel)\n  }\n\n  /**\n   * Update a record by ID with partial data.\n   *\n   * **Merge semantics:** Existing `data` fields are preserved; only provided\n   * fields are overwritten. Setting a field to `null` stores `null` but does\n   * NOT delete the key. To remove a field, callers should use a dedicated\n   * delete-field operation (not yet implemented).\n   *\n   * **Immutable fields:** `id`, `schemaId`, `orgId`, `workspaceId`, `userId`,\n   * and `createdAt` are silently dropped from updates.\n   *\n   * **Column routing:** Fields present in TOP_LEVEL_FIELDS are written to\n   * real RecordModel columns. Any field NOT in TOP_LEVEL_FIELDS and NOT\n   * immutable is packed into the `data` extension blob. The `data` key is\n   * only written when there are extension-only fields — callers that update\n   * only real columns do not cause an unintentional `data: {}` overwrite.\n   *\n   * Previously this method maintained a second, shorter hardcoded set of\n   * \"top-level\" fields that excluded RecordModel columns added after the\n   * initial implementation (`extended`, `sortOrder`, `priority`, `dueAt`,\n   * `amount`, `tenantId`). Those columns were silently routed to the `data`\n   * blob, leaving the real DB column NULL. The fix is to use the shared\n   * TOP_LEVEL_FIELDS constant which is kept in sync with RecordModel.\n   */\n  async update(\n    id: string,\n    updates: Record<string, unknown>\n  ): Promise<Record<string, unknown> | null> {\n    const doc = await this.recordsCollection\n      .findOne({\n        selector: { id, schemaId: this.schemaDefinition.id },\n      })\n      .exec()\n\n    if (!doc) return null\n\n    const existing = this.toPlainObject(doc) as unknown as RecordModel\n    const patch: Record<string, unknown> = {}\n    // Seed dataUpdates from the existing data blob so that extension fields\n    // that are NOT being changed in this update are preserved.\n    const dataUpdates: Record<string, unknown> = { ...(existing.data ?? {}) }\n    let hasDataUpdates = Object.keys(dataUpdates).length > 0\n\n    for (const [key, value] of Object.entries(updates)) {\n      if (IMMUTABLE_FIELDS.has(key)) {\n        // Silently drop — callers must not mutate identity/ownership fields.\n        continue\n      }\n      if (TOP_LEVEL_FIELDS.has(key)) {\n        // Route to a real RecordModel column.\n        patch[key] = value\n      } else {\n        // True extension field — pack into the data blob.\n        dataUpdates[key] = value\n        hasDataUpdates = true\n      }\n    }\n\n    // Only write the data blob when there are extension fields to persist.\n    // Omitting the key entirely avoids clobbering the existing data object\n    // with an empty {} on updates that only touch real columns.\n    if (hasDataUpdates) {\n      patch.data = dataUpdates\n    }\n\n    const updated = await this.recordsCollection.update(id, patch)\n    return this.mapFromRecord(this.toPlainObject(updated) as unknown as RecordModel)\n  }\n\n  /**\n   * Insert or update a record, handling cross-schema conflicts.\n   *\n   * Checks for existing documents proactively before insert to handle\n   * cross-org/cross-schema scenarios where the same external ID exists\n   * under a different schemaId/orgId. Falls back to CONFLICT catch for\n   * race conditions.\n   *\n   * Use this for sync workflows where the same external ID may have been\n   * previously imported under a different org or schema context.\n   */\n  async upsert(flatDoc: Record<string, unknown>): Promise<Record<string, unknown>> {\n    const id = flatDoc.id as string\n\n    // Fast path: record already belongs to this schema — update it\n    const existing = await this.recordsCollection\n      .findOne({ selector: { id, schemaId: this.schemaDefinition.id } })\n      .exec()\n\n    if (existing) {\n      const plain = this.toPlainObject(existing) as unknown as RecordModel\n      const record = this.mapToRecord(flatDoc)\n      // Merge data fields (preserve existing, overwrite with new)\n      const mergedData = { ...(plain.data ?? {}), ...(record.data ?? {}) }\n      const patch: Record<string, unknown> = { ...record, data: mergedData }\n      delete (patch as Record<string, unknown>).id // id is immutable primary key\n      const updated = await this.recordsCollection.update(id, patch)\n      return this.mapFromRecord(this.toPlainObject(updated) as unknown as RecordModel)\n    }\n\n    // Check if document exists under ANY schema (cross-org reclaim)\n    const anyExisting = await this.recordsCollection.findOne({ selector: { id } }).exec()\n\n    if (anyExisting) {\n      // Reclaim: overwrite with this adapter's schema and the caller's org context\n      const record = this.mapToRecord(flatDoc)\n      const fullPatch: Record<string, unknown> = { ...record }\n      delete (fullPatch as Record<string, unknown>).id\n      const updated = await this.recordsCollection.update(id, fullPatch)\n      return this.mapFromRecord(this.toPlainObject(updated) as unknown as RecordModel)\n    }\n\n    // New document — insert\n    try {\n      const record = this.mapToRecord(flatDoc)\n      const doc = await this.recordsCollection.insert(record)\n      return this.mapFromRecord(this.toPlainObject(doc) as unknown as RecordModel)\n    } catch (error: unknown) {\n      // Race condition fallback: document appeared between findOne and insert\n      const msg = error instanceof Error ? error.message : String(error)\n      if (msg.includes('CONFLICT') || msg.includes('conflict') || msg.includes('409')) {\n        const record = this.mapToRecord(flatDoc)\n        const fullPatch: Record<string, unknown> = { ...record }\n        delete (fullPatch as Record<string, unknown>).id\n        const updated = await this.recordsCollection.update(id, fullPatch)\n        return this.mapFromRecord(this.toPlainObject(updated) as unknown as RecordModel)\n      }\n      throw error\n    }\n  }\n\n  /** Delete a record by ID */\n  async remove(id: string): Promise<boolean> {\n    // Verify document belongs to this schema before deleting\n    const doc = await this.recordsCollection\n      .findOne({\n        selector: { id, schemaId: this.schemaDefinition.id },\n      })\n      .exec()\n\n    if (!doc) return false\n    return this.recordsCollection.delete(id)\n  }\n\n  /** Count records matching a selector */\n  async count(selector: Record<string, unknown> = {}): Promise<number> {\n    // Always count client-side via find() — the REST\n    // CollectionAccessorAdapter does not implement .count().\n    const docs = await this.find({ selector })\n    return docs.length\n  }\n\n  /**\n   * Execute an aggregate (GROUP BY / HAVING) query.\n   *\n   * Delegates directly to the underlying `RecordCollection.aggregate()`.\n   * Only REST-backed collections (D1 worker) implement this method —\n   * local RxDB collections do not support server-side aggregation.\n   *\n   * @param spec - Aggregate request spec forwarded verbatim to the worker.\n   * @throws Error if the underlying collection does not support aggregate.\n   */\n  async aggregate(spec: Record<string, unknown>): Promise<{ documents: Record<string, unknown>[] }> {\n    if (typeof this.recordsCollection.aggregate !== 'function') {\n      throw new Error(\n        `aggregate is not supported by the underlying collection for schema \"${this.schemaDefinition.name}\". ` +\n        'Only REST-backed (D1) collections support server-side aggregation.'\n      )\n    }\n    // Mirror find()/findOne(): inject schemaId so the D1 worker filters to the\n    // correct VCA schema. Without this, an aggregate call on 'journallines'\n    // would operate over ALL records rows for the org, ignoring the schema boundary.\n    const selector = ((spec.selector as Record<string, unknown>) ?? {})\n    const scopedSpec: Record<string, unknown> = {\n      ...spec,\n      selector: {\n        // Spread caller selector first, then assert our schemaId so the\n        // adapter's schema boundary always takes precedence over any\n        // caller-supplied schemaId value.\n        ...selector,\n        schemaId: this.schemaDefinition.id,\n      },\n    }\n    return this.recordsCollection.aggregate(scopedSpec)\n  }\n}\n\n/**\n * Wrap a raw RxDB collection to satisfy the RecordCollection interface.\n *\n * RxDB collections have document-level update/delete (doc.patch, doc.remove)\n * but not collection-level update(id, patch) or delete(id). This wrapper\n * bridges that gap so VirtualCollectionAdapter works in both browser (RxDB)\n * and REST (CollectionAccessorAdapter) contexts.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function wrapRxCollection(rxCollection: any): RecordCollection {\n  return {\n    find: query => rxCollection.find(query),\n    findOne: query => rxCollection.findOne(query),\n    insert: doc => rxCollection.insert(doc),\n    update: async (id: string, patch: Record<string, unknown>) => {\n      const doc = await rxCollection.findOne({ selector: { id } }).exec()\n      if (!doc) throw new Error(`Document ${id} not found`)\n      return doc.patch(patch)\n    },\n    delete: async (id: string) => {\n      const doc = await rxCollection.findOne({ selector: { id } }).exec()\n      if (!doc) return false\n      await doc.remove()\n      return true\n    },\n  }\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { SchemaModel } from '../models/Schema'\nimport type { VirtualCollectionAdapter } from './VirtualCollectionAdapter'\nimport type {\n  KeyRing,\n  EncryptionContext,\n  KeyLookupFn,\n  FieldEncryptionConfig,\n} from '@epicdm/flowstate-crypto'\nimport { encryptFields, decryptFields } from '@epicdm/flowstate-crypto'\n\n/**\n * Parse the encryption config from a schema record.\n * Returns an empty array if no encrypted fields are configured.\n *\n * Handles both pre-parsed arrays and JSON-string storage formats,\n * since RxDB may return the value as a plain object array while\n * REST responses may return it as a JSON string.\n */\nfunction parseEncryptionConfig(schema: SchemaModel): FieldEncryptionConfig[] {\n  const raw = (schema as unknown as Record<string, unknown>).encryptedFields\n  if (!raw) return []\n  try {\n    const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw\n    return Array.isArray(parsed) ? (parsed as FieldEncryptionConfig[]) : []\n  } catch {\n    return []\n  }\n}\n\n/**\n * Decorator that adds transparent field-level encryption to a {@link VirtualCollectionAdapter}.\n *\n * - On write (insert/update/upsert): encrypts configured fields before passing to VCA\n * - On read (find/findOne): decrypts encrypted field envelopes after VCA returns\n * - When KeyRing is locked: reads return `'[encrypted]'` placeholders, writes throw\n *\n * The adapter does NOT mutate the VCA — it wraps it as a pure decorator.\n *\n * @example\n * ```typescript\n * const vca = new VirtualCollectionAdapter(records, schema)\n * const adapter = new EncryptedCollectionAdapter(vca, schema, keyRing, context)\n * const doc = await adapter.insert({ name: 'Alice', ssn: '123-45-6789' })\n * // ssn is stored encrypted in VCA, returned decrypted to caller\n * ```\n */\nexport class EncryptedCollectionAdapter {\n  private readonly encryptionConfig: FieldEncryptionConfig[]\n\n  /**\n   * @param vca - The VirtualCollectionAdapter to wrap\n   * @param schema - Schema definition containing encrypted field configuration\n   * @param keyRing - The KeyRing used for encrypt/decrypt operations\n   * @param context - Encryption context (orgId, workspaceId, userId)\n   * @param lookupKey - Optional key lookup function for group key resolution\n   */\n  constructor(\n    private readonly vca: VirtualCollectionAdapter,\n    schema: SchemaModel,\n    private readonly keyRing: KeyRing,\n    private readonly context: EncryptionContext,\n    private readonly lookupKey?: KeyLookupFn\n  ) {\n    this.encryptionConfig = parseEncryptionConfig(schema)\n  }\n\n  /** Delegates to the wrapped VCA's collection name. */\n  get name(): string {\n    return this.vca.name\n  }\n\n  /** Delegates to the wrapped VCA's schema ID. */\n  get schemaId(): string {\n    return this.vca.schemaId\n  }\n\n  /**\n   * Find records matching the given selector.\n   * Encrypted fields in returned documents are decrypted transparently.\n   * Returns `'[encrypted]'` placeholder strings when the KeyRing is locked.\n   */\n  async find(\n    options: {\n      selector?: Record<string, unknown>\n      limit?: number\n      skip?: number\n      sort?: Array<Record<string, string>>\n    } = {}\n  ): Promise<Record<string, unknown>[]> {\n    const results = await this.vca.find(options)\n    return Promise.all(results.map(doc => decryptFields(doc, this.keyRing)))\n  }\n\n  /**\n   * Find a single record by ID.\n   * Encrypted fields in the returned document are decrypted transparently.\n   * Returns `null` if no record is found.\n   */\n  async findOne(id: string): Promise<Record<string, unknown> | null> {\n    const doc = await this.vca.findOne(id)\n    if (!doc) return null\n    return decryptFields(doc, this.keyRing)\n  }\n\n  /**\n   * Insert a new record, encrypting configured fields before storage.\n   *\n   * @throws When the KeyRing is locked and there are fields to encrypt\n   */\n  async insert(flatDoc: Record<string, unknown>): Promise<Record<string, unknown>> {\n    const encrypted = await encryptFields(\n      flatDoc,\n      this.encryptionConfig,\n      this.keyRing,\n      this.context,\n      this.lookupKey\n    )\n    const result = await this.vca.insert(encrypted)\n    return decryptFields(result, this.keyRing)\n  }\n\n  /**\n   * Update an existing record by ID, encrypting any configured fields in the patch.\n   * Returns the updated document with encrypted fields decrypted, or `null` if not found.\n   *\n   * @throws When the KeyRing is locked and the patch contains fields to encrypt\n   */\n  async update(\n    id: string,\n    updates: Record<string, unknown>\n  ): Promise<Record<string, unknown> | null> {\n    const encrypted = await encryptFields(\n      updates,\n      this.encryptionConfig,\n      this.keyRing,\n      this.context,\n      this.lookupKey\n    )\n    const result = await this.vca.update(id, encrypted)\n    if (!result) return null\n    return decryptFields(result, this.keyRing)\n  }\n\n  /**\n   * Remove a record by ID. Delegates directly to VCA — no encryption needed for deletes.\n   * Returns `true` if the record was found and removed, `false` otherwise.\n   */\n  async remove(id: string): Promise<boolean> {\n    return this.vca.remove(id)\n  }\n\n  /**\n   * Upsert a record, encrypting configured fields before storage.\n   * Inserts if no record with the given ID exists, updates otherwise.\n   *\n   * @throws When the KeyRing is locked and there are fields to encrypt\n   */\n  async upsert(flatDoc: Record<string, unknown>): Promise<Record<string, unknown>> {\n    const encrypted = await encryptFields(\n      flatDoc,\n      this.encryptionConfig,\n      this.keyRing,\n      this.context,\n      this.lookupKey\n    )\n    const result = await this.vca.upsert(encrypted)\n    return decryptFields(result, this.keyRing)\n  }\n}\n\n/**\n * Derive the encryptedFields config from a schema's field definitions.\n * Called by schema save handlers to keep the encryptedFields column in sync.\n *\n * @param fields - Array of field definitions from the schema\n * @returns Array of encrypted field configurations containing fieldName and encryptionScope\n *\n * @example\n * ```typescript\n * const encryptedFields = deriveEncryptedFieldsConfig(schema.fields)\n * // [{ fieldName: 'ssn', encryptionScope: 'owner' }]\n * ```\n */\nexport function deriveEncryptedFieldsConfig(\n  fields: Array<{ name: string; config?: { encrypted?: boolean; encryptionScope?: string } }>\n): Array<{ fieldName: string; encryptionScope: string }> {\n  return fields\n    .filter(f => f.config?.encrypted)\n    .map(f => ({\n      fieldName: f.name,\n      encryptionScope: f.config?.encryptionScope ?? 'owner',\n    }))\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { SchemaModel } from '../models/Schema'\nimport { VirtualCollectionAdapter } from './VirtualCollectionAdapter'\nimport type { RecordCollection, SchemaCollection } from './VirtualCollectionAdapter'\nimport { EncryptedCollectionAdapter } from './EncryptedCollectionAdapter'\nimport type { KeyRing, EncryptionContext, KeyLookupFn } from '@epicdm/flowstate-crypto'\n\n/**\n * Manages schema definitions and provides VirtualCollectionAdapters.\n * Central routing point for the schema-in-db system.\n *\n * When encryption is configured via {@link setEncryptionContext}, callers\n * can use {@link getEncryptedAdapter} / {@link getEncryptedAdapterLazy}\n * to get adapters that transparently encrypt/decrypt fields.\n * The base {@link getAdapter} / {@link getAdapterLazy} always return\n * plain VCA instances for callers that need VCA-specific internals\n * (reactive queries, selector rewriting, etc.).\n */\n/**\n * Per-(user, org) encryption configuration. Stored in a Map keyed by\n * `${userId}:${orgId}` so a single registry instance can serve many\n * unlocked sessions concurrently — multi-org service accounts and\n * users with concurrent unlocked sessions in different orgs each get\n * their own keyRing/context/lookupKey without overwriting one\n * another. Surfaced during Phase 8 acceptance: a singleton\n * encryption context here meant that unlocking org B silently\n * overwrote org A's crypto for every encrypted CRUD call, even\n * after vault-state itself was correctly per-(user, org).\n */\ninterface EncryptionEntry {\n  keyRing: KeyRing\n  context: EncryptionContext\n  lookupKey?: KeyLookupFn\n}\n\nfunction encryptionContextKey(userId: string, orgId: string): string {\n  if (!userId) throw new Error('SchemaRegistry: userId is required for encryption context')\n  if (!orgId) throw new Error('SchemaRegistry: orgId is required for encryption context')\n  return `${userId}:${orgId}`\n}\n\nfunction encryptedAdapterCacheKey(userId: string, orgId: string, name: string): string {\n  return `${userId}:${orgId}:${name}`\n}\n\nexport class SchemaRegistry {\n  private schemas = new Map<string, SchemaModel>()\n  private adapterCache = new Map<string, VirtualCollectionAdapter>()\n  /**\n   * Encrypted-adapter cache keyed by `${userId}:${orgId}:${name}` so\n   * adapters created under one org's keyRing are NOT served to\n   * another org's request. The plain (`adapterCache` above) is org-\n   * agnostic because the underlying VCA reads the records table\n   * directly with no encryption involved.\n   */\n  private encryptedAdapterCache = new Map<string, EncryptedCollectionAdapter>()\n\n  /**\n   * Per-(user, org) encryption entries. Set via\n   * `setEncryptionContext(userId, orgId, ...)` after a successful\n   * vault-unlock; cleared via `clearEncryptionContext(userId, orgId)`\n   * on vault-lock or session end. Concurrent unlocked sessions in\n   * different orgs each have their own entry.\n   */\n  private encryptionContexts = new Map<string, EncryptionEntry>()\n\n  constructor(\n    private schemasCollection: SchemaCollection | null,\n    private recordsCollection: RecordCollection | null\n  ) {}\n\n  /**\n   * Load all schema definitions for an org from the database.\n   * Uses query-then-swap: existing cache is preserved if the DB query fails.\n   *\n   * @param orgId - The organization ID to filter schemas by\n   */\n  async loadSchemas(orgId: string): Promise<void> {\n    if (!this.schemasCollection) return\n    const docs = await this.schemasCollection\n      .find({\n        selector: { orgId, archived: false },\n      })\n      .exec()\n\n    // Query succeeded — build new maps, then swap atomically\n    const newSchemas = new Map<string, SchemaModel>()\n    for (const doc of docs) {\n      const schema = SchemaRegistry.docToSchema(doc)\n      newSchemas.set(schema.name, schema)\n    }\n    if (this.schemas.size > 0 && newSchemas.size === 0) {\n      console.warn(\n        `[SchemaRegistry] loadSchemas returned 0 results but cache had ${this.schemas.size} schema(s) — replacing anyway`\n      )\n    }\n    this.schemas = newSchemas\n    this.adapterCache = new Map()\n    this.encryptedAdapterCache = new Map()\n  }\n\n  /**\n   * Load all non-archived schema definitions across all orgs.\n   * Uses query-then-swap: existing cache is preserved if the DB query fails.\n   */\n  async loadAllSchemas(): Promise<void> {\n    if (!this.schemasCollection) return\n    const docs = await this.schemasCollection\n      .find({\n        selector: { archived: false },\n      })\n      .exec()\n\n    const newSchemas = new Map<string, SchemaModel>()\n    for (const doc of docs) {\n      const schema = SchemaRegistry.docToSchema(doc)\n      newSchemas.set(schema.name, schema)\n    }\n    if (this.schemas.size > 0 && newSchemas.size === 0) {\n      console.warn(\n        `[SchemaRegistry] loadAllSchemas returned 0 results but cache had ${this.schemas.size} schema(s) — replacing anyway`\n      )\n    }\n    this.schemas = newSchemas\n    this.adapterCache = new Map()\n    this.encryptedAdapterCache = new Map()\n  }\n\n  /**\n   * Lazy single-schema resolution with DB fallback.\n   * Checks the in-memory cache first; on miss, queries the DB and caches the result.\n   *\n   * @param name - Schema name\n   * @param orgId - Organization ID for the DB query\n   * @returns The schema if found, undefined otherwise\n   */\n  async getSchemaLazy(name: string, orgId: string): Promise<SchemaModel | undefined> {\n    const cached = this.schemas.get(name)\n    if (cached) return cached\n\n    if (!this.schemasCollection) return undefined\n\n    const doc = await this.schemasCollection\n      .findOne({ selector: { name, orgId, archived: false } })\n      .exec()\n\n    if (!doc) return undefined\n\n    const schema = SchemaRegistry.docToSchema(doc)\n    this.schemas.set(schema.name, schema)\n    return schema\n  }\n\n  /**\n   * Lazy adapter resolution with DB fallback.\n   * Checks adapter cache, then schema cache, then falls back to DB query.\n   *\n   * @param name - Schema/virtual collection name\n   * @param orgId - Organization ID for the DB query\n   * @returns A VirtualCollectionAdapter if the schema targets 'records', undefined otherwise\n   */\n  async getAdapterLazy(name: string, orgId: string): Promise<VirtualCollectionAdapter | undefined> {\n    const cached = this.adapterCache.get(name)\n    if (cached) return cached\n\n    const schema = this.schemas.get(name) ?? await this.getSchemaLazy(name, orgId)\n    if (!schema || schema.target !== 'records') return undefined\n    if (!this.recordsCollection) return undefined\n\n    const adapter = new VirtualCollectionAdapter(this.recordsCollection, schema)\n    this.adapterCache.set(name, adapter)\n    return adapter\n  }\n\n  /**\n   * Lazy encrypted adapter resolution with DB fallback.\n   * Returns an {@link EncryptedCollectionAdapter} when a KeyRing is configured,\n   * otherwise returns a plain {@link VirtualCollectionAdapter}.\n   *\n   * Use this when you need transparent field-level encryption on CRUD operations.\n   * Use {@link getAdapterLazy} when you need VCA-specific internals (reactive queries,\n   * selector rewriting, etc.).\n   *\n   * @param name - Schema/virtual collection name\n   * @param orgId - Organization ID for the DB query\n   */\n  async getEncryptedAdapterLazy(\n    name: string,\n    userId: string,\n    orgId: string\n  ): Promise<VirtualCollectionAdapter | EncryptedCollectionAdapter | undefined> {\n    const cacheKey = encryptedAdapterCacheKey(userId, orgId, name)\n    const cached = this.encryptedAdapterCache.get(cacheKey)\n    if (cached) return cached\n\n    const vca = await this.getAdapterLazy(name, orgId)\n    if (!vca) return undefined\n\n    return this.wrapWithEncryption(userId, orgId, name, vca)\n  }\n\n  /** Register a schema directly (for seed/testing without DB) */\n  registerSchema(schema: SchemaModel): void {\n    this.schemas.set(schema.name, schema)\n    this.adapterCache.delete(schema.name)\n    this.encryptedAdapterCache.delete(schema.name)\n  }\n\n  /** Check if a name matches a registered schema */\n  hasSchema(name: string): boolean {\n    return this.schemas.has(name)\n  }\n\n  /** Get the schema definition by name */\n  getSchema(name: string): SchemaModel | undefined {\n    return this.schemas.get(name)\n  }\n\n  /** Get all registered schema names */\n  getSchemaNames(): string[] {\n    return Array.from(this.schemas.keys()).sort()\n  }\n\n  /** Get all registered schemas */\n  getAllSchemas(): SchemaModel[] {\n    return Array.from(this.schemas.values())\n  }\n\n  /** Get or create a VirtualCollectionAdapter for a schema name */\n  getAdapter(name: string): VirtualCollectionAdapter | undefined {\n    const cached = this.adapterCache.get(name)\n    if (cached) return cached\n\n    const schema = this.schemas.get(name)\n    if (!schema || schema.target !== 'records') return undefined\n    if (!this.recordsCollection) return undefined\n\n    const adapter = new VirtualCollectionAdapter(this.recordsCollection, schema)\n    this.adapterCache.set(name, adapter)\n    return adapter\n  }\n\n  /**\n   * Get or create an encrypted adapter for a schema name.\n   * Returns an {@link EncryptedCollectionAdapter} when a KeyRing is configured,\n   * otherwise returns a plain {@link VirtualCollectionAdapter}.\n   *\n   * Use this when you need transparent field-level encryption on CRUD operations.\n   * Use {@link getAdapter} when you need VCA-specific internals (reactive queries,\n   * selector rewriting, etc.).\n   */\n  getEncryptedAdapter(\n    name: string,\n    userId: string,\n    orgId: string\n  ): VirtualCollectionAdapter | EncryptedCollectionAdapter | undefined {\n    const cacheKey = encryptedAdapterCacheKey(userId, orgId, name)\n    const cached = this.encryptedAdapterCache.get(cacheKey)\n    if (cached) return cached\n\n    const vca = this.getAdapter(name)\n    if (!vca) return undefined\n\n    return this.wrapWithEncryption(userId, orgId, name, vca)\n  }\n\n  /** Get schemas that overlay a primitive collection */\n  getOverlays(primitiveCollection: string): SchemaModel[] {\n    return Array.from(this.schemas.values()).filter(s => s.target === primitiveCollection)\n  }\n\n  /** Clear all cached state */\n  clear(): void {\n    this.schemas.clear()\n    this.adapterCache.clear()\n    this.encryptedAdapterCache.clear()\n    this.encryptionContexts.clear()\n  }\n\n  /**\n   * Configure field-level encryption for the (user, org) session.\n   *\n   * Multi-org callers (service accounts spanning orgs, users with\n   * concurrent vault-unlocks in different orgs) each get their own\n   * encryption entry. Setting context for (userA, orgB) does NOT\n   * disturb (userA, orgA) — earlier sessions stay unlocked.\n   *\n   * Invalidates only the (userId, orgId)-scoped slice of the\n   * encrypted-adapter cache so other unlocked sessions keep their\n   * cached encrypted adapters.\n   *\n   * @param userId  - Caller's verified userId (from JWT sub/userId claim)\n   * @param orgId   - Caller's verified orgId (from JWT orgId claim)\n   * @param keyRing - The KeyRing used for encrypt/decrypt operations\n   * @param context - Encryption context (orgId, workspaceId, userId)\n   * @param lookupKey - Optional key lookup function for group key resolution\n   */\n  setEncryptionContext(\n    userId: string,\n    orgId: string,\n    keyRing: KeyRing,\n    context: EncryptionContext,\n    lookupKey?: KeyLookupFn\n  ): void {\n    const ctxKey = encryptionContextKey(userId, orgId)\n    const entry: EncryptionEntry = lookupKey\n      ? { keyRing, context, lookupKey }\n      : { keyRing, context }\n    this.encryptionContexts.set(ctxKey, entry)\n    // Invalidate only this session's encrypted-adapter cache so a\n    // pending re-lock followed by a fresh unlock rebuilds adapters\n    // against the new keyRing — other (user, org) sessions keep\n    // their cached adapters.\n    const prefix = `${ctxKey}:`\n    for (const cacheKey of this.encryptedAdapterCache.keys()) {\n      if (cacheKey.startsWith(prefix)) this.encryptedAdapterCache.delete(cacheKey)\n    }\n  }\n\n  /**\n   * Clear the (user, org) encryption entry — encrypted adapters for\n   * THIS session resolve to plain VCA again. Other unlocked\n   * sessions are unaffected.\n   */\n  clearEncryptionContext(userId: string, orgId: string): void {\n    const ctxKey = encryptionContextKey(userId, orgId)\n    this.encryptionContexts.delete(ctxKey)\n    const prefix = `${ctxKey}:`\n    for (const cacheKey of this.encryptedAdapterCache.keys()) {\n      if (cacheKey.startsWith(prefix)) this.encryptedAdapterCache.delete(cacheKey)\n    }\n  }\n\n  /**\n   * Drop ALL encryption contexts and cached encrypted adapters.\n   * Called from `MCPServer.close()` during shutdown so key material\n   * doesn't outlive the process.\n   */\n  clearAllEncryptionContexts(): void {\n    this.encryptionContexts.clear()\n    this.encryptedAdapterCache.clear()\n  }\n\n  /**\n   * Optionally wrap a VCA with encryption if KeyRing is configured.\n   * Caches the result in the encrypted adapter cache.\n   */\n  private wrapWithEncryption(\n    userId: string,\n    orgId: string,\n    name: string,\n    vca: VirtualCollectionAdapter\n  ): VirtualCollectionAdapter | EncryptedCollectionAdapter {\n    const ctxKey = encryptionContextKey(userId, orgId)\n    const entry = this.encryptionContexts.get(ctxKey)\n    if (entry) {\n      const schema = this.schemas.get(name)\n      if (schema) {\n        const encrypted = new EncryptedCollectionAdapter(\n          vca,\n          schema,\n          entry.keyRing,\n          entry.context,\n          entry.lookupKey\n        )\n        this.encryptedAdapterCache.set(encryptedAdapterCacheKey(userId, orgId, name), encrypted)\n        return encrypted\n      }\n    }\n    return vca\n  }\n\n  /** Normalize a DB document (RxDB or REST plain object) to a SchemaModel. */\n  private static docToSchema(doc: unknown): SchemaModel {\n    const obj = doc as { toJSON?: () => Record<string, unknown> }\n    return (typeof obj.toJSON === 'function'\n      ? obj.toJSON()\n      : doc) as unknown as SchemaModel\n  }\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Local-only implementation of useRecords backed by RxDB.\n *\n * Queries and mutates virtual collections via SchemaRegistry and\n * VirtualCollectionAdapter. Extracted from useRecords for mode routing.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { SchemaRegistry } from '../../../core/SchemaRegistry'\nimport { VirtualCollectionAdapter, wrapRxCollection } from '../../../core/VirtualCollectionAdapter'\nimport type { RecordModel } from '../../../models/Record'\n\nexport interface UseLocalRecordsOptions {\n  selector?: Record<string, unknown>\n  sort?: Array<Record<string, string>>\n  limit?: number\n  skip?: number\n  orgId?: string\n  workspaceId?: string\n}\n\nexport interface UseLocalRecordsResult<T = Record<string, unknown>> {\n  data: T[]\n  isLoading: boolean\n  error: Error | null\n  create: (doc: Partial<T>) => Promise<T>\n  update: (id: string, updates: Partial<T>) => Promise<T | null>\n  remove: (id: string) => Promise<boolean>\n  refresh: () => void\n}\n\n// Module-level cache: one SchemaRegistry per db instance\nconst registryCache = new WeakMap<object, SchemaRegistry>()\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getOrCreateRegistry(db: Record<string, any>): SchemaRegistry {\n  let registry = registryCache.get(db as object)\n  if (!registry) {\n    registry = new SchemaRegistry(\n      db.schemas as ConstructorParameters<typeof SchemaRegistry>[0],\n      wrapRxCollection(db.records)\n    )\n    registryCache.set(db as object, registry)\n  }\n  return registry\n}\n\nconst EMPTY_DATA: never[] = []\nconst NOOP_CREATE = async (): Promise<never> => {\n  throw new Error('useLocalRecords: not initialized')\n}\nconst NOOP_UPDATE = async (): Promise<null> => {\n  throw new Error('useLocalRecords: not initialized')\n}\nconst NOOP_REMOVE = async (): Promise<boolean> => {\n  throw new Error('useLocalRecords: not initialized')\n}\nconst NOOP_REFRESH = (): void => {}\n\n/**\n * Generic React hook for querying and mutating virtual collections\n * backed by the `records` table via `SchemaRegistry` and `VirtualCollectionAdapter`\n * (local RxDB path only).\n *\n * @param db - RxDB database instance (must have `schemas` and `records` collections)\n * @param schemaName - Name of the virtual collection schema (e.g. 'products', 'codebases')\n * @param options - Query options: selector, sort, limit, skip, orgId\n * @returns Reactive data array, loading/error state, and CRUD mutations\n */\nexport function useLocalRecords<T = Record<string, unknown>>(\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  db: Record<string, any> | null | undefined,\n  schemaName: string,\n  options: UseLocalRecordsOptions = {}\n): UseLocalRecordsResult<T> {\n  const [data, setData] = useState<T[]>(EMPTY_DATA)\n  const [isLoading, setIsLoading] = useState(db != null)\n  const [error, setError] = useState<Error | null>(null)\n  const adapterRef = useRef<VirtualCollectionAdapter | null>(null)\n  const [refreshTrigger, setRefreshTrigger] = useState(0)\n\n  // Serialize options for dependency comparison\n  const selectorKey = JSON.stringify(options.selector ?? {})\n  const sortKey = JSON.stringify(options.sort ?? [])\n  const { limit, skip, orgId, workspaceId } = options\n\n  useEffect(() => {\n    if (!db) {\n      // eslint-disable-next-line react-hooks/set-state-in-effect -- Reset to defaults when db removed\n      setData(EMPTY_DATA)\n      // eslint-disable-next-line react-hooks/set-state-in-effect\n      setIsLoading(false)\n      // eslint-disable-next-line react-hooks/set-state-in-effect\n      setError(null)\n      return\n    }\n\n    let cancelled = false\n    let subscription: { unsubscribe: () => void } | null = null\n\n    async function init() {\n      try {\n        setIsLoading(true)\n        setError(null)\n\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        const registry = getOrCreateRegistry(db!)\n\n        // Load schemas if registry doesn't have this schema yet\n        if (!registry.hasSchema(schemaName)) {\n          await registry.loadSchemas(orgId ?? '')\n        }\n\n        // If schema still not found, retry once after a short delay.\n        // This handles the race condition where useRecords runs before\n        // schema seeding (triggered on app startup) has completed.\n        if (!registry.hasSchema(schemaName)) {\n          await new Promise(resolve => setTimeout(resolve, 1500))\n          if (cancelled) return\n          await registry.loadSchemas(orgId ?? '')\n        }\n\n        const adapter = registry.getAdapter(schemaName)\n        if (!adapter) {\n          if (!cancelled) {\n            setError(new Error(`Schema '${schemaName}' not found or not a records-target schema`))\n            setIsLoading(false)\n            setData(EMPTY_DATA)\n          }\n          return\n        }\n\n        adapterRef.current = adapter\n\n        // Build the RxDB query — only top-level fields go to RxDB,\n        // data-bag fields are filtered client-side after mapping.\n        // Parse from serialized keys so the linter sees the deps match.\n        const selector = JSON.parse(selectorKey) as Record<string, unknown>\n\n        // Auto-inject org/workspace context into the selector so queries\n        // are scoped to the current tenant. Callers pass orgId/workspaceId\n        // in options; we merge them here so every consumer gets filtering\n        // without needing to duplicate context in both options and selector.\n        if (orgId && !selector.orgId) selector.orgId = orgId\n        if (workspaceId && !selector.workspaceId) selector.workspaceId = workspaceId\n\n        const rewrittenSelector = adapter.rewriteSelector(selector)\n        const dataFilter = adapter.extractDataFilter(selector)\n        const hasDataFilter = Object.keys(dataFilter).length > 0\n\n        // Split sort into RxDB-safe and client-side parts\n        const sortOpts = JSON.parse(sortKey) as Array<Record<string, 'asc' | 'desc'>>\n        const dbSort = adapter.rewriteSort(sortOpts)\n        const clientSort = adapter.extractClientSort(sortOpts)\n\n        const records = (db as Record<string, unknown>).records as {\n          find(q: { selector: Record<string, unknown>; sort?: Array<Record<string, string>> }): {\n            skip(n: number): unknown\n            limit(n: number): unknown\n            $: { subscribe(fn: (docs: unknown[]) => void): { unsubscribe: () => void } }\n          }\n        }\n\n        // Pass sort in find() options — RxDB's query builder .sort() method\n        // does not handle array-of-objects format correctly (it enters the\n        // array-of-tuples branch, producing {\"0\": \"desc\"} sort fields).\n        const findOptions: {\n          selector: Record<string, unknown>\n          sort?: Array<Record<string, string>>\n        } = { selector: rewrittenSelector }\n        if (dbSort.length > 0) {\n          findOptions.sort = dbSort\n        }\n\n        let query = records.find(findOptions) as {\n          skip(n: number): unknown\n          limit(n: number): unknown\n          $: { subscribe(fn: (docs: unknown[]) => void): { unsubscribe: () => void } }\n        }\n        // When client-side filtering is needed, skip/limit must be applied after filtering\n        if (skip && !hasDataFilter) query = query.skip(skip) as typeof query\n        if (limit && !hasDataFilter) query = query.limit(limit) as typeof query\n\n        // Subscribe for live updates\n        subscription = query.$.subscribe((docs: unknown[]) => {\n          if (cancelled) return\n          let mapped = docs.map(\n            doc =>\n              adapter.mapFromRecord(\n                (doc as { toJSON(): Record<string, unknown> }).toJSON() as unknown as RecordModel\n              ) as unknown as T\n          )\n\n          // Apply client-side data filter for data-bag fields\n          if (hasDataFilter) {\n            mapped = mapped.filter(doc =>\n              VirtualCollectionAdapter.matchesDataFilter(\n                doc as unknown as Record<string, unknown>,\n                dataFilter\n              )\n            )\n          }\n\n          // Apply client-side sort for data-bag fields\n          if (clientSort.length > 0) {\n            mapped = VirtualCollectionAdapter.applyClientSort(\n              mapped as unknown as Record<string, unknown>[],\n              clientSort\n            ) as unknown as T[]\n          }\n\n          // Apply skip/limit after client-side processing if needed\n          if (hasDataFilter) {\n            if (skip) mapped = mapped.slice(skip)\n            if (limit) mapped = mapped.slice(0, limit)\n          }\n\n          setData(mapped)\n          setIsLoading(false)\n        })\n      } catch (err) {\n        if (!cancelled) {\n          setError(err instanceof Error ? err : new Error(String(err)))\n          setIsLoading(false)\n        }\n      }\n    }\n\n    init()\n\n    return () => {\n      cancelled = true\n      subscription?.unsubscribe()\n    }\n  }, [db, schemaName, selectorKey, sortKey, limit, skip, orgId, workspaceId, refreshTrigger])\n\n  const create = useCallback(async (doc: Partial<T>): Promise<T> => {\n    const adapter = adapterRef.current\n    if (!adapter) throw new Error('useLocalRecords: adapter not initialized')\n    const result = await adapter.insert(doc as Record<string, unknown>)\n    return result as unknown as T\n  }, [])\n\n  const update = useCallback(async (id: string, updates: Partial<T>): Promise<T | null> => {\n    const adapter = adapterRef.current\n    if (!adapter) throw new Error('useLocalRecords: adapter not initialized')\n    const result = await adapter.update(id, updates as Record<string, unknown>)\n    return result as unknown as T | null\n  }, [])\n\n  const remove = useCallback(async (id: string): Promise<boolean> => {\n    const adapter = adapterRef.current\n    if (!adapter) throw new Error('useLocalRecords: adapter not initialized')\n    return adapter.remove(id)\n  }, [])\n\n  const refresh = useCallback(() => {\n    setRefreshTrigger(prev => prev + 1)\n  }, [])\n\n  if (!db) {\n    return {\n      data: EMPTY_DATA as T[],\n      isLoading: false,\n      error: null,\n      create: NOOP_CREATE as unknown as UseLocalRecordsResult<T>['create'],\n      update: NOOP_UPDATE as unknown as UseLocalRecordsResult<T>['update'],\n      remove: NOOP_REMOVE as unknown as UseLocalRecordsResult<T>['remove'],\n      refresh: NOOP_REFRESH,\n    }\n  }\n\n  return { data, isLoading, error, create, update, remove, refresh }\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Remote mutation hook backed by D1 REST + @tanstack/react-query.\n *\n * Returns `{ create, update, remove, isLoading, error }` matching\n * the local CRUD shape so consumers can switch modes transparently.\n */\n\nimport { useCallback, useState } from 'react'\nimport { useMutation as useTanstackMutation } from '@tanstack/react-query'\nimport { useCollectionMode } from '../CollectionModeContext'\nimport { collectionKeys } from '../../remote/queryKeys'\n\nexport interface UseRemoteMutationResult<T> {\n  create: (doc: Partial<T>) => Promise<T>\n  update: (id: string, updates: Partial<T>) => Promise<T>\n  remove: (id: string) => Promise<boolean>\n  isLoading: boolean\n  error: Error | null\n}\n\nexport function useRemoteMutation<T extends { id: string }>(\n  collectionName: string,\n): UseRemoteMutationResult<T> {\n  const ctx = useCollectionMode()\n  if (!ctx) throw new Error('useRemoteMutation requires CollectionModeProvider')\n\n  const { client, queryClient } = ctx\n\n  const createMutation = useTanstackMutation<T, Error, Partial<T>>({\n    mutationFn: (doc: Partial<T>) => client.set<T>(collectionName, doc),\n    onSuccess: () => {\n      queryClient.invalidateQueries({ queryKey: collectionKeys.all(collectionName) })\n    },\n  })\n\n  const updateMutation = useTanstackMutation<T, Error, { id: string; updates: Partial<T> }>({\n    mutationFn: ({ id, updates }: { id: string; updates: Partial<T> }) =>\n      client.set<T>(collectionName, { ...updates, id } as Partial<T>),\n    onSuccess: () => {\n      queryClient.invalidateQueries({ queryKey: collectionKeys.all(collectionName) })\n    },\n  })\n\n  const removeMutation = useTanstackMutation<boolean, Error, string>({\n    mutationFn: (id: string) =>\n      client.set<T>(collectionName, { id, _deleted: true } as unknown as Partial<T>)\n        .then(() => true),\n    onSuccess: () => {\n      queryClient.invalidateQueries({ queryKey: collectionKeys.all(collectionName) })\n    },\n  })\n\n  return {\n    create: (doc) => createMutation.mutateAsync(doc),\n    update: (id, updates) => updateMutation.mutateAsync({ id, updates }),\n    remove: (id) => removeMutation.mutateAsync(id),\n    isLoading: createMutation.isPending || updateMutation.isPending || removeMutation.isPending,\n    error: createMutation.error ?? updateMutation.error ?? removeMutation.error ?? null,\n  }\n}\n\n/**\n * Conditional variant safe to use without a CollectionModeProvider.\n *\n * Uses useState/useCallback directly (no tanstack hooks) so it maintains\n * a consistent hook count regardless of whether a provider is mounted.\n * When `collectionName` is null or no provider exists, returns no-op\n * functions that resolve immediately.\n */\nexport function useRemoteMutationConditional<T extends { id: string }>(\n  collectionName: string | null,\n): UseRemoteMutationResult<T> {\n  const ctx = useCollectionMode()\n  const [isLoading, setIsLoading] = useState(false)\n  const [error, setError] = useState<Error | null>(null)\n\n  const create = useCallback(async (doc: Partial<T>): Promise<T> => {\n    if (!ctx || !collectionName) return {} as T\n    setIsLoading(true)\n    setError(null)\n    try {\n      const result = await ctx.client.set<T>(collectionName, doc)\n      ctx.queryClient.invalidateQueries({ queryKey: collectionKeys.all(collectionName) })\n      return result\n    } catch (err) {\n      const e = err instanceof Error ? err : new Error(String(err))\n      setError(e)\n      throw e\n    } finally {\n      setIsLoading(false)\n    }\n  }, [ctx, collectionName])\n\n  const update = useCallback(async (id: string, updates: Partial<T>): Promise<T> => {\n    if (!ctx || !collectionName) return {} as T\n    setIsLoading(true)\n    setError(null)\n    try {\n      const result = await ctx.client.set<T>(collectionName, { ...updates, id } as Partial<T>)\n      ctx.queryClient.invalidateQueries({ queryKey: collectionKeys.all(collectionName) })\n      return result\n    } catch (err) {\n      const e = err instanceof Error ? err : new Error(String(err))\n      setError(e)\n      throw e\n    } finally {\n      setIsLoading(false)\n    }\n  }, [ctx, collectionName])\n\n  const remove = useCallback(async (id: string): Promise<boolean> => {\n    if (!ctx || !collectionName) return false\n    setIsLoading(true)\n    setError(null)\n    try {\n      await ctx.client.set<T>(collectionName, { id, _deleted: true } as unknown as Partial<T>)\n      ctx.queryClient.invalidateQueries({ queryKey: collectionKeys.all(collectionName) })\n      return true\n    } catch (err) {\n      const e = err instanceof Error ? err : new Error(String(err))\n      setError(e)\n      throw e\n    } finally {\n      setIsLoading(false)\n    }\n  }, [ctx, collectionName])\n\n  return { create, update, remove, isLoading, error }\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Records hook with mode routing.\n *\n * Delegates to either local RxDB (useLocalRecords) or remote D1\n * (useRemoteQueryConditional + useRemoteMutationConditional)\n * based on the CollectionModeProvider context.\n *\n * When no provider is mounted, all collections route to local (backward compatible).\n */\n\nimport { useCallback } from 'react'\nimport { useCollectionMode } from '../CollectionModeContext'\nimport { useLocalRecords } from './useLocalRecords'\nimport { useRemoteQueryConditional } from './useRemoteQuery'\nimport { useRemoteMutationConditional } from './useRemoteMutation'\nimport type { UseLocalRecordsResult } from './useLocalRecords'\n\nexport type UseRecordsOptions = import('./useLocalRecords').UseLocalRecordsOptions\n\nexport type UseRecordsResult<T = Record<string, unknown>> = UseLocalRecordsResult<T>\n\n/**\n * Generic React hook for querying and mutating virtual collections.\n *\n * Routes to local RxDB or remote D1 based on CollectionModeProvider context.\n * When no provider is mounted, all collections route to local.\n *\n * @param db - RxDB database instance (must have `schemas` and `records` collections)\n * @param schemaName - Name of the virtual collection schema (e.g. 'products', 'codebases')\n * @param options - Query options: selector, sort, limit, skip, orgId\n * @returns Reactive data array, loading/error state, and CRUD mutations\n */\nexport function useRecords<T = Record<string, unknown>>(\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  db: Record<string, any> | null | undefined,\n  schemaName: string,\n  options: UseRecordsOptions = {}\n): UseRecordsResult<T> {\n  const modeCtx = useCollectionMode()\n  const mode = modeCtx?.getMode(schemaName) ?? 'local'\n  const isRemote = mode === 'remote'\n\n  // Both hook sets always called (rules of hooks), only one is active.\n  const localResult = useLocalRecords<T>(\n    isRemote ? null : db,\n    schemaName,\n    options\n  )\n\n  const remoteQuery = useRemoteQueryConditional<T>(\n    isRemote ? schemaName : null,\n    {\n      selector: options.selector,\n      sort: options.sort as Array<Record<string, 'asc' | 'desc'>> | undefined,\n      limit: options.limit,\n      skip: options.skip,\n    }\n  )\n\n  const remoteMutation = useRemoteMutationConditional<T & { id: string }>(\n    isRemote ? schemaName : null\n  )\n\n  // Remote refresh invalidates the react-query cache\n  const remoteRefresh = useCallback(() => {\n    if (modeCtx) {\n      modeCtx.queryClient.invalidateQueries({ queryKey: [schemaName] })\n    }\n  }, [modeCtx, schemaName])\n\n  if (isRemote) {\n    return {\n      data: remoteQuery.data,\n      isLoading: remoteQuery.isLoading || remoteMutation.isLoading,\n      error: remoteQuery.error ?? remoteMutation.error,\n      create: remoteMutation.create as UseRecordsResult<T>['create'],\n      update: remoteMutation.update as unknown as UseRecordsResult<T>['update'],\n      remove: remoteMutation.remove,\n      refresh: remoteRefresh,\n    }\n  }\n\n  return localResult\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Local-only implementation of useAnyCollection backed by RxDB.\n *\n * Queries either a native RxDB collection or a virtual schema-in-db\n * collection transparently. Extracted from useAnyCollection for mode\n * routing — this file contains the pure RxDB logic.\n */\n\nimport { useEffect, useState } from 'react'\nimport { SchemaRegistry } from '../../../core/SchemaRegistry'\nimport { VirtualCollectionAdapter } from '../../../core/VirtualCollectionAdapter'\nimport type { RecordModel } from '../../../models/Record'\n\nexport interface UseLocalAnyCollectionOptions {\n  /** MongoDB-style selector for filtering */\n  selector?: Record<string, unknown>\n  /** Sort criteria array, e.g. [{ title: 'asc' }] */\n  sort?: Array<Record<string, 'asc' | 'desc'>>\n  /** Maximum number of results */\n  limit?: number\n  /** Number of results to skip */\n  skip?: number\n  /** Organization ID (needed for virtual collection schema loading) */\n  orgId?: string\n}\n\nexport interface UseLocalAnyCollectionResult<T> {\n  data: T[]\n  isLoading: boolean\n  error: Error | null\n}\n\n/**\n * Minimal structural type covering the subset of RxDatabase used by this hook.\n * Accepts both native (db.collections) and virtual (db.schemas + db.records) shapes.\n */\nexport interface AnyDb {\n  /** Native RxDB collections keyed by name */\n  collections?: Record<string, NativeCollection>\n  /** Schema collection for virtual collection support */\n  schemas?: unknown\n  /** Records collection for virtual collection support */\n  records?: unknown\n}\n\n/** Minimal RxDB document type for native collection results */\ninterface RxDoc {\n  toJSON(): Record<string, unknown>\n}\n\n/** Minimal native RxDB collection interface used by this hook */\ninterface NativeCollection {\n  find(q: {\n    selector: Record<string, unknown>\n    sort?: Array<Record<string, 'asc' | 'desc'>>\n  }): NativeQuery\n}\n\ninterface NativeQuery {\n  skip(n: number): NativeQuery\n  limit(n: number): NativeQuery\n  $: {\n    subscribe(observer: { next: (docs: RxDoc[]) => void; error: (err: Error) => void }): {\n      unsubscribe: () => void\n    }\n  }\n}\n\n// Module-level cache: one SchemaRegistry per db instance (separate from useRecords cache)\nconst registryCache = new WeakMap<object, SchemaRegistry>()\n\nfunction getOrCreateRegistry(db: { schemas: unknown; records: unknown }): SchemaRegistry {\n  let registry = registryCache.get(db as object)\n  if (!registry) {\n    registry = new SchemaRegistry(\n      db.schemas as ConstructorParameters<typeof SchemaRegistry>[0],\n      db.records as ConstructorParameters<typeof SchemaRegistry>[1]\n    )\n    registryCache.set(db as object, registry)\n  }\n  return registry\n}\n\nconst EMPTY_DATA: never[] = []\n\n/**\n * React hook that queries either a native RxDB collection or a virtual\n * schema-in-db collection transparently (local path only).\n *\n * - If `collectionName` exists in `db.collections`, queries the native collection.\n * - Otherwise, falls back to SchemaRegistry + VirtualCollectionAdapter (records table).\n *\n * This is a read-only query hook. For CRUD on virtual collections, use `useRecords`.\n *\n * @param db - RxDatabase instance (or null/undefined)\n * @param collectionName - Collection name (native or virtual)\n * @param options - Query options: selector, sort, limit, skip, orgId\n * @returns Reactive data array with loading/error state\n */\nexport function useLocalAnyCollection<T = Record<string, unknown>>(\n  db: AnyDb | null | undefined,\n  collectionName: string,\n  options: UseLocalAnyCollectionOptions = {}\n): UseLocalAnyCollectionResult<T> {\n  const [data, setData] = useState<T[]>(EMPTY_DATA)\n  const [isLoading, setIsLoading] = useState(db !== null && db !== undefined)\n  const [error, setError] = useState<Error | null>(null)\n\n  // Serialize options for dependency comparison\n  const selectorKey = JSON.stringify(options.selector ?? {})\n  const sortKey = JSON.stringify(options.sort ?? [])\n  const { limit, skip, orgId } = options\n\n  useEffect(() => {\n    if (!db) {\n      // eslint-disable-next-line react-hooks/set-state-in-effect -- intentional: reset state when db is unavailable\n      setData(EMPTY_DATA)\n      setIsLoading(false)\n      setError(null)\n      return\n    }\n\n    let cancelled = false\n    let subscription: { unsubscribe: () => void } | null = null\n\n    // Check if this is a native RxDB collection\n    const nativeCollection = db.collections?.[collectionName]\n\n    if (nativeCollection) {\n      // === NATIVE COLLECTION PATH ===\n      setIsLoading(true)\n      setError(null)\n\n      try {\n        const selector = options.selector ?? {}\n        const findOptions: {\n          selector: Record<string, unknown>\n          sort?: Array<Record<string, 'asc' | 'desc'>>\n        } = { selector }\n        if (options.sort && options.sort.length > 0) {\n          findOptions.sort = options.sort\n        }\n\n        let query = nativeCollection.find(findOptions)\n        if (skip) query = query.skip(skip)\n        if (limit) query = query.limit(limit)\n\n        subscription = query.$.subscribe({\n          next: (docs: RxDoc[]) => {\n            if (cancelled) return\n            const mapped = docs.map(d => d.toJSON() as T)\n            setData(mapped)\n            setIsLoading(false)\n          },\n          error: (err: Error) => {\n            if (cancelled) return\n            setError(err)\n            setIsLoading(false)\n          },\n        })\n      } catch (err) {\n        if (!cancelled) {\n          setError(err instanceof Error ? err : new Error(String(err)))\n          setIsLoading(false)\n        }\n      }\n    } else if (db.schemas && db.records) {\n      // === VIRTUAL COLLECTION PATH (schema-in-db) ===\n      // Arrow expression avoids the no-inner-declarations ESLint rule that\n      // prohibits function declarations inside block scopes.\n      const initVirtual = async (): Promise<void> => {\n        try {\n          setIsLoading(true)\n          setError(null)\n\n          const registry = getOrCreateRegistry(db as { schemas: unknown; records: unknown })\n\n          // Load schemas if registry doesn't have this schema yet\n          if (!registry.hasSchema(collectionName)) {\n            await registry.loadSchemas(orgId ?? '')\n          }\n\n          const adapter = registry.getAdapter(collectionName)\n          if (!adapter) {\n            if (!cancelled) {\n              // Not a native collection and not a virtual schema — genuinely missing\n              setData(EMPTY_DATA)\n              setIsLoading(false)\n            }\n            return\n          }\n\n          const selector = options.selector ?? {}\n          const rewrittenSelector = adapter.rewriteSelector(selector)\n          const dataFilter = adapter.extractDataFilter(selector)\n          const hasDataFilter = Object.keys(dataFilter).length > 0\n\n          // Split sort into RxDB-safe and client-side parts\n          const sortOpts = options.sort ?? []\n          const dbSort = adapter.rewriteSort(sortOpts)\n          const clientSort = adapter.extractClientSort(sortOpts)\n\n          const records = db.records as {\n            find(q: { selector: Record<string, unknown>; sort?: Array<Record<string, string>> }): {\n              skip(n: number): unknown\n              limit(n: number): unknown\n              $: {\n                subscribe(fn: { next: (docs: unknown[]) => void; error: (err: Error) => void }): {\n                  unsubscribe: () => void\n                }\n              }\n            }\n          }\n\n          const findOptions: {\n            selector: Record<string, unknown>\n            sort?: Array<Record<string, string>>\n          } = { selector: rewrittenSelector }\n          if (dbSort.length > 0) {\n            findOptions.sort = dbSort\n          }\n\n          let query = records.find(findOptions) as {\n            skip(n: number): unknown\n            limit(n: number): unknown\n            $: {\n              subscribe(fn: { next: (docs: unknown[]) => void; error: (err: Error) => void }): {\n                unsubscribe: () => void\n              }\n            }\n          }\n\n          if (skip && !hasDataFilter) query = query.skip(skip) as typeof query\n          if (limit && !hasDataFilter) query = query.limit(limit) as typeof query\n\n          subscription = query.$.subscribe({\n            next: (docs: unknown[]) => {\n              if (cancelled) return\n              let mapped = docs.map(\n                doc =>\n                  adapter.mapFromRecord(\n                    (\n                      doc as { toJSON(): Record<string, unknown> }\n                    ).toJSON() as unknown as RecordModel\n                  ) as unknown as T\n              )\n\n              // Apply client-side data filter for data-bag fields\n              if (hasDataFilter) {\n                mapped = mapped.filter(doc =>\n                  VirtualCollectionAdapter.matchesDataFilter(\n                    doc as unknown as Record<string, unknown>,\n                    dataFilter\n                  )\n                )\n              }\n\n              // Apply client-side sort for data-bag fields\n              if (clientSort.length > 0) {\n                mapped = VirtualCollectionAdapter.applyClientSort(\n                  mapped as unknown as Record<string, unknown>[],\n                  clientSort\n                ) as unknown as T[]\n              }\n\n              // Apply skip/limit after client-side processing if needed\n              if (hasDataFilter) {\n                if (skip) mapped = mapped.slice(skip)\n                if (limit) mapped = mapped.slice(0, limit)\n              }\n\n              setData(mapped)\n              setIsLoading(false)\n            },\n            error: (err: Error) => {\n              if (cancelled) return\n              setError(err)\n              setIsLoading(false)\n            },\n          })\n        } catch (err) {\n          if (!cancelled) {\n            setError(err instanceof Error ? err : new Error(String(err)))\n            setIsLoading(false)\n          }\n        }\n      }\n\n      initVirtual()\n    } else {\n      // No native collection and no schema-in-db support\n      // eslint-disable-next-line react-hooks/set-state-in-effect -- intentional: reset state for unsupported collection\n      setData(EMPTY_DATA)\n      setIsLoading(false)\n      setError(null)\n    }\n\n    return () => {\n      cancelled = true\n      subscription?.unsubscribe()\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps -- selector/sort serialized as selectorKey/sortKey\n  }, [db, collectionName, selectorKey, sortKey, limit, skip, orgId])\n\n  return { data, isLoading, error }\n}\n","// Copyright 2026 Epic Digital Interactive Media LLC\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Unified collection query hook with mode routing.\n *\n * Delegates to either local RxDB (useLocalAnyCollection) or remote D1\n * (useRemoteQueryConditional) based on the CollectionModeProvider context.\n *\n * When no provider is mounted, all collections route to local (backward compatible).\n */\n\nimport { useCollectionMode } from '../CollectionModeContext'\nimport { useLocalAnyCollection } from './useLocalAnyCollection'\nimport { useRemoteQueryConditional } from './useRemoteQuery'\nimport type { UseLocalAnyCollectionResult, AnyDb } from './useLocalAnyCollection'\n\nexport type UseAnyCollectionOptions = import('./useLocalAnyCollection').UseLocalAnyCollectionOptions\n\nexport type UseAnyCollectionResult<T> = UseLocalAnyCollectionResult<T>\n\n/**\n * React hook that queries either a native RxDB collection or a virtual\n * schema-in-db collection transparently.\n *\n * Routes to local RxDB or remote D1 based on CollectionModeProvider context.\n * When no provider is mounted, all collections route to local.\n *\n * @param db - RxDatabase instance (or null/undefined)\n * @param collectionName - Collection name (native or virtual)\n * @param options - Query options: selector, sort, limit, skip, orgId\n * @returns Reactive data array with loading/error state\n */\nexport function useAnyCollection<T = Record<string, unknown>>(\n  db: AnyDb | null | undefined,\n  collectionName: string,\n  options: UseAnyCollectionOptions = {}\n): UseAnyCollectionResult<T> {\n  const modeCtx = useCollectionMode()\n  const mode = modeCtx?.getMode(collectionName) ?? 'local'\n  const isRemote = mode === 'remote'\n\n  // Both hooks are always called (rules of hooks) but only one is active.\n  const localResult = useLocalAnyCollection<T>(\n    isRemote ? null : db,\n    collectionName,\n    options\n  )\n\n  const remoteResult = useRemoteQueryConditional<T>(\n    isRemote ? collectionName : null,\n    {\n      selector: options.selector,\n      sort: options.sort,\n      limit: options.limit,\n      skip: options.skip,\n    }\n  )\n\n  return isRemote ? remoteResult : localResult\n}\n"]}