@almadar/ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../hooks/useOrbitalHistory.ts","../../hooks/useFileSystem.ts","../../hooks/useExtensions.ts","../../hooks/useFileEditor.ts","../../hooks/useCompile.ts","../../hooks/usePreview.ts","../../hooks/useAgentChat.ts","../../hooks/useValidation.ts","../../hooks/useDeepAgentGeneration.ts","../../providers/EventBusProvider.tsx","../../hooks/useEventBus.ts","../../hooks/useUISlots.ts","../../providers/SelectionProvider.tsx","../../hooks/useUIEvents.ts","../../hooks/useEntityData.ts","../../hooks/useQuerySingleton.ts","../../../../node_modules/.pnpm/@tanstack+query-core@5.90.20/node_modules/@tanstack/query-core/src/subscribable.ts","../../../../node_modules/.pnpm/@tanstack+query-core@5.90.20/node_modules/@tanstack/query-core/src/timeoutManager.ts","../../../../node_modules/.pnpm/@tanstack+query-core@5.90.20/node_modules/@tanstack/query-core/src/utils.ts","../../../../node_modules/.pnpm/@tanstack+query-core@5.90.20/node_modules/@tanstack/query-core/src/notifyManager.ts","../../../../node_modules/.pnpm/@tanstack+query-core@5.90.20/node_modules/@tanstack/query-core/src/mutation.ts","../../../../node_modules/.pnpm/@tanstack+query-core@5.90.20/node_modules/@tanstack/query-core/src/mutationObserver.ts","../../../../node_modules/.pnpm/@tanstack+react-query@5.90.20_react@18.3.1/node_modules/@tanstack/react-query/src/QueryClientProvider.tsx","../../../../node_modules/.pnpm/@tanstack+react-query@5.90.20_react@18.3.1/node_modules/@tanstack/react-query/src/useMutation.ts","../../lib/api-client.ts","../../hooks/useOrbitalMutations.ts","../../hooks/useEntityMutations.ts","../../stores/entityStore.ts","../../hooks/useEntities.ts","../../hooks/useAuthContext.ts"],"names":["getHeaders","useState","useCallback","useEffect","loadExtensions","useRef","subscribe","createContext","useMemo","useContext","_a","React3","idCounter","entities","useSyncExternalStore","useEntity"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * useOrbitalHistory Hook\n *\n * Provides version control timeline for OrbitalSchema changes.\n * Tracks changesets and snapshots, supports reverting to previous versions.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { OrbitalSchema } from '@almadar/core';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ChangeSummary {\n added: number;\n modified: number;\n removed: number;\n}\n\nexport interface HistoryTimelineItem {\n id: string;\n type: 'changeset' | 'snapshot';\n version: number;\n timestamp: number;\n description: string;\n source?: string;\n summary?: ChangeSummary;\n reason?: string;\n}\n\nexport interface RevertResult {\n success: boolean;\n error?: string;\n restoredSchema?: OrbitalSchema;\n}\n\nexport interface UseOrbitalHistoryOptions {\n appId: string | null;\n /** Firebase auth token for authenticated API requests */\n authToken?: string | null;\n /** User ID for x-user-id header (required for Firestore path) */\n userId?: string | null;\n onHistoryChange?: (timeline: HistoryTimelineItem[]) => void;\n onRevertSuccess?: (restoredSchema: OrbitalSchema) => void;\n}\n\nexport interface UseOrbitalHistoryResult {\n timeline: HistoryTimelineItem[];\n currentVersion: number;\n isLoading: boolean;\n error: string | null;\n revertToSnapshot: (snapshotId: string) => Promise<RevertResult>;\n refresh: () => Promise<void>;\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\nexport function useOrbitalHistory(options: UseOrbitalHistoryOptions): UseOrbitalHistoryResult {\n const { appId, authToken, userId, onHistoryChange, onRevertSuccess } = options;\n\n // Helper to create headers with auth token and user ID\n const getHeaders = useCallback((): HeadersInit => {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n };\n if (authToken) {\n headers['Authorization'] = `Bearer ${authToken}`;\n }\n if (userId) {\n headers['x-user-id'] = userId;\n }\n return headers;\n }, [authToken, userId]);\n\n const [timeline, setTimeline] = useState<HistoryTimelineItem[]>([]);\n const [currentVersion, setCurrentVersion] = useState(1);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(async () => {\n if (!appId) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n // Fetch changesets and snapshots in parallel\n const headers = getHeaders();\n const [changesetsRes, snapshotsRes] = await Promise.all([\n fetch(`/api/graphs/${appId}/history/changesets`, { headers }),\n fetch(`/api/graphs/${appId}/history/snapshots`, { headers }),\n ]);\n\n if (!changesetsRes.ok) {\n throw new Error(`Failed to fetch changesets: ${changesetsRes.status}`);\n }\n if (!snapshotsRes.ok) {\n throw new Error(`Failed to fetch snapshots: ${snapshotsRes.status}`);\n }\n\n const changesetsData = await changesetsRes.json();\n const snapshotsData = await snapshotsRes.json();\n\n // Map changesets to timeline items\n const changesetItems: HistoryTimelineItem[] = (changesetsData.changesets || []).map((cs: {\n id: string;\n version: number;\n timestamp: number;\n source?: string;\n summary?: ChangeSummary;\n }) => ({\n id: cs.id,\n type: 'changeset' as const,\n version: cs.version,\n timestamp: cs.timestamp,\n description: `Version ${cs.version}`,\n source: cs.source,\n summary: cs.summary,\n }));\n\n // Map snapshots to timeline items\n const snapshotItems: HistoryTimelineItem[] = (snapshotsData.snapshots || []).map((snap: {\n id: string;\n version: number;\n timestamp: number;\n reason?: string;\n }) => ({\n id: snap.id,\n type: 'snapshot' as const,\n version: snap.version,\n timestamp: snap.timestamp,\n description: snap.reason || `Snapshot v${snap.version}`,\n reason: snap.reason,\n }));\n\n // Merge and sort by timestamp (newest first)\n const mergedTimeline = [...changesetItems, ...snapshotItems].sort(\n (a, b) => b.timestamp - a.timestamp\n );\n\n setTimeline(mergedTimeline);\n\n // Update current version from the latest item\n if (mergedTimeline.length > 0) {\n setCurrentVersion(mergedTimeline[0].version);\n }\n } catch (err) {\n console.error('[useOrbitalHistory] Failed to load history:', err);\n setError(err instanceof Error ? err.message : 'Failed to load history');\n } finally {\n setIsLoading(false);\n }\n }, [appId, getHeaders]);\n\n const revertToSnapshot = useCallback(async (snapshotId: string): Promise<RevertResult> => {\n if (!appId) {\n return { success: false, error: 'No app ID provided' };\n }\n\n try {\n const response = await fetch(`/api/graphs/${appId}/history/revert/${snapshotId}`, {\n method: 'POST',\n headers: getHeaders(),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Failed to revert: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (data.success && data.schema) {\n // Refresh timeline after successful revert\n await refresh();\n\n // Call success callback with restored schema\n onRevertSuccess?.(data.schema);\n\n return {\n success: true,\n restoredSchema: data.schema,\n };\n }\n\n return {\n success: false,\n error: data.error || 'Unknown error during revert',\n };\n } catch (err) {\n console.error('[useOrbitalHistory] Failed to revert:', err);\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Failed to revert',\n };\n }\n }, [appId, getHeaders, refresh, onRevertSuccess]);\n\n // Load history on mount and when appId/authToken/userId changes\n // Wait for authToken and userId to be available before fetching\n useEffect(() => {\n if (appId && authToken && userId) {\n refresh();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [appId, authToken, userId]);\n\n // Call onHistoryChange when timeline changes (separate effect to avoid infinite loop)\n useEffect(() => {\n onHistoryChange?.(timeline);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [timeline]);\n\n return {\n timeline,\n currentVersion,\n isLoading,\n error,\n revertToSnapshot,\n refresh,\n };\n}\n","/**\n * useFileSystem Hook\n *\n * Provides file system operations for WebContainer-based file management.\n * Handles booting, mounting files, reading/writing, and tree operations.\n */\n\nimport { useState, useCallback } from 'react';\n\n// =============================================================================\n// FileNode Type (defined locally to avoid dependency on FileTree component)\n// =============================================================================\n\nexport interface FileNode {\n path: string;\n name: string;\n type: 'file' | 'directory';\n children?: FileNode[];\n}\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type FileSystemStatus = 'idle' | 'booting' | 'ready' | 'running' | 'error';\n\nexport interface FileSystemFile {\n path: string;\n content: string;\n}\n\nexport interface SelectedFile {\n path: string;\n content: string;\n language?: string;\n isDirty?: boolean;\n}\n\nexport interface UseFileSystemResult {\n status: FileSystemStatus;\n error: string | null;\n isLoading: boolean;\n files: FileNode[];\n selectedFile: SelectedFile | null;\n selectedPath: string | null;\n previewUrl: string | null;\n boot: () => Promise<void>;\n mountFiles: (files: FileSystemFile[] | Record<string, unknown>) => Promise<void>;\n readFile: (path: string) => Promise<string>;\n writeFile: (path: string, content: string) => Promise<void>;\n selectFile: (path: string) => Promise<void>;\n updateContent: (pathOrContent: string, content?: string) => void;\n updateSelectedContent: (content: string) => void;\n refreshTree: () => Promise<void>;\n runCommand: (command: string) => Promise<{ exitCode: number; output: string }>;\n startDevServer: () => Promise<void>;\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\nexport function useFileSystem(): UseFileSystemResult {\n const [status, setStatus] = useState<FileSystemStatus>('idle');\n const [error, setError] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [files, setFiles] = useState<FileNode[]>([]);\n const [selectedFile, setSelectedFile] = useState<SelectedFile | null>(null);\n const [selectedPath, setSelectedPath] = useState<string | null>(null);\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n const [fileContents, setFileContents] = useState<Map<string, string>>(new Map());\n\n const boot = useCallback(async () => {\n setStatus('booting');\n setError(null);\n setIsLoading(true);\n\n try {\n // TODO: Implement WebContainer boot\n console.log('[useFileSystem] Booting WebContainer...');\n await new Promise(resolve => setTimeout(resolve, 100));\n setStatus('ready');\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to boot');\n setStatus('error');\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const mountFiles = useCallback(async (filesToMount: FileSystemFile[] | Record<string, unknown>) => {\n setIsLoading(true);\n try {\n // Convert object format to array if needed\n let filesArray: FileSystemFile[];\n if (Array.isArray(filesToMount)) {\n filesArray = filesToMount;\n } else {\n // Convert FileSystemTree object to array\n filesArray = [];\n const flattenTree = (obj: Record<string, unknown>, basePath = '') => {\n for (const [key, value] of Object.entries(obj)) {\n const path = basePath ? `${basePath}/${key}` : key;\n if (value && typeof value === 'object' && 'file' in value) {\n const fileObj = value as { file: { contents: string } };\n filesArray.push({ path, content: fileObj.file.contents || '' });\n } else if (value && typeof value === 'object' && 'directory' in value) {\n const dirObj = value as { directory: Record<string, unknown> };\n flattenTree(dirObj.directory, path);\n }\n }\n };\n flattenTree(filesToMount);\n }\n\n // Store file contents\n const newContents = new Map<string, string>();\n for (const file of filesArray) {\n newContents.set(file.path, file.content);\n }\n setFileContents(newContents);\n\n // Build tree from files\n const newTree: FileNode[] = [];\n for (const file of filesArray) {\n const parts = file.path.split('/').filter(Boolean);\n let current = newTree;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isFile = i === parts.length - 1;\n const currentPath = '/' + parts.slice(0, i + 1).join('/');\n\n let node = current.find(n => n.name === part);\n if (!node) {\n node = {\n path: currentPath,\n name: part,\n type: isFile ? 'file' : 'directory',\n children: isFile ? undefined : [],\n };\n current.push(node);\n }\n\n if (!isFile && node && node.children) {\n current = node.children;\n }\n }\n }\n\n setFiles(newTree);\n setStatus('running');\n } catch (err) {\n console.error('[useFileSystem] Failed to mount files:', err);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const readFile = useCallback(async (path: string): Promise<string> => {\n return fileContents.get(path) || '';\n }, [fileContents]);\n\n const writeFile = useCallback(async (path: string, content: string) => {\n setFileContents(prev => {\n const next = new Map(prev);\n next.set(path, content);\n return next;\n });\n }, []);\n\n const selectFile = useCallback(async (path: string) => {\n const content = fileContents.get(path) || '';\n const ext = path.split('.').pop()?.toLowerCase() || '';\n\n const languageMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n json: 'json',\n md: 'markdown',\n css: 'css',\n html: 'html',\n orb: 'json',\n };\n\n setSelectedPath(path);\n setSelectedFile({\n path,\n content,\n language: languageMap[ext] || 'plaintext',\n isDirty: false,\n });\n }, [fileContents]);\n\n const updateContent = useCallback((pathOrContent: string, contentArg?: string) => {\n // Support both signatures: (path, content) and (content) - latter uses selectedPath\n const path = contentArg !== undefined ? pathOrContent : selectedPath;\n const content = contentArg !== undefined ? contentArg : pathOrContent;\n\n if (!path) {\n console.warn('[useFileSystem] updateContent called without path and no file selected');\n return;\n }\n\n setFileContents(prev => {\n const next = new Map(prev);\n next.set(path, content);\n return next;\n });\n if (selectedPath === path) {\n setSelectedFile(prev => prev ? { ...prev, content, isDirty: true } : null);\n }\n }, [selectedPath]);\n\n const updateSelectedContent = useCallback((content: string) => {\n setSelectedFile(prev => prev ? { ...prev, content, isDirty: true } : null);\n }, []);\n\n const refreshTree = useCallback(async () => {\n console.log('[useFileSystem] Refreshing tree');\n }, []);\n\n const runCommand = useCallback(async (command: string) => {\n console.log('[useFileSystem] Running command:', command);\n return { exitCode: 0, output: '' };\n }, []);\n\n const startDevServer = useCallback(async () => {\n console.log('[useFileSystem] Starting dev server');\n // TODO: Implement dev server start\n setPreviewUrl('http://localhost:5173');\n }, []);\n\n return {\n status,\n error,\n isLoading,\n files,\n selectedFile,\n selectedPath,\n previewUrl,\n boot,\n mountFiles,\n readFile,\n writeFile,\n selectFile,\n updateContent,\n updateSelectedContent,\n refreshTree,\n runCommand,\n startDevServer,\n };\n}\n","/**\n * useExtensions Hook\n *\n * Manages loading and accessing language/editor extensions.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface Extension {\n id: string;\n name: string;\n language?: string;\n loaded: boolean;\n}\n\nexport interface ExtensionEntry {\n file: string;\n language?: string;\n}\n\nexport interface ExtensionManifest {\n languages: Record<string, { extensions: string[]; icon?: string; color?: string }>;\n extensions: ExtensionEntry[];\n}\n\nexport interface UseExtensionsOptions {\n appId: string;\n loadOnMount?: boolean;\n}\n\nexport interface UseExtensionsResult {\n extensions: Extension[];\n manifest: ExtensionManifest;\n isLoading: boolean;\n error: string | null;\n loadExtension: (extensionId: string) => Promise<void>;\n loadExtensions: () => Promise<void>;\n getExtensionForFile: (filename: string) => Extension | null;\n}\n\n// Default manifest\nconst defaultManifest: ExtensionManifest = {\n languages: {\n typescript: { extensions: ['.ts', '.tsx'], icon: 'ts', color: '#3178c6' },\n javascript: { extensions: ['.js', '.jsx'], icon: 'js', color: '#f7df1e' },\n json: { extensions: ['.json', '.orb'], icon: 'json', color: '#000000' },\n css: { extensions: ['.css'], icon: 'css', color: '#264de4' },\n html: { extensions: ['.html'], icon: 'html', color: '#e34c26' },\n markdown: { extensions: ['.md', '.mdx'], icon: 'md', color: '#083fa1' },\n },\n extensions: [],\n};\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\nexport function useExtensions(options: UseExtensionsOptions): UseExtensionsResult {\n const { appId, loadOnMount = true } = options;\n\n const [extensions, setExtensions] = useState<Extension[]>([]);\n const [manifest] = useState<ExtensionManifest>(defaultManifest);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const loadExtension = useCallback(async (extensionId: string) => {\n console.log('[useExtensions] Loading extension:', extensionId);\n }, []);\n\n const loadExtensions = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const defaultExtensions: Extension[] = [\n { id: 'typescript', name: 'TypeScript', language: 'typescript', loaded: true },\n { id: 'javascript', name: 'JavaScript', language: 'javascript', loaded: true },\n { id: 'json', name: 'JSON', language: 'json', loaded: true },\n { id: 'css', name: 'CSS', language: 'css', loaded: true },\n { id: 'html', name: 'HTML', language: 'html', loaded: true },\n { id: 'markdown', name: 'Markdown', language: 'markdown', loaded: true },\n ];\n\n setExtensions(defaultExtensions);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load extensions');\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const getExtensionForFile = useCallback((filename: string): Extension | null => {\n const ext = filename.split('.').pop()?.toLowerCase();\n if (!ext) return null;\n\n const languageMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n json: 'json',\n md: 'markdown',\n css: 'css',\n html: 'html',\n orb: 'json',\n };\n\n const language = languageMap[ext];\n if (!language) return null;\n\n return extensions.find(e => e.language === language) || null;\n }, [extensions]);\n\n useEffect(() => {\n if (!appId || !loadOnMount) return;\n\n const loadExtensions = async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const defaultExtensions: Extension[] = [\n { id: 'typescript', name: 'TypeScript', language: 'typescript', loaded: true },\n { id: 'javascript', name: 'JavaScript', language: 'javascript', loaded: true },\n { id: 'json', name: 'JSON', language: 'json', loaded: true },\n { id: 'css', name: 'CSS', language: 'css', loaded: true },\n { id: 'html', name: 'HTML', language: 'html', loaded: true },\n { id: 'markdown', name: 'Markdown', language: 'markdown', loaded: true },\n ];\n\n setExtensions(defaultExtensions);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load extensions');\n } finally {\n setIsLoading(false);\n }\n };\n\n loadExtensions();\n }, [appId, loadOnMount]);\n\n return {\n extensions,\n manifest,\n isLoading,\n error,\n loadExtension,\n loadExtensions,\n getExtensionForFile,\n };\n}\n","/**\n * useFileEditor Hook\n *\n * Manages file editing state and operations.\n */\n\nimport { useState, useCallback } from 'react';\nimport type { UseExtensionsResult } from './useExtensions';\nimport type { UseFileSystemResult } from './useFileSystem';\nimport type { OrbitalSchema } from '@almadar/core';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface OpenFile {\n path: string;\n content: string;\n isDirty: boolean;\n language?: string;\n}\n\nexport interface UseFileEditorOptions {\n extensions: UseExtensionsResult;\n fileSystem: UseFileSystemResult;\n onSchemaUpdate?: (schema: OrbitalSchema) => Promise<void>;\n}\n\nexport interface FileEditResult {\n success: boolean;\n action?: 'updated_schema' | 'converted_extension' | 'saved_extension' | 'saved';\n error?: string;\n}\n\nexport interface UseFileEditorResult {\n openFiles: OpenFile[];\n activeFile: OpenFile | null;\n isSaving: boolean;\n openFile: (path: string) => Promise<void>;\n closeFile: (path: string) => void;\n setActiveFile: (path: string) => void;\n updateFileContent: (path: string, content: string) => void;\n handleFileEdit: (path: string, content: string) => Promise<FileEditResult>;\n saveFile: (path: string) => Promise<void>;\n saveAllFiles: () => Promise<void>;\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\nexport function useFileEditor(options: UseFileEditorOptions): UseFileEditorResult {\n const { extensions, fileSystem, onSchemaUpdate } = options;\n\n const [openFiles, setOpenFiles] = useState<OpenFile[]>([]);\n const [activeFilePath, setActiveFilePath] = useState<string | null>(null);\n const [isSaving, setIsSaving] = useState(false);\n\n const activeFile = openFiles.find(f => f.path === activeFilePath) || null;\n\n const openFile = useCallback(async (path: string) => {\n // Check if already open\n const existing = openFiles.find(f => f.path === path);\n if (existing) {\n setActiveFilePath(path);\n return;\n }\n\n try {\n const content = await fileSystem.readFile(path);\n const ext = extensions.getExtensionForFile(path);\n\n const newFile: OpenFile = {\n path,\n content,\n isDirty: false,\n language: ext?.language,\n };\n\n setOpenFiles(prev => [...prev, newFile]);\n setActiveFilePath(path);\n } catch (err) {\n console.error('[useFileEditor] Failed to open file:', err);\n }\n }, [openFiles, fileSystem, extensions]);\n\n const closeFile = useCallback((path: string) => {\n setOpenFiles(prev => prev.filter(f => f.path !== path));\n\n if (activeFilePath === path) {\n const remaining = openFiles.filter(f => f.path !== path);\n setActiveFilePath(remaining.length > 0 ? remaining[0].path : null);\n }\n }, [activeFilePath, openFiles]);\n\n const setActiveFile = useCallback((path: string) => {\n setActiveFilePath(path);\n }, []);\n\n const updateFileContent = useCallback((path: string, content: string) => {\n setOpenFiles(prev =>\n prev.map(f =>\n f.path === path ? { ...f, content, isDirty: true } : f\n )\n );\n }, []);\n\n const handleFileEdit = useCallback(async (path: string, content: string): Promise<FileEditResult> => {\n try {\n // Save the file\n await fileSystem.writeFile(path, content);\n\n // Determine the action based on file type\n let action: FileEditResult['action'] = 'saved';\n\n if (path.endsWith('.orb') || path.endsWith('schema.json')) {\n try {\n const schema = JSON.parse(content) as OrbitalSchema;\n await onSchemaUpdate?.(schema);\n action = 'updated_schema';\n } catch {\n // Not valid JSON, just save as file\n }\n } else if (path.includes('/extensions/')) {\n action = path.endsWith('.new') ? 'converted_extension' : 'saved_extension';\n }\n\n return { success: true, action };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Failed to save file',\n };\n }\n }, [fileSystem, onSchemaUpdate]);\n\n const saveFile = useCallback(async (path: string) => {\n const file = openFiles.find(f => f.path === path);\n if (!file) return;\n\n setIsSaving(true);\n try {\n await fileSystem.writeFile(path, file.content);\n\n setOpenFiles(prev =>\n prev.map(f =>\n f.path === path ? { ...f, isDirty: false } : f\n )\n );\n\n // Check if this is a schema file\n if (path.endsWith('.orb') || path.endsWith('schema.json')) {\n try {\n const schema = JSON.parse(file.content) as OrbitalSchema;\n await onSchemaUpdate?.(schema);\n } catch {\n // Not valid JSON, ignore\n }\n }\n } catch (err) {\n console.error('[useFileEditor] Failed to save file:', err);\n } finally {\n setIsSaving(false);\n }\n }, [openFiles, fileSystem, onSchemaUpdate]);\n\n const saveAllFiles = useCallback(async () => {\n setIsSaving(true);\n try {\n const dirtyFiles = openFiles.filter(f => f.isDirty);\n for (const file of dirtyFiles) {\n await saveFile(file.path);\n }\n } finally {\n setIsSaving(false);\n }\n }, [openFiles, saveFile]);\n\n return {\n openFiles,\n activeFile,\n isSaving,\n openFile,\n closeFile,\n setActiveFile,\n updateFileContent,\n handleFileEdit,\n saveFile,\n saveAllFiles,\n };\n}\n","/**\n * useCompile Hook\n *\n * Handles schema compilation to generate application files.\n */\n\nimport { useState, useCallback } from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n// Accept any schema-like object to avoid type conflicts between\n// client's local OrbitalSchema type and shared package's type\nexport interface SchemaLike {\n name: string;\n version?: string;\n [key: string]: unknown;\n}\n\nexport type CompileStage = 'idle' | 'compiling' | 'done' | 'error';\n\nexport interface CompileResult {\n success: boolean;\n files?: Array<{ path: string; content: string }>;\n errors?: string[];\n}\n\nexport interface UseCompileResult {\n isCompiling: boolean;\n stage: CompileStage;\n lastResult: CompileResult | null;\n error: string | null;\n compileSchema: (schema: SchemaLike) => Promise<CompileResult | null>;\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\nexport function useCompile(): UseCompileResult {\n const [isCompiling, setIsCompiling] = useState(false);\n const [stage, setStage] = useState<CompileStage>('idle');\n const [lastResult, setLastResult] = useState<CompileResult | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const compileSchema = useCallback(async (schema: SchemaLike): Promise<CompileResult | null> => {\n setIsCompiling(true);\n setStage('compiling');\n setError(null);\n\n try {\n // TODO: Implement actual compilation via API\n console.log('[useCompile] Compiling schema:', schema.name);\n\n // Mock result for now\n const result: CompileResult = {\n success: true,\n files: [],\n };\n\n setLastResult(result);\n setStage('done');\n return result;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Compilation failed';\n setError(errorMessage);\n setStage('error');\n setLastResult({ success: false, errors: [errorMessage] });\n return null;\n } finally {\n setIsCompiling(false);\n }\n }, []);\n\n return {\n isCompiling,\n stage,\n lastResult,\n error,\n compileSchema,\n };\n}\n","/**\n * usePreview Hook\n *\n * Stub implementation for app preview state management.\n * Actual API calls should be implemented by the consuming client.\n */\n\nimport { useState, useCallback, useMemo, useEffect } from 'react';\nimport type { OrbitalSchema } from '@almadar/core';\n\nexport interface PreviewApp {\n id: string;\n name: string;\n status: 'loading' | 'ready' | 'error';\n schema?: OrbitalSchema;\n graphView: {\n version: string;\n };\n}\n\nexport interface Notification {\n id: string;\n type: 'info' | 'warning' | 'error' | 'success';\n title: string;\n message: string;\n timestamp: number;\n read?: boolean;\n actionLabel?: string;\n onAction?: () => void;\n autoDismiss?: boolean;\n dismissAfter?: number;\n}\n\nexport interface NotificationsState {\n notifications: Notification[];\n isPanelOpen: boolean;\n closePanel: () => void;\n dismissNotification: (id: string) => void;\n markAsRead: (id: string) => void;\n clearAll: () => void;\n}\n\nexport interface ErrorToast {\n message: string;\n}\n\nexport interface UsePreviewResult {\n previewUrl: string | null;\n isLoading: boolean;\n error: string | null;\n loadError: string | null;\n app: PreviewApp | null;\n isFullscreen: boolean;\n isExecutingEvent: boolean;\n errorToast: ErrorToast | null;\n currentStateName: string | null;\n notifications: NotificationsState;\n startPreview: () => Promise<void>;\n stopPreview: () => Promise<void>;\n refresh: () => Promise<void>;\n handleRefresh: () => Promise<void>;\n handleReset: () => Promise<void>;\n toggleFullscreen: () => void;\n setErrorToast: (toast: ErrorToast | null) => void;\n dismissErrorToast: () => void;\n}\n\nexport interface UsePreviewOptions {\n appId?: string;\n}\n\nexport function usePreview(options?: UsePreviewOptions): UsePreviewResult {\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n // Start loading if we have an appId\n const [isLoading, setIsLoading] = useState(!!options?.appId);\n const [error, setError] = useState<string | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [app, setApp] = useState<PreviewApp | null>(null);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [isExecutingEvent, setIsExecutingEvent] = useState(false);\n const [errorToast, setErrorToast] = useState<ErrorToast | null>(null);\n const [currentStateName, setCurrentStateName] = useState<string | null>(null);\n const [notificationsList, setNotificationsList] = useState<Notification[]>([]);\n const [isPanelOpen, setIsPanelOpen] = useState(false);\n\n const notifications: NotificationsState = useMemo(() => ({\n notifications: notificationsList,\n isPanelOpen,\n closePanel: () => setIsPanelOpen(false),\n dismissNotification: (id: string) => {\n setNotificationsList((prev) => prev.filter((n) => n.id !== id));\n },\n markAsRead: (id: string) => {\n setNotificationsList((prev) =>\n prev.map((n) => (n.id === id ? { ...n, read: true } : n))\n );\n },\n clearAll: () => setNotificationsList([]),\n }), [notificationsList, isPanelOpen]);\n\n // Load app data when appId changes\n // TODO: Implement actual app loading API call in consuming client\n useEffect(() => {\n const appId = options?.appId;\n if (!appId) {\n setApp(null);\n setIsLoading(false);\n return;\n }\n\n // Stub implementation - just set up preview URL without actual API call\n console.log('[usePreview] Setting up preview for app:', appId);\n setPreviewUrl(`/api/orbitals/${appId}`);\n setIsLoading(false);\n }, [options?.appId]);\n\n const startPreview = useCallback(async () => {\n // Preview is started automatically when app loads\n console.log('[usePreview] startPreview called');\n }, []);\n\n const stopPreview = useCallback(async () => {\n setIsLoading(true);\n try {\n console.log('[usePreview] Stopping preview server...');\n setPreviewUrl(null);\n setApp(null);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const refresh = useCallback(async () => {\n if (!previewUrl) return;\n console.log('[usePreview] Refreshing preview...');\n // Trigger iframe refresh by appending timestamp\n setPreviewUrl(`${previewUrl.split('?')[0]}?t=${Date.now()}`);\n }, [previewUrl]);\n\n const handleRefresh = useCallback(async () => {\n console.log('[usePreview] Handle refresh...');\n await refresh();\n }, [refresh]);\n\n const handleReset = useCallback(async () => {\n console.log('[usePreview] Resetting preview...');\n setError(null);\n setLoadError(null);\n setErrorToast(null);\n setIsExecutingEvent(false);\n setCurrentStateName(null);\n }, []);\n\n const toggleFullscreen = useCallback(() => {\n setIsFullscreen((prev) => !prev);\n }, []);\n\n const dismissErrorToast = useCallback(() => {\n setErrorToast(null);\n }, []);\n\n return {\n previewUrl,\n isLoading,\n error,\n loadError,\n app,\n isFullscreen,\n isExecutingEvent,\n errorToast,\n currentStateName,\n notifications,\n startPreview,\n stopPreview,\n refresh,\n handleRefresh,\n handleReset,\n toggleFullscreen,\n setErrorToast,\n dismissErrorToast,\n };\n}\n","/**\n * useAgentChat Hook\n *\n * Stub implementation for agent chat functionality.\n */\n\nimport { useState, useCallback } from 'react';\nimport type { DeepAgentInterrupt } from './useDeepAgentGeneration';\n\nexport interface ChatMessage {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n timestamp: number;\n}\n\nexport type AvatarRole = 'user' | 'assistant' | 'system';\nexport type FileOperation = 'ls' | 'read_file' | 'write_file' | 'edit_file';\n\n// Activity type matches ActivityItem from AgentActivityFeed\nexport type Activity =\n | { type: 'message'; role: AvatarRole; content: string; timestamp: number; isStreaming?: boolean }\n | { type: 'tool_call'; tool: string; args: Record<string, unknown>; timestamp: number; isExecuting?: boolean }\n | { type: 'tool_result'; tool: string; result: unknown; success: boolean; timestamp: number }\n | { type: 'file_operation'; operation: FileOperation; path: string; success?: boolean; timestamp: number }\n | { type: 'schema_diff'; filePath: string; hunks: DiffHunk[]; timestamp: number }\n | { type: 'error'; message: string; code?: string; timestamp: number };\n\nexport interface TodoActivity {\n type: 'thinking' | 'tool_call' | 'tool_result' | 'code_change';\n content: string;\n timestamp: number;\n tool?: string;\n success?: boolean;\n filePath?: string;\n diff?: string;\n}\n\nexport interface Todo {\n id: string;\n task: string;\n status: 'pending' | 'in_progress' | 'completed';\n latestActivity?: TodoActivity;\n activityHistory?: TodoActivity[];\n}\n\nexport interface DiffHunk {\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: Array<{\n type: 'add' | 'remove' | 'context';\n content: string;\n }>;\n}\n\nexport interface SchemaDiff {\n id: string;\n filePath: string;\n hunks: DiffHunk[];\n timestamp: number;\n addedLines: number;\n removedLines: number;\n}\n\nexport type AgentStatus = 'idle' | 'running' | 'complete' | 'error' | 'interrupted';\n\nexport interface UseAgentChatOptions {\n appId?: string;\n onComplete?: (schema?: unknown) => void;\n onSchemaChange?: (diff?: unknown) => void;\n onError?: (error: Error | string) => void;\n}\n\nexport interface UseAgentChatResult {\n messages: ChatMessage[];\n status: AgentStatus;\n activities: Activity[];\n todos: Todo[];\n schemaDiffs: SchemaDiff[];\n isLoading: boolean;\n error: string | null;\n threadId: string | null;\n interrupt: DeepAgentInterrupt | null;\n sendMessage: (content: string) => Promise<void>;\n startGeneration: (skill: string | string[], prompt: string, options?: Record<string, unknown>) => Promise<void>;\n continueConversation: (message: string | string[]) => Promise<void>;\n resumeWithDecision: (decisions: unknown[]) => Promise<void>;\n cancel: () => void;\n clearMessages: () => void;\n clearHistory: () => void;\n}\n\nexport function useAgentChat(options?: UseAgentChatOptions): UseAgentChatResult {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [status, setStatus] = useState<AgentStatus>('idle');\n const [activities, setActivities] = useState<Activity[]>([]);\n const [todos, setTodos] = useState<Todo[]>([]);\n const [schemaDiffs, setSchemaDiffs] = useState<SchemaDiff[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [threadId] = useState<string | null>(null);\n const [interrupt, setInterrupt] = useState<DeepAgentInterrupt | null>(null);\n\n const sendMessage = useCallback(async (content: string) => {\n setIsLoading(true);\n setStatus('running');\n setError(null);\n\n try {\n const userMessage: ChatMessage = {\n id: Date.now().toString(),\n role: 'user',\n content,\n timestamp: Date.now(),\n };\n\n setMessages((prev) => [...prev, userMessage]);\n\n // TODO: Implement actual agent chat API call\n console.log('[useAgentChat] Sending message:', content);\n\n // Stub response\n const assistantMessage: ChatMessage = {\n id: (Date.now() + 1).toString(),\n role: 'assistant',\n content: 'Agent chat is not yet implemented.',\n timestamp: Date.now(),\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n setStatus('idle');\n options?.onComplete?.();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to send message');\n setStatus('error');\n } finally {\n setIsLoading(false);\n }\n }, [options]);\n\n const startGeneration = useCallback(async (skill: string | string[], prompt: string, genOptions?: Record<string, unknown>) => {\n setStatus('running');\n setIsLoading(true);\n setError(null);\n\n const skillName = Array.isArray(skill) ? skill[0] : skill;\n try {\n console.log('[useAgentChat] Starting generation:', skillName, prompt, genOptions);\n // TODO: Implement actual generation\n await new Promise((resolve) => setTimeout(resolve, 100));\n setStatus('complete');\n options?.onComplete?.();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Generation failed');\n setStatus('error');\n } finally {\n setIsLoading(false);\n }\n }, [options]);\n\n const continueConversation = useCallback(async (message: string | string[]) => {\n console.log('[useAgentChat] Continue conversation', message);\n // TODO: Implement actual continue conversation\n }, []);\n\n const resumeWithDecision = useCallback(async (decisions: unknown[]) => {\n console.log('[useAgentChat] Resume with decision:', decisions);\n setInterrupt(null);\n // TODO: Implement actual resume with decision\n }, []);\n\n const cancel = useCallback(() => {\n setStatus('idle');\n setIsLoading(false);\n setInterrupt(null);\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n }, []);\n\n const clearHistory = useCallback(() => {\n setMessages([]);\n setActivities([]);\n setTodos([]);\n setSchemaDiffs([]);\n setError(null);\n }, []);\n\n return {\n messages,\n status,\n activities,\n todos,\n schemaDiffs,\n isLoading,\n error,\n threadId,\n interrupt,\n sendMessage,\n startGeneration,\n continueConversation,\n resumeWithDecision,\n cancel,\n clearMessages,\n clearHistory,\n };\n}\n","/**\n * useValidation Hook\n *\n * Stub implementation for schema validation.\n */\n\nimport { useState, useCallback } from 'react';\n\nexport interface LLMErrorContext {\n rawValuePreview?: string;\n expectedType?: string;\n actualType?: string;\n source?: {\n agent: 'requirements' | 'builder' | 'view-planner';\n operation: string;\n promptHash?: string;\n };\n tokenUsage?: {\n prompt: number;\n completion: number;\n };\n}\n\nexport interface ValidationError {\n code: string;\n message: string;\n path?: string;\n severity: 'error' | 'warning';\n suggestion?: string;\n validValues?: string[];\n expectedShape?: string;\n fixGuidance?: string;\n llmContext?: LLMErrorContext;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings: ValidationError[];\n}\n\nexport type ValidationStage = 'idle' | 'validating' | 'fixing' | 'complete';\n\nexport interface UseValidationResult {\n result: ValidationResult | null;\n isValidating: boolean;\n error: string | null;\n stage: ValidationStage;\n isFixing: boolean;\n progressMessage: string | null;\n errors: ValidationError[];\n warnings: ValidationError[];\n isValid: boolean;\n validate: (appId: string) => Promise<ValidationResult>;\n clearResult: () => void;\n reset: () => void;\n}\n\nexport function useValidation(): UseValidationResult {\n const [result, setResult] = useState<ValidationResult | null>(null);\n const [isValidating, setIsValidating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [stage, setStage] = useState<ValidationStage>('idle');\n const [isFixing, setIsFixing] = useState(false);\n const [progressMessage, setProgressMessage] = useState<string | null>(null);\n\n const validate = useCallback(async (appId: string): Promise<ValidationResult> => {\n setIsValidating(true);\n setError(null);\n setStage('validating');\n setProgressMessage('Validating schema...');\n\n try {\n // TODO: Implement actual validation API call\n console.log('[useValidation] Validating app:', appId);\n\n const validationResult: ValidationResult = {\n valid: true,\n errors: [],\n warnings: [],\n };\n\n setResult(validationResult);\n setStage('complete');\n setProgressMessage(null);\n return validationResult;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Validation failed';\n setError(errorMessage);\n const failedResult: ValidationResult = {\n valid: false,\n errors: [{ code: 'VALIDATION_ERROR', message: errorMessage, severity: 'error' }],\n warnings: [],\n };\n setResult(failedResult);\n setStage('complete');\n setProgressMessage(null);\n return failedResult;\n } finally {\n setIsValidating(false);\n }\n }, []);\n\n const clearResult = useCallback(() => {\n setResult(null);\n setError(null);\n }, []);\n\n const reset = useCallback(() => {\n setResult(null);\n setError(null);\n setStage('idle');\n setIsFixing(false);\n setProgressMessage(null);\n setIsValidating(false);\n }, []);\n\n return {\n result,\n isValidating,\n error,\n stage,\n isFixing,\n progressMessage,\n errors: result?.errors ?? [],\n warnings: result?.warnings ?? [],\n isValid: result?.valid ?? false,\n validate,\n clearResult,\n reset,\n };\n}\n","/**\n * useDeepAgentGeneration Hook\n *\n * Stub implementation for deep agent generation functionality.\n */\n\nimport { useState, useCallback } from 'react';\nimport type { OrbitalSchema } from '@almadar/core';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface DeepAgentActionRequest {\n id: string;\n type: string;\n tool: string;\n args: Record<string, unknown>;\n description?: string;\n allowedDecisions: ('approve' | 'edit' | 'reject')[];\n status: 'pending' | 'approved' | 'rejected' | 'edited';\n}\n\nexport interface DeepAgentInterrupt {\n id: string;\n type: 'tool_calls' | 'confirmation' | 'error';\n message?: string;\n actionRequests: DeepAgentActionRequest[];\n timestamp: number;\n threadId?: string;\n}\n\nexport interface GenerationRequest {\n id: string;\n prompt: string;\n status: 'pending' | 'running' | 'completed' | 'failed';\n result?: OrbitalSchema;\n error?: string;\n}\n\nexport interface GenerationProgress {\n stage: string;\n percent: number;\n message: string;\n}\n\nexport interface UseDeepAgentGenerationResult {\n requests: GenerationRequest[];\n currentRequest: GenerationRequest | null;\n isGenerating: boolean;\n isLoading: boolean;\n isComplete: boolean;\n progress: GenerationProgress;\n error: string | null;\n interrupt: DeepAgentInterrupt | null;\n generate: (prompt: string) => Promise<OrbitalSchema | null>;\n startGeneration: (skill: string, prompt: string, options?: Record<string, unknown>) => Promise<void>;\n cancelGeneration: () => void;\n clearRequests: () => void;\n submitInterruptDecisions: (decisions: unknown[]) => void;\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\nexport function useDeepAgentGeneration(): UseDeepAgentGenerationResult {\n const [requests, setRequests] = useState<GenerationRequest[]>([]);\n const [currentRequest, setCurrentRequest] = useState<GenerationRequest | null>(null);\n const [isGenerating, setIsGenerating] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isComplete, setIsComplete] = useState(false);\n const [progress, setProgress] = useState<GenerationProgress>({ stage: 'idle', percent: 0, message: '' });\n const [error, setError] = useState<string | null>(null);\n const [interrupt, setInterrupt] = useState<DeepAgentInterrupt | null>(null);\n\n const generate = useCallback(async (prompt: string): Promise<OrbitalSchema | null> => {\n setIsGenerating(true);\n setIsLoading(true);\n setIsComplete(false);\n setError(null);\n setProgress({ stage: 'starting', percent: 0, message: 'Starting generation...' });\n\n const request: GenerationRequest = {\n id: Date.now().toString(),\n prompt,\n status: 'running',\n };\n\n setCurrentRequest(request);\n setRequests((prev) => [...prev, request]);\n\n try {\n // TODO: Implement actual deep agent generation API call\n console.log('[useDeepAgentGeneration] Generating from prompt:', prompt);\n\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n request.status = 'completed';\n setCurrentRequest(request);\n setIsComplete(true);\n setProgress({ stage: 'complete', percent: 100, message: 'Generation complete' });\n return null;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Generation failed';\n setError(errorMessage);\n request.status = 'failed';\n request.error = errorMessage;\n setCurrentRequest(request);\n return null;\n } finally {\n setIsGenerating(false);\n setIsLoading(false);\n }\n }, []);\n\n const startGeneration = useCallback(async (skill: string, prompt: string, _options?: Record<string, unknown>): Promise<void> => {\n console.log('[useDeepAgentGeneration] Starting generation with skill:', skill);\n await generate(prompt);\n }, [generate]);\n\n const cancelGeneration = useCallback(() => {\n if (currentRequest) {\n currentRequest.status = 'failed';\n currentRequest.error = 'Cancelled by user';\n setCurrentRequest(null);\n }\n setIsGenerating(false);\n setIsLoading(false);\n setIsComplete(false);\n setProgress({ stage: 'idle', percent: 0, message: '' });\n }, [currentRequest]);\n\n const clearRequests = useCallback(() => {\n setRequests([]);\n setCurrentRequest(null);\n setError(null);\n setProgress({ stage: 'idle', percent: 0, message: '' });\n setIsComplete(false);\n }, []);\n\n const submitInterruptDecisions = useCallback((decisions: unknown[]) => {\n console.log('[useDeepAgentGeneration] Submitting interrupt decisions:', decisions);\n setInterrupt(null);\n }, []);\n\n return {\n requests,\n currentRequest,\n isGenerating,\n isLoading,\n isComplete,\n progress,\n error,\n interrupt,\n generate,\n startGeneration,\n cancelGeneration,\n clearRequests,\n submitInterruptDecisions,\n };\n}\n","/**\n * EventBusProvider - React context provider for the event bus\n *\n * Provides a page-scoped event bus for trait communication.\n * Each page has its own event bus instance.\n *\n * NOTE: Selection state has been moved to SelectionProvider.\n * Use SelectionProvider for tracking selected entities.\n *\n * @packageDocumentation\n */\n\nimport React, { createContext, useCallback, useRef, useMemo, useEffect, type ReactNode } from 'react';\nimport type { KFlowEvent, EventListener, Unsubscribe, EventBusContextType } from '../hooks/event-bus-types';\nimport { setGlobalEventBus } from '../hooks/useEventBus';\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * Extended context type for backward compatibility.\n *\n * @deprecated getSelectedEntity and clearSelectedEntity are deprecated.\n * Use SelectionProvider and useSelection hook instead.\n */\nexport interface EventBusContextTypeExtended extends EventBusContextType {\n /**\n * @deprecated Use useSelection from SelectionProvider instead.\n * This method now returns null - selection state moved to SelectionProvider.\n */\n getSelectedEntity: () => unknown | null;\n /**\n * @deprecated Use useSelection from SelectionProvider instead.\n * This method is now a no-op - selection state moved to SelectionProvider.\n */\n clearSelectedEntity: () => void;\n}\n\nexport const EventBusContext = createContext<EventBusContextTypeExtended | null>(null);\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\ninterface EventBusProviderProps {\n children: ReactNode;\n /** Enable debug logging in development */\n debug?: boolean;\n}\n\n/**\n * Provider component for the page event bus.\n *\n * This is a pure pub/sub event bus. For selection state,\n * use SelectionProvider which listens to events and maintains state.\n *\n * @example\n * ```tsx\n * function TaskDetailPage() {\n * return (\n * <EventBusProvider debug={process.env.NODE_ENV === 'development'}>\n * <SelectionProvider>\n * <TaskHeader />\n * <TaskForm />\n * <TaskActions />\n * </SelectionProvider>\n * </EventBusProvider>\n * );\n * }\n * ```\n */\nexport function EventBusProvider({ children, debug = false }: EventBusProviderProps) {\n // Store listeners by event type\n const listenersRef = useRef<Map<string, Set<EventListener>>>(new Map());\n\n // Track if deprecation warning has been shown\n const deprecationWarningShown = useRef(false);\n\n /**\n * @deprecated Use useSelection from SelectionProvider instead.\n */\n const getSelectedEntity = useCallback(() => {\n if (!deprecationWarningShown.current) {\n console.warn(\n '[EventBus] getSelectedEntity is deprecated. ' +\n 'Use SelectionProvider and useSelection hook instead. ' +\n 'See SelectionProvider.tsx for migration guide.'\n );\n deprecationWarningShown.current = true;\n }\n return null;\n }, []);\n\n /**\n * @deprecated Use useSelection from SelectionProvider instead.\n */\n const clearSelectedEntity = useCallback(() => {\n if (!deprecationWarningShown.current) {\n console.warn(\n '[EventBus] clearSelectedEntity is deprecated. ' +\n 'Use SelectionProvider and useSelection hook instead. ' +\n 'See SelectionProvider.tsx for migration guide.'\n );\n deprecationWarningShown.current = true;\n }\n }, []);\n\n /**\n * Emit an event to all listeners of that type.\n */\n const emit = useCallback((type: string, payload?: Record<string, unknown>) => {\n const event: KFlowEvent = {\n type,\n payload,\n timestamp: Date.now(),\n };\n\n const listeners = listenersRef.current.get(type);\n const listenerCount = listeners?.size ?? 0;\n\n if (debug) {\n if (listenerCount > 0) {\n console.log(`[EventBus] Emit: ${type} → ${listenerCount} listener(s)`, payload);\n } else {\n console.warn(`[EventBus] Emit: ${type} (NO LISTENERS - event may be lost!)`, payload);\n }\n }\n\n if (listeners) {\n // Create a copy to avoid issues if listener modifies the set\n const listenersCopy = Array.from(listeners);\n for (const listener of listenersCopy) {\n try {\n listener(event);\n } catch (error) {\n console.error(`[EventBus] Error in listener for '${type}':`, error);\n }\n }\n }\n }, [debug]);\n\n /**\n * Subscribe to an event type.\n * Returns an unsubscribe function.\n */\n const on = useCallback((type: string, listener: EventListener): Unsubscribe => {\n if (!listenersRef.current.has(type)) {\n listenersRef.current.set(type, new Set());\n }\n\n const listeners = listenersRef.current.get(type)!;\n listeners.add(listener);\n\n if (debug) {\n console.log(`[EventBus] Subscribed to '${type}', total: ${listeners.size}`);\n }\n\n // Return unsubscribe function\n return () => {\n listeners.delete(listener);\n if (debug) {\n console.log(`[EventBus] Unsubscribed from '${type}', remaining: ${listeners.size}`);\n }\n // Clean up empty sets\n if (listeners.size === 0) {\n listenersRef.current.delete(type);\n }\n };\n }, [debug]);\n\n /**\n * Subscribe to an event type, but only fire once.\n */\n const once = useCallback((type: string, listener: EventListener): Unsubscribe => {\n const wrappedListener: EventListener = (event) => {\n // Remove self before calling listener\n listenersRef.current.get(type)?.delete(wrappedListener);\n listener(event);\n };\n\n return on(type, wrappedListener);\n }, [on]);\n\n /**\n * Check if there are any listeners for an event type.\n */\n const hasListeners = useCallback((type: string): boolean => {\n const listeners = listenersRef.current.get(type);\n return listeners !== undefined && listeners.size > 0;\n }, []);\n\n // Memoize context value\n const contextValue = useMemo(\n () => ({\n emit,\n on,\n once,\n hasListeners,\n getSelectedEntity,\n clearSelectedEntity,\n }),\n [emit, on, once, hasListeners, getSelectedEntity, clearSelectedEntity]\n );\n\n // Bridge to global event bus system.\n // Components in other packages (like shell components) use their own useEventBus hook\n // which checks for a global event bus. Setting it here allows shell components to\n // emit events to the same bus that the main app's trait state machine listens to.\n useEffect(() => {\n setGlobalEventBus(contextValue);\n return () => {\n setGlobalEventBus(null);\n };\n }, [contextValue]);\n\n return (\n <EventBusContext.Provider value={contextValue}>\n {children}\n </EventBusContext.Provider>\n );\n}\n\nexport type { EventBusContextType };\n","/**\n * useEventBus Hook\n *\n * Provides event bus utilities for component communication.\n * This connects to the EventBusProvider for real applications\n * or provides a simple in-memory bus for design system / Storybook.\n *\n * @packageDocumentation\n */\n\nimport { useCallback, useEffect, useRef, useContext } from 'react';\nimport { EventBusContext } from '../providers/EventBusProvider';\nimport type { KFlowEvent, EventListener, Unsubscribe, EventBusContextType } from './event-bus-types';\n\n// Re-export types for convenience\nexport type { KFlowEvent, EventListener, Unsubscribe, EventBusContextType };\n\n// ============================================================================\n// Global Event Bus Bridge\n// ============================================================================\n\n/**\n * Global event bus reference for bridging between packages.\n *\n * When the EventBusProvider mounts, it can register itself as the global\n * event bus. This allows components in other packages (like ui-shell) to\n * emit events to the same bus that the main app's trait state machine listens to.\n */\nlet globalEventBus: EventBusContextType | null = null;\n\n/**\n * Set the global event bus reference.\n * Called by EventBusProvider when it mounts.\n *\n * @param bus - The event bus context to set as global, or null to clear\n */\nexport function setGlobalEventBus(bus: EventBusContextType | null): void {\n globalEventBus = bus;\n}\n\n/**\n * Get the global event bus reference.\n *\n * @returns The global event bus if set, null otherwise\n */\nexport function getGlobalEventBus(): EventBusContextType | null {\n return globalEventBus;\n}\n\n// ============================================================================\n// Fallback Event Bus (for use outside EventBusProvider)\n// ============================================================================\n\nconst fallbackListeners = new Map<string, Set<EventListener>>();\n\nconst fallbackEventBus: EventBusContextType = {\n emit: (type: string, payload?: Record<string, unknown>) => {\n const event: KFlowEvent = {\n type,\n payload,\n timestamp: Date.now(),\n };\n const handlers = fallbackListeners.get(type);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(event);\n } catch (error) {\n console.error(`[EventBus] Error in listener for '${type}':`, error);\n }\n });\n }\n },\n on: (type: string, listener: EventListener): Unsubscribe => {\n if (!fallbackListeners.has(type)) {\n fallbackListeners.set(type, new Set());\n }\n fallbackListeners.get(type)!.add(listener);\n return () => {\n const handlers = fallbackListeners.get(type);\n if (handlers) {\n handlers.delete(listener);\n if (handlers.size === 0) {\n fallbackListeners.delete(type);\n }\n }\n };\n },\n once: (type: string, listener: EventListener): Unsubscribe => {\n const wrappedListener: EventListener = (event) => {\n fallbackListeners.get(type)?.delete(wrappedListener);\n listener(event);\n };\n return fallbackEventBus.on(type, wrappedListener);\n },\n hasListeners: (type: string): boolean => {\n const handlers = fallbackListeners.get(type);\n return handlers !== undefined && handlers.size > 0;\n },\n};\n\n// ============================================================================\n// Main Hook\n// ============================================================================\n\n/**\n * Hook for accessing the event bus.\n *\n * Uses EventBusProvider context if available, otherwise falls back to\n * a simple in-memory event bus (for design system / Storybook).\n *\n * @returns Event bus instance with emit, on, once, and hasListeners methods\n *\n * @example\n * ```tsx\n * const eventBus = useEventBus();\n *\n * // Emit an event\n * eventBus.emit('UI:CLICK', { id: '123' });\n *\n * // Subscribe to an event\n * useEffect(() => {\n * return eventBus.on('UI:CLICK', (event) => {\n * console.log('Clicked:', event.payload);\n * });\n * }, []);\n * ```\n */\nexport function useEventBus(): EventBusContextType {\n const context = useContext(EventBusContext);\n // Priority: 1) React context, 2) Global bridge, 3) Fallback\n return context ?? globalEventBus ?? fallbackEventBus;\n}\n\n// ============================================================================\n// Convenience Hooks\n// ============================================================================\n\n/**\n * Hook for subscribing to a specific event.\n * Automatically cleans up subscription on unmount.\n *\n * @param event - Event name to subscribe to\n * @param handler - Event handler function\n *\n * @example\n * ```tsx\n * useEventListener('UI:CLICK', (event) => {\n * console.log('Clicked:', event.payload);\n * });\n * ```\n */\nexport function useEventListener(\n event: string,\n handler: EventListener\n): void {\n const eventBus = useEventBus();\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n\n useEffect(() => {\n const wrappedHandler: EventListener = (evt) => {\n handlerRef.current(evt);\n };\n return eventBus.on(event, wrappedHandler);\n }, [event, eventBus]);\n}\n\n/**\n * Alias for useEventListener for backward compatibility\n */\nexport const useEventSubscription = useEventListener;\n\n/**\n * Hook for emitting events.\n * Returns a memoized emit function.\n *\n * @returns Function to emit events\n *\n * @example\n * ```tsx\n * const emit = useEmitEvent();\n *\n * const handleClick = () => {\n * emit('UI:CLICK', { id: '123' });\n * };\n * ```\n */\nexport function useEmitEvent(): (type: string, payload?: Record<string, unknown>) => void {\n const eventBus = useEventBus();\n return useCallback(\n (type: string, payload?: Record<string, unknown>) => {\n eventBus.emit(type, payload);\n },\n [eventBus]\n );\n}\n\nexport default useEventBus;\n","/**\n * useUISlots Hook\n *\n * Core hook for managing UI slot rendering in the trait-driven architecture.\n * Traits use render_ui effects to dynamically render content into slots.\n *\n * Slots:\n * - main: Primary content area\n * - sidebar: Left/right sidebar\n * - modal: Modal overlay\n * - drawer: Slide-in drawer\n * - overlay: Full-screen overlay\n * - center: Centered popup\n * - toast: Toast notifications\n * - hud-top: Game HUD top bar\n * - hud-bottom: Game HUD bottom bar\n * - floating: Draggable floating panel\n *\n * @packageDocumentation\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Valid UI slot names\n */\nexport type UISlot =\n | 'main'\n | 'sidebar'\n | 'modal'\n | 'drawer'\n | 'overlay'\n | 'center'\n | 'toast'\n | 'hud-top'\n | 'hud-bottom'\n | 'floating';\n\n/**\n * Animation types for slot transitions\n */\nexport type SlotAnimation = 'fade' | 'slide' | 'scale' | 'none';\n\n/**\n * Content rendered in a slot\n */\nexport interface SlotContent {\n /** Unique ID for this content */\n id: string;\n /** Pattern/component type to render */\n pattern: string;\n /** Props to pass to the pattern component */\n props: Record<string, unknown>;\n /** Priority for conflict resolution (higher wins) */\n priority: number;\n /** Animation for showing/hiding */\n animation?: SlotAnimation;\n /** Auto-dismiss timestamp (for toasts) */\n autoDismissAt?: number;\n /** Callback when dismissed */\n onDismiss?: () => void;\n /** Source trait that rendered this content */\n sourceTrait?: string;\n}\n\n/**\n * Configuration for render_ui effect\n */\nexport interface RenderUIConfig {\n /** Target slot */\n target: UISlot;\n /** Pattern/component to render */\n pattern: string;\n /** Props for the pattern */\n props?: Record<string, unknown>;\n /** Priority (default: 0) */\n priority?: number;\n /** Animation type */\n animation?: SlotAnimation;\n /** Auto-dismiss after ms (for toasts) */\n autoDismissMs?: number;\n /** Callback on dismiss */\n onDismiss?: () => void;\n /** Source trait name */\n sourceTrait?: string;\n}\n\n/**\n * Callback for slot changes\n */\nexport type SlotChangeCallback = (slot: UISlot, content: SlotContent | null) => void;\n\n/**\n * UI Slot Manager interface\n */\nexport interface UISlotManager {\n /** Current content for each slot */\n slots: Record<UISlot, SlotContent | null>;\n /** Render content to a slot */\n render: (config: RenderUIConfig) => string;\n /** Clear a specific slot */\n clear: (slot: UISlot) => void;\n /** Clear content by ID */\n clearById: (id: string) => void;\n /** Clear all slots */\n clearAll: () => void;\n /** Subscribe to slot changes */\n subscribe: (callback: SlotChangeCallback) => () => void;\n /** Check if a slot has content */\n hasContent: (slot: UISlot) => boolean;\n /** Get content for a slot */\n getContent: (slot: UISlot) => SlotContent | null;\n}\n\n// ============================================================================\n// Default Slots State\n// ============================================================================\n\nconst DEFAULT_SLOTS: Record<UISlot, SlotContent | null> = {\n main: null,\n sidebar: null,\n modal: null,\n drawer: null,\n overlay: null,\n center: null,\n toast: null,\n 'hud-top': null,\n 'hud-bottom': null,\n floating: null,\n};\n\n// ============================================================================\n// ID Generator\n// ============================================================================\n\nlet idCounter = 0;\nfunction generateId(): string {\n return `slot-content-${++idCounter}-${Date.now()}`;\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Create a UI Slot Manager instance.\n *\n * This is the internal hook that creates the manager.\n * Use `useUISlots()` from context in components.\n */\nexport function useUISlotManager(): UISlotManager {\n const [slots, setSlots] = useState<Record<UISlot, SlotContent | null>>(DEFAULT_SLOTS);\n const subscribersRef = useRef<Set<SlotChangeCallback>>(new Set());\n const timersRef = useRef<Map<string, NodeJS.Timeout>>(new Map());\n\n // Clean up timers on unmount\n useEffect(() => {\n return () => {\n timersRef.current.forEach((timer) => clearTimeout(timer));\n timersRef.current.clear();\n };\n }, []);\n\n // Notify subscribers of slot changes\n const notifySubscribers = useCallback((slot: UISlot, content: SlotContent | null) => {\n subscribersRef.current.forEach((callback) => {\n try {\n callback(slot, content);\n } catch (error) {\n console.error('[UISlots] Subscriber error:', error);\n }\n });\n }, []);\n\n // Render content to a slot\n const render = useCallback((config: RenderUIConfig): string => {\n const id = generateId();\n const content: SlotContent = {\n id,\n pattern: config.pattern,\n props: config.props ?? {},\n priority: config.priority ?? 0,\n animation: config.animation ?? 'fade',\n onDismiss: config.onDismiss,\n sourceTrait: config.sourceTrait,\n };\n\n // Set auto-dismiss timer if specified\n if (config.autoDismissMs && config.autoDismissMs > 0) {\n content.autoDismissAt = Date.now() + config.autoDismissMs;\n const timer = setTimeout(() => {\n setSlots((prev) => {\n if (prev[config.target]?.id === id) {\n // Call onDismiss callback\n content.onDismiss?.();\n notifySubscribers(config.target, null);\n return { ...prev, [config.target]: null };\n }\n return prev;\n });\n timersRef.current.delete(id);\n }, config.autoDismissMs);\n timersRef.current.set(id, timer);\n }\n\n setSlots((prev) => {\n const existing = prev[config.target];\n\n // Priority-based conflict resolution\n if (existing && existing.priority > content.priority) {\n console.warn(\n `[UISlots] Slot \"${config.target}\" already has higher priority content (${existing.priority} > ${content.priority})`\n );\n return prev;\n }\n\n notifySubscribers(config.target, content);\n return { ...prev, [config.target]: content };\n });\n\n return id;\n }, [notifySubscribers]);\n\n // Clear a specific slot\n const clear = useCallback((slot: UISlot) => {\n setSlots((prev) => {\n const content = prev[slot];\n if (content) {\n // Clear any auto-dismiss timer\n const timer = timersRef.current.get(content.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(content.id);\n }\n // Call onDismiss callback\n content.onDismiss?.();\n notifySubscribers(slot, null);\n }\n return { ...prev, [slot]: null };\n });\n }, [notifySubscribers]);\n\n // Clear content by ID\n const clearById = useCallback((id: string) => {\n setSlots((prev) => {\n const entry = Object.entries(prev).find(([, content]) => content?.id === id);\n if (entry) {\n const [slot, content] = entry as [UISlot, SlotContent];\n // Clear any auto-dismiss timer\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n // Call onDismiss callback\n content.onDismiss?.();\n notifySubscribers(slot, null);\n return { ...prev, [slot]: null };\n }\n return prev;\n });\n }, [notifySubscribers]);\n\n // Clear all slots\n const clearAll = useCallback(() => {\n // Clear all timers\n timersRef.current.forEach((timer) => clearTimeout(timer));\n timersRef.current.clear();\n\n setSlots((prev) => {\n // Call onDismiss for all content\n Object.entries(prev).forEach(([slot, content]) => {\n if (content) {\n content.onDismiss?.();\n notifySubscribers(slot as UISlot, null);\n }\n });\n return DEFAULT_SLOTS;\n });\n }, [notifySubscribers]);\n\n // Subscribe to slot changes\n const subscribe = useCallback((callback: SlotChangeCallback): (() => void) => {\n subscribersRef.current.add(callback);\n return () => {\n subscribersRef.current.delete(callback);\n };\n }, []);\n\n // Check if slot has content\n const hasContent = useCallback((slot: UISlot): boolean => {\n return slots[slot] !== null;\n }, [slots]);\n\n // Get content for a slot\n const getContent = useCallback((slot: UISlot): SlotContent | null => {\n return slots[slot];\n }, [slots]);\n\n return {\n slots,\n render,\n clear,\n clearById,\n clearAll,\n subscribe,\n hasContent,\n getContent,\n };\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { DEFAULT_SLOTS };\n","/**\n * SelectionProvider - Manages selected entity state\n *\n * Separates selection state from the EventBusProvider to maintain\n * clean architecture (event bus stays pure pub/sub).\n *\n * This provider:\n * - Listens to UI:VIEW and UI:SELECT events to track selected entity\n * - Listens to UI:CLOSE, UI:DESELECT, UI:CANCEL to clear selection\n * - Provides the selected entity to any component that needs it\n *\n * @packageDocumentation\n */\n\nimport React, {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n type ReactNode,\n} from 'react';\nimport { useEventBus, type KFlowEvent } from '../hooks/useEventBus';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SelectionContextType<T = unknown> {\n /** The currently selected entity */\n selected: T | null;\n /** Manually set the selected entity */\n setSelected: (entity: T | null) => void;\n /** Clear the selection */\n clearSelection: () => void;\n /** Check if an entity is selected */\n isSelected: (entity: T) => boolean;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst SelectionContext = createContext<SelectionContextType | null>(null);\n\n// ============================================================================\n// Provider\n// ============================================================================\n\ninterface SelectionProviderProps {\n children: ReactNode;\n /** Enable debug logging */\n debug?: boolean;\n /** Custom comparison function for isSelected */\n compareEntities?: (a: unknown, b: unknown) => boolean;\n}\n\n/**\n * Default entity comparison - compares by id field\n */\nconst defaultCompareEntities = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n if (!a || !b) return false;\n if (typeof a === 'object' && typeof b === 'object') {\n const aId = (a as Record<string, unknown>).id;\n const bId = (b as Record<string, unknown>).id;\n return aId !== undefined && aId === bId;\n }\n return false;\n};\n\n/**\n * Provider component for selection state.\n *\n * Must be used within an EventBusProvider.\n *\n * @example\n * ```tsx\n * function OrderListPage() {\n * return (\n * <EventBusProvider>\n * <SelectionProvider debug={process.env.NODE_ENV === 'development'}>\n * <OrderTable />\n * <OrderDetailDrawer />\n * </SelectionProvider>\n * </EventBusProvider>\n * );\n * }\n * ```\n */\nexport function SelectionProvider({\n children,\n debug = false,\n compareEntities = defaultCompareEntities,\n}: SelectionProviderProps) {\n const eventBus = useEventBus();\n const [selected, setSelectedState] = useState<unknown | null>(null);\n\n /**\n * Set the selected entity\n */\n const setSelected = useCallback(\n (entity: unknown | null) => {\n setSelectedState(entity);\n if (debug) {\n console.log('[SelectionProvider] Selection set:', entity);\n }\n },\n [debug]\n );\n\n /**\n * Clear the selection\n */\n const clearSelection = useCallback(() => {\n setSelectedState(null);\n if (debug) {\n console.log('[SelectionProvider] Selection cleared');\n }\n }, [debug]);\n\n /**\n * Check if an entity is selected\n */\n const isSelected = useCallback(\n (entity: unknown): boolean => {\n return compareEntities(selected, entity);\n },\n [selected, compareEntities]\n );\n\n /**\n * Listen to event bus for selection events\n */\n useEffect(() => {\n // Handle selection events\n const handleSelect = (event: KFlowEvent) => {\n const row = event.payload?.row;\n if (row) {\n setSelected(row);\n if (debug) {\n console.log(`[SelectionProvider] ${event.type} received:`, row);\n }\n }\n };\n\n // Handle deselection events\n const handleDeselect = (event: KFlowEvent) => {\n clearSelection();\n if (debug) {\n console.log(`[SelectionProvider] ${event.type} received - clearing selection`);\n }\n };\n\n // Subscribe to selection events\n const unsubView = eventBus.on('UI:VIEW', handleSelect);\n const unsubSelect = eventBus.on('UI:SELECT', handleSelect);\n\n // Subscribe to deselection events\n const unsubClose = eventBus.on('UI:CLOSE', handleDeselect);\n const unsubDeselect = eventBus.on('UI:DESELECT', handleDeselect);\n const unsubCancel = eventBus.on('UI:CANCEL', handleDeselect);\n\n return () => {\n unsubView();\n unsubSelect();\n unsubClose();\n unsubDeselect();\n unsubCancel();\n };\n }, [eventBus, setSelected, clearSelection, debug]);\n\n const contextValue: SelectionContextType = {\n selected,\n setSelected,\n clearSelection,\n isSelected,\n };\n\n return (\n <SelectionContext.Provider value={contextValue}>\n {children}\n </SelectionContext.Provider>\n );\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to access selection state.\n *\n * @throws Error if used outside SelectionProvider\n *\n * @example\n * ```tsx\n * function OrderDetailDrawer() {\n * const { selected, clearSelection } = useSelection<Order>();\n *\n * if (!selected) return null;\n *\n * return (\n * <Drawer onClose={clearSelection}>\n * <OrderDetail order={selected} />\n * </Drawer>\n * );\n * }\n * ```\n */\nexport function useSelection<T = unknown>(): SelectionContextType<T> {\n const context = useContext(SelectionContext);\n\n if (!context) {\n throw new Error('useSelection must be used within a SelectionProvider');\n }\n\n return context as SelectionContextType<T>;\n}\n\n/**\n * Hook to access selection state with fallback for components\n * that may be used outside SelectionProvider.\n *\n * Returns null if no SelectionProvider is found.\n */\nexport function useSelectionOptional<T = unknown>(): SelectionContextType<T> | null {\n const context = useContext(SelectionContext);\n return context as SelectionContextType<T> | null;\n}\n\nexport { SelectionContext };\n","/**\n * useUIEvents - UI Event to State Machine Bridge\n *\n * Listens for UI events from the event bus and dispatches\n * corresponding state machine events.\n *\n * Components emit events like `UI:VIEW`, `UI:SAVE`, `UI:CANCEL`\n * This hook translates them to state machine dispatch calls.\n */\n\nimport { useEffect, useState, useMemo, useContext } from \"react\";\nimport { useEventBus, type KFlowEvent } from \"./useEventBus\";\nimport { SelectionContext } from \"../providers/SelectionProvider\";\n\n/**\n * Map of UI events to state machine events.\n * UI events are prefixed with \"UI:\" and the suffix is the event name.\n */\nconst UI_EVENT_MAP: Record<string, string> = {\n // Form/CRUD events\n \"UI:SAVE\": \"SAVE\",\n \"UI:CANCEL\": \"CANCEL\",\n \"UI:CLOSE\": \"CLOSE\",\n \"UI:VIEW\": \"VIEW\",\n \"UI:EDIT\": \"EDIT\",\n \"UI:DELETE\": \"DELETE\",\n \"UI:CREATE\": \"CREATE\",\n \"UI:SELECT\": \"SELECT\",\n \"UI:DESELECT\": \"DESELECT\",\n \"UI:SUBMIT\": \"SAVE\",\n \"UI:UPDATE_STATUS\": \"UPDATE_STATUS\",\n \"UI:SEARCH\": \"SEARCH\",\n \"UI:CLEAR_SEARCH\": \"CLEAR_SEARCH\",\n \"UI:ADD\": \"CREATE\",\n // Game events (for closed circuit with GameMenu, GamePauseOverlay, GameOverScreen)\n \"UI:PAUSE\": \"PAUSE\",\n \"UI:RESUME\": \"RESUME\",\n \"UI:RESTART\": \"RESTART\",\n \"UI:GAME_OVER\": \"GAME_OVER\",\n \"UI:START\": \"START\",\n \"UI:QUIT\": \"QUIT\",\n \"UI:INIT\": \"INIT\",\n};\n\n/**\n * Hook to bridge UI events to state machine dispatch\n *\n * @param dispatch - The state machine dispatch function\n * @param validEvents - Optional array of valid event names (filters which events to handle)\n * @param eventBusInstance - Optional event bus instance (for testing, uses hook if not provided)\n */\nexport function useUIEvents<E extends string>(\n dispatch: (event: E, payload?: unknown) => void,\n validEvents?: readonly E[],\n eventBusInstance?: ReturnType<typeof useEventBus>,\n): void {\n const defaultEventBus = useEventBus();\n const eventBus = eventBusInstance ?? defaultEventBus;\n\n // Stabilize validEvents to prevent re-subscriptions when array reference changes\n // but contents are the same. This is critical because generated trait hooks\n // pass inline arrays which create new references on every render.\n const validEventsKey = validEvents\n ? validEvents.slice().sort().join(\",\")\n : \"\";\n const stableValidEvents = useMemo(\n () => validEvents,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [validEventsKey],\n );\n\n useEffect(() => {\n // Create handlers for all UI events\n const unsubscribes: Array<() => void> = [];\n\n // Listen for all UI events\n Object.entries(UI_EVENT_MAP).forEach(([uiEvent, smEvent]) => {\n const handler = (event: KFlowEvent) => {\n // Only dispatch if the event is valid for this state machine\n if (!stableValidEvents || stableValidEvents.includes(smEvent as E)) {\n dispatch(smEvent as E, event.payload);\n }\n };\n\n const unsubscribe = eventBus.on(uiEvent, handler);\n unsubscribes.push(unsubscribe);\n });\n\n // Also listen for generic UI events that aren't in the map\n const genericHandler = (event: KFlowEvent) => {\n const eventName = event.payload?.event as string | undefined;\n if (eventName) {\n const smEvent = eventName as E;\n if (!stableValidEvents || stableValidEvents.includes(smEvent)) {\n dispatch(smEvent, event.payload);\n }\n }\n };\n const genericUnsubscribe = eventBus.on(\"UI:DISPATCH\", genericHandler);\n unsubscribes.push(genericUnsubscribe);\n\n // Listen for custom UI events not in the static map\n // Components emit events with UI: prefix (e.g., UI:OPEN_MODAL)\n // We need to listen for both the prefixed and non-prefixed versions\n if (stableValidEvents) {\n stableValidEvents.forEach((smEvent) => {\n // Skip events already handled by UI_EVENT_MAP\n const uiPrefixedEvent = `UI:${smEvent}`;\n const alreadyMapped =\n Object.keys(UI_EVENT_MAP).includes(uiPrefixedEvent);\n if (!alreadyMapped) {\n const directHandler = (event: KFlowEvent) => {\n dispatch(smEvent, event.payload);\n };\n // Listen for UI:EVENT (what components emit)\n const unsubscribePrefixed = eventBus.on(\n uiPrefixedEvent,\n directHandler,\n );\n unsubscribes.push(unsubscribePrefixed);\n // Also listen for EVENT directly (for internal trait events)\n const unsubscribeDirect = eventBus.on(smEvent, directHandler);\n unsubscribes.push(unsubscribeDirect);\n }\n });\n }\n\n return () => {\n unsubscribes.forEach((unsub) => unsub());\n };\n }, [eventBus, dispatch, stableValidEvents]);\n}\n\n/**\n * Hook for selected entity tracking\n * Many list UIs need to track which item is selected.\n *\n * This hook uses SelectionProvider if available (preferred),\n * otherwise falls back to listening to events directly.\n *\n * @example Using with SelectionProvider (recommended)\n * ```tsx\n * function MyPage() {\n * return (\n * <EventBusProvider>\n * <SelectionProvider>\n * <MyComponent />\n * </SelectionProvider>\n * </EventBusProvider>\n * );\n * }\n *\n * function MyComponent() {\n * const [selected, setSelected] = useSelectedEntity<Order>();\n * // selected is automatically updated when UI:VIEW/UI:SELECT events fire\n * }\n * ```\n */\nexport function useSelectedEntity<T>(\n eventBusInstance?: ReturnType<typeof useEventBus>,\n): [T | null, (entity: T | null) => void] {\n const defaultEventBus = useEventBus();\n const eventBus = eventBusInstance ?? defaultEventBus;\n\n // Try to use SelectionProvider context first (preferred - survives component mount/unmount)\n // Import dynamically to avoid circular dependency\n const selectionContext = useSelectionContext<T>();\n\n // Local state for fallback mode (when SelectionProvider is not available)\n const [localSelected, setLocalSelected] = useState<T | null>(null);\n\n // Track if we're using context mode\n const usingContext = selectionContext !== null;\n\n // Listen for selection events (fallback mode only - when no SelectionProvider)\n useEffect(() => {\n // Skip event listening if we have a SelectionProvider (it handles events itself)\n if (usingContext) return;\n\n const handleSelect = (event: KFlowEvent) => {\n const row = event.payload?.row as T | undefined;\n if (row) {\n setLocalSelected(row);\n }\n };\n\n const handleDeselect = () => {\n setLocalSelected(null);\n };\n\n const unsubSelect = eventBus.on(\"UI:SELECT\", handleSelect);\n const unsubView = eventBus.on(\"UI:VIEW\", handleSelect);\n const unsubDeselect = eventBus.on(\"UI:DESELECT\", handleDeselect);\n const unsubClose = eventBus.on(\"UI:CLOSE\", handleDeselect);\n const unsubCancel = eventBus.on(\"UI:CANCEL\", handleDeselect);\n\n return () => {\n unsubSelect();\n unsubView();\n unsubDeselect();\n unsubClose();\n unsubCancel();\n };\n }, [eventBus, usingContext]);\n\n // Return context values if available, otherwise local state\n if (selectionContext) {\n return [selectionContext.selected, selectionContext.setSelected];\n }\n\n return [localSelected, setLocalSelected];\n}\n\n/**\n * Internal hook to safely access SelectionContext without throwing.\n * Returns null if SelectionProvider is not in the tree.\n */\nfunction useSelectionContext<T>(): {\n selected: T | null;\n setSelected: (entity: T | null) => void;\n} | null {\n // useContext returns null if the context is not available (no provider in tree)\n const context = useContext(SelectionContext);\n return context as {\n selected: T | null;\n setSelected: (entity: T | null) => void;\n } | null;\n}\n","/**\n * useEntityData Hook\n *\n * Provides data fetching utilities for entity lists.\n * This is a stub implementation for the design system that returns mock data.\n * In a real application, this would connect to a backend API.\n *\n * @packageDocumentation\n */\n\nimport { useState, useEffect } from \"react\";\n\n/**\n * Query key factory for entity data queries.\n * Used with React Query for cache invalidation.\n */\nexport const entityDataKeys = {\n all: ['entities'] as const,\n lists: () => [...entityDataKeys.all, 'list'] as const,\n list: (entity: string, filters?: Record<string, unknown>) =>\n [...entityDataKeys.lists(), entity, filters] as const,\n details: () => [...entityDataKeys.all, 'detail'] as const,\n detail: (entity: string, id: string) =>\n [...entityDataKeys.details(), entity, id] as const,\n};\n\n/**\n * Generic entity data record type\n */\nexport type EntityDataRecord = Record<string, unknown>;\n\nexport interface UseEntityListOptions {\n /** Skip fetching */\n skip?: boolean;\n}\n\nexport interface UseEntityListResult<T = Record<string, unknown>> {\n /** Fetched data */\n data: T[];\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * Hook for fetching entity list data\n *\n * @param entity - Entity name to fetch\n * @param options - Fetch options\n * @returns Entity list data and loading states\n *\n * @example\n * ```tsx\n * const { data, isLoading, error } = useEntityList('tasks');\n * ```\n */\nexport function useEntityList<T = Record<string, unknown>>(\n entity: string | undefined,\n options: UseEntityListOptions = {},\n): UseEntityListResult<T> {\n const { skip = false } = options;\n const [data, setData] = useState<T[]>([]);\n const [isLoading, setIsLoading] = useState(!skip && !!entity);\n const [error, setError] = useState<Error | null>(null);\n\n const refetch = () => {\n if (!entity || skip) return;\n setIsLoading(true);\n setError(null);\n // In a real implementation, this would fetch from an API\n // For the design system, we just simulate a short delay\n setTimeout(() => {\n setData([]);\n setIsLoading(false);\n }, 100);\n };\n\n useEffect(() => {\n if (skip || !entity) {\n setIsLoading(false);\n return;\n }\n\n refetch();\n }, [entity, skip]);\n\n return { data, isLoading, error, refetch };\n}\n\n/**\n * Hook for fetching a single entity by ID\n *\n * @param entity - Entity name\n * @param id - Entity ID\n * @returns Single entity data and loading states\n */\nexport function useEntity<T = Record<string, unknown>>(\n entity: string | undefined,\n id: string | undefined,\n): { data: T | null; isLoading: boolean; error: Error | null } {\n const [data, setData] = useState<T | null>(null);\n const [isLoading, setIsLoading] = useState(!!entity && !!id);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!entity || !id) {\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n // Simulate API call\n setTimeout(() => {\n setData(null);\n setIsLoading(false);\n }, 100);\n }, [entity, id]);\n\n return { data, isLoading, error };\n}\n\n/**\n * Result type for useEntityDetail hook\n */\nexport interface UseEntityDetailResult<T = Record<string, unknown>> {\n /** Fetched entity data */\n data: T | null;\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * Hook for fetching entity detail by ID (alias for useEntity with refetch)\n *\n * @param entity - Entity name\n * @param id - Entity ID\n * @returns Entity detail data and loading states\n *\n * @example\n * ```tsx\n * const { data, isLoading, error, refetch } = useEntityDetail('tasks', taskId);\n * ```\n */\nexport function useEntityDetail<T = Record<string, unknown>>(\n entity: string | undefined,\n id: string | undefined,\n): UseEntityDetailResult<T> {\n const [data, setData] = useState<T | null>(null);\n const [isLoading, setIsLoading] = useState(!!entity && !!id);\n const [error, setError] = useState<Error | null>(null);\n\n const refetch = () => {\n if (!entity || !id) return;\n setIsLoading(true);\n setError(null);\n // In a real implementation, this would fetch from an API\n // For the design system, we just simulate a short delay\n setTimeout(() => {\n setData(null);\n setIsLoading(false);\n }, 100);\n };\n\n useEffect(() => {\n if (!entity || !id) {\n setIsLoading(false);\n return;\n }\n\n refetch();\n }, [entity, id]);\n\n return { data, isLoading, error, refetch };\n}\n\n/**\n * Pagination parameters for paginated queries\n */\nexport interface PaginationParams {\n /** Current page (1-indexed) */\n page: number;\n /** Items per page */\n pageSize: number;\n /** Search query */\n search?: string;\n /** Sort field */\n sortBy?: string;\n /** Sort direction */\n sortDirection?: \"asc\" | \"desc\";\n /** Filters */\n filters?: Record<string, unknown>;\n}\n\nexport interface UsePaginatedEntityListResult<T = Record<string, unknown>> {\n /** Fetched data */\n data: T[];\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Total item count */\n totalCount: number;\n /** Total pages */\n totalPages: number;\n /** Has next page */\n hasNextPage: boolean;\n /** Has previous page */\n hasPreviousPage: boolean;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * Hook for fetching paginated entity list data\n *\n * @param entity - Entity name to fetch\n * @param params - Pagination parameters\n * @param options - Fetch options\n * @returns Paginated entity list data and loading states\n *\n * @example\n * ```tsx\n * const { data, isLoading, totalPages } = usePaginatedEntityList('tasks', { page: 1, pageSize: 10 });\n * ```\n */\nexport function usePaginatedEntityList<T = Record<string, unknown>>(\n entity: string | undefined,\n params: PaginationParams,\n options: UseEntityListOptions = {},\n): UsePaginatedEntityListResult<T> {\n const { skip = false } = options;\n const [data, setData] = useState<T[]>([]);\n const [isLoading, setIsLoading] = useState(!skip && !!entity);\n const [error, setError] = useState<Error | null>(null);\n const [totalCount, setTotalCount] = useState(0);\n\n const refetch = () => {\n if (!entity || skip) return;\n setIsLoading(true);\n setError(null);\n // In a real implementation, this would fetch from an API with pagination\n // For the design system, we just simulate a short delay\n setTimeout(() => {\n setData([]);\n setTotalCount(0);\n setIsLoading(false);\n }, 100);\n };\n\n useEffect(() => {\n if (skip || !entity) {\n setIsLoading(false);\n return;\n }\n\n refetch();\n }, [\n entity,\n params.page,\n params.pageSize,\n params.search,\n params.sortBy,\n params.sortDirection,\n skip,\n ]);\n\n const totalPages = Math.ceil(totalCount / params.pageSize) || 1;\n\n return {\n data,\n isLoading,\n error,\n totalCount,\n totalPages,\n hasNextPage: params.page < totalPages,\n hasPreviousPage: params.page > 1,\n refetch,\n };\n}\n\nexport default useEntityList;\n","/**\n * useQuerySingleton Hook\n *\n * Provides query state management for search/filter components.\n * This is a stub implementation for the design system.\n * In a real application, this would connect to the orbital query singleton.\n *\n * @packageDocumentation\n */\n\nimport { useState, useCallback, useMemo } from 'react';\n\n/**\n * Query state for filters and search\n */\nexport interface QueryState {\n search?: string;\n filters?: Record<string, unknown>;\n sortField?: string;\n sortDirection?: 'asc' | 'desc';\n}\n\n/**\n * Query singleton entity reference\n */\nexport interface QuerySingletonEntity {\n name: string;\n fields: Record<string, unknown>;\n}\n\n/**\n * Query singleton result type\n */\nexport interface QuerySingletonResult {\n state: QueryState;\n setState: (state: Partial<QueryState>) => void;\n reset: () => void;\n}\n\nexport interface QuerySingletonState {\n /** Current search term */\n search: string;\n /** Set search term */\n setSearch: (value: string) => void;\n /** Current filters */\n filters: Record<string, unknown>;\n /** Set a filter value */\n setFilter: (key: string, value: unknown) => void;\n /** Clear all filters */\n clearFilters: () => void;\n /** Current sort field */\n sortField?: string;\n /** Current sort direction */\n sortDirection?: 'asc' | 'desc';\n /** Set sort */\n setSort: (field: string, direction: 'asc' | 'desc') => void;\n}\n\n// In-memory store for query singletons (keyed by query name)\nconst queryStores = new Map<string, {\n search: string;\n filters: Record<string, unknown>;\n sortField?: string;\n sortDirection?: 'asc' | 'desc';\n listeners: Set<() => void>;\n}>();\n\nfunction getOrCreateStore(query: string) {\n if (!queryStores.has(query)) {\n queryStores.set(query, {\n search: '',\n filters: {},\n sortField: undefined,\n sortDirection: undefined,\n listeners: new Set(),\n });\n }\n return queryStores.get(query)!;\n}\n\n/**\n * Hook for accessing a query singleton by name\n *\n * @param query - Query singleton name (e.g., \"@TaskQuery\")\n * @returns Query singleton state or null if no query provided\n *\n * @example\n * ```tsx\n * const queryState = useQuerySingleton('@TaskQuery');\n *\n * // Use search state\n * queryState?.search\n * queryState?.setSearch('new search term')\n * ```\n */\nexport function useQuerySingleton(query?: string): QuerySingletonState | null {\n const [, forceUpdate] = useState({});\n\n // Return null if no query provided\n if (!query) {\n return null;\n }\n\n const store = useMemo(() => getOrCreateStore(query), [query]);\n\n // Subscribe to updates\n useMemo(() => {\n const listener = () => forceUpdate({});\n store.listeners.add(listener);\n return () => {\n store.listeners.delete(listener);\n };\n }, [store]);\n\n const notifyListeners = useCallback(() => {\n store.listeners.forEach((listener) => listener());\n }, [store]);\n\n const setSearch = useCallback((value: string) => {\n store.search = value;\n notifyListeners();\n }, [store, notifyListeners]);\n\n const setFilter = useCallback((key: string, value: unknown) => {\n store.filters = { ...store.filters, [key]: value };\n notifyListeners();\n }, [store, notifyListeners]);\n\n const clearFilters = useCallback(() => {\n store.filters = {};\n store.search = '';\n notifyListeners();\n }, [store, notifyListeners]);\n\n const setSort = useCallback((field: string, direction: 'asc' | 'desc') => {\n store.sortField = field;\n store.sortDirection = direction;\n notifyListeners();\n }, [store, notifyListeners]);\n\n return {\n search: store.search,\n setSearch,\n filters: store.filters,\n setFilter,\n clearFilters,\n sortField: store.sortField,\n sortDirection: store.sortDirection,\n setSort,\n };\n}\n\n/**\n * Parse a query binding string to extract the query singleton name\n *\n * @param binding - Binding string like \"@TaskQuery.search\" or \"@TaskQuery\"\n * @returns Object with query name and optional field path\n *\n * @example\n * ```tsx\n * parseQueryBinding('@TaskQuery.search')\n * // { query: 'TaskQuery', field: 'search' }\n *\n * parseQueryBinding('@TaskQuery')\n * // { query: 'TaskQuery', field: undefined }\n * ```\n */\nexport function parseQueryBinding(binding: string): { query: string; field?: string } {\n // Remove @ prefix if present\n const cleaned = binding.startsWith('@') ? binding.slice(1) : binding;\n const parts = cleaned.split('.');\n\n return {\n query: parts[0],\n field: parts.length > 1 ? parts.slice(1).join('.') : undefined,\n };\n}\n\nexport default useQuerySingleton;\n","export class Subscribable<TListener extends Function> {\n protected listeners = new Set<TListener>()\n\n constructor() {\n this.subscribe = this.subscribe.bind(this)\n }\n\n subscribe(listener: TListener): () => void {\n this.listeners.add(listener)\n\n this.onSubscribe()\n\n return () => {\n this.listeners.delete(listener)\n this.onUnsubscribe()\n }\n }\n\n hasListeners(): boolean {\n return this.listeners.size > 0\n }\n\n protected onSubscribe(): void {\n // Do nothing\n }\n\n protected onUnsubscribe(): void {\n // Do nothing\n }\n}\n","/**\n * {@link TimeoutManager} does not support passing arguments to the callback.\n *\n * `(_: void)` is the argument type inferred by TypeScript's default typings for\n * `setTimeout(cb, number)`.\n * If we don't accept a single void argument, then\n * `new Promise(resolve => timeoutManager.setTimeout(resolve, N))` is a type error.\n */\nexport type TimeoutCallback = (_: void) => void\n\n/**\n * Wrapping `setTimeout` is awkward from a typing perspective because platform\n * typings may extend the return type of `setTimeout`. For example, NodeJS\n * typings add `NodeJS.Timeout`; but a non-default `timeoutManager` may not be\n * able to return such a type.\n */\nexport type ManagedTimerId = number | { [Symbol.toPrimitive]: () => number }\n\n/**\n * Backend for timer functions.\n */\nexport type TimeoutProvider<TTimerId extends ManagedTimerId = ManagedTimerId> =\n {\n readonly setTimeout: (callback: TimeoutCallback, delay: number) => TTimerId\n readonly clearTimeout: (timeoutId: TTimerId | undefined) => void\n\n readonly setInterval: (callback: TimeoutCallback, delay: number) => TTimerId\n readonly clearInterval: (intervalId: TTimerId | undefined) => void\n }\n\nexport const defaultTimeoutProvider: TimeoutProvider<\n ReturnType<typeof setTimeout>\n> = {\n // We need the wrapper function syntax below instead of direct references to\n // global setTimeout etc.\n //\n // BAD: `setTimeout: setTimeout`\n // GOOD: `setTimeout: (cb, delay) => setTimeout(cb, delay)`\n //\n // If we use direct references here, then anything that wants to spy on or\n // replace the global setTimeout (like tests) won't work since we'll already\n // have a hard reference to the original implementation at the time when this\n // file was imported.\n setTimeout: (callback, delay) => setTimeout(callback, delay),\n clearTimeout: (timeoutId) => clearTimeout(timeoutId),\n\n setInterval: (callback, delay) => setInterval(callback, delay),\n clearInterval: (intervalId) => clearInterval(intervalId),\n}\n\n/**\n * Allows customization of how timeouts are created.\n *\n * @tanstack/query-core makes liberal use of timeouts to implement `staleTime`\n * and `gcTime`. The default TimeoutManager provider uses the platform's global\n * `setTimeout` implementation, which is known to have scalability issues with\n * thousands of timeouts on the event loop.\n *\n * If you hit this limitation, consider providing a custom TimeoutProvider that\n * coalesces timeouts.\n */\nexport class TimeoutManager implements Omit<TimeoutProvider, 'name'> {\n // We cannot have TimeoutManager<T> as we must instantiate it with a concrete\n // type at app boot; and if we leave that type, then any new timer provider\n // would need to support ReturnType<typeof setTimeout>, which is infeasible.\n //\n // We settle for type safety for the TimeoutProvider type, and accept that\n // this class is unsafe internally to allow for extension.\n #provider: TimeoutProvider<any> = defaultTimeoutProvider\n #providerCalled = false\n\n setTimeoutProvider<TTimerId extends ManagedTimerId>(\n provider: TimeoutProvider<TTimerId>,\n ): void {\n if (process.env.NODE_ENV !== 'production') {\n if (this.#providerCalled && provider !== this.#provider) {\n // After changing providers, `clearTimeout` will not work as expected for\n // timeouts from the previous provider.\n //\n // Since they may allocate the same timeout ID, clearTimeout may cancel an\n // arbitrary different timeout, or unexpected no-op.\n //\n // We could protect against this by mixing the timeout ID bits\n // deterministically with some per-provider bits.\n //\n // We could internally queue `setTimeout` calls to `TimeoutManager` until\n // some API call to set the initial provider.\n console.error(\n `[timeoutManager]: Switching provider after calls to previous provider might result in unexpected behavior.`,\n { previous: this.#provider, provider },\n )\n }\n }\n\n this.#provider = provider\n if (process.env.NODE_ENV !== 'production') {\n this.#providerCalled = false\n }\n }\n\n setTimeout(callback: TimeoutCallback, delay: number): ManagedTimerId {\n if (process.env.NODE_ENV !== 'production') {\n this.#providerCalled = true\n }\n return this.#provider.setTimeout(callback, delay)\n }\n\n clearTimeout(timeoutId: ManagedTimerId | undefined): void {\n this.#provider.clearTimeout(timeoutId)\n }\n\n setInterval(callback: TimeoutCallback, delay: number): ManagedTimerId {\n if (process.env.NODE_ENV !== 'production') {\n this.#providerCalled = true\n }\n return this.#provider.setInterval(callback, delay)\n }\n\n clearInterval(intervalId: ManagedTimerId | undefined): void {\n this.#provider.clearInterval(intervalId)\n }\n}\n\nexport const timeoutManager = new TimeoutManager()\n\n/**\n * In many cases code wants to delay to the next event loop tick; this is not\n * mediated by {@link timeoutManager}.\n *\n * This function is provided to make auditing the `tanstack/query-core` for\n * incorrect use of system `setTimeout` easier.\n */\nexport function systemSetTimeoutZero(callback: TimeoutCallback): void {\n setTimeout(callback, 0)\n}\n","import { timeoutManager } from './timeoutManager'\nimport type {\n DefaultError,\n Enabled,\n FetchStatus,\n MutationKey,\n MutationStatus,\n QueryFunction,\n QueryKey,\n QueryOptions,\n StaleTime,\n StaleTimeFunction,\n} from './types'\nimport type { Mutation } from './mutation'\nimport type { FetchOptions, Query } from './query'\n\n// TYPES\n\ntype DropLast<T extends ReadonlyArray<unknown>> = T extends readonly [\n ...infer R,\n unknown,\n]\n ? readonly [...R]\n : never\n\ntype TuplePrefixes<T extends ReadonlyArray<unknown>> = T extends readonly []\n ? readonly []\n : TuplePrefixes<DropLast<T>> | T\n\nexport interface QueryFilters<TQueryKey extends QueryKey = QueryKey> {\n /**\n * Filter to active queries, inactive queries or all queries\n */\n type?: QueryTypeFilter\n /**\n * Match query key exactly\n */\n exact?: boolean\n /**\n * Include queries matching this predicate function\n */\n predicate?: (query: Query) => boolean\n /**\n * Include queries matching this query key\n */\n queryKey?: TQueryKey | TuplePrefixes<TQueryKey>\n /**\n * Include or exclude stale queries\n */\n stale?: boolean\n /**\n * Include queries matching their fetchStatus\n */\n fetchStatus?: FetchStatus\n}\n\nexport interface MutationFilters<\n TData = unknown,\n TError = DefaultError,\n TVariables = unknown,\n TOnMutateResult = unknown,\n> {\n /**\n * Match mutation key exactly\n */\n exact?: boolean\n /**\n * Include mutations matching this predicate function\n */\n predicate?: (\n mutation: Mutation<TData, TError, TVariables, TOnMutateResult>,\n ) => boolean\n /**\n * Include mutations matching this mutation key\n */\n mutationKey?: TuplePrefixes<MutationKey>\n /**\n * Filter by mutation status\n */\n status?: MutationStatus\n}\n\nexport type Updater<TInput, TOutput> = TOutput | ((input: TInput) => TOutput)\n\nexport type QueryTypeFilter = 'all' | 'active' | 'inactive'\n\n// UTILS\n\nexport const isServer = typeof window === 'undefined' || 'Deno' in globalThis\n\nexport function noop(): void\nexport function noop(): undefined\nexport function noop() {}\n\nexport function functionalUpdate<TInput, TOutput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as (_: TInput) => TOutput)(input)\n : updater\n}\n\nexport function isValidTimeout(value: unknown): value is number {\n return typeof value === 'number' && value >= 0 && value !== Infinity\n}\n\nexport function timeUntilStale(updatedAt: number, staleTime?: number): number {\n return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0)\n}\n\nexport function resolveStaleTime<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n staleTime:\n | undefined\n | StaleTimeFunction<TQueryFnData, TError, TData, TQueryKey>,\n query: Query<TQueryFnData, TError, TData, TQueryKey>,\n): StaleTime | undefined {\n return typeof staleTime === 'function' ? staleTime(query) : staleTime\n}\n\nexport function resolveEnabled<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n enabled: undefined | Enabled<TQueryFnData, TError, TData, TQueryKey>,\n query: Query<TQueryFnData, TError, TData, TQueryKey>,\n): boolean | undefined {\n return typeof enabled === 'function' ? enabled(query) : enabled\n}\n\nexport function matchQuery(\n filters: QueryFilters,\n query: Query<any, any, any, any>,\n): boolean {\n const {\n type = 'all',\n exact,\n fetchStatus,\n predicate,\n queryKey,\n stale,\n } = filters\n\n if (queryKey) {\n if (exact) {\n if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n return false\n }\n } else if (!partialMatchKey(query.queryKey, queryKey)) {\n return false\n }\n }\n\n if (type !== 'all') {\n const isActive = query.isActive()\n if (type === 'active' && !isActive) {\n return false\n }\n if (type === 'inactive' && isActive) {\n return false\n }\n }\n\n if (typeof stale === 'boolean' && query.isStale() !== stale) {\n return false\n }\n\n if (fetchStatus && fetchStatus !== query.state.fetchStatus) {\n return false\n }\n\n if (predicate && !predicate(query)) {\n return false\n }\n\n return true\n}\n\nexport function matchMutation(\n filters: MutationFilters,\n mutation: Mutation<any, any>,\n): boolean {\n const { exact, status, predicate, mutationKey } = filters\n if (mutationKey) {\n if (!mutation.options.mutationKey) {\n return false\n }\n if (exact) {\n if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {\n return false\n }\n } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n return false\n }\n }\n\n if (status && mutation.state.status !== status) {\n return false\n }\n\n if (predicate && !predicate(mutation)) {\n return false\n }\n\n return true\n}\n\nexport function hashQueryKeyByOptions<TQueryKey extends QueryKey = QueryKey>(\n queryKey: TQueryKey,\n options?: Pick<QueryOptions<any, any, any, any>, 'queryKeyHashFn'>,\n): string {\n const hashFn = options?.queryKeyHashFn || hashKey\n return hashFn(queryKey)\n}\n\n/**\n * Default query & mutation keys hash function.\n * Hashes the value into a stable hash.\n */\nexport function hashKey(queryKey: QueryKey | MutationKey): string {\n return JSON.stringify(queryKey, (_, val) =>\n isPlainObject(val)\n ? Object.keys(val)\n .sort()\n .reduce((result, key) => {\n result[key] = val[key]\n return result\n }, {} as any)\n : val,\n )\n}\n\n/**\n * Checks if key `b` partially matches with key `a`.\n */\nexport function partialMatchKey(a: QueryKey, b: QueryKey): boolean\nexport function partialMatchKey(a: any, b: any): boolean {\n if (a === b) {\n return true\n }\n\n if (typeof a !== typeof b) {\n return false\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n return Object.keys(b).every((key) => partialMatchKey(a[key], b[key]))\n }\n\n return false\n}\n\nconst hasOwn = Object.prototype.hasOwnProperty\n\n/**\n * This function returns `a` if `b` is deeply equal.\n * If not, it will replace any deeply equal children of `b` with those of `a`.\n * This can be used for structural sharing between JSON values for example.\n */\nexport function replaceEqualDeep<T>(a: unknown, b: T, depth?: number): T\nexport function replaceEqualDeep(a: any, b: any, depth = 0): any {\n if (a === b) {\n return a\n }\n\n if (depth > 500) return b\n\n const array = isPlainArray(a) && isPlainArray(b)\n\n if (!array && !(isPlainObject(a) && isPlainObject(b))) return b\n\n const aItems = array ? a : Object.keys(a)\n const aSize = aItems.length\n const bItems = array ? b : Object.keys(b)\n const bSize = bItems.length\n const copy: any = array ? new Array(bSize) : {}\n\n let equalItems = 0\n\n for (let i = 0; i < bSize; i++) {\n const key: any = array ? i : bItems[i]\n const aItem = a[key]\n const bItem = b[key]\n\n if (aItem === bItem) {\n copy[key] = aItem\n if (array ? i < aSize : hasOwn.call(a, key)) equalItems++\n continue\n }\n\n if (\n aItem === null ||\n bItem === null ||\n typeof aItem !== 'object' ||\n typeof bItem !== 'object'\n ) {\n copy[key] = bItem\n continue\n }\n\n const v = replaceEqualDeep(aItem, bItem, depth + 1)\n copy[key] = v\n if (v === aItem) equalItems++\n }\n\n return aSize === bSize && equalItems === aSize ? a : copy\n}\n\n/**\n * Shallow compare objects.\n */\nexport function shallowEqualObjects<T extends Record<string, any>>(\n a: T,\n b: T | undefined,\n): boolean {\n if (!b || Object.keys(a).length !== Object.keys(b).length) {\n return false\n }\n\n for (const key in a) {\n if (a[key] !== b[key]) {\n return false\n }\n }\n\n return true\n}\n\nexport function isPlainArray(value: unknown): value is Array<unknown> {\n return Array.isArray(value) && value.length === Object.keys(value).length\n}\n\n// Copied from: https://github.com/jonschlinkert/is-plain-object\nexport function isPlainObject(o: any): o is Record<PropertyKey, unknown> {\n if (!hasObjectPrototype(o)) {\n return false\n }\n\n // If has no constructor\n const ctor = o.constructor\n if (ctor === undefined) {\n return true\n }\n\n // If has modified prototype\n const prot = ctor.prototype\n if (!hasObjectPrototype(prot)) {\n return false\n }\n\n // If constructor does not have an Object-specific method\n if (!prot.hasOwnProperty('isPrototypeOf')) {\n return false\n }\n\n // Handles Objects created by Object.create(<arbitrary prototype>)\n if (Object.getPrototypeOf(o) !== Object.prototype) {\n return false\n }\n\n // Most likely a plain Object\n return true\n}\n\nfunction hasObjectPrototype(o: any): boolean {\n return Object.prototype.toString.call(o) === '[object Object]'\n}\n\nexport function sleep(timeout: number): Promise<void> {\n return new Promise((resolve) => {\n timeoutManager.setTimeout(resolve, timeout)\n })\n}\n\nexport function replaceData<\n TData,\n TOptions extends QueryOptions<any, any, any, any>,\n>(prevData: TData | undefined, data: TData, options: TOptions): TData {\n if (typeof options.structuralSharing === 'function') {\n return options.structuralSharing(prevData, data) as TData\n } else if (options.structuralSharing !== false) {\n if (process.env.NODE_ENV !== 'production') {\n try {\n return replaceEqualDeep(prevData, data)\n } catch (error) {\n console.error(\n `Structural sharing requires data to be JSON serializable. To fix this, turn off structuralSharing or return JSON-serializable data from your queryFn. [${options.queryHash}]: ${error}`,\n )\n\n // Prevent the replaceEqualDeep from being called again down below.\n throw error\n }\n }\n // Structurally share data between prev and new data if needed\n return replaceEqualDeep(prevData, data)\n }\n return data\n}\n\nexport function keepPreviousData<T>(\n previousData: T | undefined,\n): T | undefined {\n return previousData\n}\n\nexport function addToEnd<T>(items: Array<T>, item: T, max = 0): Array<T> {\n const newItems = [...items, item]\n return max && newItems.length > max ? newItems.slice(1) : newItems\n}\n\nexport function addToStart<T>(items: Array<T>, item: T, max = 0): Array<T> {\n const newItems = [item, ...items]\n return max && newItems.length > max ? newItems.slice(0, -1) : newItems\n}\n\nexport const skipToken = Symbol()\nexport type SkipToken = typeof skipToken\n\nexport function ensureQueryFn<\n TQueryFnData = unknown,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: {\n queryFn?: QueryFunction<TQueryFnData, TQueryKey> | SkipToken\n queryHash?: string\n },\n fetchOptions?: FetchOptions<TQueryFnData>,\n): QueryFunction<TQueryFnData, TQueryKey> {\n if (process.env.NODE_ENV !== 'production') {\n if (options.queryFn === skipToken) {\n console.error(\n `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${options.queryHash}'`,\n )\n }\n }\n\n // if we attempt to retry a fetch that was triggered from an initialPromise\n // when we don't have a queryFn yet, we can't retry, so we just return the already rejected initialPromise\n // if an observer has already mounted, we will be able to retry with that queryFn\n if (!options.queryFn && fetchOptions?.initialPromise) {\n return () => fetchOptions.initialPromise!\n }\n\n if (!options.queryFn || options.queryFn === skipToken) {\n return () =>\n Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`))\n }\n\n return options.queryFn\n}\n\nexport function shouldThrowError<T extends (...args: Array<any>) => boolean>(\n throwOnError: boolean | T | undefined,\n params: Parameters<T>,\n): boolean {\n // Allow throwOnError function to override throwing behavior on a per-error basis\n if (typeof throwOnError === 'function') {\n return throwOnError(...params)\n }\n\n return !!throwOnError\n}\n\nexport function addConsumeAwareSignal<T>(\n object: T,\n getSignal: () => AbortSignal,\n onCancelled: VoidFunction,\n): T & { signal: AbortSignal } {\n let consumed = false\n let signal: AbortSignal | undefined\n\n Object.defineProperty(object, 'signal', {\n enumerable: true,\n get: () => {\n signal ??= getSignal()\n if (consumed) {\n return signal\n }\n\n consumed = true\n if (signal.aborted) {\n onCancelled()\n } else {\n signal.addEventListener('abort', onCancelled, { once: true })\n }\n\n return signal\n },\n })\n\n return object as T & { signal: AbortSignal }\n}\n","// TYPES\n\nimport { systemSetTimeoutZero } from './timeoutManager'\n\ntype NotifyCallback = () => void\n\ntype NotifyFunction = (callback: () => void) => void\n\ntype BatchNotifyFunction = (callback: () => void) => void\n\ntype BatchCallsCallback<T extends Array<unknown>> = (...args: T) => void\n\ntype ScheduleFunction = (callback: () => void) => void\n\nexport const defaultScheduler: ScheduleFunction = systemSetTimeoutZero\n\nexport function createNotifyManager() {\n let queue: Array<NotifyCallback> = []\n let transactions = 0\n let notifyFn: NotifyFunction = (callback) => {\n callback()\n }\n let batchNotifyFn: BatchNotifyFunction = (callback: () => void) => {\n callback()\n }\n let scheduleFn = defaultScheduler\n\n const schedule = (callback: NotifyCallback): void => {\n if (transactions) {\n queue.push(callback)\n } else {\n scheduleFn(() => {\n notifyFn(callback)\n })\n }\n }\n const flush = (): void => {\n const originalQueue = queue\n queue = []\n if (originalQueue.length) {\n scheduleFn(() => {\n batchNotifyFn(() => {\n originalQueue.forEach((callback) => {\n notifyFn(callback)\n })\n })\n })\n }\n }\n\n return {\n batch: <T>(callback: () => T): T => {\n let result\n transactions++\n try {\n result = callback()\n } finally {\n transactions--\n if (!transactions) {\n flush()\n }\n }\n return result\n },\n /**\n * All calls to the wrapped function will be batched.\n */\n batchCalls: <T extends Array<unknown>>(\n callback: BatchCallsCallback<T>,\n ): BatchCallsCallback<T> => {\n return (...args) => {\n schedule(() => {\n callback(...args)\n })\n }\n },\n schedule,\n /**\n * Use this method to set a custom notify function.\n * This can be used to for example wrap notifications with `React.act` while running tests.\n */\n setNotifyFunction: (fn: NotifyFunction) => {\n notifyFn = fn\n },\n /**\n * Use this method to set a custom function to batch notifications together into a single tick.\n * By default React Query will use the batch function provided by ReactDOM or React Native.\n */\n setBatchNotifyFunction: (fn: BatchNotifyFunction) => {\n batchNotifyFn = fn\n },\n setScheduler: (fn: ScheduleFunction) => {\n scheduleFn = fn\n },\n } as const\n}\n\n// SINGLETON\nexport const notifyManager = createNotifyManager()\n","import { notifyManager } from './notifyManager'\nimport { Removable } from './removable'\nimport { createRetryer } from './retryer'\nimport type {\n DefaultError,\n MutationFunctionContext,\n MutationMeta,\n MutationOptions,\n MutationStatus,\n} from './types'\nimport type { MutationCache } from './mutationCache'\nimport type { MutationObserver } from './mutationObserver'\nimport type { Retryer } from './retryer'\nimport type { QueryClient } from './queryClient'\n\n// TYPES\n\ninterface MutationConfig<TData, TError, TVariables, TOnMutateResult> {\n client: QueryClient\n mutationId: number\n mutationCache: MutationCache\n options: MutationOptions<TData, TError, TVariables, TOnMutateResult>\n state?: MutationState<TData, TError, TVariables, TOnMutateResult>\n}\n\nexport interface MutationState<\n TData = unknown,\n TError = DefaultError,\n TVariables = unknown,\n TOnMutateResult = unknown,\n> {\n context: TOnMutateResult | undefined\n data: TData | undefined\n error: TError | null\n failureCount: number\n failureReason: TError | null\n isPaused: boolean\n status: MutationStatus\n variables: TVariables | undefined\n submittedAt: number\n}\n\ninterface FailedAction<TError> {\n type: 'failed'\n failureCount: number\n error: TError | null\n}\n\ninterface PendingAction<TVariables, TOnMutateResult> {\n type: 'pending'\n isPaused: boolean\n variables?: TVariables\n context?: TOnMutateResult\n}\n\ninterface SuccessAction<TData> {\n type: 'success'\n data: TData\n}\n\ninterface ErrorAction<TError> {\n type: 'error'\n error: TError\n}\n\ninterface PauseAction {\n type: 'pause'\n}\n\ninterface ContinueAction {\n type: 'continue'\n}\n\nexport type Action<TData, TError, TVariables, TOnMutateResult> =\n | ContinueAction\n | ErrorAction<TError>\n | FailedAction<TError>\n | PendingAction<TVariables, TOnMutateResult>\n | PauseAction\n | SuccessAction<TData>\n\n// CLASS\n\nexport class Mutation<\n TData = unknown,\n TError = DefaultError,\n TVariables = unknown,\n TOnMutateResult = unknown,\n> extends Removable {\n state: MutationState<TData, TError, TVariables, TOnMutateResult>\n options!: MutationOptions<TData, TError, TVariables, TOnMutateResult>\n readonly mutationId: number\n\n #client: QueryClient\n #observers: Array<\n MutationObserver<TData, TError, TVariables, TOnMutateResult>\n >\n #mutationCache: MutationCache\n #retryer?: Retryer<TData>\n\n constructor(\n config: MutationConfig<TData, TError, TVariables, TOnMutateResult>,\n ) {\n super()\n\n this.#client = config.client\n this.mutationId = config.mutationId\n this.#mutationCache = config.mutationCache\n this.#observers = []\n this.state = config.state || getDefaultState()\n\n this.setOptions(config.options)\n this.scheduleGc()\n }\n\n setOptions(\n options: MutationOptions<TData, TError, TVariables, TOnMutateResult>,\n ): void {\n this.options = options\n\n this.updateGcTime(this.options.gcTime)\n }\n\n get meta(): MutationMeta | undefined {\n return this.options.meta\n }\n\n addObserver(observer: MutationObserver<any, any, any, any>): void {\n if (!this.#observers.includes(observer)) {\n this.#observers.push(observer)\n\n // Stop the mutation from being garbage collected\n this.clearGcTimeout()\n\n this.#mutationCache.notify({\n type: 'observerAdded',\n mutation: this,\n observer,\n })\n }\n }\n\n removeObserver(observer: MutationObserver<any, any, any, any>): void {\n this.#observers = this.#observers.filter((x) => x !== observer)\n\n this.scheduleGc()\n\n this.#mutationCache.notify({\n type: 'observerRemoved',\n mutation: this,\n observer,\n })\n }\n\n protected optionalRemove() {\n if (!this.#observers.length) {\n if (this.state.status === 'pending') {\n this.scheduleGc()\n } else {\n this.#mutationCache.remove(this)\n }\n }\n }\n\n continue(): Promise<unknown> {\n return (\n this.#retryer?.continue() ??\n // continuing a mutation assumes that variables are set, mutation must have been dehydrated before\n this.execute(this.state.variables!)\n )\n }\n\n async execute(variables: TVariables): Promise<TData> {\n const onContinue = () => {\n this.#dispatch({ type: 'continue' })\n }\n\n const mutationFnContext = {\n client: this.#client,\n meta: this.options.meta,\n mutationKey: this.options.mutationKey,\n } satisfies MutationFunctionContext\n\n this.#retryer = createRetryer({\n fn: () => {\n if (!this.options.mutationFn) {\n return Promise.reject(new Error('No mutationFn found'))\n }\n\n return this.options.mutationFn(variables, mutationFnContext)\n },\n onFail: (failureCount, error) => {\n this.#dispatch({ type: 'failed', failureCount, error })\n },\n onPause: () => {\n this.#dispatch({ type: 'pause' })\n },\n onContinue,\n retry: this.options.retry ?? 0,\n retryDelay: this.options.retryDelay,\n networkMode: this.options.networkMode,\n canRun: () => this.#mutationCache.canRun(this),\n })\n\n const restored = this.state.status === 'pending'\n const isPaused = !this.#retryer.canStart()\n\n try {\n if (restored) {\n // Dispatch continue action to unpause restored mutation\n onContinue()\n } else {\n this.#dispatch({ type: 'pending', variables, isPaused })\n // Notify cache callback\n if (this.#mutationCache.config.onMutate) {\n await this.#mutationCache.config.onMutate(\n variables,\n this as Mutation<unknown, unknown, unknown, unknown>,\n mutationFnContext,\n )\n }\n const context = await this.options.onMutate?.(\n variables,\n mutationFnContext,\n )\n if (context !== this.state.context) {\n this.#dispatch({\n type: 'pending',\n context,\n variables,\n isPaused,\n })\n }\n }\n const data = await this.#retryer.start()\n\n // Notify cache callback\n await this.#mutationCache.config.onSuccess?.(\n data,\n variables,\n this.state.context,\n this as Mutation<unknown, unknown, unknown, unknown>,\n mutationFnContext,\n )\n\n await this.options.onSuccess?.(\n data,\n variables,\n this.state.context!,\n mutationFnContext,\n )\n\n // Notify cache callback\n await this.#mutationCache.config.onSettled?.(\n data,\n null,\n this.state.variables,\n this.state.context,\n this as Mutation<unknown, unknown, unknown, unknown>,\n mutationFnContext,\n )\n\n await this.options.onSettled?.(\n data,\n null,\n variables,\n this.state.context,\n mutationFnContext,\n )\n\n this.#dispatch({ type: 'success', data })\n return data\n } catch (error) {\n try {\n // Notify cache callback\n await this.#mutationCache.config.onError?.(\n error as any,\n variables,\n this.state.context,\n this as Mutation<unknown, unknown, unknown, unknown>,\n mutationFnContext,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n\n try {\n await this.options.onError?.(\n error as TError,\n variables,\n this.state.context,\n mutationFnContext,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n\n try {\n // Notify cache callback\n await this.#mutationCache.config.onSettled?.(\n undefined,\n error as any,\n this.state.variables,\n this.state.context,\n this as Mutation<unknown, unknown, unknown, unknown>,\n mutationFnContext,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n\n try {\n await this.options.onSettled?.(\n undefined,\n error as TError,\n variables,\n this.state.context,\n mutationFnContext,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n\n this.#dispatch({ type: 'error', error: error as TError })\n throw error\n } finally {\n this.#mutationCache.runNext(this)\n }\n }\n\n #dispatch(action: Action<TData, TError, TVariables, TOnMutateResult>): void {\n const reducer = (\n state: MutationState<TData, TError, TVariables, TOnMutateResult>,\n ): MutationState<TData, TError, TVariables, TOnMutateResult> => {\n switch (action.type) {\n case 'failed':\n return {\n ...state,\n failureCount: action.failureCount,\n failureReason: action.error,\n }\n case 'pause':\n return {\n ...state,\n isPaused: true,\n }\n case 'continue':\n return {\n ...state,\n isPaused: false,\n }\n case 'pending':\n return {\n ...state,\n context: action.context,\n data: undefined,\n failureCount: 0,\n failureReason: null,\n error: null,\n isPaused: action.isPaused,\n status: 'pending',\n variables: action.variables,\n submittedAt: Date.now(),\n }\n case 'success':\n return {\n ...state,\n data: action.data,\n failureCount: 0,\n failureReason: null,\n error: null,\n status: 'success',\n isPaused: false,\n }\n case 'error':\n return {\n ...state,\n data: undefined,\n error: action.error,\n failureCount: state.failureCount + 1,\n failureReason: action.error,\n isPaused: false,\n status: 'error',\n }\n }\n }\n this.state = reducer(this.state)\n\n notifyManager.batch(() => {\n this.#observers.forEach((observer) => {\n observer.onMutationUpdate(action)\n })\n this.#mutationCache.notify({\n mutation: this,\n type: 'updated',\n action,\n })\n })\n }\n}\n\nexport function getDefaultState<\n TData,\n TError,\n TVariables,\n TOnMutateResult,\n>(): MutationState<TData, TError, TVariables, TOnMutateResult> {\n return {\n context: undefined,\n data: undefined,\n error: null,\n failureCount: 0,\n failureReason: null,\n isPaused: false,\n status: 'idle',\n variables: undefined,\n submittedAt: 0,\n }\n}\n","import { getDefaultState } from './mutation'\nimport { notifyManager } from './notifyManager'\nimport { Subscribable } from './subscribable'\nimport { hashKey, shallowEqualObjects } from './utils'\nimport type { QueryClient } from './queryClient'\nimport type {\n DefaultError,\n MutateOptions,\n MutationFunctionContext,\n MutationObserverOptions,\n MutationObserverResult,\n} from './types'\nimport type { Action, Mutation } from './mutation'\n\n// TYPES\n\ntype MutationObserverListener<TData, TError, TVariables, TOnMutateResult> = (\n result: MutationObserverResult<TData, TError, TVariables, TOnMutateResult>,\n) => void\n\n// CLASS\n\nexport class MutationObserver<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TOnMutateResult = unknown,\n> extends Subscribable<\n MutationObserverListener<TData, TError, TVariables, TOnMutateResult>\n> {\n options!: MutationObserverOptions<TData, TError, TVariables, TOnMutateResult>\n\n #client: QueryClient\n #currentResult: MutationObserverResult<\n TData,\n TError,\n TVariables,\n TOnMutateResult\n > = undefined!\n #currentMutation?: Mutation<TData, TError, TVariables, TOnMutateResult>\n #mutateOptions?: MutateOptions<TData, TError, TVariables, TOnMutateResult>\n\n constructor(\n client: QueryClient,\n options: MutationObserverOptions<\n TData,\n TError,\n TVariables,\n TOnMutateResult\n >,\n ) {\n super()\n\n this.#client = client\n this.setOptions(options)\n this.bindMethods()\n this.#updateResult()\n }\n\n protected bindMethods(): void {\n this.mutate = this.mutate.bind(this)\n this.reset = this.reset.bind(this)\n }\n\n setOptions(\n options: MutationObserverOptions<\n TData,\n TError,\n TVariables,\n TOnMutateResult\n >,\n ) {\n const prevOptions = this.options as\n | MutationObserverOptions<TData, TError, TVariables, TOnMutateResult>\n | undefined\n this.options = this.#client.defaultMutationOptions(options)\n if (!shallowEqualObjects(this.options, prevOptions)) {\n this.#client.getMutationCache().notify({\n type: 'observerOptionsUpdated',\n mutation: this.#currentMutation,\n observer: this,\n })\n }\n\n if (\n prevOptions?.mutationKey &&\n this.options.mutationKey &&\n hashKey(prevOptions.mutationKey) !== hashKey(this.options.mutationKey)\n ) {\n this.reset()\n } else if (this.#currentMutation?.state.status === 'pending') {\n this.#currentMutation.setOptions(this.options)\n }\n }\n\n protected onUnsubscribe(): void {\n if (!this.hasListeners()) {\n this.#currentMutation?.removeObserver(this)\n }\n }\n\n onMutationUpdate(\n action: Action<TData, TError, TVariables, TOnMutateResult>,\n ): void {\n this.#updateResult()\n\n this.#notify(action)\n }\n\n getCurrentResult(): MutationObserverResult<\n TData,\n TError,\n TVariables,\n TOnMutateResult\n > {\n return this.#currentResult\n }\n\n reset(): void {\n // reset needs to remove the observer from the mutation because there is no way to \"get it back\"\n // another mutate call will yield a new mutation!\n this.#currentMutation?.removeObserver(this)\n this.#currentMutation = undefined\n this.#updateResult()\n this.#notify()\n }\n\n mutate(\n variables: TVariables,\n options?: MutateOptions<TData, TError, TVariables, TOnMutateResult>,\n ): Promise<TData> {\n this.#mutateOptions = options\n\n this.#currentMutation?.removeObserver(this)\n\n this.#currentMutation = this.#client\n .getMutationCache()\n .build(this.#client, this.options)\n\n this.#currentMutation.addObserver(this)\n\n return this.#currentMutation.execute(variables)\n }\n\n #updateResult(): void {\n const state =\n this.#currentMutation?.state ??\n getDefaultState<TData, TError, TVariables, TOnMutateResult>()\n\n this.#currentResult = {\n ...state,\n isPending: state.status === 'pending',\n isSuccess: state.status === 'success',\n isError: state.status === 'error',\n isIdle: state.status === 'idle',\n mutate: this.mutate,\n reset: this.reset,\n } as MutationObserverResult<TData, TError, TVariables, TOnMutateResult>\n }\n\n #notify(action?: Action<TData, TError, TVariables, TOnMutateResult>): void {\n notifyManager.batch(() => {\n // First trigger the mutate callbacks\n if (this.#mutateOptions && this.hasListeners()) {\n const variables = this.#currentResult.variables!\n const onMutateResult = this.#currentResult.context\n\n const context = {\n client: this.#client,\n meta: this.options.meta,\n mutationKey: this.options.mutationKey,\n } satisfies MutationFunctionContext\n\n if (action?.type === 'success') {\n try {\n this.#mutateOptions.onSuccess?.(\n action.data,\n variables,\n onMutateResult,\n context,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n try {\n this.#mutateOptions.onSettled?.(\n action.data,\n null,\n variables,\n onMutateResult,\n context,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n } else if (action?.type === 'error') {\n try {\n this.#mutateOptions.onError?.(\n action.error,\n variables,\n onMutateResult,\n context,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n try {\n this.#mutateOptions.onSettled?.(\n undefined,\n action.error,\n variables,\n onMutateResult,\n context,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n }\n }\n\n // Then trigger the listeners\n this.listeners.forEach((listener) => {\n listener(this.#currentResult)\n })\n })\n }\n}\n","'use client'\nimport * as React from 'react'\n\nimport type { QueryClient } from '@tanstack/query-core'\n\nexport const QueryClientContext = React.createContext<QueryClient | undefined>(\n undefined,\n)\n\nexport const useQueryClient = (queryClient?: QueryClient) => {\n const client = React.useContext(QueryClientContext)\n\n if (queryClient) {\n return queryClient\n }\n\n if (!client) {\n throw new Error('No QueryClient set, use QueryClientProvider to set one')\n }\n\n return client\n}\n\nexport type QueryClientProviderProps = {\n client: QueryClient\n children?: React.ReactNode\n}\n\nexport const QueryClientProvider = ({\n client,\n children,\n}: QueryClientProviderProps): React.JSX.Element => {\n React.useEffect(() => {\n client.mount()\n return () => {\n client.unmount()\n }\n }, [client])\n\n return (\n <QueryClientContext.Provider value={client}>\n {children}\n </QueryClientContext.Provider>\n )\n}\n","'use client'\nimport * as React from 'react'\nimport {\n MutationObserver,\n noop,\n notifyManager,\n shouldThrowError,\n} from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type {\n UseMutateFunction,\n UseMutationOptions,\n UseMutationResult,\n} from './types'\nimport type { DefaultError, QueryClient } from '@tanstack/query-core'\n\n// HOOK\n\nexport function useMutation<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TOnMutateResult = unknown,\n>(\n options: UseMutationOptions<TData, TError, TVariables, TOnMutateResult>,\n queryClient?: QueryClient,\n): UseMutationResult<TData, TError, TVariables, TOnMutateResult> {\n const client = useQueryClient(queryClient)\n\n const [observer] = React.useState(\n () =>\n new MutationObserver<TData, TError, TVariables, TOnMutateResult>(\n client,\n options,\n ),\n )\n\n React.useEffect(() => {\n observer.setOptions(options)\n }, [observer, options])\n\n const result = React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) =>\n observer.subscribe(notifyManager.batchCalls(onStoreChange)),\n [observer],\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult(),\n )\n\n const mutate = React.useCallback<\n UseMutateFunction<TData, TError, TVariables, TOnMutateResult>\n >(\n (variables, mutateOptions) => {\n observer.mutate(variables, mutateOptions).catch(noop)\n },\n [observer],\n )\n\n if (\n result.error &&\n shouldThrowError(observer.options.throwOnError, [result.error])\n ) {\n throw result.error\n }\n\n return { ...result, mutate, mutateAsync: result.mutate }\n}\n","/**\n * API Client - HTTP client for backend API calls\n *\n * Provides typed methods for making API requests.\n * All requests go through the backend server, NOT directly to Firestore.\n *\n * @packageDocumentation\n */\n\nconst API_BASE_URL = typeof import.meta !== 'undefined' && import.meta.env?.VITE_API_URL\n ? import.meta.env.VITE_API_URL\n : '/api';\n\n/**\n * API Error class for handling HTTP errors\n */\nexport class ApiError extends Error {\n constructor(\n public status: number,\n public statusText: string,\n message?: string\n ) {\n super(message || `API Error: ${status} ${statusText}`);\n this.name = 'ApiError';\n }\n}\n\n/**\n * Handle response and parse JSON\n */\nasync function handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n let message: string | undefined;\n try {\n const errorData = await response.json();\n message = errorData.message || errorData.error;\n } catch {\n // Ignore JSON parse errors\n }\n throw new ApiError(response.status, response.statusText, message);\n }\n\n // Handle empty responses (e.g., 204 No Content)\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n\n return JSON.parse(text) as T;\n}\n\n/**\n * Get default headers for requests\n */\nfunction getHeaders(): HeadersInit {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n };\n\n // Add auth token if available (from localStorage or session)\n const token = typeof localStorage !== 'undefined'\n ? localStorage.getItem('authToken')\n : null;\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n return headers;\n}\n\n/**\n * API client with typed methods\n */\nexport const apiClient = {\n /**\n * GET request\n */\n async get<T>(endpoint: string): Promise<T> {\n const response = await fetch(`${API_BASE_URL}${endpoint}`, {\n method: 'GET',\n headers: getHeaders(),\n });\n return handleResponse<T>(response);\n },\n\n /**\n * POST request\n */\n async post<T>(endpoint: string, data?: unknown): Promise<T> {\n const response = await fetch(`${API_BASE_URL}${endpoint}`, {\n method: 'POST',\n headers: getHeaders(),\n body: data ? JSON.stringify(data) : undefined,\n });\n return handleResponse<T>(response);\n },\n\n /**\n * PUT request\n */\n async put<T>(endpoint: string, data?: unknown): Promise<T> {\n const response = await fetch(`${API_BASE_URL}${endpoint}`, {\n method: 'PUT',\n headers: getHeaders(),\n body: data ? JSON.stringify(data) : undefined,\n });\n return handleResponse<T>(response);\n },\n\n /**\n * PATCH request\n */\n async patch<T>(endpoint: string, data?: unknown): Promise<T> {\n const response = await fetch(`${API_BASE_URL}${endpoint}`, {\n method: 'PATCH',\n headers: getHeaders(),\n body: data ? JSON.stringify(data) : undefined,\n });\n return handleResponse<T>(response);\n },\n\n /**\n * DELETE request\n */\n async delete<T = void>(endpoint: string): Promise<T> {\n const response = await fetch(`${API_BASE_URL}${endpoint}`, {\n method: 'DELETE',\n headers: getHeaders(),\n });\n return handleResponse<T>(response);\n },\n};\n\nexport default apiClient;\n","/**\n * useOrbitalMutations - Event-based entity mutations via orbital events route\n *\n * This hook provides entity mutations that go through the orbital events route\n * instead of direct CRUD API calls. This ensures all mutations:\n * 1. Go through trait state machines\n * 2. Enforce guards\n * 3. Execute all trait effects (including persist)\n *\n * This is the Phase 7 replacement for direct CRUD mutations.\n *\n * @example\n * ```tsx\n * const { createEntity, updateEntity, deleteEntity } = useOrbitalMutations('Task', 'TaskManager');\n *\n * // Create - sends ENTITY_CREATE event to orbital\n * await createEntity({ title: 'New Task', status: 'pending' });\n *\n * // Update - sends ENTITY_UPDATE event to orbital\n * await updateEntity(taskId, { status: 'completed' });\n *\n * // Delete - sends ENTITY_DELETE event to orbital\n * await deleteEntity(taskId);\n * ```\n *\n * @packageDocumentation\n */\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiClient } from '../lib/api-client';\nimport { entityDataKeys } from './useEntityData';\n\n/**\n * Standard events for entity mutations\n * These are handled by orbitals with CRUD-capable traits\n */\nexport const ENTITY_EVENTS = {\n CREATE: 'ENTITY_CREATE',\n UPDATE: 'ENTITY_UPDATE',\n DELETE: 'ENTITY_DELETE',\n} as const;\n\nexport interface OrbitalEventPayload {\n event: string;\n payload?: Record<string, unknown>;\n entityId?: string;\n}\n\nexport interface OrbitalEventResponse {\n success: boolean;\n transitioned: boolean;\n states: Record<string, string>;\n emittedEvents: Array<{ event: string; payload?: unknown }>;\n error?: string;\n}\n\n/**\n * Send an event to an orbital via the events route\n */\nasync function sendOrbitalEvent(\n orbitalName: string,\n eventPayload: OrbitalEventPayload\n): Promise<OrbitalEventResponse> {\n const response = await apiClient.post<OrbitalEventResponse>(\n `/orbitals/${orbitalName}/events`,\n eventPayload\n );\n return response;\n}\n\n/**\n * Hook for event-based entity mutations via orbital events route\n *\n * @param entityName - The entity type name (for cache invalidation)\n * @param orbitalName - The orbital to send events to\n * @param options - Optional configuration\n */\nexport function useOrbitalMutations(\n entityName: string,\n orbitalName: string,\n options?: {\n /** Custom event names for create/update/delete */\n events?: {\n create?: string;\n update?: string;\n delete?: string;\n };\n /** Enable debug logging */\n debug?: boolean;\n }\n) {\n const queryClient = useQueryClient();\n const events = {\n create: options?.events?.create || ENTITY_EVENTS.CREATE,\n update: options?.events?.update || ENTITY_EVENTS.UPDATE,\n delete: options?.events?.delete || ENTITY_EVENTS.DELETE,\n };\n\n const log = (message: string, data?: unknown) => {\n if (options?.debug) {\n console.log(`[useOrbitalMutations:${orbitalName}] ${message}`, data ?? '');\n }\n };\n\n /**\n * Create mutation - sends create event to orbital\n */\n const createMutation = useMutation({\n mutationFn: async (data: Record<string, unknown>): Promise<OrbitalEventResponse> => {\n log('Creating entity', data);\n return sendOrbitalEvent(orbitalName, {\n event: events.create,\n payload: { data, entityType: entityName },\n });\n },\n onSuccess: (response) => {\n log('Create succeeded', response);\n queryClient.invalidateQueries({ queryKey: entityDataKeys.list(entityName) });\n },\n onError: (error) => {\n console.error(`[useOrbitalMutations] Create failed:`, error);\n },\n });\n\n /**\n * Update mutation - sends update event to orbital\n */\n const updateMutation = useMutation({\n mutationFn: async ({\n id,\n data,\n }: {\n id: string;\n data: Record<string, unknown>;\n }): Promise<OrbitalEventResponse> => {\n log(`Updating entity ${id}`, data);\n return sendOrbitalEvent(orbitalName, {\n event: events.update,\n entityId: id,\n payload: { data, entityType: entityName },\n });\n },\n onSuccess: (response, variables) => {\n log('Update succeeded', response);\n queryClient.invalidateQueries({ queryKey: entityDataKeys.list(entityName) });\n queryClient.invalidateQueries({\n queryKey: entityDataKeys.detail(entityName, variables.id),\n });\n },\n onError: (error) => {\n console.error(`[useOrbitalMutations] Update failed:`, error);\n },\n });\n\n /**\n * Delete mutation - sends delete event to orbital\n */\n const deleteMutation = useMutation({\n mutationFn: async (id: string): Promise<OrbitalEventResponse> => {\n log(`Deleting entity ${id}`);\n return sendOrbitalEvent(orbitalName, {\n event: events.delete,\n entityId: id,\n payload: { entityType: entityName },\n });\n },\n onSuccess: (response, id) => {\n log('Delete succeeded', response);\n queryClient.invalidateQueries({ queryKey: entityDataKeys.list(entityName) });\n queryClient.removeQueries({ queryKey: entityDataKeys.detail(entityName, id) });\n },\n onError: (error) => {\n console.error(`[useOrbitalMutations] Delete failed:`, error);\n },\n });\n\n return {\n // Async functions\n createEntity: async (data: Record<string, unknown>) => {\n return createMutation.mutateAsync(data);\n },\n updateEntity: async (id: string | undefined, data: Record<string, unknown>) => {\n if (!id) {\n console.warn('[useOrbitalMutations] Cannot update without ID');\n return;\n }\n return updateMutation.mutateAsync({ id, data });\n },\n deleteEntity: async (id: string | undefined) => {\n if (!id) {\n console.warn('[useOrbitalMutations] Cannot delete without ID');\n return;\n }\n return deleteMutation.mutateAsync(id);\n },\n\n // Mutation objects for fine-grained control\n createMutation,\n updateMutation,\n deleteMutation,\n\n // Aggregate states\n isCreating: createMutation.isPending,\n isUpdating: updateMutation.isPending,\n isDeleting: deleteMutation.isPending,\n isMutating: createMutation.isPending || updateMutation.isPending || deleteMutation.isPending,\n\n // Errors\n createError: createMutation.error,\n updateError: updateMutation.error,\n deleteError: deleteMutation.error,\n };\n}\n\n/**\n * Send a custom event to an orbital\n * For non-CRUD operations that go through trait state machines\n */\nexport function useSendOrbitalEvent(orbitalName: string) {\n const mutation = useMutation({\n mutationFn: async (payload: OrbitalEventPayload): Promise<OrbitalEventResponse> => {\n return sendOrbitalEvent(orbitalName, payload);\n },\n });\n\n return {\n sendEvent: async (event: string, payload?: Record<string, unknown>, entityId?: string) => {\n return mutation.mutateAsync({ event, payload, entityId });\n },\n isPending: mutation.isPending,\n error: mutation.error,\n data: mutation.data,\n };\n}\n","/**\n * useEntityMutations - Entity CRUD mutation hooks\n *\n * Provides create, update, and delete mutations for entities.\n * Used by trait hooks for persist_data effects.\n *\n * @deprecated For new code, prefer useOrbitalMutations which sends mutations\n * through the orbital events route. This ensures all mutations go through\n * trait state machines and enforce guards/effects.\n *\n * Migration:\n * ```tsx\n * // Old (deprecated):\n * const { createEntity } = useEntityMutations('Task');\n *\n * // New (recommended):\n * const { createEntity } = useOrbitalMutations('Task', 'TaskManager');\n * ```\n *\n * @see useOrbitalMutations\n */\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiClient } from '../lib/api-client';\nimport { entityDataKeys } from './useEntityData';\nimport { ENTITY_EVENTS, type OrbitalEventResponse } from './useOrbitalMutations';\n\n/**\n * Convert entity name to API collection path\n * Uses the KFlow convention: {entity-name}-list\n * e.g., \"Customer\" -> \"customer-list\", \"InventoryItem\" -> \"inventory-item-list\"\n */\nfunction entityToCollection(entityName: string): string {\n return entityName\n .replace(/([a-z])([A-Z])/g, '$1-$2') // camelCase to kebab-case\n .toLowerCase() + '-list'; // KFlow API convention\n}\n\nexport interface EntityMutationResult {\n id: string;\n [key: string]: unknown;\n}\n\n/**\n * Hook for creating entities\n */\nexport function useCreateEntity(entityName: string) {\n const queryClient = useQueryClient();\n const collection = entityToCollection(entityName);\n\n return useMutation({\n mutationFn: async (data: Record<string, unknown>) => {\n console.log(`[useCreateEntity] Creating ${entityName}:`, data);\n const response = await apiClient.post<{ data: EntityMutationResult }>(\n `/${collection}`,\n data\n );\n return response.data;\n },\n onSuccess: () => {\n // Invalidate list queries to refetch\n queryClient.invalidateQueries({ queryKey: entityDataKeys.list(entityName) });\n },\n onError: (error) => {\n console.error(`[useCreateEntity] Failed to create ${entityName}:`, error);\n },\n });\n}\n\n/**\n * Hook for updating entities\n */\nexport function useUpdateEntity(entityName: string) {\n const queryClient = useQueryClient();\n const collection = entityToCollection(entityName);\n\n return useMutation({\n mutationFn: async ({ id, data }: { id: string; data: Record<string, unknown> }) => {\n console.log(`[useUpdateEntity] Updating ${entityName} ${id}:`, data);\n const response = await apiClient.patch<{ data: EntityMutationResult }>(\n `/${collection}/${id}`,\n data\n );\n return response.data;\n },\n onSuccess: (_, variables) => {\n // Invalidate both list and detail queries\n queryClient.invalidateQueries({ queryKey: entityDataKeys.list(entityName) });\n queryClient.invalidateQueries({ queryKey: entityDataKeys.detail(entityName, variables.id) });\n },\n onError: (error) => {\n console.error(`[useUpdateEntity] Failed to update ${entityName}:`, error);\n },\n });\n}\n\n/**\n * Hook for deleting entities\n */\nexport function useDeleteEntity(entityName: string) {\n const queryClient = useQueryClient();\n const collection = entityToCollection(entityName);\n\n return useMutation({\n mutationFn: async (id: string) => {\n console.log(`[useDeleteEntity] Deleting ${entityName} ${id}`);\n await apiClient.delete(`/${collection}/${id}`);\n return { id };\n },\n onSuccess: (_, id) => {\n // Invalidate list and remove detail from cache\n queryClient.invalidateQueries({ queryKey: entityDataKeys.list(entityName) });\n queryClient.removeQueries({ queryKey: entityDataKeys.detail(entityName, id) });\n },\n onError: (error) => {\n console.error(`[useDeleteEntity] Failed to delete ${entityName}:`, error);\n },\n });\n}\n\nexport interface UseEntityMutationsOptions {\n /**\n * If provided, mutations go through orbital events route instead of direct CRUD.\n * This is the recommended approach for Phase 7+ compliance.\n */\n orbitalName?: string;\n /**\n * Custom event names when using orbital-based mutations\n */\n events?: {\n create?: string;\n update?: string;\n delete?: string;\n };\n}\n\n/**\n * Send mutation event to orbital events route\n */\nasync function sendOrbitalMutation(\n orbitalName: string,\n event: string,\n entityId: string | undefined,\n payload: Record<string, unknown>\n): Promise<OrbitalEventResponse> {\n const response = await apiClient.post<OrbitalEventResponse>(\n `/orbitals/${orbitalName}/events`,\n { event, entityId, payload }\n );\n return response;\n}\n\n/**\n * Combined hook that provides all entity mutations\n * Used by trait hooks for persist_data effects\n *\n * @param entityName - The entity type name\n * @param options - Optional configuration including orbital-based mutations\n *\n * @deprecated For new code, prefer useOrbitalMutations directly\n */\nexport function useEntityMutations(entityName: string, options?: UseEntityMutationsOptions) {\n const queryClient = useQueryClient();\n\n // If orbitalName provided, use orbital events route\n const useOrbitalRoute = !!options?.orbitalName;\n const events = {\n create: options?.events?.create || ENTITY_EVENTS.CREATE,\n update: options?.events?.update || ENTITY_EVENTS.UPDATE,\n delete: options?.events?.delete || ENTITY_EVENTS.DELETE,\n };\n\n // Legacy direct CRUD mutations\n const createMutation = useCreateEntity(entityName);\n const updateMutation = useUpdateEntity(entityName);\n const deleteMutation = useDeleteEntity(entityName);\n\n // Orbital-based mutations\n const orbitalCreateMutation = useMutation({\n mutationFn: async (data: Record<string, unknown>) => {\n return sendOrbitalMutation(options!.orbitalName!, events.create, undefined, {\n data,\n entityType: entityName,\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: entityDataKeys.list(entityName) });\n },\n });\n\n const orbitalUpdateMutation = useMutation({\n mutationFn: async ({ id, data }: { id: string; data: Record<string, unknown> }) => {\n return sendOrbitalMutation(options!.orbitalName!, events.update, id, {\n data,\n entityType: entityName,\n });\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({ queryKey: entityDataKeys.list(entityName) });\n queryClient.invalidateQueries({\n queryKey: entityDataKeys.detail(entityName, variables.id),\n });\n },\n });\n\n const orbitalDeleteMutation = useMutation({\n mutationFn: async (id: string) => {\n return sendOrbitalMutation(options!.orbitalName!, events.delete, id, {\n entityType: entityName,\n });\n },\n onSuccess: (_, id) => {\n queryClient.invalidateQueries({ queryKey: entityDataKeys.list(entityName) });\n queryClient.removeQueries({ queryKey: entityDataKeys.detail(entityName, id) });\n },\n });\n\n // Select which mutations to use based on options\n const activeMutations = {\n create: useOrbitalRoute ? orbitalCreateMutation : createMutation,\n update: useOrbitalRoute ? orbitalUpdateMutation : updateMutation,\n delete: useOrbitalRoute ? orbitalDeleteMutation : deleteMutation,\n };\n\n return {\n // Async functions that can be called directly\n // Accepts either (data) or (entityName, data) for compiler compatibility\n createEntity: async (entityOrData: string | Record<string, unknown>, data?: Record<string, unknown>) => {\n const actualData = typeof entityOrData === 'string' ? data : entityOrData;\n if (!actualData) {\n console.warn('[useEntityMutations] Cannot create entity without data');\n return;\n }\n return activeMutations.create.mutateAsync(actualData as Record<string, unknown>);\n },\n updateEntity: async (id: string | undefined, data: Record<string, unknown>) => {\n if (!id) {\n console.warn('[useEntityMutations] Cannot update entity without ID');\n return;\n }\n return activeMutations.update.mutateAsync({ id, data });\n },\n deleteEntity: async (id: string | undefined) => {\n if (!id) {\n console.warn('[useEntityMutations] Cannot delete entity without ID');\n return;\n }\n return activeMutations.delete.mutateAsync(id);\n },\n // Mutation states for UI feedback\n isCreating: activeMutations.create.isPending,\n isUpdating: activeMutations.update.isPending,\n isDeleting: activeMutations.delete.isPending,\n createError: activeMutations.create.error,\n updateError: activeMutations.update.error,\n deleteError: activeMutations.delete.error,\n };\n}\n","/**\n * Entity Store\n *\n * Simple module-level store for runtime entities.\n * No providers needed - hooks import and use directly.\n *\n * NOTE: Mutations create new Map instances to trigger React rerenders\n * when using useSyncExternalStore.\n */\n\nimport {\n type EntityFilterValue,\n type FilterOperator,\n type EntityFilters,\n applyFilters,\n createFilter\n} from './filtering';\n\n// Re-export filtering types for convenience\nexport type { EntityFilterValue, FilterOperator, EntityFilters };\nexport { applyFilters, createFilter };\n\nexport interface Entity {\n id: string;\n type: string;\n [key: string]: unknown;\n}\n\ntype Listener = () => void;\n\n// Module-level state - use `let` so we can reassign to new Map on mutations\nlet entities = new Map<string, Entity>();\nlet filters = new Map<string, EntityFilters>();\nconst listeners = new Set<Listener>();\nlet idCounter = 0;\n\n/**\n * Subscribe to store changes\n */\nexport function subscribe(listener: Listener): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/**\n * Notify all listeners of changes\n */\nfunction notify(): void {\n listeners.forEach(listener => listener());\n}\n\n/**\n * Get all entities\n */\nexport function getEntities(): Map<string, Entity> {\n return entities;\n}\n\n/**\n * Get entity by ID\n */\nexport function getEntity(id: string): Entity | undefined {\n return entities.get(id);\n}\n\n/**\n * Get entities by type\n */\nexport function getByType(type: string | string[]): Entity[] {\n const types = Array.isArray(type) ? type : [type];\n return [...entities.values()].filter(e => types.includes(e.type));\n}\n\n/**\n * Get all entities as array\n */\nexport function getAllEntities(): Entity[] {\n return [...entities.values()];\n}\n\n/**\n * Get singleton entity by type (first of that type)\n */\nexport function getSingleton(type: string): Entity | undefined {\n return [...entities.values()].find(e => e.type === type);\n}\n\n/**\n * Spawn a new entity\n */\nexport function spawnEntity(config: { type: string; id?: string; [key: string]: unknown }): string {\n const id = config.id ?? `entity_${++idCounter}`;\n const entity: Entity = { ...config, id };\n // Create new Map to trigger React rerender\n entities = new Map(entities);\n entities.set(id, entity);\n notify();\n return id;\n}\n\n/**\n * Update an entity\n */\nexport function updateEntity(id: string, updates: Partial<Entity>): void {\n const entity = entities.get(id);\n if (entity) {\n // Create new Map to trigger React rerender\n entities = new Map(entities);\n entities.set(id, { ...entity, ...updates });\n notify();\n }\n}\n\n/**\n * Update singleton entity by type\n */\nexport function updateSingleton(type: string, updates: Partial<Entity>): void {\n const entity = getSingleton(type);\n if (entity) {\n updateEntity(entity.id, updates);\n }\n}\n\n/**\n * Remove an entity\n */\nexport function removeEntity(id: string): void {\n if (entities.has(id)) {\n // Create new Map to trigger React rerender\n entities = new Map(entities);\n entities.delete(id);\n notify();\n }\n}\n\n/**\n * Clear all entities\n */\nexport function clearEntities(): void {\n // Create new Map to trigger React rerender\n entities = new Map();\n notify();\n}\n\n// ============================================================================\n// Filter Management\n// ============================================================================\n\n/**\n * Set a filter for an entity type\n * @param entityType - The entity type to filter (e.g., \"Player\", \"Enemy\")\n * @param field - The filter key (e.g., 'status' or 'date_from')\n * @param value - The filter value\n * @param operator - The comparison operator\n * @param targetField - The actual record field to compare (defaults to field)\n */\nexport function setFilter(\n entityType: string,\n field: string,\n value: unknown,\n operator: FilterOperator = 'eq',\n targetField?: string\n): void {\n filters = new Map(filters);\n const entityFilters = new Map(filters.get(entityType) || []);\n entityFilters.set(field, createFilter(field, value, operator, targetField));\n filters.set(entityType, entityFilters);\n notify();\n}\n\n/**\n * Clear a specific filter\n */\nexport function clearFilter(entityType: string, field: string): void {\n const entityFilters = filters.get(entityType);\n if (entityFilters && entityFilters.has(field)) {\n filters = new Map(filters);\n const newFilters = new Map(entityFilters);\n newFilters.delete(field);\n filters.set(entityType, newFilters);\n notify();\n }\n}\n\n/**\n * Clear all filters for an entity type\n */\nexport function clearAllFilters(entityType: string): void {\n if (filters.has(entityType)) {\n filters = new Map(filters);\n filters.set(entityType, new Map());\n notify();\n }\n}\n\n/**\n * Get active filters for an entity type\n */\nexport function getFilters(entityType: string): EntityFilters {\n return filters.get(entityType) || new Map();\n}\n\n/**\n * Get entities by type with optional filtering\n */\nexport function getByTypeFiltered(type: string | string[]): Entity[] {\n const types = Array.isArray(type) ? type : [type];\n let result = [...entities.values()].filter(e => types.includes(e.type));\n\n // Apply filters for each type\n for (const t of types) {\n const typeFilters = filters.get(t);\n if (typeFilters && typeFilters.size > 0) {\n result = applyFilters(result, typeFilters);\n }\n }\n\n return result;\n}\n\n/**\n * Get snapshot for React useSyncExternalStore\n */\nexport function getSnapshot(): Map<string, Entity> {\n return entities;\n}\n\n/**\n * Get filter snapshot for React useSyncExternalStore\n */\nexport function getFilterSnapshot(): Map<string, EntityFilters> {\n return filters;\n}\n","/**\n * useEntities Hook\n *\n * React hook to access the entity store.\n * Uses useSyncExternalStore for efficient updates.\n */\n\nimport { useSyncExternalStore, useCallback } from 'react';\nimport {\n subscribe,\n getSnapshot,\n getEntity,\n getByType,\n getAllEntities,\n getSingleton,\n spawnEntity,\n updateEntity,\n updateSingleton,\n removeEntity,\n clearEntities,\n} from '../stores/entityStore';\nimport type { Entity } from '../stores/entityStore';\n\n// Re-export Entity type\nexport type { Entity };\n\n/**\n * Hook to access all entities\n */\nexport function useEntities() {\n const entities = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n return {\n entities,\n getEntity,\n getByType,\n getAllEntities,\n getSingleton,\n spawnEntity,\n updateEntity,\n updateSingleton,\n removeEntity,\n clearEntities,\n };\n}\n\n/**\n * Hook to access a specific entity by ID\n */\nexport function useEntity(id: string): Entity | undefined {\n const entities = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n return entities.get(id);\n}\n\n/**\n * Hook to access entities of a specific type\n */\nexport function useEntitiesByType(type: string): Entity[] {\n const entities = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n return [...entities.values()].filter(e => e.type === type);\n}\n\n/**\n * Hook to access a singleton entity by type\n */\nexport function useSingletonEntity<T extends Entity = Entity>(type: string): T | undefined {\n const entities = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n return [...entities.values()].find(e => e.type === type) as T | undefined;\n}\n\n/**\n * Hook for Player entity (convenience)\n */\nexport function usePlayer() {\n const player = useSingletonEntity('Player');\n const update = useCallback((updates: Partial<Entity>) => {\n if (player) updateEntity(player.id, updates);\n }, [player?.id]);\n\n return { player, updatePlayer: update };\n}\n\n/**\n * Hook for Physics entity (convenience)\n */\nexport function usePhysics() {\n const physics = useSingletonEntity('Physics');\n const update = useCallback((updates: Partial<Entity>) => {\n if (physics) updateEntity(physics.id, updates);\n }, [physics?.id]);\n\n return { physics, updatePhysics: update };\n}\n\n/**\n * Hook for Input entity (convenience)\n */\nexport function useInput() {\n const input = useSingletonEntity('Input');\n const update = useCallback((updates: Partial<Entity>) => {\n if (input) updateEntity(input.id, updates);\n }, [input?.id]);\n\n return { input, updateInput: update };\n}\n\n// Re-export store functions for direct use\nexport {\n spawnEntity,\n updateEntity,\n updateSingleton,\n removeEntity,\n clearEntities,\n getEntity,\n getByType,\n getAllEntities,\n getSingleton,\n};\n","/**\n * Auth Context Hook Stub\n *\n * Provides a placeholder auth context for the design system.\n * Applications should provide their own AuthContext provider\n * that implements this interface.\n */\n\nexport interface AuthUser {\n uid: string;\n email: string | null;\n displayName: string | null;\n photoURL: string | null;\n}\n\nexport interface AuthContextValue {\n user: AuthUser | null;\n loading: boolean;\n signIn?: () => Promise<void>;\n signOut?: () => Promise<void>;\n}\n\n/**\n * Stub hook that returns empty auth context.\n * Applications should wrap their app with an AuthProvider\n * that supplies real auth state.\n */\nexport function useAuthContext(): AuthContextValue {\n // Return stub values - applications should override with real provider\n return {\n user: null,\n loading: false,\n signIn: undefined,\n signOut: undefined,\n };\n}\n"]}