{"version":3,"sources":["../../src/admin/AdminProvider.tsx","../../src/admin/types.ts","../../src/admin/errors.ts","../../src/admin/DotdoDataProvider.ts","../../src/admin/useResource.ts","../../src/admin/useResourceRecord.ts","../../src/admin/schema.ts","../../src/admin/cache.ts"],"names":["React","jsx","React2","React3","React4"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Admin Provider\n *\n * React context provider for the admin data layer.\n * Manages the data provider and resource configurations.\n *\n * @module @dotdo/react/admin\n */\n\nimport * as React from 'react'\nimport type { DataProvider, ResourceConfig, BaseRecord } from './types'\n\n// =============================================================================\n// Context Types\n// =============================================================================\n\n/**\n * Value provided by AdminProvider context\n */\nexport interface AdminContextValue {\n  /** The data provider instance */\n  dataProvider: DataProvider\n  /** Registered resource configurations */\n  resources: Map<string, ResourceConfig>\n  /** Register a resource configuration */\n  registerResource: <T extends BaseRecord>(config: ResourceConfig<T>) => void\n  /** Unregister a resource */\n  unregisterResource: (name: string) => void\n  /** Get resource configuration by name */\n  getResource: (name: string) => ResourceConfig | undefined\n  /** Invalidate cache for a resource */\n  invalidateResource: (name: string) => void\n  /** Global loading state across all resources */\n  isLoading: boolean\n}\n\n/**\n * Props for AdminProvider component\n */\nexport interface AdminProviderProps {\n  /** The data provider to use for all operations */\n  dataProvider: DataProvider\n  /** Child components */\n  children: React.ReactNode\n  /** Initial resource configurations */\n  resources?: ResourceConfig[]\n}\n\n// =============================================================================\n// Context\n// =============================================================================\n\nconst AdminContext = React.createContext<AdminContextValue | null>(null)\nAdminContext.displayName = 'AdminContext'\n\n// =============================================================================\n// Provider Component\n// =============================================================================\n\n/**\n * Admin context provider.\n *\n * Wraps your admin application to provide data access to all child components.\n *\n * @example\n * ```tsx\n * import { AdminProvider, DotdoDataProvider } from '@dotdo/react/admin'\n *\n * function App() {\n *   const dataProvider = DotdoDataProvider({\n *     ns: 'https://api.example.com.ai/do/workspace'\n *   })\n *\n *   return (\n *     <AdminProvider dataProvider={dataProvider}>\n *       <AdminRoutes />\n *     </AdminProvider>\n *   )\n * }\n * ```\n */\nexport function AdminProvider({\n  dataProvider,\n  children,\n  resources: initialResources = [],\n}: AdminProviderProps): React.ReactElement {\n  // Resource registry\n  const [resources, setResources] = React.useState<Map<string, ResourceConfig>>(\n    () => {\n      const map = new Map<string, ResourceConfig>()\n      for (const config of initialResources) {\n        map.set(config.name, config)\n      }\n      return map\n    }\n  )\n\n  // Track global loading state\n  const [loadingCount, setLoadingCount] = React.useState(0)\n\n  // Cache invalidation version (increments to trigger refetches)\n  const [cacheVersions, setCacheVersions] = React.useState<\n    Map<string, number>\n  >(new Map())\n\n  // Register a resource configuration\n  const registerResource = React.useCallback(\n    <T extends BaseRecord>(config: ResourceConfig<T>) => {\n      setResources((prev) => {\n        const next = new Map(prev)\n        next.set(config.name, config as unknown as ResourceConfig)\n        return next\n      })\n    },\n    []\n  )\n\n  // Unregister a resource\n  const unregisterResource = React.useCallback((name: string) => {\n    setResources((prev) => {\n      const next = new Map(prev)\n      next.delete(name)\n      return next\n    })\n  }, [])\n\n  // Get resource configuration\n  const getResource = React.useCallback(\n    (name: string): ResourceConfig | undefined => {\n      return resources.get(name)\n    },\n    [resources]\n  )\n\n  // Invalidate cache for a resource\n  const invalidateResource = React.useCallback((name: string) => {\n    setCacheVersions((prev) => {\n      const next = new Map(prev)\n      next.set(name, (prev.get(name) || 0) + 1)\n      return next\n    })\n  }, [])\n\n  // Memoize context value\n  const value = React.useMemo<AdminContextValue>(\n    () => ({\n      dataProvider,\n      resources,\n      registerResource,\n      unregisterResource,\n      getResource,\n      invalidateResource,\n      isLoading: loadingCount > 0,\n    }),\n    [\n      dataProvider,\n      resources,\n      registerResource,\n      unregisterResource,\n      getResource,\n      invalidateResource,\n      loadingCount,\n    ]\n  )\n\n  return <AdminContext.Provider value={value}>{children}</AdminContext.Provider>\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\n/**\n * Hook to access the admin context.\n *\n * Must be used within an AdminProvider.\n *\n * @returns The admin context value\n * @throws Error if used outside of AdminProvider\n */\nexport function useAdminContext(): AdminContextValue {\n  const context = React.useContext(AdminContext)\n  if (!context) {\n    throw new Error('useAdminContext must be used within an AdminProvider')\n  }\n  return context\n}\n\n/**\n * Hook to check if we're inside an AdminProvider\n */\nexport function useIsAdminContext(): boolean {\n  return React.useContext(AdminContext) !== null\n}\n","/**\n * Data Provider Types\n *\n * Core types for the data provider abstraction layer.\n * Based on React Admin's DataProvider pattern for familiarity.\n *\n * @module @dotdo/react/admin\n */\n\nimport type { ZodSchema } from 'zod'\n\n// =============================================================================\n// Base Types\n// =============================================================================\n\n/**\n * Base interface for items with an ID.\n * All resource items must have a unique identifier.\n */\nexport interface BaseRecord {\n  /** Unique identifier - can be $id (dotdo) or id (standard) */\n  $id?: string\n  id?: string\n  [key: string]: unknown\n}\n\n/**\n * Get the ID from a record, supporting both $id and id formats\n */\nexport function getRecordId(record: BaseRecord): string {\n  return record.$id ?? record.id ?? ''\n}\n\n/**\n * Sort order for list queries\n */\nexport type SortOrder = 'asc' | 'desc'\n\n/**\n * Filter operators for queries\n */\nexport type FilterOperator =\n  | 'eq'      // equals\n  | 'neq'     // not equals\n  | 'gt'      // greater than\n  | 'gte'     // greater than or equal\n  | 'lt'      // less than\n  | 'lte'     // less than or equal\n  | 'contains' // string contains\n  | 'startsWith'\n  | 'endsWith'\n  | 'in'      // value in array\n  | 'nin'     // value not in array\n\n/**\n * Query filter definition\n */\nexport interface QueryFilter {\n  field: string\n  operator: FilterOperator\n  value: unknown\n}\n\n// =============================================================================\n// Method Parameters\n// =============================================================================\n\n/**\n * Parameters for getList operation\n */\nexport interface GetListParams {\n  /** Resource name (e.g., 'User', 'Task') */\n  resource: string\n  /** Pagination settings */\n  pagination?: {\n    page: number\n    perPage: number\n  }\n  /** Sort settings */\n  sort?: {\n    field: string\n    order: SortOrder\n  }\n  /** Filters to apply */\n  filter?: Record<string, unknown> | QueryFilter[]\n  /** Fields to select (projection) */\n  select?: string[]\n}\n\n/**\n * Result from getList operation\n */\nexport interface GetListResult<T extends BaseRecord = BaseRecord> {\n  /** Array of records */\n  data: T[]\n  /** Total count for pagination */\n  total: number\n  /** Cursor for cursor-based pagination */\n  cursor?: string | null\n  /** Whether more pages exist */\n  hasMore?: boolean\n}\n\n/**\n * Parameters for getOne operation\n */\nexport interface GetOneParams {\n  /** Resource name */\n  resource: string\n  /** Record ID */\n  id: string\n  /** Fields to select (projection) */\n  select?: string[]\n}\n\n/**\n * Result from getOne operation\n */\nexport interface GetOneResult<T extends BaseRecord = BaseRecord> {\n  data: T\n}\n\n/**\n * Parameters for getMany operation (batch get by IDs)\n */\nexport interface GetManyParams {\n  /** Resource name */\n  resource: string\n  /** Array of record IDs */\n  ids: string[]\n  /** Fields to select (projection) */\n  select?: string[]\n}\n\n/**\n * Result from getMany operation\n */\nexport interface GetManyResult<T extends BaseRecord = BaseRecord> {\n  data: T[]\n}\n\n/**\n * Parameters for create operation\n */\nexport interface CreateParams<T extends BaseRecord = BaseRecord> {\n  /** Resource name */\n  resource: string\n  /** Data to create (without ID) */\n  data: Omit<T, '$id' | 'id'>\n}\n\n/**\n * Result from create operation\n */\nexport interface CreateResult<T extends BaseRecord = BaseRecord> {\n  data: T\n}\n\n/**\n * Parameters for update operation\n */\nexport interface UpdateParams<T extends BaseRecord = BaseRecord> {\n  /** Resource name */\n  resource: string\n  /** Record ID to update */\n  id: string\n  /** Partial data to update */\n  data: Partial<Omit<T, '$id' | 'id'>>\n  /** Previous data for optimistic updates */\n  previousData?: T\n}\n\n/**\n * Result from update operation\n */\nexport interface UpdateResult<T extends BaseRecord = BaseRecord> {\n  data: T\n}\n\n/**\n * Parameters for delete operation\n */\nexport interface DeleteParams<T extends BaseRecord = BaseRecord> {\n  /** Resource name */\n  resource: string\n  /** Record ID to delete */\n  id: string\n  /** Previous data for rollback */\n  previousData?: T\n}\n\n/**\n * Result from delete operation\n */\nexport interface DeleteResult<T extends BaseRecord = BaseRecord> {\n  data: T\n}\n\n/**\n * Parameters for deleteMany operation\n */\nexport interface DeleteManyParams {\n  /** Resource name */\n  resource: string\n  /** Array of record IDs to delete */\n  ids: string[]\n}\n\n/**\n * Result from deleteMany operation\n */\nexport interface DeleteManyResult {\n  /** Array of deleted record IDs */\n  data: string[]\n}\n\n// =============================================================================\n// Data Provider Interface\n// =============================================================================\n\n/**\n * Data Provider interface.\n *\n * Abstraction layer that allows swapping backends.\n * Implementations include DotdoDataProvider, MockDataProvider, etc.\n *\n * @example\n * ```ts\n * const provider: DataProvider = {\n *   getList: async (params) => { ... },\n *   getOne: async (params) => { ... },\n *   create: async (params) => { ... },\n *   // ...\n * }\n * ```\n */\nexport interface DataProvider {\n  /**\n   * Get a list of records with pagination, sorting, and filtering\n   */\n  getList<T extends BaseRecord = BaseRecord>(\n    params: GetListParams\n  ): Promise<GetListResult<T>>\n\n  /**\n   * Get a single record by ID\n   */\n  getOne<T extends BaseRecord = BaseRecord>(\n    params: GetOneParams\n  ): Promise<GetOneResult<T>>\n\n  /**\n   * Get multiple records by their IDs\n   */\n  getMany<T extends BaseRecord = BaseRecord>(\n    params: GetManyParams\n  ): Promise<GetManyResult<T>>\n\n  /**\n   * Create a new record\n   */\n  create<T extends BaseRecord = BaseRecord>(\n    params: CreateParams<T>\n  ): Promise<CreateResult<T>>\n\n  /**\n   * Update an existing record\n   */\n  update<T extends BaseRecord = BaseRecord>(\n    params: UpdateParams<T>\n  ): Promise<UpdateResult<T>>\n\n  /**\n   * Delete a record by ID\n   */\n  delete<T extends BaseRecord = BaseRecord>(\n    params: DeleteParams<T>\n  ): Promise<DeleteResult<T>>\n\n  /**\n   * Delete multiple records by their IDs\n   */\n  deleteMany(params: DeleteManyParams): Promise<DeleteManyResult>\n\n  /**\n   * Subscribe to real-time updates for a resource.\n   * Returns an unsubscribe function.\n   */\n  subscribe?<T extends BaseRecord = BaseRecord>(\n    resource: string,\n    callback: (event: SubscriptionEvent<T>) => void\n  ): () => void\n}\n\n/**\n * Real-time subscription event types\n */\nexport type SubscriptionEventType = 'created' | 'updated' | 'deleted'\n\n/**\n * Real-time subscription event\n */\nexport interface SubscriptionEvent<T extends BaseRecord = BaseRecord> {\n  type: SubscriptionEventType\n  resource: string\n  data?: T\n  id?: string\n}\n\n// =============================================================================\n// Configuration Types\n// =============================================================================\n\n/**\n * Configuration for creating a DataProvider\n */\nexport interface DataProviderConfig {\n  /** Base URL for API calls */\n  baseUrl?: string\n  /** Custom headers for requests */\n  headers?: Record<string, string>\n  /** Timeout in milliseconds */\n  timeout?: number\n  /** Enable real-time subscriptions */\n  realtime?: boolean\n}\n\n/**\n * Resource-specific configuration\n */\nexport interface ResourceConfig<T extends BaseRecord = BaseRecord> {\n  /** Resource name (e.g., 'User') */\n  name: string\n  /** Zod schema for validation */\n  schema?: ZodSchema<T>\n  /** Default sort settings */\n  defaultSort?: {\n    field: keyof T & string\n    order: SortOrder\n  }\n  /** Default filters */\n  defaultFilter?: Record<string, unknown>\n  /** Fields to always include */\n  defaultSelect?: (keyof T & string)[]\n  /** Enable optimistic updates */\n  optimistic?: boolean\n  /** Cache TTL in milliseconds */\n  cacheTTL?: number\n}\n","/**\n * Admin Error Handling\n *\n * Unified error types and utilities for the admin data layer.\n *\n * @module @dotdo/react/admin\n */\n\n// =============================================================================\n// Error Codes\n// =============================================================================\n\n/**\n * Error codes for admin operations\n */\nexport type AdminErrorCode =\n  | 'VALIDATION_ERROR'\n  | 'NOT_FOUND'\n  | 'NETWORK_ERROR'\n  | 'UNAUTHORIZED'\n  | 'FORBIDDEN'\n  | 'CONFLICT'\n  | 'RATE_LIMITED'\n  | 'SERVER_ERROR'\n  | 'TIMEOUT'\n  | 'UNKNOWN'\n\n// =============================================================================\n// Error Details\n// =============================================================================\n\n/**\n * Detailed error information\n */\nexport interface AdminErrorDetails {\n  /** Error code for programmatic handling */\n  code: AdminErrorCode\n  /** Human-readable message */\n  message: string\n  /** HTTP status code if applicable */\n  status?: number\n  /** Resource name where error occurred */\n  resource?: string\n  /** Record ID if applicable */\n  recordId?: string\n  /** Field-level validation errors */\n  fieldErrors?: Record<string, string[]>\n  /** Original error for debugging */\n  originalError?: unknown\n  /** Whether the operation can be retried */\n  retryable?: boolean\n  /** Suggested retry delay in ms */\n  retryAfter?: number\n}\n\n// =============================================================================\n// AdminError Class\n// =============================================================================\n\n/**\n * Structured error class for admin operations.\n *\n * Provides consistent error handling across all data provider operations.\n *\n * @example\n * ```ts\n * try {\n *   await dataProvider.create({ resource: 'User', data })\n * } catch (err) {\n *   if (isAdminError(err) && err.code === 'VALIDATION_ERROR') {\n *     // Handle validation errors\n *     console.log(err.fieldErrors)\n *   }\n * }\n * ```\n */\nexport class AdminError extends Error {\n  readonly code: AdminErrorCode\n  readonly status?: number\n  readonly resource?: string\n  readonly recordId?: string\n  readonly fieldErrors?: Record<string, string[]>\n  readonly originalError?: unknown\n  readonly retryable: boolean\n  readonly retryAfter?: number\n\n  constructor(details: AdminErrorDetails) {\n    super(details.message)\n    this.name = 'AdminError'\n    this.code = details.code\n    this.status = details.status\n    this.resource = details.resource\n    this.recordId = details.recordId\n    this.fieldErrors = details.fieldErrors\n    this.originalError = details.originalError\n    this.retryable = details.retryable ?? isRetryableCode(details.code)\n    this.retryAfter = details.retryAfter\n\n    // Maintain proper stack trace in V8 environments\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, AdminError)\n    }\n\n    // Ensure instanceof works correctly\n    Object.setPrototypeOf(this, AdminError.prototype)\n  }\n\n  /**\n   * Create an AdminError from an HTTP response\n   */\n  static fromResponse(\n    response: Response,\n    resource?: string,\n    body?: unknown\n  ): AdminError {\n    const code = httpStatusToCode(response.status)\n    const message = extractMessage(body, response.statusText)\n\n    return new AdminError({\n      code,\n      message,\n      status: response.status,\n      resource,\n      fieldErrors: extractFieldErrors(body),\n      retryable: response.status >= 500 || response.status === 429,\n      retryAfter: parseRetryAfter(response.headers.get('Retry-After')),\n    })\n  }\n\n  /**\n   * Create an AdminError from a network error\n   */\n  static fromNetworkError(error: Error, resource?: string): AdminError {\n    return new AdminError({\n      code: 'NETWORK_ERROR',\n      message: `Network error: ${error.message}`,\n      resource,\n      originalError: error,\n      retryable: true,\n    })\n  }\n\n  /**\n   * Create an AdminError from a validation error\n   */\n  static fromValidation(\n    fieldErrors: Record<string, string[]>,\n    resource?: string\n  ): AdminError {\n    const fieldMessages = Object.entries(fieldErrors)\n      .map(([field, messages]) => `${field}: ${messages.join(', ')}`)\n      .join('; ')\n\n    return new AdminError({\n      code: 'VALIDATION_ERROR',\n      message: `Validation failed - ${fieldMessages}`,\n      resource,\n      fieldErrors,\n      retryable: false,\n    })\n  }\n\n  /**\n   * Create a not found error\n   */\n  static notFound(resource: string, id: string): AdminError {\n    return new AdminError({\n      code: 'NOT_FOUND',\n      message: `${resource} with ID ${id} not found`,\n      status: 404,\n      resource,\n      recordId: id,\n      retryable: false,\n    })\n  }\n\n  /**\n   * Get a user-friendly error message\n   */\n  toUserMessage(): string {\n    switch (this.code) {\n      case 'VALIDATION_ERROR':\n        return 'Please check the form for errors and try again.'\n      case 'NOT_FOUND':\n        return 'The requested item could not be found.'\n      case 'NETWORK_ERROR':\n        return 'Unable to connect. Please check your internet connection.'\n      case 'UNAUTHORIZED':\n        return 'Please log in to continue.'\n      case 'FORBIDDEN':\n        return 'You do not have permission to perform this action.'\n      case 'CONFLICT':\n        return 'This item has been modified. Please refresh and try again.'\n      case 'RATE_LIMITED':\n        return 'Too many requests. Please wait a moment and try again.'\n      case 'TIMEOUT':\n        return 'The request took too long. Please try again.'\n      case 'SERVER_ERROR':\n        return 'Something went wrong on our end. Please try again later.'\n      default:\n        return 'An unexpected error occurred. Please try again.'\n    }\n  }\n}\n\n// =============================================================================\n// Type Guards and Utilities\n// =============================================================================\n\n/**\n * Type guard to check if an error is an AdminError\n */\nexport function isAdminError(error: unknown): error is AdminError {\n  return error instanceof AdminError\n}\n\n/**\n * Format any error into an AdminError\n */\nexport function formatAdminError(\n  error: unknown,\n  resource?: string\n): AdminError {\n  if (isAdminError(error)) {\n    return error\n  }\n\n  if (error instanceof Error) {\n    // Check for network-related errors\n    if (\n      error.name === 'TypeError' ||\n      error.message.includes('fetch') ||\n      error.message.includes('network')\n    ) {\n      return AdminError.fromNetworkError(error, resource)\n    }\n\n    return new AdminError({\n      code: 'UNKNOWN',\n      message: error.message,\n      resource,\n      originalError: error,\n    })\n  }\n\n  return new AdminError({\n    code: 'UNKNOWN',\n    message: String(error),\n    resource,\n    originalError: error,\n  })\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Map HTTP status codes to AdminErrorCode\n */\nfunction httpStatusToCode(status: number): AdminErrorCode {\n  if (status === 400) return 'VALIDATION_ERROR'\n  if (status === 401) return 'UNAUTHORIZED'\n  if (status === 403) return 'FORBIDDEN'\n  if (status === 404) return 'NOT_FOUND'\n  if (status === 409) return 'CONFLICT'\n  if (status === 429) return 'RATE_LIMITED'\n  if (status === 408) return 'TIMEOUT'\n  if (status >= 500) return 'SERVER_ERROR'\n  return 'UNKNOWN'\n}\n\n/**\n * Check if an error code is retryable\n */\nfunction isRetryableCode(code: AdminErrorCode): boolean {\n  return ['NETWORK_ERROR', 'RATE_LIMITED', 'TIMEOUT', 'SERVER_ERROR'].includes(\n    code\n  )\n}\n\n/**\n * Extract error message from response body\n */\nfunction extractMessage(body: unknown, fallback: string): string {\n  if (body && typeof body === 'object') {\n    const obj = body as Record<string, unknown>\n    if (typeof obj.message === 'string') return obj.message\n    if (typeof obj.error === 'string') return obj.error\n    if (obj.error && typeof obj.error === 'object') {\n      const err = obj.error as Record<string, unknown>\n      if (typeof err.message === 'string') return err.message\n    }\n  }\n  return fallback\n}\n\n/**\n * Extract field errors from response body\n */\nfunction extractFieldErrors(\n  body: unknown\n): Record<string, string[]> | undefined {\n  if (!body || typeof body !== 'object') return undefined\n\n  const obj = body as Record<string, unknown>\n\n  // Check common field error formats\n  if (obj.fieldErrors && typeof obj.fieldErrors === 'object') {\n    return obj.fieldErrors as Record<string, string[]>\n  }\n\n  if (obj.errors && typeof obj.errors === 'object') {\n    return obj.errors as Record<string, string[]>\n  }\n\n  // Zod-style errors\n  if (Array.isArray(obj.issues)) {\n    const fieldErrors: Record<string, string[]> = {}\n    for (const issue of obj.issues) {\n      if (issue && typeof issue === 'object' && 'path' in issue) {\n        const path = Array.isArray(issue.path)\n          ? issue.path.join('.')\n          : String(issue.path)\n        if (!fieldErrors[path]) {\n          fieldErrors[path] = []\n        }\n        fieldErrors[path].push(String(issue.message || 'Invalid value'))\n      }\n    }\n    if (Object.keys(fieldErrors).length > 0) {\n      return fieldErrors\n    }\n  }\n\n  return undefined\n}\n\n/**\n * Parse Retry-After header\n */\nfunction parseRetryAfter(value: string | null): number | undefined {\n  if (!value) return undefined\n\n  // Try parsing as number of seconds\n  const seconds = parseInt(value, 10)\n  if (!isNaN(seconds)) {\n    return seconds * 1000\n  }\n\n  // Try parsing as HTTP date\n  const date = new Date(value)\n  if (!isNaN(date.getTime())) {\n    return Math.max(0, date.getTime() - Date.now())\n  }\n\n  return undefined\n}\n","/**\n * Dotdo Data Provider\n *\n * DataProvider implementation for dotdo Durable Objects.\n * Provides CRUD operations over Cap'n Web RPC with real-time subscriptions.\n *\n * @module @dotdo/react/admin\n */\n\nimport type {\n  DataProvider,\n  GetListParams,\n  GetListResult,\n  GetOneParams,\n  GetOneResult,\n  GetManyParams,\n  GetManyResult,\n  CreateParams,\n  CreateResult,\n  UpdateParams,\n  UpdateResult,\n  DeleteParams,\n  DeleteResult,\n  DeleteManyParams,\n  DeleteManyResult,\n  BaseRecord,\n  SubscriptionEvent,\n  QueryFilter,\n} from './types'\nimport { getRecordId } from './types'\nimport { AdminError, formatAdminError } from './errors'\n\n// =============================================================================\n// Configuration\n// =============================================================================\n\n/**\n * Configuration for DotdoDataProvider\n */\nexport interface DotdoDataProviderConfig {\n  /** Namespace URL for the Durable Object (e.g., 'https://api.example.com.ai/do/workspace') */\n  ns: string\n  /** Custom headers for requests */\n  headers?: Record<string, string>\n  /** Request timeout in milliseconds (default: 30000) */\n  timeout?: number\n  /** Enable real-time subscriptions (default: true) */\n  realtime?: boolean\n  /** Custom fetch function for testing */\n  fetch?: typeof fetch\n}\n\n// =============================================================================\n// RPC Types\n// =============================================================================\n\ninterface RPCCall {\n  promiseId: string\n  target: { type: 'root' }\n  method: string\n  args: Array<{ type: 'value'; value: unknown }>\n}\n\ninterface RPCRequest {\n  id: string\n  type: 'call'\n  calls: RPCCall[]\n}\n\ninterface RPCResponse {\n  results?: Array<{ value: unknown; error?: { message: string } }>\n  error?: { message: string }\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\n/**\n * Create a DotdoDataProvider.\n *\n * Connects to a dotdo Durable Object namespace and provides CRUD operations\n * via Cap'n Web RPC protocol.\n *\n * @example\n * ```ts\n * const dataProvider = DotdoDataProvider({\n *   ns: 'https://api.example.com.ai/do/workspace',\n *   headers: { Authorization: 'Bearer token' },\n * })\n * ```\n */\nexport function DotdoDataProvider(\n  config: DotdoDataProviderConfig\n): DataProvider {\n  const {\n    ns,\n    headers = {},\n    timeout = 30000,\n    realtime = true,\n    fetch: customFetch = fetch,\n  } = config\n\n  // Derive URLs\n  const rpcUrl = `${ns}/rpc`\n  const wsUrl = ns.replace(/^https?:/, (m) => (m === 'https:' ? 'wss:' : 'ws:')) + '/sync'\n\n  // Track active subscriptions\n  const subscriptions = new Map<\n    string,\n    {\n      ws: WebSocket | null\n      callbacks: Set<(event: SubscriptionEvent) => void>\n    }\n  >()\n\n  // ==========================================================================\n  // RPC Helper\n  // ==========================================================================\n\n  async function rpc<T>(\n    method: string,\n    args: unknown[]\n  ): Promise<T> {\n    const controller = new AbortController()\n    const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n    try {\n      const request: RPCRequest = {\n        id: crypto.randomUUID(),\n        type: 'call',\n        calls: [\n          {\n            promiseId: 'p-1',\n            target: { type: 'root' },\n            method,\n            args: args.map((arg) => ({ type: 'value', value: arg })),\n          },\n        ],\n      }\n\n      const response = await customFetch(rpcUrl, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          ...headers,\n        },\n        body: JSON.stringify(request),\n        signal: controller.signal,\n      })\n\n      if (!response.ok) {\n        let body: unknown\n        try {\n          body = await response.json()\n        } catch {\n          // Ignore JSON parse errors\n        }\n        throw AdminError.fromResponse(response, method.split('.')[0], body)\n      }\n\n      const result = (await response.json()) as RPCResponse\n\n      if (result.error) {\n        throw new AdminError({\n          code: 'SERVER_ERROR',\n          message: result.error.message,\n          resource: method.split('.')[0],\n        })\n      }\n\n      const callResult = result.results?.[0]\n      if (callResult?.error) {\n        throw new AdminError({\n          code: 'SERVER_ERROR',\n          message: callResult.error.message,\n          resource: method.split('.')[0],\n        })\n      }\n\n      return callResult?.value as T\n    } catch (err) {\n      if (err instanceof AdminError) throw err\n      if (err instanceof Error && err.name === 'AbortError') {\n        throw new AdminError({\n          code: 'TIMEOUT',\n          message: 'Request timed out',\n          resource: method.split('.')[0],\n          retryable: true,\n        })\n      }\n      throw formatAdminError(err, method.split('.')[0])\n    } finally {\n      clearTimeout(timeoutId)\n    }\n  }\n\n  // ==========================================================================\n  // Normalize Record ID\n  // ==========================================================================\n\n  function normalizeId(record: BaseRecord): BaseRecord {\n    // Ensure both $id and id are set for compatibility\n    const id = getRecordId(record)\n    return {\n      ...record,\n      $id: record.$id ?? id,\n      id: record.id ?? id,\n    }\n  }\n\n  // ==========================================================================\n  // Data Provider Methods\n  // ==========================================================================\n\n  const provider: DataProvider = {\n    async getList<T extends BaseRecord>(\n      params: GetListParams\n    ): Promise<GetListResult<T>> {\n      const { resource, pagination, sort, filter } = params\n\n      // Build query params\n      const queryParams: Record<string, unknown> = {}\n\n      if (pagination) {\n        queryParams.page = pagination.page\n        queryParams.perPage = pagination.perPage\n      }\n\n      if (sort) {\n        queryParams.sortField = sort.field\n        queryParams.sortOrder = sort.order\n      }\n\n      if (filter) {\n        queryParams.filter = filter\n      }\n\n      try {\n        const result = await rpc<{ items: T[]; total: number; cursor?: string }>(\n          `${resource}.findAll`,\n          [queryParams]\n        )\n\n        // Handle both array response and paginated response\n        const items = Array.isArray(result)\n          ? (result as T[])\n          : result.items || []\n        const total = Array.isArray(result) ? items.length : result.total\n\n        return {\n          data: items.map((item) => normalizeId(item) as T),\n          total,\n          cursor: Array.isArray(result) ? null : result.cursor,\n          hasMore: Array.isArray(result) ? false : !!result.cursor,\n        }\n      } catch (err) {\n        throw formatAdminError(err, resource)\n      }\n    },\n\n    async getOne<T extends BaseRecord>(\n      params: GetOneParams\n    ): Promise<GetOneResult<T>> {\n      const { resource, id } = params\n\n      try {\n        const result = await rpc<T | null>(`${resource}.findById`, [id])\n\n        if (!result) {\n          throw AdminError.notFound(resource, id)\n        }\n\n        return {\n          data: normalizeId(result) as T,\n        }\n      } catch (err) {\n        throw formatAdminError(err, resource)\n      }\n    },\n\n    async getMany<T extends BaseRecord>(\n      params: GetManyParams\n    ): Promise<GetManyResult<T>> {\n      const { resource, ids } = params\n\n      try {\n        // Batch fetch - try findByIds first, fall back to individual calls\n        let results: T[]\n\n        try {\n          results = await rpc<T[]>(`${resource}.findByIds`, [ids])\n        } catch {\n          // Fall back to individual calls\n          const fetchedItems = await Promise.all(\n            ids.map((id) =>\n              rpc<T | null>(`${resource}.findById`, [id]).then((r) => r)\n            )\n          )\n          // Filter out null values and cast the result\n          results = fetchedItems.filter(\n            (item): item is NonNullable<typeof item> => item !== null && item !== undefined\n          ) as T[]\n        }\n\n        return {\n          data: results.map((item) => normalizeId(item) as T),\n        }\n      } catch (err) {\n        throw formatAdminError(err, resource)\n      }\n    },\n\n    async create<T extends BaseRecord>(\n      params: CreateParams<T>\n    ): Promise<CreateResult<T>> {\n      const { resource, data } = params\n\n      try {\n        const result = await rpc<T>(`${resource}.create`, [data])\n\n        return {\n          data: normalizeId(result) as T,\n        }\n      } catch (err) {\n        throw formatAdminError(err, resource)\n      }\n    },\n\n    async update<T extends BaseRecord>(\n      params: UpdateParams<T>\n    ): Promise<UpdateResult<T>> {\n      const { resource, id, data } = params\n\n      try {\n        const result = await rpc<T>(`${resource}.update`, [{ key: id, ...data }])\n\n        return {\n          data: normalizeId(result) as T,\n        }\n      } catch (err) {\n        throw formatAdminError(err, resource)\n      }\n    },\n\n    async delete<T extends BaseRecord>(\n      params: DeleteParams<T>\n    ): Promise<DeleteResult<T>> {\n      const { resource, id, previousData } = params\n\n      try {\n        await rpc<void>(`${resource}.delete`, [{ key: id }])\n\n        // Return the previous data or a minimal object\n        const deletedRecord = previousData ?? ({ $id: id, id } as T)\n\n        return {\n          data: normalizeId(deletedRecord) as T,\n        }\n      } catch (err) {\n        throw formatAdminError(err, resource)\n      }\n    },\n\n    async deleteMany(params: DeleteManyParams): Promise<DeleteManyResult> {\n      const { resource, ids } = params\n\n      try {\n        // Try bulk delete first\n        try {\n          await rpc<void>(`${resource}.deleteMany`, [ids])\n        } catch {\n          // Fall back to individual deletes\n          await Promise.all(\n            ids.map((id) => rpc<void>(`${resource}.delete`, [{ key: id }]))\n          )\n        }\n\n        return {\n          data: ids,\n        }\n      } catch (err) {\n        throw formatAdminError(err, resource)\n      }\n    },\n\n    subscribe<T extends BaseRecord>(\n      resource: string,\n      callback: (event: SubscriptionEvent<T>) => void\n    ): () => void {\n      if (!realtime) {\n        return () => {}\n      }\n\n      // Get or create subscription for this resource\n      let subscription = subscriptions.get(resource)\n\n      if (!subscription) {\n        subscription = {\n          ws: null,\n          callbacks: new Set(),\n        }\n        subscriptions.set(resource, subscription)\n      }\n\n      // Add callback\n      subscription.callbacks.add(callback as (event: SubscriptionEvent) => void)\n\n      // Connect WebSocket if not already connected\n      if (!subscription.ws || subscription.ws.readyState !== WebSocket.OPEN) {\n        const ws = new WebSocket(wsUrl)\n        subscription.ws = ws\n\n        ws.addEventListener('open', () => {\n          // Subscribe to collection\n          ws.send(\n            JSON.stringify({\n              type: 'subscribe',\n              collection: resource,\n            })\n          )\n        })\n\n        ws.addEventListener('message', (event) => {\n          try {\n            const msg = JSON.parse(event.data)\n            const sub = subscriptions.get(resource)\n\n            if (!sub) return\n\n            let subscriptionEvent: SubscriptionEvent<T> | null = null\n\n            if (msg.type === 'insert') {\n              subscriptionEvent = {\n                type: 'created',\n                resource,\n                data: normalizeId(msg.data) as T,\n              }\n            } else if (msg.type === 'update') {\n              subscriptionEvent = {\n                type: 'updated',\n                resource,\n                data: normalizeId(msg.data) as T,\n                id: msg.key,\n              }\n            } else if (msg.type === 'delete') {\n              subscriptionEvent = {\n                type: 'deleted',\n                resource,\n                id: msg.key,\n              }\n            }\n\n            if (subscriptionEvent) {\n              for (const cb of sub.callbacks) {\n                try {\n                  cb(subscriptionEvent as SubscriptionEvent)\n                } catch (err) {\n                  console.error('Subscription callback error:', err)\n                }\n              }\n            }\n          } catch {\n            // Ignore malformed messages\n          }\n        })\n\n        ws.addEventListener('close', () => {\n          // Attempt reconnection after delay\n          setTimeout(() => {\n            const sub = subscriptions.get(resource)\n            if (sub && sub.callbacks.size > 0) {\n              // Reconnect if there are still active subscribers\n              sub.ws = null\n              // Re-subscribe for each callback\n              for (const cb of sub.callbacks) {\n                provider.subscribe?.(resource, cb as (event: SubscriptionEvent) => void)\n              }\n            }\n          }, 1000)\n        })\n      }\n\n      // Return unsubscribe function\n      return () => {\n        const sub = subscriptions.get(resource)\n        if (sub) {\n          sub.callbacks.delete(callback as (event: SubscriptionEvent) => void)\n\n          // Close WebSocket if no more subscribers\n          if (sub.callbacks.size === 0) {\n            sub.ws?.close()\n            subscriptions.delete(resource)\n          }\n        }\n      }\n    },\n  }\n\n  return provider\n}\n","/**\n * useResource Hook\n *\n * React hook for working with a resource collection through the DataProvider.\n * Provides data fetching, mutations, and real-time updates.\n *\n * @module @dotdo/react/admin\n */\n\nimport * as React from 'react'\nimport { useAdminContext } from './AdminProvider'\nimport type {\n  BaseRecord,\n  GetListParams,\n  SortOrder,\n  QueryFilter,\n} from './types'\nimport { getRecordId } from './types'\nimport { AdminError, formatAdminError } from './errors'\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Configuration for useResource hook\n */\nexport interface UseResourceConfig<T extends BaseRecord = BaseRecord> {\n  /** Resource name (e.g., 'User', 'Task') */\n  resource: string\n  /** Initial sort settings */\n  sort?: {\n    field: keyof T & string\n    order: SortOrder\n  }\n  /** Initial filters */\n  filter?: Record<string, unknown> | QueryFilter[]\n  /** Items per page (default: 25) */\n  perPage?: number\n  /** Enable real-time updates (default: true) */\n  realtime?: boolean\n  /** Enable optimistic updates (default: true) */\n  optimistic?: boolean\n}\n\n/**\n * Return type for useResource hook\n */\nexport interface UseResourceResult<T extends BaseRecord> {\n  // State\n  /** Current data array */\n  data: T[]\n  /** Total count of items (for pagination) */\n  total: number\n  /** Loading state for initial load */\n  isLoading: boolean\n  /** Loading state for mutations */\n  isMutating: boolean\n  /** Error from last operation */\n  error: AdminError | null\n\n  // Pagination\n  /** Current page (1-indexed) */\n  page: number\n  /** Items per page */\n  perPage: number\n  /** Whether more pages exist */\n  hasMore: boolean\n  /** Go to a specific page */\n  setPage: (page: number) => void\n  /** Change items per page */\n  setPerPage: (perPage: number) => void\n\n  // Sorting\n  /** Current sort settings */\n  sort: { field: string; order: SortOrder } | null\n  /** Change sort settings */\n  setSort: (field: string, order?: SortOrder) => void\n\n  // Filtering\n  /** Current filters */\n  filter: Record<string, unknown>\n  /** Update filters (merge with existing) */\n  setFilter: (filter: Record<string, unknown>) => void\n  /** Clear all filters */\n  clearFilter: () => void\n\n  // Mutations\n  /** Create a new record */\n  create: (data: Omit<T, '$id' | 'id'>) => Promise<T>\n  /** Update an existing record */\n  update: (id: string, data: Partial<Omit<T, '$id' | 'id'>>) => Promise<T>\n  /** Delete a record */\n  remove: (id: string) => Promise<void>\n  /** Delete multiple records */\n  removeMany: (ids: string[]) => Promise<void>\n\n  // Actions\n  /** Refetch data from server */\n  refetch: () => Promise<void>\n  /** Find an item by ID from current data */\n  findById: (id: string) => T | undefined\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\n/**\n * React hook for working with a resource collection.\n *\n * Provides CRUD operations, pagination, sorting, filtering, and real-time updates.\n *\n * @example\n * ```tsx\n * function UserList() {\n *   const {\n *     data: users,\n *     isLoading,\n *     error,\n *     create,\n *     update,\n *     remove,\n *     setSort,\n *     setFilter,\n *   } = useResource<User>({ resource: 'User' })\n *\n *   if (isLoading) return <Loading />\n *   if (error) return <Error message={error.message} />\n *\n *   return (\n *     <div>\n *       <button onClick={() => setSort('name')}>Sort by Name</button>\n *       <input onChange={e => setFilter({ search: e.target.value })} />\n *       {users.map(user => (\n *         <UserCard\n *           key={user.$id || user.id}\n *           user={user}\n *           onUpdate={update}\n *           onDelete={() => remove(user.$id || user.id)}\n *         />\n *       ))}\n *     </div>\n *   )\n * }\n * ```\n */\nexport function useResource<T extends BaseRecord = BaseRecord>(\n  config: UseResourceConfig<T>\n): UseResourceResult<T> {\n  const {\n    resource,\n    sort: initialSort,\n    filter: initialFilter,\n    perPage: initialPerPage = 25,\n    realtime = true,\n    optimistic = true,\n  } = config\n\n  const { dataProvider } = useAdminContext()\n\n  // State\n  const [data, setData] = React.useState<T[]>([])\n  const [total, setTotal] = React.useState(0)\n  const [isLoading, setIsLoading] = React.useState(true)\n  const [isMutating, setIsMutating] = React.useState(false)\n  const [error, setError] = React.useState<AdminError | null>(null)\n\n  // Pagination state\n  const [page, setPageState] = React.useState(1)\n  const [perPage, setPerPageState] = React.useState(initialPerPage)\n\n  // Sort state\n  const [sort, setSort] = React.useState<{ field: string; order: SortOrder } | null>(\n    initialSort ? { field: initialSort.field, order: initialSort.order } : null\n  )\n\n  // Filter state\n  const [filter, setFilterState] = React.useState<Record<string, unknown>>(\n    Array.isArray(initialFilter)\n      ? {}\n      : initialFilter ?? {}\n  )\n\n  // Fetch version for triggering refetches\n  const [fetchVersion, setFetchVersion] = React.useState(0)\n\n  // ==========================================================================\n  // Data Fetching\n  // ==========================================================================\n\n  React.useEffect(() => {\n    let mounted = true\n\n    const fetchData = async () => {\n      setIsLoading(true)\n      setError(null)\n\n      const params: GetListParams = {\n        resource,\n        pagination: { page, perPage },\n      }\n\n      if (sort) {\n        params.sort = sort\n      }\n\n      if (Object.keys(filter).length > 0) {\n        params.filter = filter\n      }\n\n      try {\n        const result = await dataProvider.getList<T>(params)\n\n        if (mounted) {\n          setData(result.data)\n          setTotal(result.total)\n          setIsLoading(false)\n        }\n      } catch (err) {\n        if (mounted) {\n          setError(formatAdminError(err, resource))\n          setIsLoading(false)\n        }\n      }\n    }\n\n    fetchData()\n\n    return () => {\n      mounted = false\n    }\n  }, [dataProvider, resource, page, perPage, sort, filter, fetchVersion])\n\n  // ==========================================================================\n  // Real-time Subscription\n  // ==========================================================================\n\n  React.useEffect(() => {\n    if (!realtime || !dataProvider.subscribe) {\n      return\n    }\n\n    const unsubscribe = dataProvider.subscribe<T>(resource, (event) => {\n      if (event.type === 'created' && event.data) {\n        setData((prev) => {\n          // Add to beginning of list\n          const newData = [event.data as T, ...prev]\n          // Trim to perPage to maintain pagination\n          return newData.slice(0, perPage)\n        })\n        setTotal((prev) => prev + 1)\n      } else if (event.type === 'updated' && event.data) {\n        const updatedItem = event.data as T\n        setData((prev) =>\n          prev.map((item) =>\n            getRecordId(item) === getRecordId(updatedItem) ? updatedItem : item\n          )\n        )\n      } else if (event.type === 'deleted' && event.id) {\n        setData((prev) =>\n          prev.filter((item) => getRecordId(item) !== event.id)\n        )\n        setTotal((prev) => Math.max(0, prev - 1))\n      }\n    })\n\n    return unsubscribe\n  }, [dataProvider, resource, realtime, perPage])\n\n  // ==========================================================================\n  // Pagination Actions\n  // ==========================================================================\n\n  const setPage = React.useCallback((newPage: number) => {\n    setPageState(Math.max(1, newPage))\n  }, [])\n\n  const setPerPage = React.useCallback((newPerPage: number) => {\n    setPerPageState(Math.max(1, Math.min(100, newPerPage)))\n    setPageState(1) // Reset to first page\n  }, [])\n\n  const hasMore = page * perPage < total\n\n  // ==========================================================================\n  // Sort Actions\n  // ==========================================================================\n\n  const handleSetSort = React.useCallback(\n    (field: string, order?: SortOrder) => {\n      setSort((prev) => {\n        // Toggle order if clicking same field\n        if (prev?.field === field && !order) {\n          return {\n            field,\n            order: prev.order === 'asc' ? 'desc' : 'asc',\n          }\n        }\n        return { field, order: order ?? 'asc' }\n      })\n      setPageState(1) // Reset to first page\n    },\n    []\n  )\n\n  // ==========================================================================\n  // Filter Actions\n  // ==========================================================================\n\n  const setFilter = React.useCallback((newFilter: Record<string, unknown>) => {\n    setFilterState((prev) => ({ ...prev, ...newFilter }))\n    setPageState(1) // Reset to first page\n  }, [])\n\n  const clearFilter = React.useCallback(() => {\n    setFilterState({})\n    setPageState(1)\n  }, [])\n\n  // ==========================================================================\n  // Mutations\n  // ==========================================================================\n\n  const create = React.useCallback(\n    async (createData: Omit<T, '$id' | 'id'>): Promise<T> => {\n      setIsMutating(true)\n      setError(null)\n\n      // Generate temp ID for optimistic update\n      const tempId = `temp-${Date.now()}`\n      const optimisticItem = { ...createData, $id: tempId, id: tempId } as T\n\n      // Optimistic update\n      if (optimistic) {\n        setData((prev) => [optimisticItem, ...prev.slice(0, perPage - 1)])\n        setTotal((prev) => prev + 1)\n      }\n\n      try {\n        const result = await dataProvider.create<T>({\n          resource,\n          data: createData,\n        })\n\n        // Replace optimistic item with real data\n        setData((prev) =>\n          prev.map((item) =>\n            getRecordId(item) === tempId ? result.data : item\n          )\n        )\n\n        setIsMutating(false)\n        return result.data\n      } catch (err) {\n        // Rollback optimistic update\n        if (optimistic) {\n          setData((prev) =>\n            prev.filter((item) => getRecordId(item) !== tempId)\n          )\n          setTotal((prev) => Math.max(0, prev - 1))\n        }\n\n        const adminError = formatAdminError(err, resource)\n        setError(adminError)\n        setIsMutating(false)\n        throw adminError\n      }\n    },\n    [dataProvider, resource, optimistic, perPage]\n  )\n\n  const update = React.useCallback(\n    async (id: string, updateData: Partial<Omit<T, '$id' | 'id'>>): Promise<T> => {\n      setIsMutating(true)\n      setError(null)\n\n      // Store original for rollback\n      const original = data.find((item) => getRecordId(item) === id)\n\n      // Optimistic update\n      if (optimistic && original) {\n        setData((prev) =>\n          prev.map((item) =>\n            getRecordId(item) === id ? { ...item, ...updateData } : item\n          )\n        )\n      }\n\n      try {\n        const result = await dataProvider.update<T>({\n          resource,\n          id,\n          data: updateData,\n          previousData: original,\n        })\n\n        // Update with server response\n        setData((prev) =>\n          prev.map((item) =>\n            getRecordId(item) === id ? result.data : item\n          )\n        )\n\n        setIsMutating(false)\n        return result.data\n      } catch (err) {\n        // Rollback optimistic update\n        if (optimistic && original) {\n          setData((prev) =>\n            prev.map((item) =>\n              getRecordId(item) === id ? original : item\n            )\n          )\n        }\n\n        const adminError = formatAdminError(err, resource)\n        setError(adminError)\n        setIsMutating(false)\n        throw adminError\n      }\n    },\n    [dataProvider, resource, data, optimistic]\n  )\n\n  const remove = React.useCallback(\n    async (id: string): Promise<void> => {\n      setIsMutating(true)\n      setError(null)\n\n      // Store original for rollback\n      const original = data.find((item) => getRecordId(item) === id)\n      const originalIndex = data.findIndex((item) => getRecordId(item) === id)\n\n      // Optimistic update\n      if (optimistic) {\n        setData((prev) =>\n          prev.filter((item) => getRecordId(item) !== id)\n        )\n        setTotal((prev) => Math.max(0, prev - 1))\n      }\n\n      try {\n        await dataProvider.delete<T>({\n          resource,\n          id,\n          previousData: original,\n        })\n\n        setIsMutating(false)\n      } catch (err) {\n        // Rollback optimistic update\n        if (optimistic && original) {\n          setData((prev) => {\n            const newData = [...prev]\n            newData.splice(originalIndex, 0, original)\n            return newData\n          })\n          setTotal((prev) => prev + 1)\n        }\n\n        const adminError = formatAdminError(err, resource)\n        setError(adminError)\n        setIsMutating(false)\n        throw adminError\n      }\n    },\n    [dataProvider, resource, data, optimistic]\n  )\n\n  const removeMany = React.useCallback(\n    async (ids: string[]): Promise<void> => {\n      setIsMutating(true)\n      setError(null)\n\n      // Store originals for rollback\n      const originals = data.filter((item) =>\n        ids.includes(getRecordId(item))\n      )\n\n      // Optimistic update\n      if (optimistic) {\n        setData((prev) =>\n          prev.filter((item) => !ids.includes(getRecordId(item)))\n        )\n        setTotal((prev) => Math.max(0, prev - ids.length))\n      }\n\n      try {\n        await dataProvider.deleteMany({\n          resource,\n          ids,\n        })\n\n        setIsMutating(false)\n      } catch (err) {\n        // Rollback optimistic update\n        if (optimistic) {\n          setData((prev) => [...originals, ...prev])\n          setTotal((prev) => prev + originals.length)\n        }\n\n        const adminError = formatAdminError(err, resource)\n        setError(adminError)\n        setIsMutating(false)\n        throw adminError\n      }\n    },\n    [dataProvider, resource, data, optimistic]\n  )\n\n  // ==========================================================================\n  // Utility Actions\n  // ==========================================================================\n\n  const refetch = React.useCallback(async () => {\n    setFetchVersion((v) => v + 1)\n  }, [])\n\n  const findById = React.useCallback(\n    (id: string): T | undefined => {\n      return data.find((item) => getRecordId(item) === id)\n    },\n    [data]\n  )\n\n  // ==========================================================================\n  // Return\n  // ==========================================================================\n\n  return React.useMemo(\n    () => ({\n      // State\n      data,\n      total,\n      isLoading,\n      isMutating,\n      error,\n\n      // Pagination\n      page,\n      perPage,\n      hasMore,\n      setPage,\n      setPerPage,\n\n      // Sorting\n      sort,\n      setSort: handleSetSort,\n\n      // Filtering\n      filter,\n      setFilter,\n      clearFilter,\n\n      // Mutations\n      create,\n      update,\n      remove,\n      removeMany,\n\n      // Actions\n      refetch,\n      findById,\n    }),\n    [\n      data,\n      total,\n      isLoading,\n      isMutating,\n      error,\n      page,\n      perPage,\n      hasMore,\n      setPage,\n      setPerPage,\n      sort,\n      handleSetSort,\n      filter,\n      setFilter,\n      clearFilter,\n      create,\n      update,\n      remove,\n      removeMany,\n      refetch,\n      findById,\n    ]\n  )\n}\n","/**\n * useResourceRecord Hook\n *\n * React hook for working with a single record from a resource.\n * Provides loading, updating, deleting, and real-time updates for one item.\n *\n * @module @dotdo/react/admin\n */\n\nimport * as React from 'react'\nimport { useAdminContext } from './AdminProvider'\nimport type { BaseRecord } from './types'\nimport { getRecordId } from './types'\nimport { AdminError, formatAdminError } from './errors'\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Configuration for useResourceRecord hook\n */\nexport interface UseResourceRecordConfig {\n  /** Resource name (e.g., 'User', 'Task') */\n  resource: string\n  /** Record ID to fetch */\n  id: string\n  /** Enable real-time updates (default: true) */\n  realtime?: boolean\n  /** Enable optimistic updates (default: true) */\n  optimistic?: boolean\n}\n\n/**\n * Return type for useResourceRecord hook\n */\nexport interface UseResourceRecordResult<T extends BaseRecord> {\n  /** The record data, or null if not found/loading */\n  data: T | null\n  /** Loading state */\n  isLoading: boolean\n  /** Saving state for mutations */\n  isSaving: boolean\n  /** Error from last operation */\n  error: AdminError | null\n  /** Whether the record was not found */\n  notFound: boolean\n\n  /** Update the record */\n  update: (data: Partial<Omit<T, '$id' | 'id'>>) => Promise<T>\n  /** Delete the record */\n  remove: () => Promise<void>\n  /** Refetch the record from server */\n  refetch: () => Promise<void>\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\n/**\n * React hook for working with a single resource record.\n *\n * Provides CRUD operations and real-time updates for one item.\n *\n * @example\n * ```tsx\n * function UserDetail({ userId }: { userId: string }) {\n *   const {\n *     data: user,\n *     isLoading,\n *     error,\n *     notFound,\n *     update,\n *     remove,\n *   } = useResourceRecord<User>({\n *     resource: 'User',\n *     id: userId,\n *   })\n *\n *   if (isLoading) return <Loading />\n *   if (notFound) return <NotFound />\n *   if (error) return <Error message={error.message} />\n *\n *   return (\n *     <form onSubmit={e => {\n *       e.preventDefault()\n *       update({ name: formData.name })\n *     }}>\n *       <input defaultValue={user.name} name=\"name\" />\n *       <button type=\"submit\">Save</button>\n *       <button type=\"button\" onClick={remove}>Delete</button>\n *     </form>\n *   )\n * }\n * ```\n */\nexport function useResourceRecord<T extends BaseRecord = BaseRecord>(\n  config: UseResourceRecordConfig\n): UseResourceRecordResult<T> {\n  const { resource, id, realtime = true, optimistic = true } = config\n\n  const { dataProvider } = useAdminContext()\n\n  // State\n  const [data, setData] = React.useState<T | null>(null)\n  const [isLoading, setIsLoading] = React.useState(true)\n  const [isSaving, setIsSaving] = React.useState(false)\n  const [error, setError] = React.useState<AdminError | null>(null)\n  const [notFound, setNotFound] = React.useState(false)\n\n  // Fetch version for triggering refetches\n  const [fetchVersion, setFetchVersion] = React.useState(0)\n\n  // ==========================================================================\n  // Data Fetching\n  // ==========================================================================\n\n  React.useEffect(() => {\n    let mounted = true\n\n    const fetchData = async () => {\n      if (!id) {\n        setData(null)\n        setIsLoading(false)\n        setNotFound(true)\n        return\n      }\n\n      setIsLoading(true)\n      setError(null)\n      setNotFound(false)\n\n      try {\n        const result = await dataProvider.getOne<T>({\n          resource,\n          id,\n        })\n\n        if (mounted) {\n          setData(result.data)\n          setIsLoading(false)\n        }\n      } catch (err) {\n        if (mounted) {\n          const adminError = formatAdminError(err, resource)\n          if (adminError.code === 'NOT_FOUND') {\n            setNotFound(true)\n            setData(null)\n          } else {\n            setError(adminError)\n          }\n          setIsLoading(false)\n        }\n      }\n    }\n\n    fetchData()\n\n    return () => {\n      mounted = false\n    }\n  }, [dataProvider, resource, id, fetchVersion])\n\n  // ==========================================================================\n  // Real-time Subscription\n  // ==========================================================================\n\n  React.useEffect(() => {\n    if (!realtime || !dataProvider.subscribe || !id) {\n      return\n    }\n\n    const unsubscribe = dataProvider.subscribe<T>(resource, (event) => {\n      // Only handle events for this specific record\n      const eventId = event.id ?? (event.data ? getRecordId(event.data) : null)\n      if (eventId !== id) return\n\n      if (event.type === 'updated' && event.data) {\n        setData(event.data as T)\n      } else if (event.type === 'deleted') {\n        setData(null)\n        setNotFound(true)\n      }\n    })\n\n    return unsubscribe\n  }, [dataProvider, resource, id, realtime])\n\n  // ==========================================================================\n  // Mutations\n  // ==========================================================================\n\n  const update = React.useCallback(\n    async (updateData: Partial<Omit<T, '$id' | 'id'>>): Promise<T> => {\n      if (!id) {\n        throw new AdminError({\n          code: 'NOT_FOUND',\n          message: 'Cannot update: no record ID',\n          resource,\n        })\n      }\n\n      setIsSaving(true)\n      setError(null)\n\n      // Store original for rollback\n      const original = data\n\n      // Optimistic update\n      if (optimistic && original) {\n        setData({ ...original, ...updateData } as T)\n      }\n\n      try {\n        const result = await dataProvider.update<T>({\n          resource,\n          id,\n          data: updateData,\n          previousData: original ?? undefined,\n        })\n\n        setData(result.data)\n        setIsSaving(false)\n        return result.data\n      } catch (err) {\n        // Rollback optimistic update\n        if (optimistic && original) {\n          setData(original)\n        }\n\n        const adminError = formatAdminError(err, resource)\n        setError(adminError)\n        setIsSaving(false)\n        throw adminError\n      }\n    },\n    [dataProvider, resource, id, data, optimistic]\n  )\n\n  const remove = React.useCallback(async (): Promise<void> => {\n    if (!id) {\n      throw new AdminError({\n        code: 'NOT_FOUND',\n        message: 'Cannot delete: no record ID',\n        resource,\n      })\n    }\n\n    setIsSaving(true)\n    setError(null)\n\n    // Store original for rollback\n    const original = data\n\n    // Optimistic update\n    if (optimistic) {\n      setData(null)\n    }\n\n    try {\n      await dataProvider.delete<T>({\n        resource,\n        id,\n        previousData: original ?? undefined,\n      })\n\n      setNotFound(true)\n      setIsSaving(false)\n    } catch (err) {\n      // Rollback optimistic update\n      if (optimistic && original) {\n        setData(original)\n      }\n\n      const adminError = formatAdminError(err, resource)\n      setError(adminError)\n      setIsSaving(false)\n      throw adminError\n    }\n  }, [dataProvider, resource, id, data, optimistic])\n\n  // ==========================================================================\n  // Utility Actions\n  // ==========================================================================\n\n  const refetch = React.useCallback(async () => {\n    setFetchVersion((v) => v + 1)\n  }, [])\n\n  // ==========================================================================\n  // Return\n  // ==========================================================================\n\n  return React.useMemo(\n    () => ({\n      data,\n      isLoading,\n      isSaving,\n      error,\n      notFound,\n      update,\n      remove,\n      refetch,\n    }),\n    [data, isLoading, isSaving, error, notFound, update, remove, refetch]\n  )\n}\n","/**\n * Schema Utilities\n *\n * Utilities for inferring resource configurations from Zod schemas.\n * Provides automatic field type detection for form generation.\n *\n * @module @dotdo/react/admin\n */\n\nimport type { ZodSchema, ZodTypeAny, ZodObject, ZodRawShape } from 'zod'\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Inferred field type from schema\n */\nexport type InferredFieldType =\n  | 'string'\n  | 'number'\n  | 'boolean'\n  | 'date'\n  | 'datetime'\n  | 'email'\n  | 'url'\n  | 'enum'\n  | 'array'\n  | 'object'\n  | 'reference'\n  | 'unknown'\n\n/**\n * Inferred field definition\n */\nexport interface InferredField {\n  /** Field name */\n  name: string\n  /** Field type */\n  type: InferredFieldType\n  /** Whether the field is required */\n  required: boolean\n  /** Default value if any */\n  defaultValue?: unknown\n  /** For enum types, the allowed values */\n  enumValues?: string[]\n  /** For reference types, the referenced resource */\n  reference?: string\n  /** Human-readable label (derived from name) */\n  label: string\n  /** Whether this is the ID field */\n  isId: boolean\n  /** Whether this field should be hidden in forms */\n  hidden: boolean\n  /** Field description from schema */\n  description?: string\n  /** Minimum value/length */\n  min?: number\n  /** Maximum value/length */\n  max?: number\n}\n\n/**\n * Resource definition derived from schema\n */\nexport interface ResourceDefinition {\n  /** Resource name */\n  name: string\n  /** ID field name */\n  idField: string\n  /** All fields */\n  fields: InferredField[]\n  /** Fields to show in list view */\n  listFields: InferredField[]\n  /** Fields to show in forms */\n  formFields: InferredField[]\n  /** Searchable fields */\n  searchFields: string[]\n  /** Sortable fields */\n  sortableFields: string[]\n  /** Filterable fields */\n  filterableFields: string[]\n}\n\n// =============================================================================\n// Field Inference\n// =============================================================================\n\n/**\n * Infer fields from a Zod schema.\n *\n * Analyzes the schema structure to determine field types, validation rules,\n * and display properties.\n *\n * @example\n * ```ts\n * const UserSchema = z.object({\n *   $id: z.string(),\n *   name: z.string().min(1),\n *   email: z.string().email(),\n *   role: z.enum(['admin', 'user']),\n *   createdAt: z.string(),\n * })\n *\n * const fields = inferFieldsFromSchema(UserSchema)\n * // [\n * //   { name: '$id', type: 'string', isId: true, hidden: true, ... },\n * //   { name: 'name', type: 'string', required: true, ... },\n * //   { name: 'email', type: 'email', required: true, ... },\n * //   { name: 'role', type: 'enum', enumValues: ['admin', 'user'], ... },\n * //   { name: 'createdAt', type: 'datetime', ... },\n * // ]\n * ```\n */\nexport function inferFieldsFromSchema<T extends ZodRawShape>(\n  schema: ZodObject<T>\n): InferredField[] {\n  const shape = schema.shape\n  const fields: InferredField[] = []\n\n  for (const [name, zodType] of Object.entries(shape)) {\n    const field = inferField(name, zodType as ZodTypeAny)\n    fields.push(field)\n  }\n\n  return fields\n}\n\n/**\n * Infer a single field from a Zod type\n */\nfunction inferField(name: string, zodType: ZodTypeAny): InferredField {\n  const field: InferredField = {\n    name,\n    type: 'unknown',\n    required: true,\n    label: formatLabel(name),\n    isId: name === '$id' || name === 'id',\n    hidden: false,\n  }\n\n  // Get the inner type (unwrap optional, nullable, default, etc.)\n  const { innerType, isOptional, defaultValue, description } = unwrapZodType(zodType)\n\n  field.required = !isOptional\n  field.defaultValue = defaultValue\n  field.description = description\n\n  // Hide ID and timestamp fields by default\n  if (field.isId || name === 'createdAt' || name === 'updatedAt' || name === '$type') {\n    field.hidden = true\n  }\n\n  // Determine the field type\n  const typeName = getZodTypeName(innerType)\n\n  switch (typeName) {\n    case 'ZodString':\n      field.type = inferStringType(name, innerType)\n      const { min, max } = getStringConstraints(innerType)\n      field.min = min\n      field.max = max\n      break\n\n    case 'ZodNumber':\n      field.type = 'number'\n      break\n\n    case 'ZodBoolean':\n      field.type = 'boolean'\n      break\n\n    case 'ZodDate':\n      field.type = 'date'\n      break\n\n    case 'ZodEnum':\n    case 'ZodNativeEnum':\n      field.type = 'enum'\n      field.enumValues = getEnumValues(innerType)\n      break\n\n    case 'ZodArray':\n      field.type = 'array'\n      break\n\n    case 'ZodObject':\n      field.type = 'object'\n      break\n\n    case 'ZodLiteral':\n      // Literal values are typically hidden (like $type)\n      field.hidden = true\n      break\n\n    default:\n      field.type = 'unknown'\n  }\n\n  // Check for reference fields (e.g., userId, ownerId)\n  if (\n    field.type === 'string' &&\n    (name.endsWith('Id') || name.endsWith('_id'))\n  ) {\n    field.type = 'reference'\n    field.reference = inferReferenceResource(name)\n  }\n\n  return field\n}\n\n// =============================================================================\n// Resource Definition\n// =============================================================================\n\n/**\n * Create a resource definition from a Zod schema.\n *\n * Generates a complete resource definition including field categorization\n * for list views, forms, searching, and filtering.\n *\n * @example\n * ```ts\n * const userResource = createResourceFromSchema('User', UserSchema)\n *\n * // Use in admin components:\n * <ResourceProvider resource={userResource}>\n *   <DataGrid columns={userResource.listFields} />\n * </ResourceProvider>\n * ```\n */\nexport function createResourceFromSchema<T extends ZodRawShape>(\n  name: string,\n  schema: ZodObject<T>\n): ResourceDefinition {\n  const fields = inferFieldsFromSchema(schema)\n\n  // Determine ID field\n  const idField = fields.find((f) => f.isId)?.name ?? '$id'\n\n  // Fields for list view (visible, non-object, non-array)\n  const listFields = fields.filter(\n    (f) =>\n      !f.hidden &&\n      f.type !== 'object' &&\n      f.type !== 'array' &&\n      f.name !== 'description'\n  )\n\n  // Fields for forms (non-hidden, non-id, non-readonly)\n  const formFields = fields.filter(\n    (f) =>\n      !f.hidden &&\n      !f.isId &&\n      f.name !== 'createdAt' &&\n      f.name !== 'updatedAt'\n  )\n\n  // Searchable fields (strings, emails, urls - text that can be searched)\n  const searchFields = fields\n    .filter(\n      (f) =>\n        ['string', 'email', 'url'].includes(f.type) &&\n        !f.isId &&\n        !f.hidden &&\n        f.name !== 'createdAt' &&\n        f.name !== 'updatedAt'\n    )\n    .map((f) => f.name)\n\n  // Sortable fields (strings, numbers, dates)\n  const sortableFields = fields\n    .filter(\n      (f) =>\n        ['string', 'number', 'date', 'datetime', 'email'].includes(f.type) &&\n        f.name !== 'description'\n    )\n    .map((f) => f.name)\n\n  // Filterable fields (enums, booleans, references)\n  const filterableFields = fields\n    .filter(\n      (f) =>\n        ['enum', 'boolean', 'reference'].includes(f.type) ||\n        (f.type === 'string' && f.name.includes('status'))\n    )\n    .map((f) => f.name)\n\n  return {\n    name,\n    idField,\n    fields,\n    listFields,\n    formFields,\n    searchFields,\n    sortableFields,\n    filterableFields,\n  }\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Format a field name as a human-readable label\n */\nfunction formatLabel(name: string): string {\n  // Remove common prefixes\n  let label = name\n  if (label.startsWith('$')) {\n    label = label.slice(1)\n  }\n\n  // Handle camelCase and snake_case\n  label = label\n    .replace(/([A-Z])/g, ' $1')\n    .replace(/_/g, ' ')\n    .replace(/Id$/, ' ID')\n    .replace(/Url$/, ' URL')\n    .replace(/\\s+/g, ' ') // Collapse multiple spaces\n\n  // Capitalize first letter and trim\n  return (label.charAt(0).toUpperCase() + label.slice(1)).trim()\n}\n\n/**\n * Get the type name of a Zod type\n */\nfunction getZodTypeName(zodType: ZodTypeAny): string {\n  return (zodType as { _def?: { typeName?: string } })._def?.typeName ?? 'Unknown'\n}\n\n/**\n * Unwrap optional, nullable, default, and effect wrappers\n */\nfunction unwrapZodType(zodType: ZodTypeAny): {\n  innerType: ZodTypeAny\n  isOptional: boolean\n  defaultValue?: unknown\n  description?: string\n} {\n  let innerType = zodType\n  let isOptional = false\n  let defaultValue: unknown\n  let description: string | undefined\n\n  // Type for accessing Zod internal _def\n  type ZodDef = {\n    description?: string\n    innerType?: ZodTypeAny\n    defaultValue?: () => unknown\n    schema?: ZodTypeAny\n  }\n\n  // Get description\n  description = (zodType as { _def?: ZodDef })._def?.description\n\n  // Recursively unwrap\n  let safety = 10\n  while (safety-- > 0) {\n    const typeName = getZodTypeName(innerType)\n    const def = (innerType as { _def?: ZodDef })._def\n\n    if (typeName === 'ZodOptional') {\n      isOptional = true\n      innerType = def?.innerType ?? innerType\n    } else if (typeName === 'ZodNullable') {\n      isOptional = true\n      innerType = def?.innerType ?? innerType\n    } else if (typeName === 'ZodDefault') {\n      defaultValue = def?.defaultValue?.()\n      innerType = def?.innerType ?? innerType\n    } else if (typeName === 'ZodEffects') {\n      innerType = def?.schema ?? innerType\n    } else {\n      break\n    }\n  }\n\n  return { innerType, isOptional, defaultValue, description }\n}\n\n/**\n * Infer string subtype based on field name and constraints\n */\nfunction inferStringType(name: string, zodType: ZodTypeAny): InferredFieldType {\n  // Check for common patterns in field names\n  const lowerName = name.toLowerCase()\n\n  if (lowerName === 'email' || lowerName.endsWith('email')) {\n    return 'email'\n  }\n\n  if (\n    lowerName === 'url' ||\n    lowerName.endsWith('url') ||\n    lowerName.endsWith('link')\n  ) {\n    return 'url'\n  }\n\n  if (\n    lowerName.endsWith('at') ||\n    lowerName.includes('date') ||\n    lowerName.includes('time')\n  ) {\n    return 'datetime'\n  }\n\n  // Check for .email() or .url() validators\n  type ZodStringDef = { checks?: Array<{ kind: string }> }\n  const checks = (zodType as { _def?: ZodStringDef })._def?.checks ?? []\n  for (const check of checks) {\n    if (check.kind === 'email') return 'email'\n    if (check.kind === 'url') return 'url'\n  }\n\n  return 'string'\n}\n\n/**\n * Get string constraints (min/max length)\n */\nfunction getStringConstraints(\n  zodType: ZodTypeAny\n): { min?: number; max?: number } {\n  type ZodStringCheck = { kind: string; value?: number }\n  type ZodStringDef = { checks?: ZodStringCheck[] }\n  const checks = (zodType as { _def?: ZodStringDef })._def?.checks ?? []\n\n  let min: number | undefined\n  let max: number | undefined\n\n  for (const check of checks) {\n    if (check.kind === 'min') min = check.value\n    if (check.kind === 'max') max = check.value\n    if (check.kind === 'length') {\n      min = check.value\n      max = check.value\n    }\n  }\n\n  return { min, max }\n}\n\n/**\n * Get enum values from a ZodEnum or ZodNativeEnum\n */\nfunction getEnumValues(zodType: ZodTypeAny): string[] {\n  const typeName = getZodTypeName(zodType)\n\n  type ZodEnumDef = { values?: string[] | Record<string, unknown> }\n\n  if (typeName === 'ZodEnum') {\n    return ((zodType as { _def?: ZodEnumDef })._def?.values as string[]) ?? []\n  }\n\n  if (typeName === 'ZodNativeEnum') {\n    const enumObj = (zodType as { _def?: ZodEnumDef })._def?.values as Record<string, unknown> | undefined\n    if (enumObj) {\n      return Object.values(enumObj).filter(\n        (v): v is string => typeof v === 'string'\n      )\n    }\n  }\n\n  return []\n}\n\n/**\n * Infer the referenced resource from a field name\n */\nfunction inferReferenceResource(name: string): string {\n  // Remove common suffixes and convert to PascalCase\n  let resource = name\n    .replace(/Id$/, '')\n    .replace(/_id$/, '')\n    .replace(/_/g, '')\n\n  // Capitalize first letter\n  return resource.charAt(0).toUpperCase() + resource.slice(1)\n}\n","/**\n * Cache Utilities\n *\n * Smart cache invalidation and optimistic update utilities\n * for the admin data layer.\n *\n * @module @dotdo/react/admin\n */\n\nimport * as React from 'react'\nimport type { BaseRecord } from './types'\nimport { getRecordId } from './types'\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Cache configuration\n */\nexport interface CacheConfig {\n  /** Time-to-live in milliseconds (default: 5 minutes) */\n  ttl?: number\n  /** Enable stale-while-revalidate pattern */\n  staleWhileRevalidate?: boolean\n  /** Maximum stale time in milliseconds */\n  maxStale?: number\n  /** Resources that invalidate this cache */\n  invalidatedBy?: string[]\n}\n\n/**\n * Optimistic update configuration\n */\nexport interface OptimisticConfig<T extends BaseRecord> {\n  /** Resource name */\n  resource: string\n  /** The operation type */\n  type: 'create' | 'update' | 'delete'\n  /** Record ID (for update/delete) */\n  id?: string\n  /** New/updated data */\n  data?: Partial<T>\n  /** Original data for rollback */\n  previousData?: T\n  /** Callback when mutation succeeds */\n  onSuccess?: (data: T) => void\n  /** Callback when mutation fails */\n  onError?: (error: Error, previousData?: T) => void\n  /** Callback to rollback optimistic update */\n  onRollback?: (previousData?: T) => void\n}\n\n/**\n * Cache entry with metadata\n */\ninterface CacheEntry<T> {\n  data: T\n  fetchedAt: number\n  staleAt: number\n  expiresAt: number\n}\n\n// =============================================================================\n// Cache Key Generation\n// =============================================================================\n\n/**\n * Create a cache key from parameters.\n *\n * Generates a consistent, serializable key for caching query results.\n *\n * @example\n * ```ts\n * const key = createCacheKey('User', {\n *   pagination: { page: 1, perPage: 25 },\n *   sort: { field: 'name', order: 'asc' },\n *   filter: { role: 'admin' },\n * })\n * // 'User:{\"filter\":{\"role\":\"admin\"},\"pagination\":{\"page\":1,\"perPage\":25},\"sort\":{\"field\":\"name\",\"order\":\"asc\"}}'\n * ```\n */\nexport function createCacheKey(\n  resource: string,\n  params?: Record<string, unknown>\n): string {\n  if (!params || Object.keys(params).length === 0) {\n    return resource\n  }\n\n  // Sort keys for consistent ordering\n  const sortedParams = sortObjectKeys(params)\n  return `${resource}:${JSON.stringify(sortedParams)}`\n}\n\n/**\n * Create a cache key for a single record\n */\nexport function createRecordCacheKey(resource: string, id: string): string {\n  return `${resource}:${id}`\n}\n\n// =============================================================================\n// Cache Invalidation\n// =============================================================================\n\n/**\n * Cache invalidation manager.\n *\n * Tracks cache entries and handles invalidation based on mutations.\n */\nclass CacheManager {\n  private cache = new Map<string, CacheEntry<unknown>>()\n  private subscribers = new Map<string, Set<() => void>>()\n  private resourceDependencies = new Map<string, Set<string>>()\n\n  /**\n   * Get a cached value if still valid\n   */\n  get<T>(key: string, config: CacheConfig = {}): T | null {\n    const entry = this.cache.get(key) as CacheEntry<T> | undefined\n    if (!entry) return null\n\n    const now = Date.now()\n\n    // Expired - remove and return null\n    if (now > entry.expiresAt) {\n      this.cache.delete(key)\n      return null\n    }\n\n    // Stale but usable with stale-while-revalidate\n    if (now > entry.staleAt && config.staleWhileRevalidate) {\n      // Trigger background revalidation\n      this.notifySubscribers(key)\n    }\n\n    return entry.data\n  }\n\n  /**\n   * Set a cached value\n   */\n  set<T>(key: string, data: T, config: CacheConfig = {}): void {\n    const now = Date.now()\n    const ttl = config.ttl ?? 5 * 60 * 1000 // 5 minutes default\n    const maxStale = config.maxStale ?? ttl\n\n    const entry: CacheEntry<T> = {\n      data,\n      fetchedAt: now,\n      staleAt: now + ttl,\n      expiresAt: now + ttl + maxStale,\n    }\n\n    this.cache.set(key, entry)\n\n    // Track resource dependencies\n    if (config.invalidatedBy) {\n      for (const dep of config.invalidatedBy) {\n        if (!this.resourceDependencies.has(dep)) {\n          this.resourceDependencies.set(dep, new Set())\n        }\n        this.resourceDependencies.get(dep)!.add(key)\n      }\n    }\n  }\n\n  /**\n   * Invalidate cache entries for a resource\n   */\n  invalidate(resource: string): void {\n    // Invalidate direct resource entries\n    for (const key of this.cache.keys()) {\n      if (key.startsWith(`${resource}:`)) {\n        this.cache.delete(key)\n        this.notifySubscribers(key)\n      }\n    }\n\n    // Invalidate dependent caches\n    const dependencies = this.resourceDependencies.get(resource)\n    if (dependencies) {\n      for (const key of dependencies) {\n        this.cache.delete(key)\n        this.notifySubscribers(key)\n      }\n    }\n\n    // Notify resource-level subscribers\n    this.notifySubscribers(resource)\n  }\n\n  /**\n   * Subscribe to cache invalidations\n   */\n  subscribe(key: string, callback: () => void): () => void {\n    if (!this.subscribers.has(key)) {\n      this.subscribers.set(key, new Set())\n    }\n    this.subscribers.get(key)!.add(callback)\n\n    return () => {\n      this.subscribers.get(key)?.delete(callback)\n    }\n  }\n\n  /**\n   * Clear all cached data\n   */\n  clear(): void {\n    this.cache.clear()\n    for (const key of this.subscribers.keys()) {\n      this.notifySubscribers(key)\n    }\n  }\n\n  private notifySubscribers(key: string): void {\n    const callbacks = this.subscribers.get(key)\n    if (callbacks) {\n      for (const callback of callbacks) {\n        try {\n          callback()\n        } catch (err) {\n          console.error('Cache subscriber error:', err)\n        }\n      }\n    }\n  }\n}\n\n// Global cache manager instance\nconst cacheManager = new CacheManager()\n\n/**\n * Invalidate cache for a resource.\n *\n * Call this after mutations to ensure fresh data is fetched.\n *\n * @example\n * ```ts\n * await dataProvider.create({ resource: 'User', data })\n * invalidateCache('User')\n * ```\n */\nexport function invalidateCache(resource: string): void {\n  cacheManager.invalidate(resource)\n}\n\n/**\n * Clear all cached data\n */\nexport function clearCache(): void {\n  cacheManager.clear()\n}\n\n/**\n * Get cached data\n */\nexport function getCachedData<T>(key: string, config?: CacheConfig): T | null {\n  return cacheManager.get<T>(key, config)\n}\n\n/**\n * Set cached data\n */\nexport function setCachedData<T>(\n  key: string,\n  data: T,\n  config?: CacheConfig\n): void {\n  cacheManager.set(key, data, config)\n}\n\n/**\n * Subscribe to cache invalidations\n */\nexport function subscribeToCache(key: string, callback: () => void): () => void {\n  return cacheManager.subscribe(key, callback)\n}\n\n// =============================================================================\n// Optimistic Update Hook\n// =============================================================================\n\n/**\n * Hook for managing optimistic updates with automatic rollback.\n *\n * @example\n * ```tsx\n * function TodoItem({ todo }) {\n *   const { applyUpdate, isPending } = useOptimisticUpdate<Todo>()\n *\n *   const handleToggle = async () => {\n *     await applyUpdate({\n *       resource: 'Todo',\n *       type: 'update',\n *       id: todo.id,\n *       data: { completed: !todo.completed },\n *       previousData: todo,\n *       onSuccess: () => console.log('Saved!'),\n *       onError: (err) => console.error('Failed:', err),\n *     })\n *   }\n *\n *   return (\n *     <button onClick={handleToggle} disabled={isPending}>\n *       {todo.completed ? 'Completed' : 'Mark Done'}\n *     </button>\n *   )\n * }\n * ```\n */\nexport function useOptimisticUpdate<T extends BaseRecord>() {\n  const [pending, setPending] = React.useState<Map<string, OptimisticConfig<T>>>(\n    new Map()\n  )\n\n  const applyUpdate = React.useCallback(\n    async (\n      config: OptimisticConfig<T>,\n      mutationFn: () => Promise<T>\n    ): Promise<T> => {\n      const updateKey =\n        config.id ?? `temp-${Date.now()}-${Math.random().toString(36).slice(2)}`\n\n      // Track pending mutation\n      setPending((prev) => new Map(prev).set(updateKey, config))\n\n      try {\n        const result = await mutationFn()\n\n        // Success - notify and clean up\n        config.onSuccess?.(result)\n        setPending((prev) => {\n          const next = new Map(prev)\n          next.delete(updateKey)\n          return next\n        })\n\n        // Invalidate cache\n        invalidateCache(config.resource)\n\n        return result\n      } catch (err) {\n        // Failure - rollback and notify\n        config.onRollback?.(config.previousData)\n        config.onError?.(err as Error, config.previousData)\n\n        setPending((prev) => {\n          const next = new Map(prev)\n          next.delete(updateKey)\n          return next\n        })\n\n        throw err\n      }\n    },\n    []\n  )\n\n  const isPending = pending.size > 0\n  const pendingUpdates = Array.from(pending.values())\n\n  return React.useMemo(\n    () => ({\n      applyUpdate,\n      isPending,\n      pendingUpdates,\n      pendingCount: pending.size,\n    }),\n    [applyUpdate, isPending, pendingUpdates, pending.size]\n  )\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Sort object keys recursively for consistent serialization\n */\nfunction sortObjectKeys(obj: Record<string, unknown>): Record<string, unknown> {\n  if (Array.isArray(obj)) {\n    return obj.map((item) =>\n      typeof item === 'object' && item !== null\n        ? sortObjectKeys(item as Record<string, unknown>)\n        : item\n    ) as unknown as Record<string, unknown>\n  }\n\n  if (typeof obj !== 'object' || obj === null) {\n    return obj\n  }\n\n  const sorted: Record<string, unknown> = {}\n  const keys = Object.keys(obj).sort()\n\n  for (const key of keys) {\n    const value = obj[key]\n    sorted[key] =\n      typeof value === 'object' && value !== null\n        ? sortObjectKeys(value as Record<string, unknown>)\n        : value\n  }\n\n  return sorted\n}\n"]}