@ai4b-team/fsaos-gateway-sdk 1.0.1
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.
- package/CHANGELOG.md +56 -0
- package/README.md +157 -0
- package/dist/iife/gateway.js +12 -0
- package/dist/iife/gateway.js.map +7 -0
- package/dist/iife/ui.js +3 -0
- package/dist/iife/ui.js.map +7 -0
- package/dist/index.cjs +3220 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1806 -0
- package/dist/index.d.ts +1806 -0
- package/dist/index.js +3079 -0
- package/dist/index.js.map +1 -0
- package/dist/ui.cjs +201 -0
- package/dist/ui.cjs.map +1 -0
- package/dist/ui.d.cts +243 -0
- package/dist/ui.d.ts +243 -0
- package/dist/ui.js +180 -0
- package/dist/ui.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["global-external:@supabase/supabase-js", "global-external:react", "global-external:react/jsx-runtime", "global-external:react-dom/client", "global-external:react-dom", "../../src/index.ts", "../../src/enforcement.ts", "../../src/config.ts", "../../src/session.ts", "../../src/client.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/subscribable.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/focusManager.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/timeoutManager.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/utils.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/environmentManager.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/thenable.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/notifyManager.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/onlineManager.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/retryer.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/removable.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/query.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/queryObserver.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/infiniteQueryBehavior.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/infiniteQueryObserver.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/mutation.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/mutationCache.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/mutationObserver.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/queryCache.ts", "../../node_modules/.pnpm/@tanstack+query-core@5.99.0/node_modules/@tanstack/query-core/src/queryClient.ts", "../../node_modules/.pnpm/@tanstack+react-query@5.99.0_react@19.2.5/node_modules/@tanstack/react-query/src/QueryClientProvider.tsx", "../../node_modules/.pnpm/@tanstack+react-query@5.99.0_react@19.2.5/node_modules/@tanstack/react-query/src/IsRestoringProvider.ts", "../../node_modules/.pnpm/@tanstack+react-query@5.99.0_react@19.2.5/node_modules/@tanstack/react-query/src/QueryErrorResetBoundary.tsx", "../../node_modules/.pnpm/@tanstack+react-query@5.99.0_react@19.2.5/node_modules/@tanstack/react-query/src/errorBoundaryUtils.ts", "../../node_modules/.pnpm/@tanstack+react-query@5.99.0_react@19.2.5/node_modules/@tanstack/react-query/src/suspense.ts", "../../node_modules/.pnpm/@tanstack+react-query@5.99.0_react@19.2.5/node_modules/@tanstack/react-query/src/useBaseQuery.ts", "../../node_modules/.pnpm/@tanstack+react-query@5.99.0_react@19.2.5/node_modules/@tanstack/react-query/src/useQuery.ts", "../../node_modules/.pnpm/@tanstack+react-query@5.99.0_react@19.2.5/node_modules/@tanstack/react-query/src/useMutation.ts", "../../node_modules/.pnpm/@tanstack+react-query@5.99.0_react@19.2.5/node_modules/@tanstack/react-query/src/useInfiniteQuery.ts", "../../src/query-client.ts", "../../src/vfs-keys.ts", "../../src/vfs.ts", "../../src/ws.ts", "../../src/vfs-realtime-ws.ts", "../../src/runtime.ts", "../../src/hooks.ts", "../../src/schema-utils.ts", "../../src/upload.ts"],
|
|
4
|
+
"sourcesContent": ["module.exports = { createClient: window.supabase.createClient };", "module.exports = React;", "module.exports = { jsx: React.createElement, jsxs: React.createElement, Fragment: React.Fragment };", "module.exports = ReactDOM;", "module.exports = ReactDOM;", "/**\n * @fsaos/gateway \u2014 Barrel Export\n *\n * Single entry point for the SDK. Re-exports all symbols for the\n * deployed gateway.js bundle on R2.\n */\n\n// Error\nexport { EnforcementDeniedError } from './enforcement';\n\n// Session\nexport { initSession, clearSession, getSessionEntry, getAccessToken, setCachedToken, clearCachedToken, setScope, getScope, getScopeVersion, subscribeScope, awaitScopeReady, isScopeReady, resetAllSdkState, registerCleanup } from './session';\n\n// Client\nexport { gatewayCall } from './client';\n\n// Config \u2014 supabase client is internal, not part of the public API.\n// Use useAuth(), gatewayCall(), and SDK hooks instead.\n\n// Query Client\nexport { queryClient } from './query-client';\n\n// QueryClientProvider (re-exported so runtime can wrap components)\nexport { QueryClientProvider } from '@tanstack/react-query';\n\n// VFS Keys\nexport { vfsKeys } from './vfs-keys';\n\n// VFS Operations\nexport {\n normalizeItem,\n fetchVfsItem,\n fetchVfsItemById,\n fetchVfsChildren,\n fetchVfsChildrenPage,\n fetchTypeDefinitions,\n fetchItems,\n fetchEdgesForItem,\n fetchVfsTree,\n fetchMemberFocus,\n fetchRecentActivity,\n fetchItemHistory,\n fetchChannelMessages,\n fetchChannelMessagesPage,\n fetchOpenEnvelope,\n invalidateChildren,\n invalidateItem,\n invalidatePathAndParent,\n invalidateSubtree,\n invalidateAllVfs,\n invalidateTypes,\n invalidateChannelMessages,\n invalidateOpenEnvelope,\n} from './vfs';\nexport type { ItemsFilter, ChannelMessage, ChannelMessagesPage } from './vfs';\n\n// VFS Realtime via WebSocket\nexport { initVfsRealtimeWs, disposeVfsRealtimeWs, mountRealtimeScope, unmountRealtimeScope } from './vfs-realtime-ws';\n\n// WebSocket Transport\nexport { subscribeToPath, subscribeToEvents, subscribeToScope, emitEvent, disconnectSSE, ping } from './ws';\n\n// Runtime (imperative VFS functions, auth facade, mount, require shim)\nexport {\n readItem,\n listChildren,\n createItem,\n updateItem,\n pushChanges,\n callTool,\n signal,\n getAssetUrl,\n auth,\n mount,\n setupRequireShim,\n} from './runtime';\n\n// React Hooks\nexport {\n useItem,\n useItemById,\n useItems,\n useInfiniteItems,\n useInfiniteChildren,\n useList,\n useChildren,\n useTree,\n useSearch,\n useEdges,\n useTypes,\n useType,\n useOpen,\n useTypeHelpers,\n useMemberFocus,\n useItemHistory,\n useRecentActivity,\n useScope,\n useScopeReady,\n useAuth,\n useAsset,\n useComponent,\n useTheme,\n usePermission,\n usePermissions,\n usePrincipal,\n resolvePrincipalId,\n useAccounts,\n useTool,\n useCreate,\n useUpdate,\n useDelete,\n useMove,\n useLink,\n useMutation,\n useEventStream,\n useChannelMessages,\n useInfiniteChannelMessages,\n useAllChannels,\n useChannels,\n useDmChannels,\n useNotifications,\n useUnreadCounts,\n useRealtimeQuery,\n ComponentRenderer,\n KernelProvider,\n} from './hooks';\nexport type {\n ChannelMessagesOptions,\n InfiniteChannelMessagesOptions,\n Channel,\n ChannelsOptions,\n Notification,\n NotificationsOptions,\n UnreadCountsOptions,\n} from './hooks';\n\n// Schema Interpretation Utilities\nexport { interpretSchema, getDefaultSort, getRequiredFormFields } from './schema-utils';\nexport type { FieldDescriptor, TypeSchema } from './schema-utils';\n\n// File Upload (imperative + React hook)\nexport { uploadFile, useFileUpload } from './upload';\nexport type { FileRef, UploadOptions, UploadResult, UploadItem, UseFileUploadReturn } from './upload';\n\n// Types (re-export for consumers)\nexport type {\n VFSItem,\n TypeDefinition,\n VFSEdge,\n SessionEntry,\n EnforcementPayload,\n GatewayParams,\n GatewayResponse,\n CreateParams,\n UpdateParams,\n DeleteParams,\n MoveParams,\n LinkParams,\n OpenEnvelope,\n OpenOptions,\n ComponentOpener,\n} from './types';\n\nexport type { PrincipalData, AccountInfo, TypeHelpers } from './hooks';\n\n// \u2500\u2500 SDK Self-Registration \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Register the complete export map so the require shim in useComponent() can\n// return the full SDK when child components call require('@fsaos/gateway').\n// This covers the npm/ESM context where window.__FSAOS_GATEWAY__ isn't set by\n// a <script> tag. In the dispatch worker context, the gateway.js IIFE already\n// sets the global, so __registerSdkExports() skips the window assignment.\nimport { __registerSdkExports } from './hooks';\nimport * as _self from './index';\n__registerSdkExports(_self as unknown as Record<string, unknown>);\n", "/**\n * @fsaos/gateway \u2014 Enforcement Error\n *\n * Thrown when a gateway call is denied by the enforcement layer\n * (rules, access control, or entitlement checks).\n */\n\nimport type { EnforcementPayload } from './types';\n\nexport class EnforcementDeniedError extends Error {\n public readonly name = 'EnforcementDeniedError';\n public readonly deniedBy: string;\n public readonly ruleKey?: string;\n public readonly displayName?: string;\n\n constructor(payload: EnforcementPayload) {\n const message = payload.message || EnforcementDeniedError.fallbackMessage(payload);\n super(message);\n this.deniedBy = payload.denied_by || payload.error_type || payload.error || 'unknown';\n const enforcement = payload.enforcement;\n this.ruleKey = enforcement?.rule_key ?? undefined;\n this.displayName = enforcement?.display_name ?? undefined;\n }\n\n static fallbackMessage(payload: EnforcementPayload): string {\n const err = payload.error || '';\n const deniedBy = payload.denied_by || '';\n\n if (deniedBy === 'rule' || err === 'RULE_DENIED') {\n return 'This feature is not enabled for this workspace.';\n }\n if (deniedBy === 'entitlement' || err === 'ENTITLEMENT_REQUIRED') {\n return 'This feature requires a plan upgrade.';\n }\n if (deniedBy === 'access' || err === 'ACCESS_DENIED' || err === 'PERMISSION_DENIED') {\n return \"You don't have permission to do this.\";\n }\n return 'This action is not allowed.';\n }\n\n get isRuleDenial(): boolean {\n return this.deniedBy === 'rule' || this.deniedBy === 'RULE_DENIED';\n }\n\n get isAccessDenial(): boolean {\n return this.deniedBy === 'access' || this.deniedBy === 'ACCESS_DENIED';\n }\n\n get isEntitlementDenial(): boolean {\n return this.deniedBy === 'entitlement' || this.deniedBy === 'ENTITLEMENT_REQUIRED';\n }\n}\n", "/**\n * @fsaos/gateway \u2014 Configuration & Supabase Client\n *\n * Reads the per-page config injected by the dispatch worker into\n * window.__FSAOS_CONFIG__ and creates the shared Supabase client instance.\n *\n * Supabase is imported via standard ESM import. In the IIFE build,\n * esbuild's globalExternalsPlugin maps this to window.supabase (CDN global).\n * In a Vite/bundler context, it resolves to the npm @supabase/supabase-js package.\n */\nimport { createClient } from '@supabase/supabase-js';\n\ndeclare global {\n interface Window {\n __FSAOS_CONFIG__?: {\n supabaseUrl?: string;\n supabaseAnonKey?: string;\n gatewayUrl?: string;\n scopePath?: string;\n embedToken?: string | null;\n edgeBaseUrl?: string;\n componentPath?: string;\n /** Override the hostname used for domain-scoped gateway dispatch.\n * Useful in dev environments where window.location.hostname\n * doesn't match the registered VFS domain. */\n hostname?: string;\n };\n }\n}\n\nconst CONFIG = (typeof window !== 'undefined' && window.__FSAOS_CONFIG__) || {};\n\nexport const SUPABASE_URL =\n CONFIG.supabaseUrl || 'https://vahbmsslxuustnlvsrkg.supabase.co';\n\nexport const SUPABASE_ANON_KEY =\n CONFIG.supabaseAnonKey || 'sb_publishable_ZjosozAjfpZ4InMNElTr6Q_hHB-f5nc';\n\nexport const GATEWAY_URL =\n CONFIG.gatewayUrl || 'https://fsaos-mcp-gw-rust.fly.dev';\n\n/**\n * Shared Supabase client instance.\n * Internal to the SDK \u2014 not part of the public API.\n */\nexport const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {\n auth: {\n persistSession: true,\n autoRefreshToken: true,\n detectSessionInUrl: false,\n },\n});\n", "/**\n * @fsaos/gateway \u2014 Session Management\n *\n * Manages the auth token lifecycle, reactive scope state, and domain-scoped\n * session initialization.\n *\n * Token flow:\n * 1. Supabase auth fires onAuthStateChange \u2192 we cache the access_token\n * 2. A one-shot Promise (`tokenReady`) gates all gateway calls until the\n * first auth event fires (or a 5 s timeout elapses)\n * 3. initSession() calls GET /d/{hostname}/init to resolve the domain's\n * scope, fractal, and instance metadata\n *\n * Scope flow:\n * 1. useAccounts() fetches memberships \u2192 auto-selects or user picks an account\n * 2. setScope(accountPath) is called \u2192 sets the active scope path\n * 3. `scopeReady` promise resolves \u2192 all gated queries begin executing\n * 4. Scope subscribers are notified \u2192 React hooks re-render with new scope key\n * 5. On account switch, setScope(newPath) fires subscribers again \u2192\n * query keys change \u2192 React Query renders from new namespace (old cache stays warm)\n */\n\nimport { supabase, GATEWAY_URL } from './config';\nimport type { SessionEntry } from './types';\n\n// \u2500\u2500 Token cache \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet cachedToken: string | null = null;\nlet tokenExpiresAt = 0;\n\n/** One-shot gate: resolved after the first auth event (or 5 s timeout). */\nlet tokenReady: Promise<void>;\nlet resolveTokenReady: () => void;\nlet tokenResolved = false;\n\ntokenReady = new Promise<void>((resolve) => {\n resolveTokenReady = resolve;\n});\n\n// Listen for Supabase auth state changes to keep the token fresh.\nsupabase.auth.onAuthStateChange((_event: string, session: any) => {\n if (session?.access_token) {\n cachedToken = session.access_token;\n tokenExpiresAt = session.expires_at ?? Math.floor(Date.now() / 1000) + 3600;\n } else {\n cachedToken = null;\n tokenExpiresAt = 0;\n }\n if (!tokenResolved) {\n tokenResolved = true;\n resolveTokenReady();\n }\n});\n\n// Safety timeout: if no auth event fires within 5 s, unblock callers anyway.\nsetTimeout(() => {\n if (!tokenResolved) {\n tokenResolved = true;\n resolveTokenReady();\n }\n}, 5000);\n\n// \u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Manually set the cached access token.\n * Useful when the token is obtained out-of-band (e.g. embed token injection).\n */\nexport function setCachedToken(token: string, expiresAt?: number): void {\n cachedToken = token;\n tokenExpiresAt = expiresAt ?? Math.floor(Date.now() / 1000) + 3600;\n}\n\n/**\n * Clear the cached access token.\n * Called during sign-out to prevent stale tokens from leaking to the next session.\n */\nexport function clearCachedToken(): void {\n cachedToken = null;\n tokenExpiresAt = 0;\n}\n\n/**\n * Returns the current access token, waiting for the first auth event if needed.\n */\nexport async function getAccessToken(): Promise<string | null> {\n await tokenReady;\n return cachedToken;\n}\n\n// \u2500\u2500 Scope (account-level) \u2014 Reactive \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet currentScopePath: string | null = null;\n\n/**\n * Monotonically increasing version counter for scope changes.\n * Used by React hooks (via useSyncExternalStore) to detect scope transitions.\n */\nlet scopeVersion = 0;\n\n/** Subscriber set for reactive scope updates. */\ntype ScopeListener = () => void;\nconst scopeListeners = new Set<ScopeListener>();\n\n/**\n * One-shot gate: resolved when setScope() is first called.\n * All scope-dependent queries await this before executing.\n * Mirrors the tokenReady pattern.\n */\nlet scopeReady: Promise<void>;\nlet resolveScopeReady: () => void;\nlet scopeResolved = false;\n\nscopeReady = new Promise<void>((resolve) => {\n resolveScopeReady = resolve;\n});\n\n/**\n * Set the active scope path (e.g. after account selection or account switch).\n *\n * Once set, every gatewayCall() automatically injects `_scope_path` into\n * the request params so kernel_auth can validate membership at the correct\n * account scope instead of falling back to the domain root.\n *\n * Setting scope also:\n * - Resolves the `scopeReady` gate (unblocking all scope-dependent queries)\n * - Increments the scope version counter\n * - Notifies all scope subscribers (triggering React hook re-renders)\n *\n * @param scopePath The VFS path of the selected account/scope\n * (e.g. \"/root/accounts/joel-rowland\")\n */\nexport function setScope(scopePath: string): void {\n const changed = currentScopePath !== scopePath;\n currentScopePath = scopePath;\n\n // Resolve the one-shot gate on first scope set\n if (!scopeResolved) {\n scopeResolved = true;\n resolveScopeReady();\n }\n\n // Notify subscribers on any change (including first set)\n if (changed) {\n scopeVersion++;\n scopeListeners.forEach((listener) => {\n try {\n listener();\n } catch (e) {\n console.warn('[SDK] Scope listener error:', e);\n }\n });\n }\n}\n\n/**\n * Returns the currently active scope path, or null if not yet set.\n */\nexport function getScope(): string | null {\n return currentScopePath;\n}\n\n/**\n * Returns the current scope version (monotonically increasing on each scope change).\n * Used by useSyncExternalStore in React hooks.\n */\nexport function getScopeVersion(): number {\n return scopeVersion;\n}\n\n/**\n * Subscribe to scope changes. Returns an unsubscribe function.\n * Compatible with React's useSyncExternalStore pattern.\n */\nexport function subscribeScope(listener: ScopeListener): () => void {\n scopeListeners.add(listener);\n return () => { scopeListeners.delete(listener); };\n}\n\n/**\n * Returns a promise that resolves when scope is first set.\n * Used by gatewayCall to gate scope-dependent requests.\n */\nexport function awaitScopeReady(): Promise<void> {\n return scopeReady;\n}\n\n/**\n * Returns whether scope has been set at least once.\n */\nexport function isScopeReady(): boolean {\n return scopeResolved;\n}\n\n// \u2500\u2500 Session (domain-scoped) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet sessionEntry: SessionEntry | null = null;\nlet sessionPromise: Promise<SessionEntry> | null = null;\n\n/**\n * Initialize the domain-scoped session by calling the gateway's /init endpoint.\n * Returns the cached session if already initialized.\n *\n * The gateway resolves the hostname \u2192 scope mapping and returns metadata about\n * the fractal instance, scope path, and display name.\n */\nexport async function initSession(): Promise<SessionEntry> {\n // Return cached session immediately\n if (sessionEntry) return sessionEntry;\n // Return in-flight promise to deduplicate concurrent calls\n if (sessionPromise) return sessionPromise;\n\n sessionPromise = (async () => {\n const hostname = getHostname();\n const token = await getAccessToken();\n const headers: Record<string, string> = {};\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const response = await fetch(`${GATEWAY_URL}/d/${hostname}/init`, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Session init failed: ${response.status} ${response.statusText}`);\n }\n\n const json = await response.json();\n const entry = json.entry || json;\n\n sessionEntry = {\n scope_id: entry.scope_id,\n scope_path: entry.scope_path,\n instance_path: entry.instance_path || '/root',\n fractal_id: entry.fractal_id || null,\n instance_name: entry.instance_name || null,\n display_name: entry.scope_display_name || entry.display_name || null,\n };\n\n return sessionEntry;\n })();\n\n return sessionPromise;\n}\n\n/**\n * Returns the current session entry, or null if not yet initialized.\n */\nexport function getSessionEntry(): SessionEntry | null {\n return sessionEntry;\n}\n\n/**\n * Clears the cached session, forcing a fresh /init call on next access.\n */\nexport function clearSession(): void {\n sessionEntry = null;\n sessionPromise = null;\n currentScopePath = null;\n}\n\n// \u2500\u2500 Full SDK Reset \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Imported lazily to avoid circular dependencies. Each module provides its\n// own cleanup function; resetAllSdkState orchestrates them all.\n\ntype CleanupFn = () => void;\nconst cleanupRegistry: CleanupFn[] = [];\n\n/**\n * Register a cleanup function to be called during resetAllSdkState().\n * Modules call this at import time to register their own cache-clearing logic.\n */\nexport function registerCleanup(fn: CleanupFn): void {\n cleanupRegistry.push(fn);\n}\n\n/**\n * Reset ALL SDK module-level state.\n *\n * Called by signOut() to ensure no cached identity, session, scope, principal,\n * query data, SSE connections, or realtime channels leak between user sessions.\n *\n * This is the single source of truth for auth cleanup. After this call,\n * the SDK is in the same state as a fresh page load (minus the Supabase\n * onAuthStateChange listener, which will re-populate the token on next sign-in).\n */\nexport function resetAllSdkState(): void {\n // 1. Clear session + scope\n clearSession();\n\n // 2. Clear token cache\n clearCachedToken();\n\n // 3. Reset scope gate so next login must re-establish scope\n scopeResolved = false;\n scopeReady = new Promise<void>((resolve) => {\n resolveScopeReady = resolve;\n });\n scopeVersion++;\n // Notify subscribers that scope has been cleared\n scopeListeners.forEach((listener) => {\n try {\n listener();\n } catch (e) {\n console.warn('[SDK] Scope listener error:', e);\n }\n });\n\n // 4. Run all registered module cleanups (SSE, realtime, principal, query, etc.)\n for (const fn of cleanupRegistry) {\n try {\n fn();\n } catch (e) {\n console.warn('[SDK] Cleanup function failed:', e);\n }\n }\n}\n\n/**\n * Returns the current hostname (used for domain-scoped dispatch).\n * Supports an explicit override via `window.__FSAOS_CONFIG__.hostname`\n * so dev environments (proxied URLs, tunnels) can specify the registered domain.\n */\nexport function getHostname(): string {\n if (typeof window !== 'undefined') {\n const cfg = (window as any).__FSAOS_CONFIG__;\n if (cfg?.hostname) return cfg.hostname;\n return window.location.hostname;\n }\n return 'localhost';\n}\n", "/**\n * @fsaos/gateway \u2014 Gateway Call (RPC Dispatcher)\n *\n * The single function that all VFS operations go through.\n *\n * Protocol:\n * POST https://{gatewayUrl}/d/{hostname}\n * Body: { method: string, params: Record<string, unknown> }\n *\n * The gateway resolves the hostname to a domain scope, authenticates via\n * the Bearer token, and dispatches the method to the appropriate handler.\n *\n * If the domain scope is already known (from initSession), it is injected\n * as `domain_scope_id` into the params automatically.\n *\n * SCOPE GATING:\n * gatewayCall awaits `scopeReady` before sending any request that doesn't\n * already have an explicit `_scope_path`. This prevents race conditions where\n * hooks fire before account selection completes, sending relative paths that\n * the kernel can't resolve.\n *\n * Methods that are inherently scope-independent (list-memberships, auth-related)\n * bypass the scope gate because they're needed BEFORE scope is established.\n */\n\nimport { GATEWAY_URL } from './config';\nimport { EnforcementDeniedError } from './enforcement';\nimport { getAccessToken, getHostname, getSessionEntry, getScope, awaitScopeReady } from './session';\nimport type { GatewayParams, GatewayResponse, EnforcementPayload } from './types';\n\n/**\n * Methods that can execute without scope being set.\n * These are bootstrap/auth methods needed before account selection.\n */\nconst SCOPE_INDEPENDENT_METHODS = new Set([\n 'list-memberships',\n 'init',\n]);\n\n/**\n * Call a gateway method.\n *\n * @param method The RPC method name (e.g. \"read\", \"list\", \"create\", \"update\",\n * \"delete\", \"tree\", \"search\", \"edges\", \"move\", \"link\",\n * \"types-list\", \"member-focus\")\n * @param params Method-specific parameters\n * @returns The raw gateway response\n *\n * @throws {EnforcementDeniedError} When denied by rules, access, or entitlement\n * @throws {Error} On HTTP errors or gateway-level failures\n */\nexport async function gatewayCall(\n method: string,\n params: GatewayParams = {},\n): Promise<GatewayResponse> {\n const hostname = getHostname();\n const url = `${GATEWAY_URL}/d/${hostname}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n const token = await getAccessToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n // Gate scope-dependent calls until scope is established.\n // Scope-independent methods (list-memberships) bypass this gate.\n // Calls that already have an explicit _scope_path also bypass.\n if (!SCOPE_INDEPENDENT_METHODS.has(method) && !params._scope_path) {\n await awaitScopeReady();\n }\n\n // Auto-inject domain_scope_id if the session is initialized and the caller\n // didn't explicitly provide one.\n const enrichedParams: GatewayParams = { ...params };\n const session = getSessionEntry();\n if (!enrichedParams.domain_scope_id && session?.scope_id) {\n enrichedParams.domain_scope_id = session.scope_id;\n }\n\n // Auto-inject _scope_path for scoped auth enforcement.\n // When set (via setScope after account selection), kernel_auth validates\n // the user's membership at this scope instead of falling back to /root.\n const scopePath = getScope();\n if (!enrichedParams._scope_path && scopePath) {\n enrichedParams._scope_path = scopePath;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ method, params: enrichedParams }),\n });\n\n if (!response.ok) {\n throw new Error(`Gateway HTTP error: ${response.status} ${response.statusText}`);\n }\n\n const json: GatewayResponse = await response.json();\n\n if (json.success === false) {\n const err = (json as any).error || '';\n const deniedBy = (json as any).denied_by || (json as any).error_type || '';\n\n if (\n deniedBy === 'rule' ||\n deniedBy === 'access' ||\n deniedBy === 'entitlement' ||\n err === 'RULE_DENIED' ||\n err === 'ACCESS_DENIED' ||\n err === 'PERMISSION_DENIED' ||\n err === 'ENTITLEMENT_REQUIRED'\n ) {\n throw new EnforcementDeniedError(json as unknown as EnforcementPayload);\n }\n\n throw new Error(\n (json as any).message || (json as any).error || `Gateway call ${method} failed`,\n );\n }\n\n return json;\n}\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", "import { Subscribable } from './subscribable'\n\ntype Listener = (focused: boolean) => void\n\ntype SetupFn = (\n setFocused: (focused?: boolean) => void,\n) => (() => void) | undefined\n\nexport class FocusManager extends Subscribable<Listener> {\n #focused?: boolean\n #cleanup?: () => void\n\n #setup: SetupFn\n\n constructor() {\n super()\n this.#setup = (onFocus) => {\n // addEventListener does not exist in React Native, but window does\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof window !== 'undefined' && window.addEventListener) {\n const listener = () => onFocus()\n // Listen to visibilitychange\n window.addEventListener('visibilitychange', listener, false)\n\n return () => {\n // Be sure to unsubscribe if a new handler is set\n window.removeEventListener('visibilitychange', listener)\n }\n }\n return\n }\n }\n\n protected onSubscribe(): void {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup)\n }\n }\n\n protected onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.()\n this.#cleanup = undefined\n }\n }\n\n setEventListener(setup: SetupFn): void {\n this.#setup = setup\n this.#cleanup?.()\n this.#cleanup = setup((focused) => {\n if (typeof focused === 'boolean') {\n this.setFocused(focused)\n } else {\n this.onFocus()\n }\n })\n }\n\n setFocused(focused?: boolean): void {\n const changed = this.#focused !== focused\n if (changed) {\n this.#focused = focused\n this.onFocus()\n }\n }\n\n onFocus(): void {\n const isFocused = this.isFocused()\n this.listeners.forEach((listener) => {\n listener(isFocused)\n })\n }\n\n isFocused(): boolean {\n if (typeof this.#focused === 'boolean') {\n return this.#focused\n }\n\n // document global can be unavailable in react native\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return globalThis.document?.visibilityState !== 'hidden'\n }\n}\n\nexport const focusManager = new FocusManager()\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\ntype SystemTimerId = ReturnType<typeof setTimeout>\n\nexport const defaultTimeoutProvider: TimeoutProvider = {\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) =>\n clearTimeout(timeoutId as SystemTimerId | undefined),\n\n setInterval: (callback, delay) => setInterval(callback, delay),\n clearInterval: (intervalId) =>\n clearInterval(intervalId as SystemTimerId | undefined),\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 the default provider's concrete timer ID, which is\n // infeasible across environments.\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\n/** @deprecated\n * use `environmentManager.isServer()` instead.\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", "import { isServer } from './utils'\n\nexport type IsServerValue = () => boolean\n\n/**\n * Manages environment detection used by TanStack Query internals.\n */\nexport const environmentManager = (() => {\n let isServerFn: IsServerValue = () => isServer\n\n return {\n /**\n * Returns whether the current runtime should be treated as a server environment.\n */\n isServer(): boolean {\n return isServerFn()\n },\n /**\n * Overrides the server check globally.\n */\n setIsServer(isServerValue: IsServerValue): void {\n isServerFn = isServerValue\n },\n }\n})()\n", "/**\n * Thenable types which matches React's types for promises\n *\n * React seemingly uses `.status`, `.value` and `.reason` properties on a promises to optimistically unwrap data from promises\n *\n * @see https://github.com/facebook/react/blob/main/packages/shared/ReactTypes.js#L112-L138\n * @see https://github.com/facebook/react/blob/4f604941569d2e8947ce1460a0b2997e835f37b9/packages/react-debug-tools/src/ReactDebugHooks.js#L224-L227\n */\n\nimport { noop } from './utils'\n\ninterface Fulfilled<T> {\n status: 'fulfilled'\n value: T\n}\ninterface Rejected {\n status: 'rejected'\n reason: unknown\n}\ninterface Pending<T> {\n status: 'pending'\n\n /**\n * Resolve the promise with a value.\n * Will remove the `resolve` and `reject` properties from the promise.\n */\n resolve: (value: T) => void\n /**\n * Reject the promise with a reason.\n * Will remove the `resolve` and `reject` properties from the promise.\n */\n reject: (reason: unknown) => void\n}\n\nexport type FulfilledThenable<T> = Promise<T> & Fulfilled<T>\nexport type RejectedThenable<T> = Promise<T> & Rejected\nexport type PendingThenable<T> = Promise<T> & Pending<T>\n\nexport type Thenable<T> =\n | FulfilledThenable<T>\n | RejectedThenable<T>\n | PendingThenable<T>\n\nexport function pendingThenable<T>(): PendingThenable<T> {\n let resolve: Pending<T>['resolve']\n let reject: Pending<T>['reject']\n // this could use `Promise.withResolvers()` in the future\n const thenable = new Promise((_resolve, _reject) => {\n resolve = _resolve\n reject = _reject\n }) as PendingThenable<T>\n\n thenable.status = 'pending'\n thenable.catch(() => {\n // prevent unhandled rejection errors\n })\n\n function finalize(data: Fulfilled<T> | Rejected) {\n Object.assign(thenable, data)\n\n // clear pending props to avoid calling them twice\n delete (thenable as Partial<PendingThenable<T>>).resolve\n delete (thenable as Partial<PendingThenable<T>>).reject\n }\n\n thenable.resolve = (value) => {\n finalize({\n status: 'fulfilled',\n value,\n })\n\n resolve(value)\n }\n thenable.reject = (reason) => {\n finalize({\n status: 'rejected',\n reason,\n })\n\n reject(reason)\n }\n\n return thenable\n}\n\n/**\n * This function takes a Promise-like input and detects whether the data\n * is synchronously available or not.\n *\n * It does not inspect .status, .value or .reason properties of the promise,\n * as those are not always available, and the .status of React's promises\n * should not be considered part of the public API.\n */\nexport function tryResolveSync(promise: Promise<unknown> | Thenable<unknown>) {\n let data: unknown\n\n promise\n .then((result) => {\n data = result\n return result\n }, noop)\n // .catch can be unavailable on certain kinds of thenable's\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ?.catch(noop)\n\n if (data !== undefined) {\n return { data }\n }\n\n return undefined\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 { Subscribable } from './subscribable'\n\ntype Listener = (online: boolean) => void\ntype SetupFn = (setOnline: Listener) => (() => void) | undefined\n\nexport class OnlineManager extends Subscribable<Listener> {\n #online = true\n #cleanup?: () => void\n\n #setup: SetupFn\n\n constructor() {\n super()\n this.#setup = (onOnline) => {\n // addEventListener does not exist in React Native, but window does\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof window !== 'undefined' && window.addEventListener) {\n const onlineListener = () => onOnline(true)\n const offlineListener = () => onOnline(false)\n // Listen to online\n window.addEventListener('online', onlineListener, false)\n window.addEventListener('offline', offlineListener, false)\n\n return () => {\n // Be sure to unsubscribe if a new handler is set\n window.removeEventListener('online', onlineListener)\n window.removeEventListener('offline', offlineListener)\n }\n }\n\n return\n }\n }\n\n protected onSubscribe(): void {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup)\n }\n }\n\n protected onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.()\n this.#cleanup = undefined\n }\n }\n\n setEventListener(setup: SetupFn): void {\n this.#setup = setup\n this.#cleanup?.()\n this.#cleanup = setup(this.setOnline.bind(this))\n }\n\n setOnline(online: boolean): void {\n const changed = this.#online !== online\n\n if (changed) {\n this.#online = online\n this.listeners.forEach((listener) => {\n listener(online)\n })\n }\n }\n\n isOnline(): boolean {\n return this.#online\n }\n}\n\nexport const onlineManager = new OnlineManager()\n", "import { focusManager } from './focusManager'\nimport { onlineManager } from './onlineManager'\nimport { pendingThenable } from './thenable'\nimport { environmentManager } from './environmentManager'\nimport { sleep } from './utils'\nimport type { Thenable } from './thenable'\nimport type { CancelOptions, DefaultError, NetworkMode } from './types'\n\n// TYPES\n\ninterface RetryerConfig<TData = unknown, TError = DefaultError> {\n fn: () => TData | Promise<TData>\n initialPromise?: Promise<TData>\n onCancel?: (error: TError) => void\n onFail?: (failureCount: number, error: TError) => void\n onPause?: () => void\n onContinue?: () => void\n retry?: RetryValue<TError>\n retryDelay?: RetryDelayValue<TError>\n networkMode: NetworkMode | undefined\n canRun: () => boolean\n}\n\nexport interface Retryer<TData = unknown> {\n promise: Promise<TData>\n cancel: (cancelOptions?: CancelOptions) => void\n continue: () => Promise<unknown>\n cancelRetry: () => void\n continueRetry: () => void\n canStart: () => boolean\n start: () => Promise<TData>\n status: () => 'pending' | 'resolved' | 'rejected'\n}\n\nexport type RetryValue<TError> = boolean | number | ShouldRetryFunction<TError>\n\ntype ShouldRetryFunction<TError = DefaultError> = (\n failureCount: number,\n error: TError,\n) => boolean\n\nexport type RetryDelayValue<TError> = number | RetryDelayFunction<TError>\n\ntype RetryDelayFunction<TError = DefaultError> = (\n failureCount: number,\n error: TError,\n) => number\n\nfunction defaultRetryDelay(failureCount: number) {\n return Math.min(1000 * 2 ** failureCount, 30000)\n}\n\nexport function canFetch(networkMode: NetworkMode | undefined): boolean {\n return (networkMode ?? 'online') === 'online'\n ? onlineManager.isOnline()\n : true\n}\n\nexport class CancelledError extends Error {\n revert?: boolean\n silent?: boolean\n constructor(options?: CancelOptions) {\n super('CancelledError')\n this.revert = options?.revert\n this.silent = options?.silent\n }\n}\n\n/**\n * @deprecated Use instanceof `CancelledError` instead.\n */\nexport function isCancelledError(value: any): value is CancelledError {\n return value instanceof CancelledError\n}\n\nexport function createRetryer<TData = unknown, TError = DefaultError>(\n config: RetryerConfig<TData, TError>,\n): Retryer<TData> {\n let isRetryCancelled = false\n let failureCount = 0\n let continueFn: ((value?: unknown) => void) | undefined\n\n const thenable = pendingThenable<TData>()\n\n const isResolved = () =>\n (thenable.status as Thenable<TData>['status']) !== 'pending'\n\n const cancel = (cancelOptions?: CancelOptions): void => {\n if (!isResolved()) {\n const error = new CancelledError(cancelOptions) as TError\n reject(error)\n\n config.onCancel?.(error)\n }\n }\n const cancelRetry = () => {\n isRetryCancelled = true\n }\n\n const continueRetry = () => {\n isRetryCancelled = false\n }\n\n const canContinue = () =>\n focusManager.isFocused() &&\n (config.networkMode === 'always' || onlineManager.isOnline()) &&\n config.canRun()\n\n const canStart = () => canFetch(config.networkMode) && config.canRun()\n\n const resolve = (value: any) => {\n if (!isResolved()) {\n continueFn?.()\n thenable.resolve(value)\n }\n }\n\n const reject = (value: any) => {\n if (!isResolved()) {\n continueFn?.()\n thenable.reject(value)\n }\n }\n\n const pause = () => {\n return new Promise((continueResolve) => {\n continueFn = (value) => {\n if (isResolved() || canContinue()) {\n continueResolve(value)\n }\n }\n config.onPause?.()\n }).then(() => {\n continueFn = undefined\n if (!isResolved()) {\n config.onContinue?.()\n }\n })\n }\n\n // Create loop function\n const run = () => {\n // Do nothing if already resolved\n if (isResolved()) {\n return\n }\n\n let promiseOrValue: any\n\n // we can re-use config.initialPromise on the first call of run()\n const initialPromise =\n failureCount === 0 ? config.initialPromise : undefined\n\n // Execute query\n try {\n promiseOrValue = initialPromise ?? config.fn()\n } catch (error) {\n promiseOrValue = Promise.reject(error)\n }\n\n Promise.resolve(promiseOrValue)\n .then(resolve)\n .catch((error) => {\n // Stop if the fetch is already resolved\n if (isResolved()) {\n return\n }\n\n // Do we need to retry the request?\n const retry = config.retry ?? (environmentManager.isServer() ? 0 : 3)\n const retryDelay = config.retryDelay ?? defaultRetryDelay\n const delay =\n typeof retryDelay === 'function'\n ? retryDelay(failureCount, error)\n : retryDelay\n const shouldRetry =\n retry === true ||\n (typeof retry === 'number' && failureCount < retry) ||\n (typeof retry === 'function' && retry(failureCount, error))\n\n if (isRetryCancelled || !shouldRetry) {\n // We are done if the query does not need to be retried\n reject(error)\n return\n }\n\n failureCount++\n\n // Notify on fail\n config.onFail?.(failureCount, error)\n\n // Delay\n sleep(delay)\n // Pause if the document is not visible or when the device is offline\n .then(() => {\n return canContinue() ? undefined : pause()\n })\n .then(() => {\n if (isRetryCancelled) {\n reject(error)\n } else {\n run()\n }\n })\n })\n }\n\n return {\n promise: thenable,\n status: () => thenable.status,\n cancel,\n continue: () => {\n continueFn?.()\n return thenable\n },\n cancelRetry,\n continueRetry,\n canStart,\n start: () => {\n // Start loop\n if (canStart()) {\n run()\n } else {\n pause().then(run)\n }\n return thenable\n },\n }\n}\n", "import { timeoutManager } from './timeoutManager'\nimport { environmentManager } from './environmentManager'\nimport { isValidTimeout } from './utils'\nimport type { ManagedTimerId } from './timeoutManager'\n\nexport abstract class Removable {\n gcTime!: number\n #gcTimeout?: ManagedTimerId\n\n destroy(): void {\n this.clearGcTimeout()\n }\n\n protected scheduleGc(): void {\n this.clearGcTimeout()\n\n if (isValidTimeout(this.gcTime)) {\n this.#gcTimeout = timeoutManager.setTimeout(() => {\n this.optionalRemove()\n }, this.gcTime)\n }\n }\n\n protected updateGcTime(newGcTime: number | undefined): void {\n // Default to 5 minutes (Infinity for server-side) if no gcTime is set\n this.gcTime = Math.max(\n this.gcTime || 0,\n newGcTime ?? (environmentManager.isServer() ? Infinity : 5 * 60 * 1000),\n )\n }\n\n protected clearGcTimeout() {\n if (this.#gcTimeout !== undefined) {\n timeoutManager.clearTimeout(this.#gcTimeout)\n this.#gcTimeout = undefined\n }\n }\n\n protected abstract optionalRemove(): void\n}\n", "import {\n ensureQueryFn,\n noop,\n replaceData,\n resolveEnabled,\n resolveStaleTime,\n skipToken,\n timeUntilStale,\n} from './utils'\nimport { notifyManager } from './notifyManager'\nimport { CancelledError, canFetch, createRetryer } from './retryer'\nimport { Removable } from './removable'\nimport type { QueryCache } from './queryCache'\nimport type { QueryClient } from './queryClient'\nimport type {\n CancelOptions,\n DefaultError,\n FetchStatus,\n InitialDataFunction,\n OmitKeyof,\n QueryFunctionContext,\n QueryKey,\n QueryMeta,\n QueryOptions,\n QueryStatus,\n SetDataOptions,\n StaleTime,\n} from './types'\nimport type { QueryObserver } from './queryObserver'\nimport type { Retryer } from './retryer'\n\n// TYPES\n\ninterface QueryConfig<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey = QueryKey,\n> {\n client: QueryClient\n queryKey: TQueryKey\n queryHash: string\n options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n defaultOptions?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n state?: QueryState<TData, TError>\n}\n\nexport interface QueryState<TData = unknown, TError = DefaultError> {\n data: TData | undefined\n dataUpdateCount: number\n dataUpdatedAt: number\n error: TError | null\n errorUpdateCount: number\n errorUpdatedAt: number\n fetchFailureCount: number\n fetchFailureReason: TError | null\n fetchMeta: FetchMeta | null\n isInvalidated: boolean\n status: QueryStatus\n fetchStatus: FetchStatus\n}\n\nexport interface FetchContext<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey = QueryKey,\n> {\n fetchFn: () => unknown | Promise<unknown>\n fetchOptions?: FetchOptions\n signal: AbortSignal\n options: QueryOptions<TQueryFnData, TError, TData, any>\n client: QueryClient\n queryKey: TQueryKey\n state: QueryState<TData, TError>\n}\n\nexport interface QueryBehavior<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> {\n onFetch: (\n context: FetchContext<TQueryFnData, TError, TData, TQueryKey>,\n query: Query,\n ) => void\n}\n\nexport type FetchDirection = 'forward' | 'backward'\n\nexport interface FetchMeta {\n fetchMore?: { direction: FetchDirection }\n}\n\nexport interface FetchOptions<TData = unknown> {\n cancelRefetch?: boolean\n meta?: FetchMeta\n initialPromise?: Promise<TData>\n}\n\ninterface FailedAction<TError> {\n type: 'failed'\n failureCount: number\n error: TError\n}\n\ninterface FetchAction {\n type: 'fetch'\n meta?: FetchMeta\n}\n\ninterface SuccessAction<TData> {\n data: TData | undefined\n type: 'success'\n dataUpdatedAt?: number\n manual?: boolean\n}\n\ninterface ErrorAction<TError> {\n type: 'error'\n error: TError\n}\n\ninterface InvalidateAction {\n type: 'invalidate'\n}\n\ninterface PauseAction {\n type: 'pause'\n}\n\ninterface ContinueAction {\n type: 'continue'\n}\n\ninterface SetStateAction<TData, TError> {\n type: 'setState'\n state: Partial<QueryState<TData, TError>>\n setStateOptions?: SetStateOptions\n}\n\nexport type Action<TData, TError> =\n | ContinueAction\n | ErrorAction<TError>\n | FailedAction<TError>\n | FetchAction\n | InvalidateAction\n | PauseAction\n | SetStateAction<TData, TError>\n | SuccessAction<TData>\n\nexport interface SetStateOptions {\n meta?: any\n}\n\n// CLASS\n\nexport class Query<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> extends Removable {\n queryKey: TQueryKey\n queryHash: string\n options!: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n state: QueryState<TData, TError>\n\n #initialState: QueryState<TData, TError>\n #revertState?: QueryState<TData, TError>\n #cache: QueryCache\n #client: QueryClient\n #retryer?: Retryer<TData>\n observers: Array<QueryObserver<any, any, any, any, any>>\n #defaultOptions?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n #abortSignalConsumed: boolean\n\n constructor(config: QueryConfig<TQueryFnData, TError, TData, TQueryKey>) {\n super()\n\n this.#abortSignalConsumed = false\n this.#defaultOptions = config.defaultOptions\n this.setOptions(config.options)\n this.observers = []\n this.#client = config.client\n this.#cache = this.#client.getQueryCache()\n this.queryKey = config.queryKey\n this.queryHash = config.queryHash\n this.#initialState = getDefaultState(this.options)\n this.state = config.state ?? this.#initialState\n this.scheduleGc()\n }\n get meta(): QueryMeta | undefined {\n return this.options.meta\n }\n\n get promise(): Promise<TData> | undefined {\n return this.#retryer?.promise\n }\n\n setOptions(\n options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n ): void {\n this.options = { ...this.#defaultOptions, ...options }\n\n this.updateGcTime(this.options.gcTime)\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.state && this.state.data === undefined) {\n const defaultState = getDefaultState(this.options)\n if (defaultState.data !== undefined) {\n this.setState(\n successState(defaultState.data, defaultState.dataUpdatedAt),\n )\n this.#initialState = defaultState\n }\n }\n }\n\n protected optionalRemove() {\n if (!this.observers.length && this.state.fetchStatus === 'idle') {\n this.#cache.remove(this)\n }\n }\n\n setData(\n newData: TData,\n options?: SetDataOptions & { manual: boolean },\n ): TData {\n const data = replaceData(this.state.data, newData, this.options)\n\n // Set data and mark it as cached\n this.#dispatch({\n data,\n type: 'success',\n dataUpdatedAt: options?.updatedAt,\n manual: options?.manual,\n })\n\n return data\n }\n\n setState(\n state: Partial<QueryState<TData, TError>>,\n setStateOptions?: SetStateOptions,\n ): void {\n this.#dispatch({ type: 'setState', state, setStateOptions })\n }\n\n cancel(options?: CancelOptions): Promise<void> {\n const promise = this.#retryer?.promise\n this.#retryer?.cancel(options)\n return promise ? promise.then(noop).catch(noop) : Promise.resolve()\n }\n\n destroy(): void {\n super.destroy()\n\n this.cancel({ silent: true })\n }\n\n get resetState(): QueryState<TData, TError> {\n return this.#initialState\n }\n\n reset(): void {\n this.destroy()\n this.setState(this.resetState)\n }\n\n isActive(): boolean {\n return this.observers.some(\n (observer) => resolveEnabled(observer.options.enabled, this) !== false,\n )\n }\n\n isDisabled(): boolean {\n if (this.getObserversCount() > 0) {\n return !this.isActive()\n }\n // if a query has no observers, it should still be considered disabled if it never attempted a fetch\n return this.options.queryFn === skipToken || !this.isFetched()\n }\n\n isFetched() {\n return this.state.dataUpdateCount + this.state.errorUpdateCount > 0\n }\n\n isStatic(): boolean {\n if (this.getObserversCount() > 0) {\n return this.observers.some(\n (observer) =>\n resolveStaleTime(observer.options.staleTime, this) === 'static',\n )\n }\n\n return false\n }\n\n isStale(): boolean {\n // check observers first, their `isStale` has the source of truth\n // calculated with `isStaleByTime` and it takes `enabled` into account\n if (this.getObserversCount() > 0) {\n return this.observers.some(\n (observer) => observer.getCurrentResult().isStale,\n )\n }\n\n return this.state.data === undefined || this.state.isInvalidated\n }\n\n isStaleByTime(staleTime: StaleTime = 0): boolean {\n // no data is always stale\n if (this.state.data === undefined) {\n return true\n }\n // static is never stale\n if (staleTime === 'static') {\n return false\n }\n // if the query is invalidated, it is stale\n if (this.state.isInvalidated) {\n return true\n }\n\n return !timeUntilStale(this.state.dataUpdatedAt, staleTime)\n }\n\n onFocus(): void {\n const observer = this.observers.find((x) => x.shouldFetchOnWindowFocus())\n\n observer?.refetch({ cancelRefetch: false })\n\n // Continue fetch if currently paused\n this.#retryer?.continue()\n }\n\n onOnline(): void {\n const observer = this.observers.find((x) => x.shouldFetchOnReconnect())\n\n observer?.refetch({ cancelRefetch: false })\n\n // Continue fetch if currently paused\n this.#retryer?.continue()\n }\n\n addObserver(observer: QueryObserver<any, any, any, any, any>): void {\n if (!this.observers.includes(observer)) {\n this.observers.push(observer)\n\n // Stop the query from being garbage collected\n this.clearGcTimeout()\n\n this.#cache.notify({ type: 'observerAdded', query: this, observer })\n }\n }\n\n removeObserver(observer: QueryObserver<any, any, any, any, any>): void {\n if (this.observers.includes(observer)) {\n this.observers = this.observers.filter((x) => x !== observer)\n\n if (!this.observers.length) {\n // If the transport layer does not support cancellation\n // we'll let the query continue so the result can be cached\n if (this.#retryer) {\n if (this.#abortSignalConsumed || this.#isInitialPausedFetch()) {\n this.#retryer.cancel({ revert: true })\n } else {\n this.#retryer.cancelRetry()\n }\n }\n\n this.scheduleGc()\n }\n\n this.#cache.notify({ type: 'observerRemoved', query: this, observer })\n }\n }\n\n getObserversCount(): number {\n return this.observers.length\n }\n\n #isInitialPausedFetch(): boolean {\n return (\n this.state.fetchStatus === 'paused' && this.state.status === 'pending'\n )\n }\n\n invalidate(): void {\n if (!this.state.isInvalidated) {\n this.#dispatch({ type: 'invalidate' })\n }\n }\n\n async fetch(\n options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n fetchOptions?: FetchOptions<TQueryFnData>,\n ): Promise<TData> {\n if (\n this.state.fetchStatus !== 'idle' &&\n // If the promise in the retryer is already rejected, we have to definitely\n // re-start the fetch; there is a chance that the query is still in a\n // pending state when that happens\n this.#retryer?.status() !== 'rejected'\n ) {\n if (this.state.data !== undefined && fetchOptions?.cancelRefetch) {\n // Silently cancel current fetch if the user wants to cancel refetch\n this.cancel({ silent: true })\n } else if (this.#retryer) {\n // make sure that retries that were potentially cancelled due to unmounts can continue\n this.#retryer.continueRetry()\n // Return current promise if we are already fetching\n return this.#retryer.promise\n }\n }\n\n // Update config if passed, otherwise the config from the last execution is used\n if (options) {\n this.setOptions(options)\n }\n\n // Use the options from the first observer with a query function if no function is found.\n // This can happen when the query is hydrated or created with setQueryData.\n if (!this.options.queryFn) {\n const observer = this.observers.find((x) => x.options.queryFn)\n if (observer) {\n this.setOptions(observer.options)\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (!Array.isArray(this.options.queryKey)) {\n console.error(\n `As of v4, queryKey needs to be an Array. If you are using a string like 'repoData', please change it to an Array, e.g. ['repoData']`,\n )\n }\n }\n\n const abortController = new AbortController()\n\n // Adds an enumerable signal property to the object that\n // which sets abortSignalConsumed to true when the signal\n // is read.\n const addSignalProperty = (object: unknown) => {\n Object.defineProperty(object, 'signal', {\n enumerable: true,\n get: () => {\n this.#abortSignalConsumed = true\n return abortController.signal\n },\n })\n }\n\n // Create fetch function\n const fetchFn = () => {\n const queryFn = ensureQueryFn(this.options, fetchOptions)\n\n // Create query function context\n const createQueryFnContext = (): QueryFunctionContext<TQueryKey> => {\n const queryFnContext: OmitKeyof<\n QueryFunctionContext<TQueryKey>,\n 'signal'\n > = {\n client: this.#client,\n queryKey: this.queryKey,\n meta: this.meta,\n }\n addSignalProperty(queryFnContext)\n return queryFnContext as QueryFunctionContext<TQueryKey>\n }\n\n const queryFnContext = createQueryFnContext()\n\n this.#abortSignalConsumed = false\n if (this.options.persister) {\n return this.options.persister(\n queryFn,\n queryFnContext,\n this as unknown as Query,\n )\n }\n\n return queryFn(queryFnContext)\n }\n\n // Trigger behavior hook\n const createFetchContext = (): FetchContext<\n TQueryFnData,\n TError,\n TData,\n TQueryKey\n > => {\n const context: OmitKeyof<\n FetchContext<TQueryFnData, TError, TData, TQueryKey>,\n 'signal'\n > = {\n fetchOptions,\n options: this.options,\n queryKey: this.queryKey,\n client: this.#client,\n state: this.state,\n fetchFn,\n }\n\n addSignalProperty(context)\n return context as FetchContext<TQueryFnData, TError, TData, TQueryKey>\n }\n\n const context = createFetchContext()\n\n this.options.behavior?.onFetch(context, this as unknown as Query)\n\n // Store state in case the current fetch needs to be reverted\n this.#revertState = this.state\n\n // Set to fetching state if not already in it\n if (\n this.state.fetchStatus === 'idle' ||\n this.state.fetchMeta !== context.fetchOptions?.meta\n ) {\n this.#dispatch({ type: 'fetch', meta: context.fetchOptions?.meta })\n }\n\n // Try to fetch the data\n this.#retryer = createRetryer({\n initialPromise: fetchOptions?.initialPromise as\n | Promise<TData>\n | undefined,\n fn: context.fetchFn as () => Promise<TData>,\n onCancel: (error) => {\n if (error instanceof CancelledError && error.revert) {\n this.setState({\n ...this.#revertState,\n fetchStatus: 'idle' as const,\n })\n }\n abortController.abort()\n },\n onFail: (failureCount, error) => {\n this.#dispatch({ type: 'failed', failureCount, error })\n },\n onPause: () => {\n this.#dispatch({ type: 'pause' })\n },\n onContinue: () => {\n this.#dispatch({ type: 'continue' })\n },\n retry: context.options.retry,\n retryDelay: context.options.retryDelay,\n networkMode: context.options.networkMode,\n canRun: () => true,\n })\n\n try {\n const data = await this.#retryer.start()\n // this is more of a runtime guard\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (data === undefined) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(\n `Query data cannot be undefined. Please make sure to return a value other than undefined from your query function. Affected query key: ${this.queryHash}`,\n )\n }\n throw new Error(`${this.queryHash} data is undefined`)\n }\n\n this.setData(data)\n\n // Notify cache callback\n this.#cache.config.onSuccess?.(data, this as Query<any, any, any, any>)\n this.#cache.config.onSettled?.(\n data,\n this.state.error as any,\n this as Query<any, any, any, any>,\n )\n return data\n } catch (error) {\n if (error instanceof CancelledError) {\n if (error.silent) {\n // silent cancellation implies a new fetch is going to be started,\n // so we piggyback onto that promise\n return this.#retryer.promise\n } else if (error.revert) {\n // transform error into reverted state data\n // if the initial fetch was cancelled, we have no data, so we have\n // to get reject with a CancelledError\n if (this.state.data === undefined) {\n throw error\n }\n return this.state.data\n }\n }\n this.#dispatch({\n type: 'error',\n error: error as TError,\n })\n\n // Notify cache callback\n this.#cache.config.onError?.(\n error as any,\n this as Query<any, any, any, any>,\n )\n this.#cache.config.onSettled?.(\n this.state.data,\n error as any,\n this as Query<any, any, any, any>,\n )\n\n throw error // rethrow the error for further handling\n } finally {\n // Schedule query gc after fetching\n this.scheduleGc()\n }\n }\n\n #dispatch(action: Action<TData, TError>): void {\n const reducer = (\n state: QueryState<TData, TError>,\n ): QueryState<TData, TError> => {\n switch (action.type) {\n case 'failed':\n return {\n ...state,\n fetchFailureCount: action.failureCount,\n fetchFailureReason: action.error,\n }\n case 'pause':\n return {\n ...state,\n fetchStatus: 'paused',\n }\n case 'continue':\n return {\n ...state,\n fetchStatus: 'fetching',\n }\n case 'fetch':\n return {\n ...state,\n ...fetchState(state.data, this.options),\n fetchMeta: action.meta ?? null,\n }\n case 'success':\n const newState = {\n ...state,\n ...successState(action.data, action.dataUpdatedAt),\n dataUpdateCount: state.dataUpdateCount + 1,\n ...(!action.manual && {\n fetchStatus: 'idle' as const,\n fetchFailureCount: 0,\n fetchFailureReason: null,\n }),\n }\n // If fetching ends successfully, we don't need revertState as a fallback anymore.\n // For manual updates, capture the state to revert to it in case of a cancellation.\n this.#revertState = action.manual ? newState : undefined\n\n return newState\n case 'error':\n const error = action.error\n return {\n ...state,\n error,\n errorUpdateCount: state.errorUpdateCount + 1,\n errorUpdatedAt: Date.now(),\n fetchFailureCount: state.fetchFailureCount + 1,\n fetchFailureReason: error,\n fetchStatus: 'idle',\n status: 'error',\n // flag existing data as invalidated if we get a background error\n // note that \"no data\" always means stale so we can set unconditionally here\n isInvalidated: true,\n }\n case 'invalidate':\n return {\n ...state,\n isInvalidated: true,\n }\n case 'setState':\n return {\n ...state,\n ...action.state,\n }\n }\n }\n\n this.state = reducer(this.state)\n\n notifyManager.batch(() => {\n this.observers.forEach((observer) => {\n observer.onQueryUpdate()\n })\n\n this.#cache.notify({ query: this, type: 'updated', action })\n })\n }\n}\n\nexport function fetchState<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey,\n>(\n data: TData | undefined,\n options: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n) {\n return {\n fetchFailureCount: 0,\n fetchFailureReason: null,\n fetchStatus: canFetch(options.networkMode) ? 'fetching' : 'paused',\n ...(data === undefined &&\n ({\n error: null,\n status: 'pending',\n } as const)),\n } as const\n}\n\nfunction successState<TData>(data: TData | undefined, dataUpdatedAt?: number) {\n return {\n data,\n dataUpdatedAt: dataUpdatedAt ?? Date.now(),\n error: null,\n isInvalidated: false,\n status: 'success' as const,\n }\n}\n\nfunction getDefaultState<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey,\n>(\n options: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n): QueryState<TData, TError> {\n const data =\n typeof options.initialData === 'function'\n ? (options.initialData as InitialDataFunction<TData>)()\n : options.initialData\n\n const hasData = data !== undefined\n\n const initialDataUpdatedAt = hasData\n ? typeof options.initialDataUpdatedAt === 'function'\n ? options.initialDataUpdatedAt()\n : options.initialDataUpdatedAt\n : 0\n\n return {\n data,\n dataUpdateCount: 0,\n dataUpdatedAt: hasData ? (initialDataUpdatedAt ?? Date.now()) : 0,\n error: null,\n errorUpdateCount: 0,\n errorUpdatedAt: 0,\n fetchFailureCount: 0,\n fetchFailureReason: null,\n fetchMeta: null,\n isInvalidated: false,\n status: hasData ? 'success' : 'pending',\n fetchStatus: 'idle',\n }\n}\n", "import { focusManager } from './focusManager'\nimport { environmentManager } from './environmentManager'\nimport { notifyManager } from './notifyManager'\nimport { fetchState } from './query'\nimport { Subscribable } from './subscribable'\nimport { pendingThenable } from './thenable'\nimport {\n isValidTimeout,\n noop,\n replaceData,\n resolveEnabled,\n resolveStaleTime,\n shallowEqualObjects,\n timeUntilStale,\n} from './utils'\nimport { timeoutManager } from './timeoutManager'\nimport type { ManagedTimerId } from './timeoutManager'\nimport type { FetchOptions, Query, QueryState } from './query'\nimport type { QueryClient } from './queryClient'\nimport type { PendingThenable, Thenable } from './thenable'\nimport type {\n DefaultError,\n DefaultedQueryObserverOptions,\n PlaceholderDataFunction,\n QueryKey,\n QueryObserverBaseResult,\n QueryObserverOptions,\n QueryObserverResult,\n RefetchOptions,\n} from './types'\n\ntype QueryObserverListener<TData, TError> = (\n result: QueryObserverResult<TData, TError>,\n) => void\n\ninterface ObserverFetchOptions extends FetchOptions {\n throwOnError?: boolean\n}\n\nexport class QueryObserver<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> extends Subscribable<QueryObserverListener<TData, TError>> {\n #client: QueryClient\n #currentQuery: Query<TQueryFnData, TError, TQueryData, TQueryKey> = undefined!\n #currentQueryInitialState: QueryState<TQueryData, TError> = undefined!\n #currentResult: QueryObserverResult<TData, TError> = undefined!\n #currentResultState?: QueryState<TQueryData, TError>\n #currentResultOptions?: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >\n #currentThenable: Thenable<TData>\n #selectError: TError | null\n #selectFn?: (data: TQueryData) => TData\n #selectResult?: TData\n // This property keeps track of the last query with defined data.\n // It will be used to pass the previous data and query to the placeholder function between renders.\n #lastQueryWithDefinedData?: Query<TQueryFnData, TError, TQueryData, TQueryKey>\n #staleTimeoutId?: ManagedTimerId\n #refetchIntervalId?: ManagedTimerId\n #currentRefetchInterval?: number | false\n #trackedProps = new Set<keyof QueryObserverResult>()\n\n constructor(\n client: QueryClient,\n public options: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ) {\n super()\n\n this.#client = client\n this.#selectError = null\n this.#currentThenable = pendingThenable()\n\n this.bindMethods()\n this.setOptions(options)\n }\n\n protected bindMethods(): void {\n this.refetch = this.refetch.bind(this)\n }\n\n protected onSubscribe(): void {\n if (this.listeners.size === 1) {\n this.#currentQuery.addObserver(this)\n\n if (shouldFetchOnMount(this.#currentQuery, this.options)) {\n this.#executeFetch()\n } else {\n this.updateResult()\n }\n\n this.#updateTimers()\n }\n }\n\n protected onUnsubscribe(): void {\n if (!this.hasListeners()) {\n this.destroy()\n }\n }\n\n shouldFetchOnReconnect(): boolean {\n return shouldFetchOn(\n this.#currentQuery,\n this.options,\n this.options.refetchOnReconnect,\n )\n }\n\n shouldFetchOnWindowFocus(): boolean {\n return shouldFetchOn(\n this.#currentQuery,\n this.options,\n this.options.refetchOnWindowFocus,\n )\n }\n\n destroy(): void {\n this.listeners = new Set()\n this.#clearStaleTimeout()\n this.#clearRefetchInterval()\n this.#currentQuery.removeObserver(this)\n }\n\n setOptions(\n options: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ): void {\n const prevOptions = this.options\n const prevQuery = this.#currentQuery\n\n this.options = this.#client.defaultQueryOptions(options)\n\n if (\n this.options.enabled !== undefined &&\n typeof this.options.enabled !== 'boolean' &&\n typeof this.options.enabled !== 'function' &&\n typeof resolveEnabled(this.options.enabled, this.#currentQuery) !==\n 'boolean'\n ) {\n throw new Error(\n 'Expected enabled to be a boolean or a callback that returns a boolean',\n )\n }\n\n this.#updateQuery()\n this.#currentQuery.setOptions(this.options)\n\n if (\n prevOptions._defaulted &&\n !shallowEqualObjects(this.options, prevOptions)\n ) {\n this.#client.getQueryCache().notify({\n type: 'observerOptionsUpdated',\n query: this.#currentQuery,\n observer: this,\n })\n }\n\n const mounted = this.hasListeners()\n\n // Fetch if there are subscribers\n if (\n mounted &&\n shouldFetchOptionally(\n this.#currentQuery,\n prevQuery,\n this.options,\n prevOptions,\n )\n ) {\n this.#executeFetch()\n }\n\n // Update result\n this.updateResult()\n\n // Update stale interval if needed\n if (\n mounted &&\n (this.#currentQuery !== prevQuery ||\n resolveEnabled(this.options.enabled, this.#currentQuery) !==\n resolveEnabled(prevOptions.enabled, this.#currentQuery) ||\n resolveStaleTime(this.options.staleTime, this.#currentQuery) !==\n resolveStaleTime(prevOptions.staleTime, this.#currentQuery))\n ) {\n this.#updateStaleTimeout()\n }\n\n const nextRefetchInterval = this.#computeRefetchInterval()\n\n // Update refetch interval if needed\n if (\n mounted &&\n (this.#currentQuery !== prevQuery ||\n resolveEnabled(this.options.enabled, this.#currentQuery) !==\n resolveEnabled(prevOptions.enabled, this.#currentQuery) ||\n nextRefetchInterval !== this.#currentRefetchInterval)\n ) {\n this.#updateRefetchInterval(nextRefetchInterval)\n }\n }\n\n getOptimisticResult(\n options: DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ): QueryObserverResult<TData, TError> {\n const query = this.#client.getQueryCache().build(this.#client, options)\n\n const result = this.createResult(query, options)\n\n if (shouldAssignObserverCurrentProperties(this, result)) {\n // this assigns the optimistic result to the current Observer\n // because if the query function changes, useQuery will be performing\n // an effect where it would fetch again.\n // When the fetch finishes, we perform a deep data cloning in order\n // to reuse objects references. This deep data clone is performed against\n // the `observer.currentResult.data` property\n // When QueryKey changes, we refresh the query and get new `optimistic`\n // result, while we leave the `observer.currentResult`, so when new data\n // arrives, it finds the old `observer.currentResult` which is related\n // to the old QueryKey. Which means that currentResult and selectData are\n // out of sync already.\n // To solve this, we move the cursor of the currentResult every time\n // an observer reads an optimistic value.\n\n // When keeping the previous data, the result doesn't change until new\n // data arrives.\n this.#currentResult = result\n this.#currentResultOptions = this.options\n this.#currentResultState = this.#currentQuery.state\n }\n return result\n }\n\n getCurrentResult(): QueryObserverResult<TData, TError> {\n return this.#currentResult\n }\n\n trackResult(\n result: QueryObserverResult<TData, TError>,\n onPropTracked?: (key: keyof QueryObserverResult) => void,\n ): QueryObserverResult<TData, TError> {\n return new Proxy(result, {\n get: (target, key) => {\n this.trackProp(key as keyof QueryObserverResult)\n onPropTracked?.(key as keyof QueryObserverResult)\n if (key === 'promise') {\n this.trackProp('data')\n if (\n !this.options.experimental_prefetchInRender &&\n this.#currentThenable.status === 'pending'\n ) {\n this.#currentThenable.reject(\n new Error(\n 'experimental_prefetchInRender feature flag is not enabled',\n ),\n )\n }\n }\n return Reflect.get(target, key)\n },\n })\n }\n\n trackProp(key: keyof QueryObserverResult) {\n this.#trackedProps.add(key)\n }\n\n getCurrentQuery(): Query<TQueryFnData, TError, TQueryData, TQueryKey> {\n return this.#currentQuery\n }\n\n refetch({ ...options }: RefetchOptions = {}): Promise<\n QueryObserverResult<TData, TError>\n > {\n return this.fetch({\n ...options,\n })\n }\n\n fetchOptimistic(\n options: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ): Promise<QueryObserverResult<TData, TError>> {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n\n const query = this.#client\n .getQueryCache()\n .build(this.#client, defaultedOptions)\n\n return query.fetch().then(() => this.createResult(query, defaultedOptions))\n }\n\n protected fetch(\n fetchOptions: ObserverFetchOptions,\n ): Promise<QueryObserverResult<TData, TError>> {\n return this.#executeFetch({\n ...fetchOptions,\n cancelRefetch: fetchOptions.cancelRefetch ?? true,\n }).then(() => {\n this.updateResult()\n return this.#currentResult\n })\n }\n\n #executeFetch(\n fetchOptions?: Omit<ObserverFetchOptions, 'initialPromise'>,\n ): Promise<TQueryData | undefined> {\n // Make sure we reference the latest query as the current one might have been removed\n this.#updateQuery()\n\n // Fetch\n let promise: Promise<TQueryData | undefined> = this.#currentQuery.fetch(\n this.options,\n fetchOptions,\n )\n\n if (!fetchOptions?.throwOnError) {\n promise = promise.catch(noop)\n }\n\n return promise\n }\n\n #updateStaleTimeout(): void {\n this.#clearStaleTimeout()\n const staleTime = resolveStaleTime(\n this.options.staleTime,\n this.#currentQuery,\n )\n\n if (\n environmentManager.isServer() ||\n this.#currentResult.isStale ||\n !isValidTimeout(staleTime)\n ) {\n return\n }\n\n const time = timeUntilStale(this.#currentResult.dataUpdatedAt, staleTime)\n\n // The timeout is sometimes triggered 1 ms before the stale time expiration.\n // To mitigate this issue we always add 1 ms to the timeout.\n const timeout = time + 1\n\n this.#staleTimeoutId = timeoutManager.setTimeout(() => {\n if (!this.#currentResult.isStale) {\n this.updateResult()\n }\n }, timeout)\n }\n\n #computeRefetchInterval() {\n return (\n (typeof this.options.refetchInterval === 'function'\n ? this.options.refetchInterval(this.#currentQuery)\n : this.options.refetchInterval) ?? false\n )\n }\n\n #updateRefetchInterval(nextInterval: number | false): void {\n this.#clearRefetchInterval()\n\n this.#currentRefetchInterval = nextInterval\n\n if (\n environmentManager.isServer() ||\n resolveEnabled(this.options.enabled, this.#currentQuery) === false ||\n !isValidTimeout(this.#currentRefetchInterval) ||\n this.#currentRefetchInterval === 0\n ) {\n return\n }\n\n this.#refetchIntervalId = timeoutManager.setInterval(() => {\n if (\n this.options.refetchIntervalInBackground ||\n focusManager.isFocused()\n ) {\n this.#executeFetch()\n }\n }, this.#currentRefetchInterval)\n }\n\n #updateTimers(): void {\n this.#updateStaleTimeout()\n this.#updateRefetchInterval(this.#computeRefetchInterval())\n }\n\n #clearStaleTimeout(): void {\n if (this.#staleTimeoutId !== undefined) {\n timeoutManager.clearTimeout(this.#staleTimeoutId)\n this.#staleTimeoutId = undefined\n }\n }\n\n #clearRefetchInterval(): void {\n if (this.#refetchIntervalId !== undefined) {\n timeoutManager.clearInterval(this.#refetchIntervalId)\n this.#refetchIntervalId = undefined\n }\n }\n\n protected createResult(\n query: Query<TQueryFnData, TError, TQueryData, TQueryKey>,\n options: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ): QueryObserverResult<TData, TError> {\n const prevQuery = this.#currentQuery\n const prevOptions = this.options\n const prevResult = this.#currentResult as\n | QueryObserverResult<TData, TError>\n | undefined\n const prevResultState = this.#currentResultState\n const prevResultOptions = this.#currentResultOptions\n const queryChange = query !== prevQuery\n const queryInitialState = queryChange\n ? query.state\n : this.#currentQueryInitialState\n\n const { state } = query\n let newState = { ...state }\n let isPlaceholderData = false\n let data: TData | undefined\n\n // Optimistically set result in fetching state if needed\n if (options._optimisticResults) {\n const mounted = this.hasListeners()\n\n const fetchOnMount = !mounted && shouldFetchOnMount(query, options)\n\n const fetchOptionally =\n mounted && shouldFetchOptionally(query, prevQuery, options, prevOptions)\n\n if (fetchOnMount || fetchOptionally) {\n newState = {\n ...newState,\n ...fetchState(state.data, query.options),\n }\n }\n if (options._optimisticResults === 'isRestoring') {\n newState.fetchStatus = 'idle'\n }\n }\n\n let { error, errorUpdatedAt, status } = newState\n\n // Per default, use query data\n data = newState.data as unknown as TData\n let skipSelect = false\n\n // use placeholderData if needed\n if (\n options.placeholderData !== undefined &&\n data === undefined &&\n status === 'pending'\n ) {\n let placeholderData\n\n // Memoize placeholder data\n if (\n prevResult?.isPlaceholderData &&\n options.placeholderData === prevResultOptions?.placeholderData\n ) {\n placeholderData = prevResult.data\n // we have to skip select when reading this memoization\n // because prevResult.data is already \"selected\"\n skipSelect = true\n } else {\n // compute placeholderData\n placeholderData =\n typeof options.placeholderData === 'function'\n ? (\n options.placeholderData as unknown as PlaceholderDataFunction<TQueryData>\n )(\n this.#lastQueryWithDefinedData?.state.data,\n this.#lastQueryWithDefinedData as any,\n )\n : options.placeholderData\n }\n\n if (placeholderData !== undefined) {\n status = 'success'\n data = replaceData(\n prevResult?.data,\n placeholderData as unknown,\n options,\n ) as TData\n isPlaceholderData = true\n }\n }\n\n // Select data if needed\n // this also runs placeholderData through the select function\n if (options.select && data !== undefined && !skipSelect) {\n // Memoize select result\n if (\n prevResult &&\n data === prevResultState?.data &&\n options.select === this.#selectFn\n ) {\n data = this.#selectResult\n } else {\n try {\n this.#selectFn = options.select\n data = options.select(data as any)\n data = replaceData(prevResult?.data, data, options)\n this.#selectResult = data\n this.#selectError = null\n } catch (selectError) {\n this.#selectError = selectError as TError\n }\n }\n }\n\n if (this.#selectError) {\n error = this.#selectError\n data = this.#selectResult\n errorUpdatedAt = Date.now()\n status = 'error'\n }\n\n const isFetching = newState.fetchStatus === 'fetching'\n const isPending = status === 'pending'\n const isError = status === 'error'\n\n const isLoading = isPending && isFetching\n const hasData = data !== undefined\n\n const result: QueryObserverBaseResult<TData, TError> = {\n status,\n fetchStatus: newState.fetchStatus,\n isPending,\n isSuccess: status === 'success',\n isError,\n isInitialLoading: isLoading,\n isLoading,\n data,\n dataUpdatedAt: newState.dataUpdatedAt,\n error,\n errorUpdatedAt,\n failureCount: newState.fetchFailureCount,\n failureReason: newState.fetchFailureReason,\n errorUpdateCount: newState.errorUpdateCount,\n isFetched: query.isFetched(),\n isFetchedAfterMount:\n newState.dataUpdateCount > queryInitialState.dataUpdateCount ||\n newState.errorUpdateCount > queryInitialState.errorUpdateCount,\n isFetching,\n isRefetching: isFetching && !isPending,\n isLoadingError: isError && !hasData,\n isPaused: newState.fetchStatus === 'paused',\n isPlaceholderData,\n isRefetchError: isError && hasData,\n isStale: isStale(query, options),\n refetch: this.refetch,\n promise: this.#currentThenable,\n isEnabled: resolveEnabled(options.enabled, query) !== false,\n }\n\n const nextResult = result as QueryObserverResult<TData, TError>\n\n if (this.options.experimental_prefetchInRender) {\n const hasResultData = nextResult.data !== undefined\n const isErrorWithoutData = nextResult.status === 'error' && !hasResultData\n const finalizeThenableIfPossible = (thenable: PendingThenable<TData>) => {\n if (isErrorWithoutData) {\n thenable.reject(nextResult.error)\n } else if (hasResultData) {\n thenable.resolve(nextResult.data as TData)\n }\n }\n\n /**\n * Create a new thenable and result promise when the results have changed\n */\n const recreateThenable = () => {\n const pending =\n (this.#currentThenable =\n nextResult.promise =\n pendingThenable())\n\n finalizeThenableIfPossible(pending)\n }\n\n const prevThenable = this.#currentThenable\n switch (prevThenable.status) {\n case 'pending':\n // Finalize the previous thenable if it was pending\n // and we are still observing the same query\n if (query.queryHash === prevQuery.queryHash) {\n finalizeThenableIfPossible(prevThenable)\n }\n break\n case 'fulfilled':\n if (isErrorWithoutData || nextResult.data !== prevThenable.value) {\n recreateThenable()\n }\n break\n case 'rejected':\n if (!isErrorWithoutData || nextResult.error !== prevThenable.reason) {\n recreateThenable()\n }\n break\n }\n }\n\n return nextResult\n }\n\n updateResult(): void {\n const prevResult = this.#currentResult as\n | QueryObserverResult<TData, TError>\n | undefined\n\n const nextResult = this.createResult(this.#currentQuery, this.options)\n\n this.#currentResultState = this.#currentQuery.state\n this.#currentResultOptions = this.options\n\n if (this.#currentResultState.data !== undefined) {\n this.#lastQueryWithDefinedData = this.#currentQuery\n }\n\n // Only notify and update result if something has changed\n if (shallowEqualObjects(nextResult, prevResult)) {\n return\n }\n\n this.#currentResult = nextResult\n\n const shouldNotifyListeners = (): boolean => {\n if (!prevResult) {\n return true\n }\n\n const { notifyOnChangeProps } = this.options\n const notifyOnChangePropsValue =\n typeof notifyOnChangeProps === 'function'\n ? notifyOnChangeProps()\n : notifyOnChangeProps\n\n if (\n notifyOnChangePropsValue === 'all' ||\n (!notifyOnChangePropsValue && !this.#trackedProps.size)\n ) {\n return true\n }\n\n const includedProps = new Set(\n notifyOnChangePropsValue ?? this.#trackedProps,\n )\n\n if (this.options.throwOnError) {\n includedProps.add('error')\n }\n\n return Object.keys(this.#currentResult).some((key) => {\n const typedKey = key as keyof QueryObserverResult\n const changed = this.#currentResult[typedKey] !== prevResult[typedKey]\n\n return changed && includedProps.has(typedKey)\n })\n }\n\n this.#notify({ listeners: shouldNotifyListeners() })\n }\n\n #updateQuery(): void {\n const query = this.#client.getQueryCache().build(this.#client, this.options)\n\n if (query === this.#currentQuery) {\n return\n }\n\n const prevQuery = this.#currentQuery as\n | Query<TQueryFnData, TError, TQueryData, TQueryKey>\n | undefined\n this.#currentQuery = query\n this.#currentQueryInitialState = query.state\n\n if (this.hasListeners()) {\n prevQuery?.removeObserver(this)\n query.addObserver(this)\n }\n }\n\n onQueryUpdate(): void {\n this.updateResult()\n\n if (this.hasListeners()) {\n this.#updateTimers()\n }\n }\n\n #notify(notifyOptions: { listeners: boolean }): void {\n notifyManager.batch(() => {\n // First, trigger the listeners\n if (notifyOptions.listeners) {\n this.listeners.forEach((listener) => {\n listener(this.#currentResult)\n })\n }\n\n // Then the cache listeners\n this.#client.getQueryCache().notify({\n query: this.#currentQuery,\n type: 'observerResultsUpdated',\n })\n })\n }\n}\n\nfunction shouldLoadOnMount(\n query: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any>,\n): boolean {\n return (\n resolveEnabled(options.enabled, query) !== false &&\n query.state.data === undefined &&\n !(query.state.status === 'error' && options.retryOnMount === false)\n )\n}\n\nfunction shouldFetchOnMount(\n query: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any, any>,\n): boolean {\n return (\n shouldLoadOnMount(query, options) ||\n (query.state.data !== undefined &&\n shouldFetchOn(query, options, options.refetchOnMount))\n )\n}\n\nfunction shouldFetchOn(\n query: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any, any>,\n field: (typeof options)['refetchOnMount'] &\n (typeof options)['refetchOnWindowFocus'] &\n (typeof options)['refetchOnReconnect'],\n) {\n if (\n resolveEnabled(options.enabled, query) !== false &&\n resolveStaleTime(options.staleTime, query) !== 'static'\n ) {\n const value = typeof field === 'function' ? field(query) : field\n\n return value === 'always' || (value !== false && isStale(query, options))\n }\n return false\n}\n\nfunction shouldFetchOptionally(\n query: Query<any, any, any, any>,\n prevQuery: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any, any>,\n prevOptions: QueryObserverOptions<any, any, any, any, any>,\n): boolean {\n return (\n (query !== prevQuery ||\n resolveEnabled(prevOptions.enabled, query) === false) &&\n (!options.suspense || query.state.status !== 'error') &&\n isStale(query, options)\n )\n}\n\nfunction isStale(\n query: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any, any>,\n): boolean {\n return (\n resolveEnabled(options.enabled, query) !== false &&\n query.isStaleByTime(resolveStaleTime(options.staleTime, query))\n )\n}\n\n// this function would decide if we will update the observer's 'current'\n// properties after an optimistic reading via getOptimisticResult\nfunction shouldAssignObserverCurrentProperties<\n TQueryFnData = unknown,\n TError = unknown,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n observer: QueryObserver<TQueryFnData, TError, TData, TQueryData, TQueryKey>,\n optimisticResult: QueryObserverResult<TData, TError>,\n) {\n // if the newly created result isn't what the observer is holding as current,\n // then we'll need to update the properties as well\n if (!shallowEqualObjects(observer.getCurrentResult(), optimisticResult)) {\n return true\n }\n\n // basically, just keep previous properties if nothing changed\n return false\n}\n", "import {\n addConsumeAwareSignal,\n addToEnd,\n addToStart,\n ensureQueryFn,\n} from './utils'\nimport type { QueryBehavior } from './query'\nimport type {\n InfiniteData,\n InfiniteQueryPageParamsOptions,\n OmitKeyof,\n QueryFunctionContext,\n QueryKey,\n} from './types'\n\nexport function infiniteQueryBehavior<TQueryFnData, TError, TData, TPageParam>(\n pages?: number,\n): QueryBehavior<TQueryFnData, TError, InfiniteData<TData, TPageParam>> {\n return {\n onFetch: (context, query) => {\n const options = context.options as InfiniteQueryPageParamsOptions<TData>\n const direction = context.fetchOptions?.meta?.fetchMore?.direction\n const oldPages = context.state.data?.pages || []\n const oldPageParams = context.state.data?.pageParams || []\n let result: InfiniteData<unknown> = { pages: [], pageParams: [] }\n let currentPage = 0\n\n const fetchFn = async () => {\n let cancelled = false\n const addSignalProperty = (object: unknown) => {\n addConsumeAwareSignal(\n object,\n () => context.signal,\n () => (cancelled = true),\n )\n }\n\n const queryFn = ensureQueryFn(context.options, context.fetchOptions)\n\n // Create function to fetch a page\n const fetchPage = async (\n data: InfiniteData<unknown>,\n param: unknown,\n previous?: boolean,\n ): Promise<InfiniteData<unknown>> => {\n if (cancelled) {\n return Promise.reject()\n }\n\n if (param == null && data.pages.length) {\n return Promise.resolve(data)\n }\n\n const createQueryFnContext = () => {\n const queryFnContext: OmitKeyof<\n QueryFunctionContext<QueryKey, unknown>,\n 'signal'\n > = {\n client: context.client,\n queryKey: context.queryKey,\n pageParam: param,\n direction: previous ? 'backward' : 'forward',\n meta: context.options.meta,\n }\n addSignalProperty(queryFnContext)\n return queryFnContext as QueryFunctionContext<QueryKey, unknown>\n }\n\n const queryFnContext = createQueryFnContext()\n\n const page = await queryFn(queryFnContext)\n\n const { maxPages } = context.options\n const addTo = previous ? addToStart : addToEnd\n\n return {\n pages: addTo(data.pages, page, maxPages),\n pageParams: addTo(data.pageParams, param, maxPages),\n }\n }\n\n // fetch next / previous page?\n if (direction && oldPages.length) {\n const previous = direction === 'backward'\n const pageParamFn = previous ? getPreviousPageParam : getNextPageParam\n const oldData = {\n pages: oldPages,\n pageParams: oldPageParams,\n }\n const param = pageParamFn(options, oldData)\n\n result = await fetchPage(oldData, param, previous)\n } else {\n const remainingPages = pages ?? oldPages.length\n\n // Fetch all pages\n do {\n const param =\n currentPage === 0\n ? (oldPageParams[0] ?? options.initialPageParam)\n : getNextPageParam(options, result)\n if (currentPage > 0 && param == null) {\n break\n }\n result = await fetchPage(result, param)\n currentPage++\n } while (currentPage < remainingPages)\n }\n\n return result\n }\n if (context.options.persister) {\n context.fetchFn = () => {\n return context.options.persister?.(\n fetchFn as any,\n {\n client: context.client,\n queryKey: context.queryKey,\n meta: context.options.meta,\n signal: context.signal,\n },\n query,\n )\n }\n } else {\n context.fetchFn = fetchFn\n }\n },\n }\n}\n\nfunction getNextPageParam(\n options: InfiniteQueryPageParamsOptions<any>,\n { pages, pageParams }: InfiniteData<unknown>,\n): unknown | undefined {\n const lastIndex = pages.length - 1\n return pages.length > 0\n ? options.getNextPageParam(\n pages[lastIndex],\n pages,\n pageParams[lastIndex],\n pageParams,\n )\n : undefined\n}\n\nfunction getPreviousPageParam(\n options: InfiniteQueryPageParamsOptions<any>,\n { pages, pageParams }: InfiniteData<unknown>,\n): unknown | undefined {\n return pages.length > 0\n ? options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams)\n : undefined\n}\n\n/**\n * Checks if there is a next page.\n */\nexport function hasNextPage(\n options: InfiniteQueryPageParamsOptions<any, any>,\n data?: InfiniteData<unknown>,\n): boolean {\n if (!data) return false\n return getNextPageParam(options, data) != null\n}\n\n/**\n * Checks if there is a previous page.\n */\nexport function hasPreviousPage(\n options: InfiniteQueryPageParamsOptions<any, any>,\n data?: InfiniteData<unknown>,\n): boolean {\n if (!data || !options.getPreviousPageParam) return false\n return getPreviousPageParam(options, data) != null\n}\n", "import { QueryObserver } from './queryObserver'\nimport {\n hasNextPage,\n hasPreviousPage,\n infiniteQueryBehavior,\n} from './infiniteQueryBehavior'\nimport type { Subscribable } from './subscribable'\nimport type {\n DefaultError,\n DefaultedInfiniteQueryObserverOptions,\n FetchNextPageOptions,\n FetchPreviousPageOptions,\n InfiniteData,\n InfiniteQueryObserverBaseResult,\n InfiniteQueryObserverOptions,\n InfiniteQueryObserverResult,\n QueryKey,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { Query } from './query'\n\ntype InfiniteQueryObserverListener<TData, TError> = (\n result: InfiniteQueryObserverResult<TData, TError>,\n) => void\n\nexport class InfiniteQueryObserver<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = InfiniteData<TQueryFnData>,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = unknown,\n> extends QueryObserver<\n TQueryFnData,\n TError,\n TData,\n InfiniteData<TQueryFnData, TPageParam>,\n TQueryKey\n> {\n // Type override\n subscribe!: Subscribable<\n InfiniteQueryObserverListener<TData, TError>\n >['subscribe']\n\n // Type override\n getCurrentResult!: ReplaceReturnType<\n QueryObserver<\n TQueryFnData,\n TError,\n TData,\n InfiniteData<TQueryFnData, TPageParam>,\n TQueryKey\n >['getCurrentResult'],\n InfiniteQueryObserverResult<TData, TError>\n >\n\n // Type override\n protected fetch!: ReplaceReturnType<\n QueryObserver<\n TQueryFnData,\n TError,\n TData,\n InfiniteData<TQueryFnData, TPageParam>,\n TQueryKey\n >['fetch'],\n Promise<InfiniteQueryObserverResult<TData, TError>>\n >\n\n constructor(\n client: QueryClient,\n options: InfiniteQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n ) {\n super(client, options)\n }\n\n protected bindMethods(): void {\n super.bindMethods()\n this.fetchNextPage = this.fetchNextPage.bind(this)\n this.fetchPreviousPage = this.fetchPreviousPage.bind(this)\n }\n\n setOptions(\n options: InfiniteQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n ): void {\n super.setOptions({\n ...options,\n behavior: infiniteQueryBehavior(),\n })\n }\n\n getOptimisticResult(\n options: DefaultedInfiniteQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n ): InfiniteQueryObserverResult<TData, TError> {\n options.behavior = infiniteQueryBehavior()\n return super.getOptimisticResult(options) as InfiniteQueryObserverResult<\n TData,\n TError\n >\n }\n\n fetchNextPage(\n options?: FetchNextPageOptions,\n ): Promise<InfiniteQueryObserverResult<TData, TError>> {\n return this.fetch({\n ...options,\n meta: {\n fetchMore: { direction: 'forward' },\n },\n })\n }\n\n fetchPreviousPage(\n options?: FetchPreviousPageOptions,\n ): Promise<InfiniteQueryObserverResult<TData, TError>> {\n return this.fetch({\n ...options,\n meta: {\n fetchMore: { direction: 'backward' },\n },\n })\n }\n\n protected createResult(\n query: Query<\n TQueryFnData,\n TError,\n InfiniteData<TQueryFnData, TPageParam>,\n TQueryKey\n >,\n options: InfiniteQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n ): InfiniteQueryObserverResult<TData, TError> {\n const { state } = query\n const parentResult = super.createResult(query, options)\n\n const { isFetching, isRefetching, isError, isRefetchError } = parentResult\n const fetchDirection = state.fetchMeta?.fetchMore?.direction\n\n const isFetchNextPageError = isError && fetchDirection === 'forward'\n const isFetchingNextPage = isFetching && fetchDirection === 'forward'\n\n const isFetchPreviousPageError = isError && fetchDirection === 'backward'\n const isFetchingPreviousPage = isFetching && fetchDirection === 'backward'\n\n const result: InfiniteQueryObserverBaseResult<TData, TError> = {\n ...parentResult,\n fetchNextPage: this.fetchNextPage,\n fetchPreviousPage: this.fetchPreviousPage,\n hasNextPage: hasNextPage(options, state.data),\n hasPreviousPage: hasPreviousPage(options, state.data),\n isFetchNextPageError,\n isFetchingNextPage,\n isFetchPreviousPageError,\n isFetchingPreviousPage,\n isRefetchError:\n isRefetchError && !isFetchNextPageError && !isFetchPreviousPageError,\n isRefetching:\n isRefetching && !isFetchingNextPage && !isFetchingPreviousPage,\n }\n\n return result as InfiniteQueryObserverResult<TData, TError>\n }\n}\n\ntype ReplaceReturnType<\n TFunction extends (...args: Array<any>) => unknown,\n TReturn,\n> = (...args: Parameters<TFunction>) => TReturn\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 { notifyManager } from './notifyManager'\nimport { Mutation } from './mutation'\nimport { matchMutation, noop } from './utils'\nimport { Subscribable } from './subscribable'\nimport type { MutationObserver } from './mutationObserver'\nimport type {\n DefaultError,\n MutationFunctionContext,\n MutationOptions,\n NotifyEvent,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { Action, MutationState } from './mutation'\nimport type { MutationFilters } from './utils'\n\n// TYPES\n\ninterface MutationCacheConfig {\n onError?: (\n error: DefaultError,\n variables: unknown,\n onMutateResult: unknown,\n mutation: Mutation<unknown, unknown, unknown>,\n context: MutationFunctionContext,\n ) => Promise<unknown> | unknown\n onSuccess?: (\n data: unknown,\n variables: unknown,\n onMutateResult: unknown,\n mutation: Mutation<unknown, unknown, unknown>,\n context: MutationFunctionContext,\n ) => Promise<unknown> | unknown\n onMutate?: (\n variables: unknown,\n mutation: Mutation<unknown, unknown, unknown>,\n context: MutationFunctionContext,\n ) => Promise<unknown> | unknown\n onSettled?: (\n data: unknown | undefined,\n error: DefaultError | null,\n variables: unknown,\n onMutateResult: unknown,\n mutation: Mutation<unknown, unknown, unknown>,\n context: MutationFunctionContext,\n ) => Promise<unknown> | unknown\n}\n\ninterface NotifyEventMutationAdded extends NotifyEvent {\n type: 'added'\n mutation: Mutation<any, any, any, any>\n}\ninterface NotifyEventMutationRemoved extends NotifyEvent {\n type: 'removed'\n mutation: Mutation<any, any, any, any>\n}\n\ninterface NotifyEventMutationObserverAdded extends NotifyEvent {\n type: 'observerAdded'\n mutation: Mutation<any, any, any, any>\n observer: MutationObserver<any, any, any>\n}\n\ninterface NotifyEventMutationObserverRemoved extends NotifyEvent {\n type: 'observerRemoved'\n mutation: Mutation<any, any, any, any>\n observer: MutationObserver<any, any, any>\n}\n\ninterface NotifyEventMutationObserverOptionsUpdated extends NotifyEvent {\n type: 'observerOptionsUpdated'\n mutation?: Mutation<any, any, any, any>\n observer: MutationObserver<any, any, any, any>\n}\n\ninterface NotifyEventMutationUpdated extends NotifyEvent {\n type: 'updated'\n mutation: Mutation<any, any, any, any>\n action: Action<any, any, any, any>\n}\n\nexport type MutationCacheNotifyEvent =\n | NotifyEventMutationAdded\n | NotifyEventMutationRemoved\n | NotifyEventMutationObserverAdded\n | NotifyEventMutationObserverRemoved\n | NotifyEventMutationObserverOptionsUpdated\n | NotifyEventMutationUpdated\n\ntype MutationCacheListener = (event: MutationCacheNotifyEvent) => void\n\n// CLASS\n\nexport class MutationCache extends Subscribable<MutationCacheListener> {\n #mutations: Set<Mutation<any, any, any, any>>\n #scopes: Map<string, Array<Mutation<any, any, any, any>>>\n #mutationId: number\n\n constructor(public config: MutationCacheConfig = {}) {\n super()\n this.#mutations = new Set()\n this.#scopes = new Map()\n this.#mutationId = 0\n }\n\n build<TData, TError, TVariables, TOnMutateResult>(\n client: QueryClient,\n options: MutationOptions<TData, TError, TVariables, TOnMutateResult>,\n state?: MutationState<TData, TError, TVariables, TOnMutateResult>,\n ): Mutation<TData, TError, TVariables, TOnMutateResult> {\n const mutation = new Mutation({\n client,\n mutationCache: this,\n mutationId: ++this.#mutationId,\n options: client.defaultMutationOptions(options),\n state,\n })\n\n this.add(mutation)\n\n return mutation\n }\n\n add(mutation: Mutation<any, any, any, any>): void {\n this.#mutations.add(mutation)\n const scope = scopeFor(mutation)\n if (typeof scope === 'string') {\n const scopedMutations = this.#scopes.get(scope)\n if (scopedMutations) {\n scopedMutations.push(mutation)\n } else {\n this.#scopes.set(scope, [mutation])\n }\n }\n this.notify({ type: 'added', mutation })\n }\n\n remove(mutation: Mutation<any, any, any, any>): void {\n if (this.#mutations.delete(mutation)) {\n const scope = scopeFor(mutation)\n if (typeof scope === 'string') {\n const scopedMutations = this.#scopes.get(scope)\n if (scopedMutations) {\n if (scopedMutations.length > 1) {\n const index = scopedMutations.indexOf(mutation)\n if (index !== -1) {\n scopedMutations.splice(index, 1)\n }\n } else if (scopedMutations[0] === mutation) {\n this.#scopes.delete(scope)\n }\n }\n }\n }\n\n // Currently we notify the removal even if the mutation was already removed.\n // Consider making this an error or not notifying of the removal depending on the desired semantics.\n this.notify({ type: 'removed', mutation })\n }\n\n canRun(mutation: Mutation<any, any, any, any>): boolean {\n const scope = scopeFor(mutation)\n if (typeof scope === 'string') {\n const mutationsWithSameScope = this.#scopes.get(scope)\n const firstPendingMutation = mutationsWithSameScope?.find(\n (m) => m.state.status === 'pending',\n )\n // we can run if there is no current pending mutation (start use-case)\n // or if WE are the first pending mutation (continue use-case)\n return !firstPendingMutation || firstPendingMutation === mutation\n } else {\n // For unscoped mutations there are never any pending mutations in front of the\n // current mutation\n return true\n }\n }\n\n runNext(mutation: Mutation<any, any, any, any>): Promise<unknown> {\n const scope = scopeFor(mutation)\n if (typeof scope === 'string') {\n const foundMutation = this.#scopes\n .get(scope)\n ?.find((m) => m !== mutation && m.state.isPaused)\n\n return foundMutation?.continue() ?? Promise.resolve()\n } else {\n return Promise.resolve()\n }\n }\n\n clear(): void {\n notifyManager.batch(() => {\n this.#mutations.forEach((mutation) => {\n this.notify({ type: 'removed', mutation })\n })\n this.#mutations.clear()\n this.#scopes.clear()\n })\n }\n\n getAll(): Array<Mutation> {\n return Array.from(this.#mutations)\n }\n\n find<\n TData = unknown,\n TError = DefaultError,\n TVariables = any,\n TOnMutateResult = unknown,\n >(\n filters: MutationFilters,\n ): Mutation<TData, TError, TVariables, TOnMutateResult> | undefined {\n const defaultedFilters = { exact: true, ...filters }\n\n return this.getAll().find((mutation) =>\n matchMutation(defaultedFilters, mutation),\n ) as Mutation<TData, TError, TVariables, TOnMutateResult> | undefined\n }\n\n findAll(filters: MutationFilters = {}): Array<Mutation> {\n return this.getAll().filter((mutation) => matchMutation(filters, mutation))\n }\n\n notify(event: MutationCacheNotifyEvent) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(event)\n })\n })\n }\n\n resumePausedMutations(): Promise<unknown> {\n const pausedMutations = this.getAll().filter((x) => x.state.isPaused)\n\n return notifyManager.batch(() =>\n Promise.all(\n pausedMutations.map((mutation) => mutation.continue().catch(noop)),\n ),\n )\n }\n}\n\nfunction scopeFor(mutation: Mutation<any, any, any, any>) {\n return mutation.options.scope?.id\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", "import { hashQueryKeyByOptions, matchQuery } from './utils'\nimport { Query } from './query'\nimport { notifyManager } from './notifyManager'\nimport { Subscribable } from './subscribable'\nimport type { QueryFilters } from './utils'\nimport type { Action, QueryState } from './query'\nimport type {\n DefaultError,\n NotifyEvent,\n QueryKey,\n QueryOptions,\n WithRequired,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { QueryObserver } from './queryObserver'\n\n// TYPES\n\ninterface QueryCacheConfig {\n onError?: (\n error: DefaultError,\n query: Query<unknown, unknown, unknown>,\n ) => void\n onSuccess?: (data: unknown, query: Query<unknown, unknown, unknown>) => void\n onSettled?: (\n data: unknown | undefined,\n error: DefaultError | null,\n query: Query<unknown, unknown, unknown>,\n ) => void\n}\n\ninterface NotifyEventQueryAdded extends NotifyEvent {\n type: 'added'\n query: Query<any, any, any, any>\n}\n\ninterface NotifyEventQueryRemoved extends NotifyEvent {\n type: 'removed'\n query: Query<any, any, any, any>\n}\n\ninterface NotifyEventQueryUpdated extends NotifyEvent {\n type: 'updated'\n query: Query<any, any, any, any>\n action: Action<any, any>\n}\n\ninterface NotifyEventQueryObserverAdded extends NotifyEvent {\n type: 'observerAdded'\n query: Query<any, any, any, any>\n observer: QueryObserver<any, any, any, any, any>\n}\n\ninterface NotifyEventQueryObserverRemoved extends NotifyEvent {\n type: 'observerRemoved'\n query: Query<any, any, any, any>\n observer: QueryObserver<any, any, any, any, any>\n}\n\ninterface NotifyEventQueryObserverResultsUpdated extends NotifyEvent {\n type: 'observerResultsUpdated'\n query: Query<any, any, any, any>\n}\n\ninterface NotifyEventQueryObserverOptionsUpdated extends NotifyEvent {\n type: 'observerOptionsUpdated'\n query: Query<any, any, any, any>\n observer: QueryObserver<any, any, any, any, any>\n}\n\nexport type QueryCacheNotifyEvent =\n | NotifyEventQueryAdded\n | NotifyEventQueryRemoved\n | NotifyEventQueryUpdated\n | NotifyEventQueryObserverAdded\n | NotifyEventQueryObserverRemoved\n | NotifyEventQueryObserverResultsUpdated\n | NotifyEventQueryObserverOptionsUpdated\n\ntype QueryCacheListener = (event: QueryCacheNotifyEvent) => void\n\nexport interface QueryStore {\n has: (queryHash: string) => boolean\n set: (queryHash: string, query: Query) => void\n get: (queryHash: string) => Query | undefined\n delete: (queryHash: string) => void\n values: () => IterableIterator<Query>\n}\n\n// CLASS\n\nexport class QueryCache extends Subscribable<QueryCacheListener> {\n #queries: QueryStore\n\n constructor(public config: QueryCacheConfig = {}) {\n super()\n this.#queries = new Map<string, Query>()\n }\n\n build<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n >(\n client: QueryClient,\n options: WithRequired<\n QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n 'queryKey'\n >,\n state?: QueryState<TData, TError>,\n ): Query<TQueryFnData, TError, TData, TQueryKey> {\n const queryKey = options.queryKey\n const queryHash =\n options.queryHash ?? hashQueryKeyByOptions(queryKey, options)\n let query = this.get<TQueryFnData, TError, TData, TQueryKey>(queryHash)\n\n if (!query) {\n query = new Query({\n client,\n queryKey,\n queryHash,\n options: client.defaultQueryOptions(options),\n state,\n defaultOptions: client.getQueryDefaults(queryKey),\n })\n this.add(query)\n }\n\n return query\n }\n\n add(query: Query<any, any, any, any>): void {\n if (!this.#queries.has(query.queryHash)) {\n this.#queries.set(query.queryHash, query)\n\n this.notify({\n type: 'added',\n query,\n })\n }\n }\n\n remove(query: Query<any, any, any, any>): void {\n const queryInMap = this.#queries.get(query.queryHash)\n\n if (queryInMap) {\n query.destroy()\n\n if (queryInMap === query) {\n this.#queries.delete(query.queryHash)\n }\n\n this.notify({ type: 'removed', query })\n }\n }\n\n clear(): void {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n this.remove(query)\n })\n })\n }\n\n get<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n >(\n queryHash: string,\n ): Query<TQueryFnData, TError, TData, TQueryKey> | undefined {\n return this.#queries.get(queryHash) as\n | Query<TQueryFnData, TError, TData, TQueryKey>\n | undefined\n }\n\n getAll(): Array<Query> {\n return [...this.#queries.values()]\n }\n\n find<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData>(\n filters: WithRequired<QueryFilters, 'queryKey'>,\n ): Query<TQueryFnData, TError, TData> | undefined {\n const defaultedFilters = { exact: true, ...filters }\n\n return this.getAll().find((query) =>\n matchQuery(defaultedFilters, query),\n ) as Query<TQueryFnData, TError, TData> | undefined\n }\n\n findAll(filters: QueryFilters<any> = {}): Array<Query> {\n const queries = this.getAll()\n return Object.keys(filters).length > 0\n ? queries.filter((query) => matchQuery(filters, query))\n : queries\n }\n\n notify(event: QueryCacheNotifyEvent): void {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(event)\n })\n })\n }\n\n onFocus(): void {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n query.onFocus()\n })\n })\n }\n\n onOnline(): void {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n query.onOnline()\n })\n })\n }\n}\n", "import {\n functionalUpdate,\n hashKey,\n hashQueryKeyByOptions,\n noop,\n partialMatchKey,\n resolveStaleTime,\n skipToken,\n} from './utils'\nimport { QueryCache } from './queryCache'\nimport { MutationCache } from './mutationCache'\nimport { focusManager } from './focusManager'\nimport { onlineManager } from './onlineManager'\nimport { notifyManager } from './notifyManager'\nimport { infiniteQueryBehavior } from './infiniteQueryBehavior'\nimport type {\n CancelOptions,\n DefaultError,\n DefaultOptions,\n DefaultedQueryObserverOptions,\n EnsureInfiniteQueryDataOptions,\n EnsureQueryDataOptions,\n FetchInfiniteQueryOptions,\n FetchQueryOptions,\n InferDataFromTag,\n InferErrorFromTag,\n InfiniteData,\n InvalidateOptions,\n InvalidateQueryFilters,\n MutationKey,\n MutationObserverOptions,\n MutationOptions,\n NoInfer,\n OmitKeyof,\n QueryClientConfig,\n QueryKey,\n QueryObserverOptions,\n QueryOptions,\n RefetchOptions,\n RefetchQueryFilters,\n ResetOptions,\n SetDataOptions,\n} from './types'\nimport type { QueryState } from './query'\nimport type { MutationFilters, QueryFilters, Updater } from './utils'\n\n// TYPES\n\ninterface QueryDefaults {\n queryKey: QueryKey\n defaultOptions: OmitKeyof<QueryOptions<any, any, any>, 'queryKey'>\n}\n\ninterface MutationDefaults {\n mutationKey: MutationKey\n defaultOptions: MutationOptions<any, any, any, any>\n}\n\n// CLASS\n\nexport class QueryClient {\n #queryCache: QueryCache\n #mutationCache: MutationCache\n #defaultOptions: DefaultOptions\n #queryDefaults: Map<string, QueryDefaults>\n #mutationDefaults: Map<string, MutationDefaults>\n #mountCount: number\n #unsubscribeFocus?: () => void\n #unsubscribeOnline?: () => void\n\n constructor(config: QueryClientConfig = {}) {\n this.#queryCache = config.queryCache || new QueryCache()\n this.#mutationCache = config.mutationCache || new MutationCache()\n this.#defaultOptions = config.defaultOptions || {}\n this.#queryDefaults = new Map()\n this.#mutationDefaults = new Map()\n this.#mountCount = 0\n }\n\n mount(): void {\n this.#mountCount++\n if (this.#mountCount !== 1) return\n\n this.#unsubscribeFocus = focusManager.subscribe(async (focused) => {\n if (focused) {\n await this.resumePausedMutations()\n this.#queryCache.onFocus()\n }\n })\n this.#unsubscribeOnline = onlineManager.subscribe(async (online) => {\n if (online) {\n await this.resumePausedMutations()\n this.#queryCache.onOnline()\n }\n })\n }\n\n unmount(): void {\n this.#mountCount--\n if (this.#mountCount !== 0) return\n\n this.#unsubscribeFocus?.()\n this.#unsubscribeFocus = undefined\n\n this.#unsubscribeOnline?.()\n this.#unsubscribeOnline = undefined\n }\n\n isFetching<TQueryFilters extends QueryFilters<any> = QueryFilters>(\n filters?: TQueryFilters,\n ): number {\n return this.#queryCache.findAll({ ...filters, fetchStatus: 'fetching' })\n .length\n }\n\n isMutating<\n TMutationFilters extends MutationFilters<any, any> = MutationFilters,\n >(filters?: TMutationFilters): number {\n return this.#mutationCache.findAll({ ...filters, status: 'pending' }).length\n }\n\n /**\n * Imperative (non-reactive) way to retrieve data for a QueryKey.\n * Should only be used in callbacks or functions where reading the latest data is necessary, e.g. for optimistic updates.\n *\n * Hint: Do not use this function inside a component, because it won't receive updates.\n * Use `useQuery` to create a `QueryObserver` that subscribes to changes.\n */\n getQueryData<\n TQueryFnData = unknown,\n TTaggedQueryKey extends QueryKey = QueryKey,\n TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,\n >(queryKey: TTaggedQueryKey): TInferredQueryFnData | undefined {\n const options = this.defaultQueryOptions({ queryKey })\n\n return this.#queryCache.get<TInferredQueryFnData>(options.queryHash)?.state\n .data\n }\n\n ensureQueryData<\n TQueryFnData,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n >(\n options: EnsureQueryDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n ): Promise<TData> {\n const defaultedOptions = this.defaultQueryOptions(options)\n const query = this.#queryCache.build(this, defaultedOptions)\n const cachedData = query.state.data\n\n if (cachedData === undefined) {\n return this.fetchQuery(options)\n }\n\n if (\n options.revalidateIfStale &&\n query.isStaleByTime(resolveStaleTime(defaultedOptions.staleTime, query))\n ) {\n void this.prefetchQuery(defaultedOptions)\n }\n\n return Promise.resolve(cachedData)\n }\n\n getQueriesData<\n TQueryFnData = unknown,\n TQueryFilters extends QueryFilters<any> = QueryFilters,\n >(filters: TQueryFilters): Array<[QueryKey, TQueryFnData | undefined]> {\n return this.#queryCache.findAll(filters).map(({ queryKey, state }) => {\n const data = state.data as TQueryFnData | undefined\n return [queryKey, data]\n })\n }\n\n setQueryData<\n TQueryFnData = unknown,\n TTaggedQueryKey extends QueryKey = QueryKey,\n TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,\n >(\n queryKey: TTaggedQueryKey,\n updater: Updater<\n NoInfer<TInferredQueryFnData> | undefined,\n NoInfer<TInferredQueryFnData> | undefined\n >,\n options?: SetDataOptions,\n ): NoInfer<TInferredQueryFnData> | undefined {\n const defaultedOptions = this.defaultQueryOptions<\n any,\n any,\n unknown,\n any,\n QueryKey\n >({ queryKey })\n\n const query = this.#queryCache.get<TInferredQueryFnData>(\n defaultedOptions.queryHash,\n )\n const prevData = query?.state.data\n const data = functionalUpdate(updater, prevData)\n\n if (data === undefined) {\n return undefined\n }\n\n return this.#queryCache\n .build(this, defaultedOptions)\n .setData(data, { ...options, manual: true })\n }\n\n setQueriesData<\n TQueryFnData,\n TQueryFilters extends QueryFilters<any> = QueryFilters,\n >(\n filters: TQueryFilters,\n updater: Updater<\n NoInfer<TQueryFnData> | undefined,\n NoInfer<TQueryFnData> | undefined\n >,\n options?: SetDataOptions,\n ): Array<[QueryKey, TQueryFnData | undefined]> {\n return notifyManager.batch(() =>\n this.#queryCache\n .findAll(filters)\n .map(({ queryKey }) => [\n queryKey,\n this.setQueryData<TQueryFnData>(queryKey, updater, options),\n ]),\n )\n }\n\n getQueryState<\n TQueryFnData = unknown,\n TError = DefaultError,\n TTaggedQueryKey extends QueryKey = QueryKey,\n TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,\n TInferredError = InferErrorFromTag<TError, TTaggedQueryKey>,\n >(\n queryKey: TTaggedQueryKey,\n ): QueryState<TInferredQueryFnData, TInferredError> | undefined {\n const options = this.defaultQueryOptions({ queryKey })\n return this.#queryCache.get<TInferredQueryFnData, TInferredError>(\n options.queryHash,\n )?.state\n }\n\n removeQueries<TTaggedQueryKey extends QueryKey = QueryKey>(\n filters?: QueryFilters<TTaggedQueryKey>,\n ): void {\n const queryCache = this.#queryCache\n notifyManager.batch(() => {\n queryCache.findAll(filters).forEach((query) => {\n queryCache.remove(query)\n })\n })\n }\n\n resetQueries<TTaggedQueryKey extends QueryKey = QueryKey>(\n filters?: QueryFilters<TTaggedQueryKey>,\n options?: ResetOptions,\n ): Promise<void> {\n const queryCache = this.#queryCache\n\n return notifyManager.batch(() => {\n queryCache.findAll(filters).forEach((query) => {\n query.reset()\n })\n return this.refetchQueries(\n {\n type: 'active',\n ...filters,\n },\n options,\n )\n })\n }\n\n cancelQueries<TTaggedQueryKey extends QueryKey = QueryKey>(\n filters?: QueryFilters<TTaggedQueryKey>,\n cancelOptions: CancelOptions = {},\n ): Promise<void> {\n const defaultedCancelOptions = { revert: true, ...cancelOptions }\n\n const promises = notifyManager.batch(() =>\n this.#queryCache\n .findAll(filters)\n .map((query) => query.cancel(defaultedCancelOptions)),\n )\n\n return Promise.all(promises).then(noop).catch(noop)\n }\n\n invalidateQueries<TTaggedQueryKey extends QueryKey = QueryKey>(\n filters?: InvalidateQueryFilters<TTaggedQueryKey>,\n options: InvalidateOptions = {},\n ): Promise<void> {\n return notifyManager.batch(() => {\n this.#queryCache.findAll(filters).forEach((query) => {\n query.invalidate()\n })\n\n if (filters?.refetchType === 'none') {\n return Promise.resolve()\n }\n return this.refetchQueries(\n {\n ...filters,\n type: filters?.refetchType ?? filters?.type ?? 'active',\n },\n options,\n )\n })\n }\n\n refetchQueries<TTaggedQueryKey extends QueryKey = QueryKey>(\n filters?: RefetchQueryFilters<TTaggedQueryKey>,\n options: RefetchOptions = {},\n ): Promise<void> {\n const fetchOptions = {\n ...options,\n cancelRefetch: options.cancelRefetch ?? true,\n }\n const promises = notifyManager.batch(() =>\n this.#queryCache\n .findAll(filters)\n .filter((query) => !query.isDisabled() && !query.isStatic())\n .map((query) => {\n let promise = query.fetch(undefined, fetchOptions)\n if (!fetchOptions.throwOnError) {\n promise = promise.catch(noop)\n }\n return query.state.fetchStatus === 'paused'\n ? Promise.resolve()\n : promise\n }),\n )\n\n return Promise.all(promises).then(noop)\n }\n\n fetchQuery<\n TQueryFnData,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = never,\n >(\n options: FetchQueryOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n ): Promise<TData> {\n const defaultedOptions = this.defaultQueryOptions(options)\n\n // https://github.com/tannerlinsley/react-query/issues/652\n if (defaultedOptions.retry === undefined) {\n defaultedOptions.retry = false\n }\n\n const query = this.#queryCache.build(this, defaultedOptions)\n\n return query.isStaleByTime(\n resolveStaleTime(defaultedOptions.staleTime, query),\n )\n ? query.fetch(defaultedOptions)\n : Promise.resolve(query.state.data as TData)\n }\n\n prefetchQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n >(\n options: FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n ): Promise<void> {\n return this.fetchQuery(options).then(noop).catch(noop)\n }\n\n fetchInfiniteQuery<\n TQueryFnData,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = unknown,\n >(\n options: FetchInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n ): Promise<InfiniteData<TData, TPageParam>> {\n options.behavior = infiniteQueryBehavior<\n TQueryFnData,\n TError,\n TData,\n TPageParam\n >(options.pages)\n return this.fetchQuery(options as any)\n }\n\n prefetchInfiniteQuery<\n TQueryFnData,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = unknown,\n >(\n options: FetchInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n ): Promise<void> {\n return this.fetchInfiniteQuery(options).then(noop).catch(noop)\n }\n\n ensureInfiniteQueryData<\n TQueryFnData,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = unknown,\n >(\n options: EnsureInfiniteQueryDataOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n ): Promise<InfiniteData<TData, TPageParam>> {\n options.behavior = infiniteQueryBehavior<\n TQueryFnData,\n TError,\n TData,\n TPageParam\n >(options.pages)\n\n return this.ensureQueryData(options as any)\n }\n\n resumePausedMutations(): Promise<unknown> {\n if (onlineManager.isOnline()) {\n return this.#mutationCache.resumePausedMutations()\n }\n return Promise.resolve()\n }\n\n getQueryCache(): QueryCache {\n return this.#queryCache\n }\n\n getMutationCache(): MutationCache {\n return this.#mutationCache\n }\n\n getDefaultOptions(): DefaultOptions {\n return this.#defaultOptions\n }\n\n setDefaultOptions(options: DefaultOptions): void {\n this.#defaultOptions = options\n }\n\n setQueryDefaults<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n >(\n queryKey: QueryKey,\n options: Partial<\n OmitKeyof<\n QueryObserverOptions<TQueryFnData, TError, TData, TQueryData>,\n 'queryKey'\n >\n >,\n ): void {\n this.#queryDefaults.set(hashKey(queryKey), {\n queryKey,\n defaultOptions: options,\n })\n }\n\n getQueryDefaults(\n queryKey: QueryKey,\n ): OmitKeyof<QueryObserverOptions<any, any, any, any, any>, 'queryKey'> {\n const defaults = [...this.#queryDefaults.values()]\n\n const result: OmitKeyof<\n QueryObserverOptions<any, any, any, any, any>,\n 'queryKey'\n > = {}\n\n defaults.forEach((queryDefault) => {\n if (partialMatchKey(queryKey, queryDefault.queryKey)) {\n Object.assign(result, queryDefault.defaultOptions)\n }\n })\n return result\n }\n\n setMutationDefaults<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TOnMutateResult = unknown,\n >(\n mutationKey: MutationKey,\n options: OmitKeyof<\n MutationObserverOptions<TData, TError, TVariables, TOnMutateResult>,\n 'mutationKey'\n >,\n ): void {\n this.#mutationDefaults.set(hashKey(mutationKey), {\n mutationKey,\n defaultOptions: options,\n })\n }\n\n getMutationDefaults(\n mutationKey: MutationKey,\n ): OmitKeyof<MutationObserverOptions<any, any, any, any>, 'mutationKey'> {\n const defaults = [...this.#mutationDefaults.values()]\n\n const result: OmitKeyof<\n MutationObserverOptions<any, any, any, any>,\n 'mutationKey'\n > = {}\n\n defaults.forEach((queryDefault) => {\n if (partialMatchKey(mutationKey, queryDefault.mutationKey)) {\n Object.assign(result, queryDefault.defaultOptions)\n }\n })\n\n return result\n }\n\n defaultQueryOptions<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = never,\n >(\n options:\n | QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey,\n TPageParam\n >\n | DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ): DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n > {\n if (options._defaulted) {\n return options as DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >\n }\n\n const defaultedOptions = {\n ...this.#defaultOptions.queries,\n ...this.getQueryDefaults(options.queryKey),\n ...options,\n _defaulted: true,\n }\n\n if (!defaultedOptions.queryHash) {\n defaultedOptions.queryHash = hashQueryKeyByOptions(\n defaultedOptions.queryKey,\n defaultedOptions,\n )\n }\n\n // dependent default values\n if (defaultedOptions.refetchOnReconnect === undefined) {\n defaultedOptions.refetchOnReconnect =\n defaultedOptions.networkMode !== 'always'\n }\n if (defaultedOptions.throwOnError === undefined) {\n defaultedOptions.throwOnError = !!defaultedOptions.suspense\n }\n\n if (!defaultedOptions.networkMode && defaultedOptions.persister) {\n defaultedOptions.networkMode = 'offlineFirst'\n }\n\n if (defaultedOptions.queryFn === skipToken) {\n defaultedOptions.enabled = false\n }\n\n return defaultedOptions as DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >\n }\n\n defaultMutationOptions<T extends MutationOptions<any, any, any, any>>(\n options?: T,\n ): T {\n if (options?._defaulted) {\n return options\n }\n return {\n ...this.#defaultOptions.mutations,\n ...(options?.mutationKey &&\n this.getMutationDefaults(options.mutationKey)),\n ...options,\n _defaulted: true,\n } as T\n }\n\n clear(): void {\n this.#queryCache.clear()\n this.#mutationCache.clear()\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'\n\nconst IsRestoringContext = React.createContext(false)\n\nexport const useIsRestoring = () => React.useContext(IsRestoringContext)\nexport const IsRestoringProvider = IsRestoringContext.Provider\n", "'use client'\nimport * as React from 'react'\n\n// CONTEXT\nexport type QueryErrorResetFunction = () => void\nexport type QueryErrorIsResetFunction = () => boolean\nexport type QueryErrorClearResetFunction = () => void\n\nexport interface QueryErrorResetBoundaryValue {\n clearReset: QueryErrorClearResetFunction\n isReset: QueryErrorIsResetFunction\n reset: QueryErrorResetFunction\n}\n\nfunction createValue(): QueryErrorResetBoundaryValue {\n let isReset = false\n return {\n clearReset: () => {\n isReset = false\n },\n reset: () => {\n isReset = true\n },\n isReset: () => {\n return isReset\n },\n }\n}\n\nconst QueryErrorResetBoundaryContext = React.createContext(createValue())\n\n// HOOK\n\nexport const useQueryErrorResetBoundary = () =>\n React.useContext(QueryErrorResetBoundaryContext)\n\n// COMPONENT\n\nexport type QueryErrorResetBoundaryFunction = (\n value: QueryErrorResetBoundaryValue,\n) => React.ReactNode\n\nexport interface QueryErrorResetBoundaryProps {\n children: QueryErrorResetBoundaryFunction | React.ReactNode\n}\n\nexport const QueryErrorResetBoundary = ({\n children,\n}: QueryErrorResetBoundaryProps) => {\n const [value] = React.useState(() => createValue())\n return (\n <QueryErrorResetBoundaryContext.Provider value={value}>\n {typeof children === 'function' ? children(value) : children}\n </QueryErrorResetBoundaryContext.Provider>\n )\n}\n", "'use client'\nimport * as React from 'react'\nimport { shouldThrowError } from '@tanstack/query-core'\nimport type {\n DefaultedQueryObserverOptions,\n Query,\n QueryKey,\n QueryObserverResult,\n ThrowOnError,\n} from '@tanstack/query-core'\nimport type { QueryErrorResetBoundaryValue } from './QueryErrorResetBoundary'\n\nexport const ensurePreventErrorBoundaryRetry = <\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey extends QueryKey,\n>(\n options: DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n errorResetBoundary: QueryErrorResetBoundaryValue,\n query: Query<TQueryFnData, TError, TQueryData, TQueryKey> | undefined,\n) => {\n const throwOnError =\n query?.state.error && typeof options.throwOnError === 'function'\n ? shouldThrowError(options.throwOnError, [query.state.error, query])\n : options.throwOnError\n\n if (\n options.suspense ||\n options.experimental_prefetchInRender ||\n throwOnError\n ) {\n // Prevent retrying failed query if the error boundary has not been reset yet\n if (!errorResetBoundary.isReset()) {\n options.retryOnMount = false\n }\n }\n}\n\nexport const useClearResetErrorBoundary = (\n errorResetBoundary: QueryErrorResetBoundaryValue,\n) => {\n React.useEffect(() => {\n errorResetBoundary.clearReset()\n }, [errorResetBoundary])\n}\n\nexport const getHasError = <\n TData,\n TError,\n TQueryFnData,\n TQueryData,\n TQueryKey extends QueryKey,\n>({\n result,\n errorResetBoundary,\n throwOnError,\n query,\n suspense,\n}: {\n result: QueryObserverResult<TData, TError>\n errorResetBoundary: QueryErrorResetBoundaryValue\n throwOnError: ThrowOnError<TQueryFnData, TError, TQueryData, TQueryKey>\n query: Query<TQueryFnData, TError, TQueryData, TQueryKey> | undefined\n suspense: boolean | undefined\n}) => {\n return (\n result.isError &&\n !errorResetBoundary.isReset() &&\n !result.isFetching &&\n query &&\n ((suspense && result.data === undefined) ||\n shouldThrowError(throwOnError, [result.error, query]))\n )\n}\n", "import type {\n DefaultError,\n DefaultedQueryObserverOptions,\n Query,\n QueryKey,\n QueryObserver,\n QueryObserverResult,\n} from '@tanstack/query-core'\nimport type { QueryErrorResetBoundaryValue } from './QueryErrorResetBoundary'\n\nexport const defaultThrowOnError = <\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n _error: TError,\n query: Query<TQueryFnData, TError, TData, TQueryKey>,\n) => query.state.data === undefined\n\nexport const ensureSuspenseTimers = (\n defaultedOptions: DefaultedQueryObserverOptions<any, any, any, any, any>,\n) => {\n if (defaultedOptions.suspense) {\n // Handle staleTime to ensure minimum 1000ms in Suspense mode\n // This prevents unnecessary refetching when components remount after suspending\n const MIN_SUSPENSE_TIME_MS = 1000\n\n const clamp = (value: number | 'static' | undefined) =>\n value === 'static'\n ? value\n : Math.max(value ?? MIN_SUSPENSE_TIME_MS, MIN_SUSPENSE_TIME_MS)\n\n const originalStaleTime = defaultedOptions.staleTime\n defaultedOptions.staleTime =\n typeof originalStaleTime === 'function'\n ? (...args) => clamp(originalStaleTime(...args))\n : clamp(originalStaleTime)\n\n if (typeof defaultedOptions.gcTime === 'number') {\n defaultedOptions.gcTime = Math.max(\n defaultedOptions.gcTime,\n MIN_SUSPENSE_TIME_MS,\n )\n }\n }\n}\n\nexport const willFetch = (\n result: QueryObserverResult<any, any>,\n isRestoring: boolean,\n) => result.isLoading && result.isFetching && !isRestoring\n\nexport const shouldSuspend = (\n defaultedOptions:\n | DefaultedQueryObserverOptions<any, any, any, any, any>\n | undefined,\n result: QueryObserverResult<any, any>,\n) => defaultedOptions?.suspense && result.isPending\n\nexport const fetchOptimistic = <\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey extends QueryKey,\n>(\n defaultedOptions: DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n observer: QueryObserver<TQueryFnData, TError, TData, TQueryData, TQueryKey>,\n errorResetBoundary: QueryErrorResetBoundaryValue,\n) =>\n observer.fetchOptimistic(defaultedOptions).catch(() => {\n errorResetBoundary.clearReset()\n })\n", "'use client'\nimport * as React from 'react'\n\nimport { environmentManager, noop, notifyManager } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport { useQueryErrorResetBoundary } from './QueryErrorResetBoundary'\nimport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary,\n} from './errorBoundaryUtils'\nimport { useIsRestoring } from './IsRestoringProvider'\nimport {\n ensureSuspenseTimers,\n fetchOptimistic,\n shouldSuspend,\n willFetch,\n} from './suspense'\nimport type {\n QueryClient,\n QueryKey,\n QueryObserver,\n QueryObserverResult,\n} from '@tanstack/query-core'\nimport type { UseBaseQueryOptions } from './types'\n\nexport function useBaseQuery<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey extends QueryKey,\n>(\n options: UseBaseQueryOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n Observer: typeof QueryObserver,\n queryClient?: QueryClient,\n): QueryObserverResult<TData, TError> {\n if (process.env.NODE_ENV !== 'production') {\n if (typeof options !== 'object' || Array.isArray(options)) {\n throw new Error(\n 'Bad argument type. Starting with v5, only the \"Object\" form is allowed when calling query related functions. Please use the error stack to find the culprit call. More info here: https://tanstack.com/query/latest/docs/react/guides/migrating-to-v5#supports-a-single-signature-one-object',\n )\n }\n }\n\n const isRestoring = useIsRestoring()\n const errorResetBoundary = useQueryErrorResetBoundary()\n const client = useQueryClient(queryClient)\n const defaultedOptions = client.defaultQueryOptions(options)\n ;(client.getDefaultOptions().queries as any)?._experimental_beforeQuery?.(\n defaultedOptions,\n )\n\n const query = client\n .getQueryCache()\n .get<\n TQueryFnData,\n TError,\n TQueryData,\n TQueryKey\n >(defaultedOptions.queryHash)\n\n if (process.env.NODE_ENV !== 'production') {\n if (!defaultedOptions.queryFn) {\n console.error(\n `[${defaultedOptions.queryHash}]: No queryFn was passed as an option, and no default queryFn was found. The queryFn parameter is only optional when using a default queryFn. More info here: https://tanstack.com/query/latest/docs/framework/react/guides/default-query-function`,\n )\n }\n }\n\n // Make sure results are optimistically set in fetching state before subscribing or updating options\n defaultedOptions._optimisticResults = isRestoring\n ? 'isRestoring'\n : 'optimistic'\n\n ensureSuspenseTimers(defaultedOptions)\n ensurePreventErrorBoundaryRetry(defaultedOptions, errorResetBoundary, query)\n useClearResetErrorBoundary(errorResetBoundary)\n\n // this needs to be invoked before creating the Observer because that can create a cache entry\n const isNewCacheEntry = !client\n .getQueryCache()\n .get(defaultedOptions.queryHash)\n\n const [observer] = React.useState(\n () =>\n new Observer<TQueryFnData, TError, TData, TQueryData, TQueryKey>(\n client,\n defaultedOptions,\n ),\n )\n\n // note: this must be called before useSyncExternalStore\n const result = observer.getOptimisticResult(defaultedOptions)\n\n const shouldSubscribe = !isRestoring && options.subscribed !== false\n React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => {\n const unsubscribe = shouldSubscribe\n ? observer.subscribe(notifyManager.batchCalls(onStoreChange))\n : noop\n\n // Update result to make sure we did not miss any query updates\n // between creating the observer and subscribing to it.\n observer.updateResult()\n\n return unsubscribe\n },\n [observer, shouldSubscribe],\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult(),\n )\n\n React.useEffect(() => {\n observer.setOptions(defaultedOptions)\n }, [defaultedOptions, observer])\n\n // Handle suspense\n if (shouldSuspend(defaultedOptions, result)) {\n throw fetchOptimistic(defaultedOptions, observer, errorResetBoundary)\n }\n\n // Handle error boundary\n if (\n getHasError({\n result,\n errorResetBoundary,\n throwOnError: defaultedOptions.throwOnError,\n query,\n suspense: defaultedOptions.suspense,\n })\n ) {\n throw result.error\n }\n\n ;(client.getDefaultOptions().queries as any)?._experimental_afterQuery?.(\n defaultedOptions,\n result,\n )\n\n if (\n defaultedOptions.experimental_prefetchInRender &&\n !environmentManager.isServer() &&\n willFetch(result, isRestoring)\n ) {\n const promise = isNewCacheEntry\n ? // Fetch immediately on render in order to ensure `.promise` is resolved even if the component is unmounted\n fetchOptimistic(defaultedOptions, observer, errorResetBoundary)\n : // subscribe to the \"cache promise\" so that we can finalize the currentThenable once data comes in\n query?.promise\n\n promise?.catch(noop).finally(() => {\n // `.updateResult()` will trigger `.#currentThenable` to finalize\n observer.updateResult()\n })\n }\n\n // Handle result property usage tracking\n return !defaultedOptions.notifyOnChangeProps\n ? observer.trackResult(result)\n : result\n}\n", "'use client'\nimport { QueryObserver } from '@tanstack/query-core'\nimport { useBaseQuery } from './useBaseQuery'\nimport type {\n DefaultError,\n NoInfer,\n QueryClient,\n QueryKey,\n} from '@tanstack/query-core'\nimport type {\n DefinedUseQueryResult,\n UseQueryOptions,\n UseQueryResult,\n} from './types'\nimport type {\n DefinedInitialDataOptions,\n UndefinedInitialDataOptions,\n} from './queryOptions'\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): DefinedUseQueryResult<NoInfer<TData>, TError>\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError>\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError>\n\nexport function useQuery(options: UseQueryOptions, queryClient?: QueryClient) {\n return useBaseQuery(options, QueryObserver, queryClient)\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", "'use client'\nimport { InfiniteQueryObserver } from '@tanstack/query-core'\nimport { useBaseQuery } from './useBaseQuery'\nimport type {\n DefaultError,\n InfiniteData,\n QueryClient,\n QueryKey,\n QueryObserver,\n} from '@tanstack/query-core'\nimport type {\n DefinedUseInfiniteQueryResult,\n UseInfiniteQueryOptions,\n UseInfiniteQueryResult,\n} from './types'\nimport type {\n DefinedInitialDataInfiniteOptions,\n UndefinedInitialDataInfiniteOptions,\n} from './infiniteQueryOptions'\n\nexport function useInfiniteQuery<\n TQueryFnData,\n TError = DefaultError,\n TData = InfiniteData<TQueryFnData>,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = unknown,\n>(\n options: DefinedInitialDataInfiniteOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n queryClient?: QueryClient,\n): DefinedUseInfiniteQueryResult<TData, TError>\n\nexport function useInfiniteQuery<\n TQueryFnData,\n TError = DefaultError,\n TData = InfiniteData<TQueryFnData>,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = unknown,\n>(\n options: UndefinedInitialDataInfiniteOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n queryClient?: QueryClient,\n): UseInfiniteQueryResult<TData, TError>\n\nexport function useInfiniteQuery<\n TQueryFnData,\n TError = DefaultError,\n TData = InfiniteData<TQueryFnData>,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = unknown,\n>(\n options: UseInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n queryClient?: QueryClient,\n): UseInfiniteQueryResult<TData, TError>\n\nexport function useInfiniteQuery(\n options: UseInfiniteQueryOptions,\n queryClient?: QueryClient,\n) {\n return useBaseQuery(\n options,\n InfiniteQueryObserver as typeof QueryObserver,\n queryClient,\n )\n}\n", "/**\n * @fsaos/gateway \u2014 Query Client\n *\n * Creates and exports the shared TanStack QueryClient instance used by all\n * VFS hooks. The default options are tuned for VFS data:\n *\n * - staleTime: 2 minutes (VFS data doesn't change that often)\n * - gcTime: 10 minutes (keep unused data around for a while)\n * - refetchOnWindowFocus: false (we use Supabase Realtime instead)\n * - retry: 1 (one retry on failure)\n */\n\nimport { QueryClient } from '@tanstack/react-query';\n\nexport const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60 * 2, // 2 minutes\n gcTime: 1000 * 60 * 10, // 10 minutes\n refetchOnWindowFocus: false,\n retry: 1,\n },\n },\n});\n", "/**\n * @fsaos/gateway \u2014 VFS Query Key Factory\n *\n * Deterministic query key factory used by TanStack Query for all VFS data.\n * Every hook and cache invalidation function references these keys to ensure\n * consistent cache identity.\n *\n * SCOPE-KEYED CACHING:\n * All scope-dependent queries include the current scope path in their key.\n * This means switching accounts creates a new cache namespace automatically \u2014\n * the old account's data stays warm for instant switch-back, while the new\n * account's data is fetched fresh (or served from its own warm cache).\n *\n * Queries that are NOT scope-dependent (memberships, item-by-id) use keys\n * without the scope prefix.\n */\n\nimport { getScope } from './session';\n\n/**\n * Returns the current scope key for query namespacing.\n * Returns '__unscoped__' before scope is set (queries gated by useScopeReady\n * won't fire in this state, but the key must still be valid for React Query).\n */\nfunction sk(): string {\n return getScope() ?? '__unscoped__';\n}\n\nexport const vfsKeys = {\n /** Root key for all VFS queries (scope-aware). */\n all: () => ['vfs', sk()] as const,\n\n /** Single item by path (scope-aware \u2014 relative paths resolve per-scope). */\n item: (path: string) => ['vfs', sk(), 'item', path] as const,\n\n /** Single item by UUID (scope-independent \u2014 UUIDs are globally unique). */\n itemById: (id: string) => ['vfs', 'item-by-id', id] as const,\n\n /** Children of a path (scope-aware). */\n children: (path: string) => ['vfs', sk(), 'children', path] as const,\n\n /** All children queries for current scope (for broad invalidation). */\n allChildren: () => ['vfs', sk(), 'children'] as const,\n\n /** Type definitions for a scope (or default). */\n types: (scopeId?: string) => ['vfs', 'types', scopeId ?? 'default'] as const,\n\n /** Edges for an item (scope-independent \u2014 edges are by item UUID). */\n edges: (itemId: string) => ['vfs', 'edges', itemId] as const,\n\n /** Search results (scope-aware \u2014 search is scoped). */\n search: (query: string, types?: string[]) =>\n ['vfs', sk(), 'search', query, ...(types ?? [])] as const,\n\n /** Items query (type-based listing with filters, scope-aware). */\n items: (type: string, filters?: Record<string, unknown>) =>\n ['vfs', sk(), 'items', type, JSON.stringify(filters ?? {})] as const,\n\n /** All items queries for current scope (for broad invalidation). */\n allItems: () => ['vfs', sk(), 'items'] as const,\n\n /** Recursive tree at a path + depth (scope-aware). */\n tree: (path: string, depth?: number) =>\n ['vfs', sk(), 'tree', path, depth ?? 1] as const,\n\n /** Open envelope for a path (scope-aware). */\n openEnvelope: (path: string, strategy?: string) =>\n ['vfs', sk(), 'open', path, strategy ?? '__default__'] as const,\n\n /** All open-envelope queries for current scope (for broad invalidation). */\n allOpenEnvelopes: () => ['vfs', sk(), 'open'] as const,\n\n /** Member focus for a scope. */\n memberFocus: (scopeId: string) => ['vfs', 'member-focus', scopeId] as const,\n\n /** Fractal instances (scope-independent). */\n fractalInstances: () => ['vfs', 'fractal-instances'] as const,\n\n /** Recent activity (scope-aware). */\n recentActivity: (a: string, b: string, c: string) =>\n ['vfs', sk(), 'recent-activity', a, b, c] as const,\n\n /** Item history (scope-independent \u2014 by item UUID). */\n itemHistory: (a: string, b: string, c: string) =>\n ['vfs', 'item-history', a, b, c] as const,\n\n /** Channel messages (scope-aware \u2014 channels are scoped). */\n channelMessages: (channelPath: string, parentMessageId?: string) =>\n ['vfs', sk(), 'channel-messages', channelPath, parentMessageId ?? '__top__'] as const,\n\n /** All channel-messages queries for current scope (for broad invalidation). */\n allChannelMessages: () => ['vfs', sk(), 'channel-messages'] as const,\n\n /** Channels listing (scope-aware). */\n channels: (filter?: string) => ['vfs', sk(), 'channels', filter ?? 'all'] as const,\n\n /** All channels queries for current scope (for broad invalidation). */\n allChannels: () => ['vfs', sk(), 'channels'] as const,\n\n /** Notifications listing (scope-aware). */\n notifications: (filter?: string, limit?: number) =>\n ['vfs', sk(), 'notifications', filter ?? 'all', limit ?? 200] as const,\n\n /** All notification queries for current scope (for broad invalidation). */\n allNotifications: () => ['vfs', sk(), 'notifications'] as const,\n\n /** Unread counts (scope-aware). */\n unreadCounts: () => ['vfs', sk(), 'unread-counts'] as const,\n\n /** Membership graph for a principal (scope-independent). */\n memberships: (principalId: string) => ['memberships', principalId] as const,\n};\n", "/**\n * @fsaos/gateway \u2014 VFS Operations\n *\n * Pure async functions that call the gateway and return normalized VFS data.\n * These are the building blocks used by the React hooks \u2014 they can also be\n * called directly for non-React use cases.\n */\n\nimport { gatewayCall } from './client';\nimport { queryClient } from './query-client';\nimport { vfsKeys } from './vfs-keys';\nimport type {\n VFSItem,\n VFSEdge,\n TypeDefinition,\n OpenEnvelope,\n OpenOptions,\n} from './types';\n\n// \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction nowISO(): string {\n return new Date().toISOString();\n}\n\nfunction randomId(): string {\n return crypto.randomUUID\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * Normalize a raw gateway item response into a clean VFSItem.\n * Handles the various shapes the gateway can return (flat fields, nested\n * content.type_data, etc.).\n */\nexport function normalizeItem(raw: any): VFSItem {\n const path = raw.path || raw.item_path || '';\n const segments = path.split('/');\n segments.pop();\n const parentPath = segments.join('/');\n\n const typeData = raw.type_data || {};\n\n if (typeData.allowed_parent_types && !typeData.accepts) {\n typeData.accepts = typeData.allowed_parent_types;\n }\n delete typeData.allowed_parent_types;\n\n return {\n id: raw.id || raw.item_id || '',\n name: raw.name || raw.item_name || '',\n item_type: raw.item_type || 'unknown',\n path,\n parent_path: parentPath,\n is_active: raw.is_active !== false,\n has_children: raw.has_children ?? false,\n created_at: raw.created_at || nowISO(),\n updated_at: raw.updated_at || nowISO(),\n visibility: raw.visibility,\n type_data: typeData,\n scope_item_id: raw.scope_item_id,\n fractal_id: raw.fractal_id,\n parent_instance_id: raw.parent_instance_id,\n owner_principal_id: raw.owner_principal_id,\n created_by_principal_id: raw.created_by_principal_id,\n parent_id: raw.parent_id,\n };\n}\n\nfunction extractItems(response: any): VFSItem[] {\n return (response.content?.items || response.items || []).map(normalizeItem);\n}\n\n// \u2500\u2500 Fetch Functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport async function fetchVfsItemById(id: string): Promise<VFSItem | null> {\n try {\n const response = await gatewayCall('read', { id });\n if (response.item_name || response.item_path) {\n const item = normalizeItem(response);\n if (item.path) {\n queryClient.setQueryData(vfsKeys.item(item.path), item);\n }\n return item;\n }\n const item = response.item;\n if (item) {\n const normalized = normalizeItem(item);\n if (normalized.path) {\n queryClient.setQueryData(vfsKeys.item(normalized.path), normalized);\n }\n return normalized;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport async function fetchVfsItem(path: string): Promise<VFSItem | null> {\n try {\n const response = await gatewayCall('read', { path });\n if (response.item_name || response.item_path) {\n return normalizeItem(response);\n }\n const item = response.item;\n return item ? normalizeItem(item) : null;\n } catch {\n return null;\n }\n}\n\nexport async function fetchVfsChildren(path: string): Promise<VFSItem[]> {\n try {\n const response = await gatewayCall('list', { path, limit: 200 });\n const items = extractItems(response);\n for (const item of items) {\n queryClient.setQueryData(vfsKeys.item(item.path), item);\n }\n return items;\n } catch (err) {\n console.error(`[gateway] Failed to fetch children of ${path}:`, err);\n return [];\n }\n}\n\n/**\n * Paginated directory listing. Returns a page of children at `path`\n * with the given `limit` and `offset`. Used by `useInfiniteChildren`.\n */\nexport async function fetchVfsChildrenPage(\n path: string,\n limit: number,\n offset: number,\n): Promise<{ items: VFSItem[]; total_hint: number }> {\n try {\n const response = await gatewayCall('list', { path, limit, offset });\n const items = extractItems(response);\n for (const item of items) {\n queryClient.setQueryData(vfsKeys.item(item.path), item);\n }\n return { items, total_hint: (response as any).total ?? response.content?.total ?? items.length };\n } catch (err) {\n console.error(`[gateway] Failed to fetch children page of ${path}:`, err);\n return { items: [], total_hint: 0 };\n }\n}\n\nexport async function fetchTypeDefinitions(\n scopeId?: string,\n): Promise<Map<string, TypeDefinition>> {\n const params = scopeId ? { scope_id: scopeId } : {};\n const response = await gatewayCall('types-list', params);\n const rawItems = response.content?.items || response.items || [];\n\n const types = new Map<string, TypeDefinition>();\n for (const raw of rawItems) {\n const name = raw.name;\n const td = raw.type_data;\n if (!name || !td) continue;\n\n types.set(name, {\n type_key: name,\n display_name: td.display_name || name,\n display_name_plural: td.display_name_plural || name + 's',\n icon: td.icon || 'File',\n color: td.color || 'gray',\n description: td.description || '',\n input_schema: td.input_schema || {},\n system_schema: td.system_schema || {},\n json_schema: td.input_schema || td.json_schema || {},\n default_data: td.default_data || {},\n field_defaults: td.field_defaults || {},\n renderer_config: td.renderer_config || {},\n is_system: td.is_system ?? false,\n is_active: td.is_active ?? true,\n is_container: td.is_container ?? false,\n is_scope: td.is_scope ?? false,\n render_mode: td.render_mode || 'none',\n placement_mode: td.placement_mode,\n direct_parent_types: td.direct_parent_types,\n allowed_parent_types: td.allowed_parent_types,\n governed_create: td.governed_create,\n create_method: td.create_method,\n dedup: td.dedup,\n edges: td.edges,\n events: td.events,\n });\n }\n\n return types;\n}\n\nexport async function fetchEdgesForItem(itemId: string): Promise<VFSEdge[]> {\n try {\n const response = await gatewayCall('edges', { item_id: itemId });\n const outgoing = response.outgoing || [];\n const incoming = response.incoming || [];\n const edges: VFSEdge[] = [];\n\n for (const edge of outgoing) {\n edges.push({\n id: edge.edge_id || randomId(),\n source_item_id: itemId,\n target_item_id: edge.target_id || '',\n edge_type: edge.edge_type || '',\n weight: edge.weight ?? 1,\n context: edge.context || {},\n is_active: true,\n is_bidirectional: edge.is_bidirectional,\n });\n }\n\n for (const edge of incoming) {\n edges.push({\n id: edge.edge_id || randomId(),\n source_item_id: edge.source_id || '',\n target_item_id: itemId,\n edge_type: edge.edge_type || '',\n weight: edge.weight ?? 1,\n context: edge.context || {},\n is_active: true,\n is_bidirectional: edge.is_bidirectional,\n });\n }\n\n return edges;\n } catch (err) {\n console.warn(`[gateway] Failed to fetch edges for ${itemId}:`, err);\n return [];\n }\n}\n\nexport async function fetchVfsTree(\n path: string,\n maxDepth: number = 1,\n itemTypes?: string[],\n limit?: number,\n): Promise<VFSItem[]> {\n try {\n const params: Record<string, unknown> = {\n path,\n max_depth: maxDepth > 0 ? maxDepth : 999,\n };\n if (itemTypes?.length) params.item_types = itemTypes;\n if (limit) params.limit = limit;\n\n const response = await gatewayCall('tree', params);\n const items = extractItems(response);\n for (const item of items) {\n queryClient.setQueryData(vfsKeys.item(item.path), item);\n }\n return items;\n } catch (err) {\n console.error(`[gateway] Failed to fetch tree at ${path}:`, err);\n return [];\n }\n}\n\nexport async function fetchRecentActivity(\n scopePath: string,\n limit: number = 50,\n offset: number = 0,\n): Promise<any[]> {\n try {\n const response = await gatewayCall('recent-activity', {\n scope_path: scopePath,\n limit,\n offset,\n });\n return response.content?.items || response.items || response.entries || [];\n } catch (err) {\n console.error(`[gateway] Failed to fetch recent activity for ${scopePath}:`, err);\n return [];\n }\n}\n\nexport async function fetchItemHistory(\n itemId: string,\n limit: number = 50,\n offset: number = 0,\n): Promise<any> {\n try {\n const response = await gatewayCall('item-history', {\n item_id: itemId,\n limit,\n offset,\n });\n return {\n versions: response.content?.items || response.versions || [],\n total: response.total ?? 0,\n };\n } catch (err) {\n console.error(`[gateway] Failed to fetch item history for ${itemId}:`, err);\n return { versions: [], total: 0 };\n }\n}\n\nexport async function fetchMemberFocus(\n scopeId: string,\n itemTypes?: string[],\n limit?: number,\n): Promise<VFSItem[]> {\n try {\n const params: Record<string, unknown> = { scope_id: scopeId };\n if (itemTypes?.length) params.item_types = itemTypes;\n if (limit) params.limit = limit;\n\n const response = await gatewayCall('member-focus', params);\n const items = extractItems(response);\n for (const item of items) {\n queryClient.setQueryData(vfsKeys.item(item.path), item);\n }\n return items;\n } catch (err) {\n console.error(`[gateway] Failed to fetch member focus for scope ${scopeId}:`, err);\n return [];\n }\n}\n// \u2500\u2500 Open Envelope \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/**\n * Fetch the kernel's open envelope for an item.\n *\n * This is the primary way to open an item \u2014 it invokes the kernel's `open`\n * syscall which runs the CCM resolution pipeline and returns:\n * - Item identity (id, path, name, type)\n * - Render directives (which component to mount, with what props)\n * - Compatible components list (for \"Open With\" UX)\n * - Content extraction (for AI/programmatic consumers)\n *\n * The gateway processes `read_url_instructions` before returning, so\n * storage-backed items arrive with `render.props.url` already populated.\n *\n * Most consumers should use the `useOpen` hook instead. This function\n * exists for non-React contexts (Fractals, scripts, imperative code).\n *\n * @param path VFS path of the item to open.\n * @param options Optional mode, strategy, and arguments.\n */\nexport async function fetchOpenEnvelope(\n path: string,\n options?: OpenOptions,\n): Promise<OpenEnvelope> {\n const params: Record<string, unknown> = { path };\n if (options?.mode) params.mode = options.mode;\n if (options?.strategy) params.strategy = options.strategy;\n if (options?.arguments) params.arguments = options.arguments;\n const response = await gatewayCall('open', params);\n // Pass through the kernel response \u2014 it IS the envelope.\n // The gateway has already processed read_url_instructions and stripped\n // internal fields. The kernel is the source of truth for the shape.\n const r = response as unknown as OpenEnvelope;\n return {\n item_id: r.item_id,\n item_path: r.item_path,\n item_name: r.item_name,\n item_type: r.item_type,\n render: r.render,\n compatible_components: r.compatible_components ?? [],\n content: r.content,\n metadata: r.metadata,\n instructions: r.instructions,\n };\n}\n\n// \u2500\u2500 Items Query \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Filters for useItems / fetchItems. */\nexport interface ItemsFilter {\n /** Item type to query (required). */\n type: string;\n /** Scope path boundary. Defaults to session scope. */\n scope?: string;\n /** Direct parent_id filter. */\n parent_id?: string;\n /** Name ILIKE filter (partial match). */\n name?: string;\n /** Tag containment filter. */\n tag?: string;\n /** type_data field filters. Keys are field names, values are exact match. */\n fields?: Record<string, string | number | boolean>;\n /** Sort field. Default: 'updated_at'. */\n sort_by?: string;\n /** Sort direction. Default: 'desc'. */\n sort_dir?: 'asc' | 'desc';\n /** Max items to return. Default: 50. */\n limit?: number;\n /** Offset for pagination. Default: 0. */\n offset?: number;\n}\n\n/**\n * Fetch items by type with structured filters.\n * Calls kernel_query (gateway 'search' method) with the extended filter support.\n */\nexport async function fetchItems(filter: ItemsFilter): Promise<{\n items: VFSItem[];\n total_hint?: number;\n}> {\n const params: Record<string, unknown> = {\n item_type: filter.type,\n };\n\n if (filter.scope) {\n params.scope_path = filter.scope;\n }\n\n // Build the filters object for kernel_query\n const filters: Record<string, unknown> = {};\n if (filter.name) filters.name = filter.name;\n if (filter.tag) filters.tag = filter.tag;\n if (filter.parent_id) filters.parent_id = filter.parent_id;\n if (filter.sort_by) filters.sort_by = filter.sort_by;\n if (filter.sort_dir) filters.sort_dir = filter.sort_dir;\n if (filter.offset != null) filters.offset = filter.offset;\n\n // Map field.* filters\n if (filter.fields) {\n for (const [key, value] of Object.entries(filter.fields)) {\n filters[`field.${key}`] = String(value);\n }\n }\n\n if (Object.keys(filters).length > 0) {\n params.filters = filters;\n }\n\n if (filter.limit != null) {\n params.limit = filter.limit;\n }\n\n try {\n const response = await gatewayCall('search', params);\n const items = extractItems(response);\n // Cache individual items\n for (const item of items) {\n queryClient.setQueryData(vfsKeys.item(item.path), item);\n }\n return { items, total_hint: (response as any).total ?? response.content?.total ?? items.length };\n } catch (err) {\n console.error(`[gateway] Failed to fetch items of type ${filter.type}:`, err);\n return { items: [], total_hint: 0 };\n }\n}\n\n// \u2500\u2500 Channel Messages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** A parsed channel message with computed thread metadata from the kernel. */\nexport interface ChannelMessage {\n id: string;\n path: string;\n content: string;\n created_at: string;\n role: 'user' | 'assistant' | 'system';\n seq: number;\n principal_id?: string;\n reply_count: number;\n parent_message_id?: string;\n intent_card?: Record<string, unknown>;\n thread_summary?: Array<Record<string, unknown>>;\n}\n\n/**\n * Parse raw kernel message items into typed ChannelMessage objects.\n * Filters to item_type === 'message' and sorts by seq.\n */\nfunction parseChannelMessages(rawItems: Array<Record<string, unknown>>): ChannelMessage[] {\n return rawItems\n .filter(i => (i.item_type as string) === 'message')\n .map(i => {\n const td = (i.type_data as Record<string, unknown>) || {};\n let role: 'user' | 'assistant' | 'system' = 'user';\n if (td.role === 'assistant') role = 'assistant';\n else if (td.role === 'system') role = 'system';\n const metadata = (td.metadata as Record<string, unknown>) || {};\n return {\n id: (i.id as string) || '',\n path: (i.path as string) || '',\n content: (td.message as string) || (td.content as string) || '',\n created_at: (i.created_at as string) || '',\n role,\n seq: (td.seq as number) || 0,\n principal_id: td.principal_id as string | undefined,\n reply_count: (td.reply_count as number) || 0,\n parent_message_id: td.parent_message_id as string | undefined,\n intent_card: metadata.intent_card as Record<string, unknown> | undefined,\n thread_summary: Array.isArray(td.thread_summary) && td.thread_summary.length > 0\n ? td.thread_summary as Array<Record<string, unknown>>\n : undefined,\n };\n })\n .sort((a, b) => a.seq - b.seq);\n}\n\n/**\n * Fetch channel messages via the kernel's `get-channel-messages` method.\n *\n * Unlike `fetchVfsChildren` (which returns raw VFS items without computed\n * fields), this calls the kernel method that computes `reply_count` and\n * `thread_summary` on each message \u2014 the metadata needed for thread UX.\n *\n * @param channelPath VFS path of the channel\n * @param parentMessageId If set, returns thread replies for that parent.\n * If omitted, returns top-level messages.\n */\nexport async function fetchChannelMessages(\n channelPath: string,\n parentMessageId?: string,\n): Promise<ChannelMessage[]> {\n try {\n const params: Record<string, unknown> = { channel_path: channelPath };\n if (parentMessageId) params.parent_message_id = parentMessageId;\n\n const response = await gatewayCall('get-channel-messages', params);\n const raw = response as Record<string, unknown>;\n const items = (raw.messages as Array<Record<string, unknown>>)\n || (raw.content as Record<string, unknown>)?.items as Array<Record<string, unknown>>\n || (raw.items as Array<Record<string, unknown>>)\n || [];\n return parseChannelMessages(items);\n } catch (err) {\n console.error(\n `[gateway] Failed to fetch channel messages for ${channelPath}:`,\n err,\n );\n return [];\n }\n}\n\n// \u2500\u2500 Paginated Channel Messages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Response shape from fetchChannelMessagesPage. */\nexport interface ChannelMessagesPage {\n messages: ChannelMessage[];\n /** Mode returned by kernel: 'top_level' or 'thread'. */\n mode: 'top_level' | 'thread';\n}\n\n/**\n * Fetch a single page of channel messages with cursor-based pagination.\n *\n * Calls `get-channel-messages` which dispatches to `kernel_get_channel_messages_v2`.\n * The kernel supports:\n * - `limit` (default 50, max 200)\n * - `before_seq` \u2014 fetch messages with seq < value (for backward/older pagination)\n * - `after_seq` \u2014 fetch messages with seq > value (for forward/newer pagination)\n *\n * @param channelPath VFS path of the channel\n * @param parentMessageId If set, fetches thread replies (uses after_seq for forward paging)\n * @param limit Number of messages per page (default 50)\n * @param before_seq Cursor for backward pagination (top-level: load older)\n * @param after_seq Cursor for forward pagination (thread: load newer)\n */\nexport async function fetchChannelMessagesPage(\n channelPath: string,\n options?: {\n parentMessageId?: string;\n limit?: number;\n before_seq?: number;\n after_seq?: number;\n },\n): Promise<ChannelMessagesPage> {\n try {\n const params: Record<string, unknown> = { channel_path: channelPath };\n if (options?.parentMessageId) params.parent_message_id = options.parentMessageId;\n if (options?.limit) params.limit = options.limit;\n if (options?.before_seq != null) params.before_seq = options.before_seq;\n if (options?.after_seq != null) params.after_seq = options.after_seq;\n\n const response = await gatewayCall('get-channel-messages', params);\n const raw = response as Record<string, unknown>;\n const items = (raw.messages as Array<Record<string, unknown>>) || [];\n return {\n messages: parseChannelMessages(items),\n mode: (raw.mode as 'top_level' | 'thread') || 'top_level',\n };\n } catch (err) {\n console.error(\n `[gateway] Failed to fetch channel messages page for ${channelPath}:`,\n err,\n );\n return { messages: [], mode: 'top_level' };\n }\n}\n\n// \u2500\u2500 Cache Invalidation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function invalidateChildren(path: string): void {\n queryClient.invalidateQueries({ queryKey: vfsKeys.children(path) });\n}\n\nexport function invalidateItem(path: string): void {\n queryClient.invalidateQueries({ queryKey: vfsKeys.item(path) });\n}\n\nexport function invalidatePathAndParent(path: string, fallbackParent?: string): void {\n invalidateItem(path);\n invalidateChildren(path);\n const segments = path.split('/');\n segments.pop();\n const parentPath = segments.join('/') || fallbackParent;\n if (parentPath) {\n invalidateChildren(parentPath);\n }\n}\n\nexport function invalidateSubtree(path: string): void {\n const prefix = path + '/';\n queryClient.invalidateQueries({\n predicate: (query) => {\n const key = query.queryKey;\n if (key[0] !== 'vfs') return false;\n return key.some(\n (segment) =>\n typeof segment === 'string' && (segment === path || segment.startsWith(prefix)),\n );\n },\n });\n}\n\nexport function invalidateAllVfs(): void {\n queryClient.invalidateQueries({ queryKey: vfsKeys.all() });\n}\n\nexport function invalidateTypes(scopeId?: string): void {\n queryClient.invalidateQueries({ queryKey: vfsKeys.types(scopeId) });\n}\n\n/**\n * Invalidate cached channel messages.\n * If channelPath is provided, invalidates that channel's messages.\n * If not, invalidates all channel-messages queries.\n */\nexport function invalidateChannelMessages(channelPath?: string, parentMessageId?: string): void {\n if (channelPath) {\n queryClient.invalidateQueries({ queryKey: vfsKeys.channelMessages(channelPath, parentMessageId) });\n } else {\n queryClient.invalidateQueries({ queryKey: vfsKeys.allChannelMessages() });\n }\n}\n\n/**\n * Invalidate cached open envelopes.\n * If path is provided, invalidates that path's envelope (all strategies).\n * If not, invalidates all open-envelope queries.\n */\nexport function invalidateOpenEnvelope(path?: string, strategy?: string): void {\n if (path && strategy) {\n queryClient.invalidateQueries({ queryKey: vfsKeys.openEnvelope(path, strategy) });\n } else if (path) {\n queryClient.invalidateQueries({\n predicate: (query) => {\n const key = query.queryKey;\n // Key structure: ['vfs', scopeKey, 'open', path, strategy]\n return key[0] === 'vfs' && key[2] === 'open' && key[3] === path;\n },\n });\n } else {\n queryClient.invalidateQueries({ queryKey: vfsKeys.allOpenEnvelopes() });\n }\n}\n", "/**\n * @fsaos/gateway \u2014 WebSocket Transport Layer\n *\n * Replaces the SSE transport with a bidirectional WebSocket connection.\n * Provides per-scope subscription routing (fixing the cross-account data leak)\n * and supports upstream events (presence, typing, edits).\n *\n * Public API:\n * - subscribeToPath(path, callback) \u2192 unsubscribe\n * - subscribeToEvents(eventType, callback, filter?) \u2192 unsubscribe\n * - disconnectSSE() \u2014 tear down connection and clear all state\n *\n * Additionally exposes:\n * - emitEvent(scopeId, eventType, payload) \u2014 upstream events\n * - subscribeToScope(scopeId, eventTypes) \u2014 explicit scope subscription\n *\n * Lifecycle:\n * - Connection is only opened when there are active scope or path subscriptions\n * - While the browser tab is visible, a 30s ping keeps the connection alive\n * - When the tab is hidden, pings stop and the connection is allowed to die\n * - When the tab becomes visible again, the connection is re-established\n * - Connection attempts have a 10s timeout to prevent stuck promises\n */\n\nimport { getAccessToken, registerCleanup } from './session';\nimport { GATEWAY_URL } from './config';\n\n// \u2500\u2500 Debug logging (production-safe \u2014 only logs in dev or when explicitly enabled) \u2500\n\nconst DEBUG =\n typeof window !== 'undefined' &&\n (window.location?.hostname === 'localhost' ||\n window.location?.hostname === '127.0.0.1' ||\n (window as any).__FSAOS_WS_DEBUG__);\n\nfunction log(...args: any[]): void {\n if (DEBUG) console.log('[WS]', ...args);\n}\n\n// \u2500\u2500 State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet ws: WebSocket | null = null;\nlet connectionInFlight: Promise<void> | null = null;\nlet reconnectTimer: ReturnType<typeof setTimeout> | null = null;\nlet reconnectAttempts = 0;\nconst MAX_RECONNECT_DELAY = 30000; // 30s max backoff\nconst CONNECTION_TIMEOUT_MS = 10_000; // 10s connection timeout\nlet intentionalClose = false;\n\n// \u2500\u2500 Ping / Visibility Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst PING_INTERVAL_MS = 30_000; // 30 seconds\nlet pingInterval: ReturnType<typeof setInterval> | null = null;\nlet visibilityListenerAttached = false;\n\nfunction startPing(): void {\n stopPing();\n pingInterval = setInterval(() => {\n sendMessage({ type: 'ping' });\n }, PING_INTERVAL_MS);\n}\n\nfunction stopPing(): void {\n if (pingInterval) {\n clearInterval(pingInterval);\n pingInterval = null;\n }\n}\n\nfunction handleVisibilityChange(): void {\n if (typeof document === 'undefined') return;\n\n if (document.hidden) {\n // Tab hidden \u2014 stop pinging, let the connection die naturally.\n stopPing();\n } else {\n // Tab visible again \u2014 reconnect if we have active subscriptions.\n if (hasActiveSubscriptions()) {\n log('Tab visible, reconnecting...');\n ensureConnection();\n }\n }\n}\n\nfunction attachVisibilityListener(): void {\n if (visibilityListenerAttached) return;\n if (typeof document === 'undefined') return;\n document.addEventListener('visibilitychange', handleVisibilityChange);\n visibilityListenerAttached = true;\n}\n\n// \u2500\u2500 Path-based listeners (backward compat with subscribeToPath) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst pathListeners: Record<string, Array<(data: any) => void>> = {};\n\n// \u2500\u2500 Type-based listeners (subscribeToEvents) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface TypedListener {\n eventType: string;\n callback: (data: any) => void;\n filter?: (data: any) => boolean;\n}\n\nconst typedListeners: TypedListener[] = [];\n\n// \u2500\u2500 Scope subscriptions (sent to server after connect) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface ScopeSubscription {\n scope_id: string;\n event_types: string[];\n}\n\ninterface PathSubscription {\n path: string;\n event_types: string[];\n}\n\nconst activeScopes: Map<string, ScopeSubscription> = new Map();\nconst activePaths: Map<string, PathSubscription> = new Map();\n\n// \u2500\u2500 Connection management \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction hasListeners(): boolean {\n const hasPath = Object.keys(pathListeners).some(\n (k) => pathListeners[k] && pathListeners[k].length > 0,\n );\n return hasPath || typedListeners.length > 0;\n}\n\n/**\n * Returns true if there are active scope or path subscriptions registered.\n */\nfunction hasActiveSubscriptions(): boolean {\n return activeScopes.size > 0 || activePaths.size > 0;\n}\n\nasync function ensureConnection(): Promise<void> {\n // Guard: don't open a connection if there's nothing to subscribe to.\n if (!hasActiveSubscriptions()) {\n log('ensureConnection: no active subscriptions, skipping');\n return;\n }\n\n // Already connected\n if (ws && ws.readyState === WebSocket.OPEN) {\n log('ensureConnection: already open');\n return;\n }\n\n // Connection attempt already in progress \u2014 wait for it\n if (connectionInFlight) {\n log('ensureConnection: connection already in flight, waiting...');\n return connectionInFlight;\n }\n\n // If there's a stale WS in CONNECTING or CLOSING state, kill it\n if (ws) {\n log('ensureConnection: killing stale WS in state', ws.readyState);\n try { ws.close(); } catch (_e) { /* ignore */ }\n ws = null;\n }\n\n // Clear intentionalClose flag \u2014 we're actively trying to connect\n intentionalClose = false;\n\n connectionInFlight = (async () => {\n try {\n const config =\n (typeof window !== 'undefined' && (window as any).__FSAOS_CONFIG__) || {};\n const gatewayUrl = GATEWAY_URL;\n const embedToken = config.embedToken || null;\n\n // Resolve auth token\n let token = embedToken;\n if (!token) {\n token = await getAccessToken();\n }\n\n if (!token) {\n log('ensureConnection: no token available, will retry');\n scheduleReconnect();\n return;\n }\n\n // Build WebSocket URL\n const wsProtocol = gatewayUrl.startsWith('https') ? 'wss' : 'ws';\n const wsHost = gatewayUrl.replace(/^https?:\\/\\//, '');\n let wsUrl = `${wsProtocol}://${wsHost}/ws`;\n wsUrl += `?token=${encodeURIComponent(token)}`;\n\n log('ensureConnection: opening WS to', wsUrl.substring(0, 50) + '...');\n ws = new WebSocket(wsUrl);\n\n await new Promise<void>((resolve, reject) => {\n if (!ws) return reject(new Error('WebSocket not created'));\n\n // Connection timeout \u2014 prevents stuck promises\n const timeout = setTimeout(() => {\n log('ensureConnection: TIMEOUT after', CONNECTION_TIMEOUT_MS, 'ms');\n if (ws && ws.readyState !== WebSocket.OPEN) {\n try { ws.close(); } catch (_e) { /* ignore */ }\n ws = null;\n }\n reject(new Error('WebSocket connection timeout'));\n }, CONNECTION_TIMEOUT_MS);\n\n ws.onopen = () => {\n clearTimeout(timeout);\n log('ensureConnection: CONNECTED');\n reconnectAttempts = 0;\n // Re-subscribe to all active scopes and paths\n resubscribeAll();\n // Start keepalive pings (only while tab is visible)\n if (typeof document === 'undefined' || !document.hidden) {\n startPing();\n }\n // Ensure visibility listener is attached for lifecycle management\n attachVisibilityListener();\n resolve();\n };\n\n ws.onmessage = (event) => {\n handleMessage(event.data);\n };\n\n ws.onerror = () => {\n log('ensureConnection: WS error event');\n // Error is followed by close, so we handle reconnect there\n };\n\n ws.onclose = (event) => {\n clearTimeout(timeout);\n log('ensureConnection: WS closed, code:', event.code, 'reason:', event.reason);\n ws = null;\n stopPing();\n if (!intentionalClose && hasActiveSubscriptions()) {\n scheduleReconnect();\n }\n reject(new Error(`WebSocket closed: ${event.code}`));\n };\n });\n } catch (e: any) {\n log('ensureConnection: failed -', e?.message || e);\n // Connection failed \u2014 reconnect will be scheduled by onclose handler\n // (or by the no-token path above)\n } finally {\n connectionInFlight = null;\n }\n })();\n\n return connectionInFlight;\n}\n\nfunction scheduleReconnect(): void {\n if (reconnectTimer) return;\n // Don't reconnect if the tab is hidden \u2014 we'll reconnect on visibility change\n if (typeof document !== 'undefined' && document.hidden) return;\n\n // Exponential backoff with jitter\n const delay = Math.min(\n 1000 * Math.pow(2, reconnectAttempts) + Math.random() * 1000,\n MAX_RECONNECT_DELAY,\n );\n reconnectAttempts++;\n log('scheduleReconnect: attempt', reconnectAttempts, 'in', Math.round(delay), 'ms');\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n if (hasActiveSubscriptions()) {\n ensureConnection();\n }\n }, delay);\n}\n\nfunction resubscribeAll(): void {\n // Re-send scope subscriptions\n for (const sub of activeScopes.values()) {\n log('resubscribeAll: scope', sub.scope_id);\n sendMessage({ type: 'subscribe', scope_id: sub.scope_id, event_types: sub.event_types });\n }\n // Re-send path subscriptions\n for (const sub of activePaths.values()) {\n log('resubscribeAll: path', sub.path);\n sendMessage({ type: 'subscribe_path', path: sub.path, event_types: sub.event_types });\n }\n}\n\nfunction sendMessage(msg: Record<string, unknown>): void {\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(msg));\n }\n}\n\nfunction handleMessage(raw: string): void {\n try {\n const msg = JSON.parse(raw);\n\n // Protocol-level messages (ack, error, pong) \u2014 ignore for now\n if (msg.type === 'subscribed' || msg.type === 'subscribed_path' ||\n msg.type === 'unsubscribed' || msg.type === 'unsubscribed_path' ||\n msg.type === 'pong') {\n return;\n }\n\n if (msg.type === 'error') {\n console.warn('[WS] Server error:', msg.message);\n return;\n }\n\n // Event messages\n if (msg.type === 'event' || msg.event_type) {\n const eventType = msg.event_type || 'message';\n const data = msg.data || msg;\n\n // Path-based dispatch\n if (data.path && pathListeners[data.path]) {\n pathListeners[data.path].forEach((cb) => cb(data));\n }\n if (pathListeners['*']) {\n pathListeners['*'].forEach((cb) => cb(data));\n }\n\n // Type-based dispatch\n for (const entry of typedListeners) {\n if (entry.eventType !== '*' && entry.eventType !== eventType) continue;\n if (entry.filter && !entry.filter(data)) continue;\n entry.callback(data);\n }\n }\n } catch (_e) {\n /* ignore parse errors */\n }\n}\n\nfunction maybeDisconnect(): void {\n if (!hasListeners() && activeScopes.size === 0 && activePaths.size === 0 && ws) {\n intentionalClose = true;\n stopPing();\n ws.close();\n ws = null;\n intentionalClose = false;\n }\n}\n\n// \u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Subscribe to events for a specific VFS path (token_stream routing).\n * Lazily connects to the gateway's /ws endpoint on first subscription.\n * Returns an unsubscribe function.\n */\nexport function subscribeToPath(\n path: string,\n callback: (data: any) => void,\n): () => void {\n if (!pathListeners[path]) {\n pathListeners[path] = [];\n }\n pathListeners[path].push(callback);\n\n // Register path subscription with the server\n if (!activePaths.has(path)) {\n activePaths.set(path, { path, event_types: ['token_stream'] });\n // If WS is already open, send immediately; otherwise resubscribeAll handles it on connect\n if (ws && ws.readyState === WebSocket.OPEN) {\n sendMessage({ type: 'subscribe_path', path, event_types: ['token_stream'] });\n }\n }\n\n ensureConnection();\n\n return () => {\n const listeners = pathListeners[path];\n if (listeners) {\n const idx = listeners.indexOf(callback);\n if (idx !== -1) listeners.splice(idx, 1);\n if (listeners.length === 0) {\n delete pathListeners[path];\n activePaths.delete(path);\n sendMessage({ type: 'unsubscribe_path', path });\n }\n }\n maybeDisconnect();\n };\n}\n\n/**\n * Subscribe to events by type with optional filter predicate.\n * The WebSocket connection is shared \u2014 one connection, many consumers.\n *\n * NOTE: This does NOT open a connection by itself. A scope or path subscription\n * must exist for the connection to be established.\n */\nexport function subscribeToEvents(\n eventType: string | string[],\n callback: (data: any) => void,\n filter?: (data: any) => boolean,\n): () => void {\n const types = Array.isArray(eventType) ? eventType : [eventType];\n const entries: TypedListener[] = types.map(t => ({ eventType: t, callback, filter }));\n typedListeners.push(...entries);\n\n // Only trigger connection if there are active scope/path subscriptions.\n // subscribeToEvents alone should not open a connection \u2014 it's a local listener.\n if (hasActiveSubscriptions()) {\n ensureConnection();\n }\n\n return () => {\n for (const entry of entries) {\n const idx = typedListeners.indexOf(entry);\n if (idx !== -1) typedListeners.splice(idx, 1);\n }\n maybeDisconnect();\n };\n}\n\n/**\n * Subscribe to a scope for VFS/CCM change events.\n * This is the primary subscription mechanism for per-account isolation.\n * Opening a scope subscription is what triggers the WebSocket connection.\n */\nexport function subscribeToScope(\n scopeId: string,\n eventTypes: string[] = ['vfs_change', 'ccm_change'],\n): () => void {\n log('subscribeToScope:', scopeId, eventTypes);\n activeScopes.set(scopeId, { scope_id: scopeId, event_types: eventTypes });\n // If WS is already open, send immediately; otherwise resubscribeAll handles it on connect\n if (ws && ws.readyState === WebSocket.OPEN) {\n sendMessage({ type: 'subscribe', scope_id: scopeId, event_types: eventTypes });\n }\n ensureConnection();\n\n return () => {\n activeScopes.delete(scopeId);\n sendMessage({ type: 'unsubscribe', scope_id: scopeId });\n maybeDisconnect();\n };\n}\n\n/**\n * Emit an upstream event to other clients subscribed to the same scope.\n * Used for presence, typing indicators, cursor positions, etc.\n */\nexport function emitEvent(\n scopeId: string,\n eventType: string,\n payload: Record<string, unknown> = {},\n): void {\n sendMessage({ type: 'emit', scope_id: scopeId, event_type: eventType, payload });\n}\n\n/**\n * Disconnect the WebSocket and clear all listeners.\n * Backward-compatible name with sse.ts.\n */\nexport function disconnectSSE(): void {\n log('disconnectSSE: tearing down');\n intentionalClose = true;\n stopPing();\n if (ws) {\n ws.close();\n ws = null;\n }\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n connectionInFlight = null;\n intentionalClose = false;\n reconnectAttempts = 0;\n\n // Clear all listeners\n for (const key of Object.keys(pathListeners)) {\n delete pathListeners[key];\n }\n typedListeners.length = 0;\n activeScopes.clear();\n activePaths.clear();\n}\n\n/**\n * Send a ping to keep the connection alive.\n * Normally handled automatically by the visibility-aware lifecycle,\n * but exposed for manual use if needed.\n */\nexport function ping(): void {\n sendMessage({ type: 'ping' });\n}\n\n// Register with the SDK-wide cleanup registry so signOut() tears down WS.\nregisterCleanup(disconnectSSE);\n", "/**\n * @fsaos/gateway \u2014 VFS Realtime (WebSocket Transport)\n *\n * Subscribes to VFS change events via the gateway WebSocket and invalidates\n * the corresponding TanStack Query caches.\n *\n * Subscription model:\n * - At login: subscribe to the logged-in account's item ID\n * - On mount: subscribe to additional account/space item IDs\n * - On unmount: unsubscribe from those IDs\n *\n * The gateway routes vfs_change events by account_item_id and space_item_id.\n * The client subscribes to account IDs and receives all VFS changes for items\n * belonging to those accounts.\n *\n * Lifecycle:\n * 1. initVfsRealtimeWs(accountId) \u2014 subscribe to account's vfs_change events\n * 2. mountRealtimeScope(id) \u2014 subscribe to an additional account/space\n * 3. unmountRealtimeScope(id) \u2014 unsubscribe from a mounted scope\n * 4. disposeVfsRealtimeWs() \u2014 unsubscribe all and clear timers\n *\n * Invalidation strategy:\n * - INSERT/UPDATE: set item data directly + invalidate parent's children list\n * - DELETE: remove item queries + invalidate parent's children list\n * - Tree queries: invalidate any tree whose root is an ancestor of the changed path\n */\n\nimport { subscribeToScope, subscribeToEvents } from './ws';\nimport { registerCleanup } from './session';\nimport { queryClient } from './query-client';\nimport { vfsKeys } from './vfs-keys';\nimport { normalizeItem } from './vfs';\n\n// \u2500\u2500 State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Map of subscribed scope IDs \u2192 their unsubscribe functions */\nconst activeScopeSubs = new Map<string, () => void>();\nlet unsubEvents: (() => void) | null = null;\nconst debounceTimers = new Map<string, ReturnType<typeof setTimeout>>();\nconst DEBOUNCE_MS = 250;\n\n// \u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Subscribe to VFS realtime events for the primary account via the gateway WebSocket.\n * Automatically invalidates TanStack Query caches when items change.\n *\n * @param accountId - The account_item_id (primary logged-in account UUID)\n */\nexport function initVfsRealtimeWs(accountId: string): void {\n // Clean up any existing subscriptions\n disposeVfsRealtimeWs();\n\n // Subscribe to the primary account scope\n mountRealtimeScope(accountId);\n\n // Listen for vfs_change events and apply cache invalidation\n // No client-side scope filter \u2014 the gateway already routes by account_item_id/space_item_id\n unsubEvents = subscribeToEvents(\n 'vfs_change',\n (data: any) => handleVfsChange(data),\n );\n}\n\n/**\n * Mount an additional scope (account or space) for realtime events.\n * Call this when the user mounts a new account or space.\n *\n * @param scopeId - The account_item_id or space_item_id to subscribe to\n */\nexport function mountRealtimeScope(scopeId: string): void {\n if (activeScopeSubs.has(scopeId)) return; // Already subscribed\n\n const unsub = subscribeToScope(scopeId, ['vfs_change', 'ccm_change']);\n activeScopeSubs.set(scopeId, unsub);\n}\n\n/**\n * Unmount a scope (account or space) from realtime events.\n * Call this when the user unmounts an account or space.\n *\n * @param scopeId - The account_item_id or space_item_id to unsubscribe from\n */\nexport function unmountRealtimeScope(scopeId: string): void {\n const unsub = activeScopeSubs.get(scopeId);\n if (unsub) {\n unsub();\n activeScopeSubs.delete(scopeId);\n }\n}\n\n/**\n * Tear down all VFS realtime WebSocket subscriptions.\n */\nexport function disposeVfsRealtimeWs(): void {\n // Unsubscribe from all scopes\n for (const [, unsub] of activeScopeSubs) {\n unsub();\n }\n activeScopeSubs.clear();\n\n if (unsubEvents) {\n unsubEvents();\n unsubEvents = null;\n }\n debounceTimers.forEach((timer) => clearTimeout(timer));\n debounceTimers.clear();\n}\n\n// Register with the SDK-wide cleanup registry so signOut() tears down the subscription.\nregisterCleanup(disposeVfsRealtimeWs);\n\n// \u2500\u2500 Event Handling \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction handleVfsChange(data: any): void {\n const path = data.path;\n const action = data.action; // 'insert', 'update', 'delete'\n\n if (!path) return;\n\n // Derive parent path\n const segments = path.split('/');\n segments.pop();\n const parentPath = segments.join('/') || '/root';\n\n // Debounce by parentPath to avoid cache invalidation storms\n const existing = debounceTimers.get(parentPath);\n if (existing) clearTimeout(existing);\n\n const timer = setTimeout(() => {\n debounceTimers.delete(parentPath);\n applyInvalidation(action, path, data, parentPath);\n }, DEBOUNCE_MS);\n\n debounceTimers.set(parentPath, timer);\n}\n\nfunction applyInvalidation(\n action: string,\n path: string,\n data: any,\n parentPath: string,\n): void {\n const upperAction = (action || '').toUpperCase();\n\n if (upperAction === 'DELETE') {\n // Remove the item from cache entirely\n queryClient.removeQueries({ queryKey: vfsKeys.item(path) });\n queryClient.removeQueries({ queryKey: vfsKeys.children(path) });\n queryClient.removeQueries({ queryKey: vfsKeys.tree(path) });\n } else if (data.item_id) {\n // For INSERT/UPDATE, if we have enough data, set it directly in cache\n // This gives instant UI updates without a refetch\n try {\n const record = {\n id: data.item_id,\n path: data.path,\n name: data.name,\n item_type: data.item_type,\n parent_id: data.parent_id,\n scope_item_id: data.scope_item_id,\n };\n const normalized = normalizeItem(record);\n if (normalized && normalized.id) {\n queryClient.setQueryData(vfsKeys.item(path), normalized);\n }\n } catch (_e) {\n // If normalization fails, just invalidate below\n }\n }\n\n // Always invalidate the parent's children list (triggers refetch for useList)\n queryClient.invalidateQueries({ queryKey: vfsKeys.children(parentPath) });\n\n // Invalidate any tree queries that include this path\n queryClient.invalidateQueries({\n predicate: (query) => {\n const key = query.queryKey;\n if (key[0] !== 'vfs' || key[1] !== 'tree') return false;\n const treePath = key[2] as string;\n return path.startsWith(treePath + '/') || path === treePath;\n },\n });\n\n // Invalidate item-by-id if we have the id\n if (data.item_id) {\n queryClient.invalidateQueries({ queryKey: vfsKeys.itemById(data.item_id) });\n }\n}\n", "/**\n * @fsaos/gateway \u2014 Edge Runtime\n *\n * This module provides the edge-specific runtime features:\n * 1. Imperative VFS functions (readItem, listChildren, createItem, etc.)\n * 2. callTool, pushChanges, getAssetUrl\n * 3. Auth facade (signIn, signOut, etc.)\n * 4. require() shim mapping bare specifiers to window globals\n * 5. __FSAOS_MOUNT__ mount logic (reads __FSAOS_COMPONENT__, wraps in\n * QueryClientProvider, creates React root)\n *\n * This module is imported by the main index.ts and its exports become part\n * of window.__FSAOS_GATEWAY__. The build script's footer code then sets up\n * the require shim and mount logic using these exports.\n */\n\nimport { createElement } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { QueryClientProvider } from '@tanstack/react-query';\nimport { gatewayCall } from './client';\nimport { queryClient } from './query-client';\nimport { normalizeItem } from './vfs';\nimport { supabase } from './config';\nimport { resetAllSdkState } from './session';\nimport { subscribeToPath, disconnectSSE } from './ws';\n\n// \u2500\u2500 Imperative VFS Functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// These mirror the old runtime's direct function calls.\n// They use the SDK's gatewayCall under the hood.\n\nexport function readItem(path: string) {\n return gatewayCall('read', { path });\n}\n\nexport function listChildren(path: string, options?: Record<string, unknown>) {\n return gatewayCall('list', { path, ...options });\n}\n\nexport function createItem(params: Record<string, unknown>) {\n return gatewayCall('create', params);\n}\n\nexport function updateItem(params: Record<string, unknown>) {\n return gatewayCall('update', params);\n}\n\nexport function pushChanges(params: Record<string, unknown>) {\n return gatewayCall('create', params); // create is the generic push\n}\n\nexport function callTool(toolName: string, params?: Record<string, unknown>) {\n const config = (typeof window !== 'undefined' && (window as any).__FSAOS_CONFIG__) || {};\n const scopePath = config.scopePath || '';\n return gatewayCall('tools/call', {\n name: toolName,\n instance_path: scopePath,\n ...(params || {}),\n });\n}\n\nexport function signal(targetId: string, eventName: string, payload?: Record<string, unknown>) {\n return gatewayCall('signal', { target_id: targetId, event_name: eventName, payload: payload || {} });\n}\n\nexport function getAssetUrl(path: string): string {\n const config = (typeof window !== 'undefined' && (window as any).__FSAOS_CONFIG__) || {};\n return (config.edgeBaseUrl || '') + path;\n}\n\n// \u2500\u2500 Auth Facade \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Imperative auth functions for non-React code.\n\nexport const auth = {\n signIn: (opts: any) => {\n if (opts.provider) {\n return supabase.auth.signInWithOAuth({\n provider: opts.provider,\n options: { redirectTo: opts.redirectTo || window.location.href },\n });\n }\n return supabase.auth.signInWithPassword({\n email: opts.email,\n password: opts.password,\n });\n },\n signUp: (opts: any) => {\n return supabase.auth.signUp({\n email: opts.email,\n password: opts.password,\n options: { data: opts.metadata || {} },\n });\n },\n signOut: async () => {\n await supabase.auth.signOut();\n resetAllSdkState();\n queryClient.clear();\n },\n getSession: () => supabase.auth.getSession().then((r: any) => r.data.session),\n getUser: () => supabase.auth.getUser().then((r: any) => r.data.user),\n onAuthStateChange: (callback: (data: any) => void) => {\n const { data: { subscription } } = supabase.auth.onAuthStateChange(\n (event: string, session: any) => {\n callback({ event, session, user: session?.user ?? null });\n },\n );\n return () => subscription?.unsubscribe();\n },\n resetPassword: (email: string) => supabase.auth.resetPasswordForEmail(email),\n signInWithMagicLink: (email: string, redirectTo?: string) => {\n return supabase.auth.signInWithOtp({\n email,\n options: { emailRedirectTo: redirectTo || window.location.href },\n });\n },\n};\n\n// Re-export SSE\nexport { subscribeToPath, disconnectSSE };\n\n// \u2500\u2500 Mount Logic \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Mount the root component into #root.\n * Reads window.__FSAOS_COMPONENT__, wraps in QueryClientProvider,\n * and renders via React 18+ createRoot.\n */\nexport function mount(): void {\n const rootEl = document.getElementById('root');\n if (!rootEl) return;\n\n try {\n const comp = (window as any).__FSAOS_COMPONENT__;\n if (!comp) {\n rootEl.innerHTML =\n '<div style=\"padding:2rem;color:#ef4444;font-family:system-ui\">' +\n '<h2>Component Error</h2><pre>No component found. The bundle may have failed to load.</pre></div>';\n return;\n }\n\n const RootComponent = comp.default || comp;\n\n // For view mode, pass the item data as props\n const itemData = (window as any).__FSAOS_ITEM_DATA__ || null;\n const props = itemData ? { item: itemData, ...itemData } : {};\n\n const root = createRoot(rootEl);\n root.render(\n createElement(QueryClientProvider, { client: queryClient },\n createElement(RootComponent, props),\n ),\n );\n } catch (err: any) {\n console.error('[FSAOS] Failed to mount root component:', err);\n rootEl.innerHTML =\n '<div style=\"padding:2rem;color:#ef4444;font-family:system-ui\">' +\n '<h2>Component Error</h2><pre>' + (err.message || err) + '</pre></div>';\n }\n}\n\n/**\n * Set up the require() shim and window globals.\n * Called by the build script's footer after the IIFE assigns window.__FSAOS_GATEWAY__.\n */\nexport function setupRequireShim(): void {\n const R = (window as any).React;\n const RD = (window as any).ReactDOM;\n const gateway = (window as any).__FSAOS_GATEWAY__;\n const ui = (window as any).__FSAOS_UI__;\n\n if (!gateway) {\n console.error('[FSAOS] Cannot set up require shim: __FSAOS_GATEWAY__ not found');\n return;\n }\n\n const modules: Record<string, any> = {\n 'react': R,\n 'react-dom': RD,\n 'react-dom/client': RD,\n 'react/jsx-runtime': {\n jsx: R?.createElement,\n jsxs: R?.createElement,\n Fragment: R?.Fragment,\n },\n '@fsaos/react': gateway,\n '@fsaos/gateway': gateway,\n '@fsaos/ui': ui || {},\n };\n\n (window as any).require = function fsaosRequire(name: string) {\n if (modules[name]) return modules[name];\n throw new Error('[FSAOS] Module not found: ' + name);\n };\n\n // Set __FSAOS_MOUNT__\n (window as any).__FSAOS_MOUNT__ = gateway.mount;\n}\n", "/**\n * @fsaos/gateway \u2014 React Hooks\n *\n * All hooks are thin wrappers around TanStack Query's useQuery/useMutation,\n * using the VFS fetch functions and the shared queryClient.\n *\n * Read hooks: useItem, useItemById, useList, useTree, useSearch, useEdges, useTypes, useType, useOpen\n * Convenience hooks: useChildren (alias for useList), useScope, useAuth, useTypeHelpers\n * Data hooks: useMemberFocus, useItemHistory, useRecentActivity, useChannelMessages\n * Component hooks: useAsset, useComponent, useTheme, usePermission, usePrincipal\n * Mutation hooks: useCreate, useUpdate, useDelete, useMove, useLink, useMutation\n * Realtime hooks: useEventStream, useRealtimeQuery\n */\n\nimport React, { useState, useEffect, useRef, useCallback, useMemo, createElement, useSyncExternalStore } from 'react';\nimport * as ReactDOM from 'react-dom';\nimport * as JsxRuntime from 'react/jsx-runtime';\nimport { useQuery, useInfiniteQuery, useMutation as useTanstackMutation, useQueryClient } from '@tanstack/react-query';\nimport { subscribeToEvents } from './ws';\nimport { gatewayCall } from './client';\nimport { vfsKeys } from './vfs-keys';\nimport { normalizeItem } from './vfs';\nimport {\n fetchVfsItem,\n fetchVfsItemById,\n fetchVfsChildren,\n fetchVfsChildrenPage,\n fetchVfsTree,\n fetchEdgesForItem,\n fetchTypeDefinitions,\n fetchItems,\n fetchMemberFocus,\n fetchRecentActivity,\n fetchItemHistory,\n fetchChannelMessages,\n fetchOpenEnvelope,\n fetchChannelMessagesPage,\n} from './vfs';\nimport type { ItemsFilter, ChannelMessage, ChannelMessagesPage } from './vfs';\nimport { supabase } from './config';\nimport { initSession, setScope, getScope, getScopeVersion, subscribeScope, isScopeReady, resetAllSdkState, registerCleanup } from './session';\nimport { initVfsRealtimeWs, mountRealtimeScope, unmountRealtimeScope } from './vfs-realtime-ws';\nimport { queryClient } from './query-client';\nimport type {\n VFSItem,\n VFSEdge,\n TypeDefinition,\n CreateParams,\n UpdateParams,\n DeleteParams,\n MoveParams,\n LinkParams,\n OpenEnvelope,\n OpenOptions,\n} from './types';\n\n// \u2500\u2500 Scope Reactivity \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Internal hook that subscribes to scope changes via useSyncExternalStore.\n * Forces a re-render whenever setScope() is called, which causes all\n * vfsKeys.*() calls in the render tree to produce updated query keys\n * (because they internally call getScope()). This is the bridge between\n * the imperative scope module and React's render cycle.\n *\n * Returns the current scope version number (useful for debugging, but the\n * primary purpose is the subscription side-effect).\n */\nfunction useScopeKey(): number {\n return useSyncExternalStore(subscribeScope, getScopeVersion, getScopeVersion);\n}\n\n/**\n * Returns whether scope has been established. Useful for gating UI that\n * depends on scope-aware data.\n */\nexport function useScopeReady(): boolean {\n // Subscribe to scope changes so we re-render when scope transitions null \u2192 set\n useScopeKey();\n return isScopeReady();\n}\n\n// \u2500\u2500 Read Hooks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Fetch a single VFS item by path. Disabled when path is falsy. */\nexport function useItem(path: string | undefined | null) {\n useScopeKey(); // re-render on scope change \u2192 query key updates\n return useQuery({\n queryKey: vfsKeys.item(path!),\n queryFn: () => fetchVfsItem(path!),\n enabled: !!path,\n });\n}\n\n/** Fetch a single VFS item by its UUID. Disabled when id is falsy. */\nexport function useItemById(id: string | undefined | null) {\n useScopeKey();\n return useQuery({\n queryKey: vfsKeys.itemById(id!),\n queryFn: () => fetchVfsItemById(id!),\n enabled: !!id,\n });\n}\n\n/** Fetch children of a VFS path. Disabled when path is falsy. */\nexport function useList(path: string | undefined | null) {\n useScopeKey();\n return useQuery({\n queryKey: vfsKeys.children(path!),\n queryFn: () => fetchVfsChildren(path!),\n enabled: !!path,\n });\n}\n\n/**\n * Fetch children of a VFS path. Returns { children, ...queryResult }.\n * Convenience wrapper around useList that renames `data` to `children`.\n */\nexport function useChildren(path: string | undefined | null) {\n const query = useList(path);\n return {\n ...query,\n children: query.data ?? [],\n };\n}\n\n/** Fetch a recursive tree starting at a path. */\nexport function useTree(path: string | undefined | null, depth: number = 1) {\n useScopeKey();\n return useQuery({\n queryKey: vfsKeys.tree(path!, depth),\n queryFn: () => fetchVfsTree(path!, depth),\n enabled: !!path,\n });\n}\n\n/** Search VFS items by query string, optionally filtered by item types. */\nexport function useSearch(query: string | undefined | null, itemTypes?: string[]) {\n useScopeKey();\n return useQuery({\n queryKey: vfsKeys.search(query!, itemTypes),\n queryFn: async () => {\n const params: Record<string, unknown> = { query: query! };\n if (itemTypes?.length) params.item_types = itemTypes;\n const response = await gatewayCall('search', params);\n return (response.content?.items || response.items || []).map(normalizeItem);\n },\n enabled: !!query && query.length > 0,\n });\n}\n\n/** Fetch items by type with structured filters. */\nexport function useItems(filter: ItemsFilter | null | undefined) {\n useScopeKey();\n const stableFilter = useMemo(() => filter, [JSON.stringify(filter)]);\n return useQuery({\n queryKey: vfsKeys.items(\n stableFilter?.type ?? '',\n stableFilter as unknown as Record<string, unknown> | undefined,\n ),\n queryFn: () => fetchItems(stableFilter!),\n enabled: !!stableFilter?.type,\n select: (result) => result.items,\n });\n}\n\n/** Infinite-scroll item fetching by type. */\nexport function useInfiniteItems(filter: ItemsFilter | null | undefined) {\n useScopeKey();\n const PAGE_SIZE = filter?.limit ?? 20;\n const stableFilter = useMemo(() => filter, [JSON.stringify(filter)]);\n\n const query = useInfiniteQuery({\n queryKey: ['vfs', getScope() ?? '__unscoped__', 'infinite-items', stableFilter?.type ?? '', JSON.stringify(stableFilter ?? {})],\n queryFn: async ({ pageParam = 0 }) => {\n return fetchItems({\n ...stableFilter!,\n limit: PAGE_SIZE,\n offset: pageParam as number,\n });\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage, _allPages, lastPageParam) => {\n if (lastPage.items.length < PAGE_SIZE) return undefined;\n return (lastPageParam as number) + lastPage.items.length;\n },\n enabled: !!stableFilter?.type,\n });\n\n const allItems = useMemo(() => {\n if (!query.data?.pages) return [];\n const seen = new Set<string>();\n const flat: VFSItem[] = [];\n for (const page of query.data.pages) {\n for (const item of page.items) {\n if (item.id && !seen.has(item.id)) {\n seen.add(item.id);\n flat.push(item);\n }\n }\n }\n return flat;\n }, [query.data?.pages]);\n\n return {\n allItems,\n fetchNextPage: query.fetchNextPage,\n isFetchingNextPage: query.isFetchingNextPage,\n isExhausted: !query.hasNextPage,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n totalHint: query.data?.pages?.[0]?.total_hint,\n };\n}\n\n/** Infinite-scroll directory listing (children of a path). */\nexport function useInfiniteChildren(path: string | undefined | null) {\n useScopeKey();\n const PAGE_SIZE = 20;\n\n const query = useInfiniteQuery({\n queryKey: ['vfs', getScope() ?? '__unscoped__', 'infinite-children', path ?? ''],\n queryFn: async ({ pageParam = 0 }) => {\n return fetchVfsChildrenPage(path!, PAGE_SIZE, pageParam as number);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage, _allPages, lastPageParam) => {\n if (lastPage.items.length < PAGE_SIZE) return undefined;\n return (lastPageParam as number) + lastPage.items.length;\n },\n enabled: !!path,\n });\n\n const allItems = useMemo(() => {\n if (!query.data?.pages) return [];\n const seen = new Set<string>();\n const flat: VFSItem[] = [];\n for (const page of query.data.pages) {\n for (const item of page.items) {\n if (item.id && !seen.has(item.id)) {\n seen.add(item.id);\n flat.push(item);\n }\n }\n }\n return flat;\n }, [query.data?.pages]);\n\n return {\n allItems,\n fetchNextPage: query.fetchNextPage,\n isFetchingNextPage: query.isFetchingNextPage,\n isExhausted: !query.hasNextPage,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n totalHint: query.data?.pages?.[0]?.total_hint,\n };\n}\n\n/** Fetch edges for an item by its ID. */\nexport function useEdges(itemId: string | undefined | null) {\n useScopeKey();\n return useQuery({\n queryKey: vfsKeys.edges(itemId!),\n queryFn: () => fetchEdgesForItem(itemId!),\n enabled: !!itemId,\n });\n}\n\n/** Fetch all type definitions for a scope. */\nexport function useTypes(scopeId?: string) {\n useScopeKey();\n return useQuery({\n queryKey: vfsKeys.types(scopeId),\n queryFn: () => fetchTypeDefinitions(scopeId),\n });\n}\n\n/** Fetch a single type definition by type_key. */\nexport function useType(typeKey: string, scopeId?: string) {\n const typesQuery = useTypes(scopeId);\n return {\n ...typesQuery,\n data: typesQuery.data?.get(typeKey) ?? undefined,\n };\n}\n\n// \u2500\u2500 Open Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/**\n * Open a VFS item \u2014 the primary hook for rendering any item.\n *\n * Calls the kernel's `open` syscall which runs the CCM resolution pipeline\n * and returns the full OpenEnvelope:\n * - Item identity (id, path, name, type)\n * - Render directives (view_component_id, props, url)\n * - Compatible components (for \"Open With\" menus)\n * - Content extraction (for AI/programmatic consumers)\n *\n * The gateway mints signed URLs for storage-backed items before returning,\n * so `render.props.url` is ready to use immediately.\n *\n * When `render.view_component_id` is null, no CCM opener is registered \u2014\n * the client should fall back to a system action (item-detail/inspector).\n *\n * @example\n * // Default open \u2014 render mode, kernel resolves the component.\n * const { data: envelope, isLoading } = useOpen(path);\n * if (!envelope?.render?.view_component_id) {\n * return <ItemDetailView />; // system action fallback\n * }\n * // Mount the resolved component...\n *\n * @example\n * // Open with content extraction for AI\n * const { data } = useOpen(path, { mode: 'extract' });\n * // data.content contains extracted text/structured data\n *\n * @example\n * // \"Open With\" menu \u2014 read compatible_components\n * const { data } = useOpen(path);\n * data?.compatible_components.map(c => c.display_name);\n */\nexport function useOpen(\n path: string | undefined | null,\n options?: OpenOptions,\n) {\n useScopeKey();\n const stableArgs = useMemo(\n () => options?.arguments,\n [JSON.stringify(options?.arguments)],\n );\n const stableMode = options?.mode;\n const stableStrategy = options?.strategy;\n return useQuery({\n queryKey: vfsKeys.openEnvelope(path!, stableStrategy),\n queryFn: () => fetchOpenEnvelope(path!, {\n mode: stableMode,\n strategy: stableStrategy,\n arguments: stableArgs,\n }),\n enabled: !!path,\n });\n}\n// \u2500\u2500 Type Helpers Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst EDGE_TYPE_LABELS: Record<string, string> = {\n related_to: 'Related To',\n depends_on: 'Depends On',\n blocks: 'Blocks',\n parent_of: 'Parent Of',\n child_of: 'Child Of',\n references: 'References',\n implements: 'Implements',\n extends: 'Extends',\n contains: 'Contains',\n belongs_to: 'Belongs To',\n created_by: 'Created By',\n assigned_to: 'Assigned To',\n tagged_with: 'Tagged With',\n linked_to: 'Linked To',\n};\n\nexport interface TypeHelpers {\n canHaveChildren: (item: VFSItem) => boolean;\n isScope: (item: VFSItem) => boolean;\n isScopeType: (typeKey: string) => boolean;\n isContainerType: (typeKey: string) => boolean;\n getTypeDefinition: (typeKey: string) => TypeDefinition | undefined;\n getTypeColor: (typeKey: string) => string;\n getTypeIcon: (typeKey: string) => string;\n getTypeDisplayName: (typeKey: string) => string;\n getKnownEdgeTypes: () => { key: string; label: string }[];\n getEdgeTypeLabel: (edgeType: string) => string;\n allTypes: Map<string, TypeDefinition>;\n loading: boolean;\n}\n\n/**\n * Convenience hook that derives type-system helper functions from useTypes().\n */\nexport function useTypeHelpers(scopeId?: string): TypeHelpers {\n const typesQuery = useTypes(scopeId);\n const types = typesQuery.data ?? new Map<string, TypeDefinition>();\n\n return useMemo(() => {\n const getTypeDefinition = (typeKey: string): TypeDefinition | undefined =>\n types.get(typeKey);\n\n const canHaveChildren = (item: VFSItem): boolean => {\n const td = types.get(item.item_type);\n return td?.is_container ?? false;\n };\n\n const isScope = (item: VFSItem): boolean => {\n const td = types.get(item.item_type);\n return td?.is_scope ?? false;\n };\n\n const isScopeType = (typeKey: string): boolean => {\n const td = types.get(typeKey);\n return td?.is_scope ?? false;\n };\n\n const isContainerType = (typeKey: string): boolean => {\n const td = types.get(typeKey);\n return td?.is_container ?? false;\n };\n\n const getTypeColor = (typeKey: string): string => {\n const td = types.get(typeKey);\n return td?.color ?? 'gray';\n };\n\n const getTypeIcon = (typeKey: string): string => {\n const td = types.get(typeKey);\n return td?.icon ?? 'File';\n };\n\n const getTypeDisplayName = (typeKey: string): string => {\n const td = types.get(typeKey);\n return td?.display_name ?? typeKey;\n };\n\n const getKnownEdgeTypes = () =>\n Object.entries(EDGE_TYPE_LABELS).map(([key, label]) => ({ key, label }));\n\n const getEdgeTypeLabel = (edgeType: string): string =>\n EDGE_TYPE_LABELS[edgeType] ?? edgeType.replace(/_/g, ' ');\n\n return {\n canHaveChildren,\n isScope,\n isScopeType,\n isContainerType,\n getTypeDefinition,\n getTypeColor,\n getTypeIcon,\n getTypeDisplayName,\n getKnownEdgeTypes,\n getEdgeTypeLabel,\n allTypes: types,\n loading: typesQuery.isLoading,\n };\n }, [types, typesQuery.isLoading]);\n}\n\n// \u2500\u2500 Member Focus Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Fetch items assigned/relevant to the current user within a scope. */\nexport function useMemberFocus(\n scopeId: string | undefined | null,\n itemTypes?: string[],\n limit?: number,\n) {\n useScopeKey();\n return useQuery({\n queryKey: vfsKeys.memberFocus(scopeId!),\n queryFn: () => fetchMemberFocus(scopeId!, itemTypes, limit),\n enabled: !!scopeId,\n });\n}\n\n// \u2500\u2500 Item History Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Fetch the version history of a VFS item. */\nexport function useItemHistory(\n itemId: string | undefined | null,\n limit: number = 50,\n offset: number = 0,\n) {\n return useQuery({\n queryKey: vfsKeys.itemHistory(itemId!, String(limit), String(offset)),\n queryFn: () => fetchItemHistory(itemId!, limit, offset),\n enabled: !!itemId,\n });\n}\n\n// \u2500\u2500 Recent Activity Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Fetch recent activity (audit log) for a scope. */\nexport function useRecentActivity(\n scopePath: string | undefined | null,\n limit: number = 50,\n offset: number = 0,\n) {\n useScopeKey();\n return useQuery({\n queryKey: vfsKeys.recentActivity(scopePath!, String(limit), String(offset)),\n queryFn: () => fetchRecentActivity(scopePath!, limit, offset),\n enabled: !!scopePath,\n });\n}\n\n// \u2500\u2500 Scope Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface ScopeData {\n path: string;\n scope_id: string;\n fractal_id: string | null;\n instance_name: string | null;\n display_name: string | null;\n componentPath?: string;\n isEmbed?: boolean;\n}\n\ninterface ScopeResult {\n data: ScopeData | null;\n loading: boolean;\n error: Error | null;\n}\n\n/** Returns the current scope session via initSession(). */\nexport function useScope(): ScopeResult {\n const [data, setData] = useState<ScopeData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n initSession().then((entry) => {\n if (!cancelled) {\n const config = (typeof window !== 'undefined' && (window as any).__FSAOS_CONFIG__) || {};\n setData({\n path: entry.scope_path,\n scope_id: entry.scope_id,\n fractal_id: entry.fractal_id,\n instance_name: entry.instance_name,\n display_name: entry.display_name,\n componentPath: config.componentPath || '',\n isEmbed: !!config.embedToken,\n });\n setLoading(false);\n }\n }).catch((err) => {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setLoading(false);\n }\n });\n return () => { cancelled = true; };\n }, []);\n\n return { data, loading, error };\n}\n\n// \u2500\u2500 Accounts Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// Stable empty array to prevent useEffect re-triggers when query.data is undefined\nconst EMPTY_ACCOUNTS: AccountInfo[] = [];\n\nexport interface AccountInfo {\n accountId: string;\n path: string;\n name: string;\n role: string;\n typeData: Record<string, unknown>;\n joinedAt: string;\n // Stage 4.2 additions \u2014 all optional / nullable for backward compat\n via?: 'direct' | 'cascade';\n placement?: 'switcher_entry' | 'mount_only';\n subordinateTo?: string | null;\n cascadeAnchorId?: string | null;\n isAccount?: boolean;\n isSpace?: boolean;\n isOwner?: boolean;\n billingResponsible?: boolean;\n grantedVia?: 'self_provisioned' | 'invitation' | 'purchase' | 'seat_assignment' | null;\n grantedUnderAccountId?: string | null;\n personalSpaceId?: string | null;\n personalSpacePath?: string | null;\n}\n\ninterface AccountsState {\n /** Switcher-eligible accounts \u2014 billing-responsible accounts the user can operate AS. */\n accounts: AccountInfo[];\n /** Full membership list including mounts, spaces, cascade entries. Used for sidebar mount tree. */\n allMemberships: AccountInfo[];\n /** Currently active billing-responsible account (auto-selected if single, or after switchAccount). */\n currentAccount: AccountInfo | null;\n /** The currently mounted scope path (may differ from currentAccount.path when navigating subaccounts). */\n mountedScope: string | null;\n /** Switch the billing-responsible account context. Only for switcher entries. */\n switchAccount: (accountPath: string) => void;\n /** Mount a scope within the current billing context (e.g., navigate into a subaccount). Does NOT change currentAccount. */\n mountScope: (scopePath: string) => void;\n loading: boolean;\n error: Error | null;\n}\n\n/** Returns the user's account memberships and provides account switching. */\nexport function useAccounts(): AccountsState {\n const { user } = useAuth();\n const [currentAccount, setCurrentAccount] = useState<AccountInfo | null>(null);\n const [mountedPath, setMountedPath] = useState<string | null>(null);\n const autoSelectedRef = useRef(false);\n\n const query = useQuery({\n queryKey: vfsKeys.memberships(user?.id ?? 'anonymous'),\n queryFn: async () => {\n const result = await gatewayCall('list-memberships', {}) as any;\n const memberships = result.memberships || [];\n return memberships.map((m: any) => ({\n accountId: m.account_id,\n path: m.account_path,\n name: m.account_name,\n role: m.role || 'member',\n typeData: m.account_type_data || {},\n joinedAt: m.joined_at,\n via: m.via,\n placement: m.placement,\n subordinateTo: m.subordinate_to ?? null,\n cascadeAnchorId: m.cascade_anchor_id ?? null,\n isAccount: m.is_account ?? undefined,\n isSpace: m.is_space ?? undefined,\n isOwner: m.is_owner ?? undefined,\n billingResponsible: m.billing_responsible ?? undefined,\n grantedVia: m.granted_via ?? null,\n grantedUnderAccountId: m.granted_under_account_id ?? null,\n personalSpaceId: m.personal_space_id ?? null,\n personalSpacePath: m.personal_space_path ?? null,\n })) as AccountInfo[];\n },\n enabled: !!user?.id,\n staleTime: 1000 * 60 * 2,\n });\n\n const allMemberships = query.data ?? [];\n\n // Switcher entries: billing-responsible accounts the principal can operate AS.\n // Spec rule: \"terminus_account_id == account_id AND is_account = true\"\n // The kernel encodes this as placement === 'switcher_entry'.\n // A principal may have multiple billing-responsible accounts (personal + org).\n const switcherAccounts = useMemo(() => {\n return allMemberships.filter((a) => {\n if (a.placement !== undefined) {\n return a.placement === 'switcher_entry' && a.isAccount === true;\n }\n // Legacy fallback: if placement is not set, treat all entries as switcher candidates\n return true;\n });\n }, [allMemberships]);\n\n useEffect(() => {\n if (!user?.id) {\n autoSelectedRef.current = false;\n setCurrentAccount(null);\n setMountedPath(null);\n return;\n }\n if (autoSelectedRef.current) return;\n if (switcherAccounts.length === 0) return;\n\n if (switcherAccounts.length === 1) {\n // Single billing-responsible account \u2014 auto-select\n setCurrentAccount(switcherAccounts[0]);\n setScope(switcherAccounts[0].path);\n initVfsRealtimeWs(switcherAccounts[0].accountId);\n autoSelectedRef.current = true;\n } else if (switcherAccounts.length > 1) {\n // Multiple billing-responsible accounts \u2014 require explicit selection.\n // Do NOT auto-select; scope remains unset until user picks.\n autoSelectedRef.current = true;\n }\n }, [user?.id, switcherAccounts]);\n\n const switchAccount = useCallback((accountPath: string) => {\n // Switch the billing-responsible account context.\n // Only switcher entries (billing-responsible accounts) are valid targets.\n const account = switcherAccounts.find((a) => a.path === accountPath);\n if (account) {\n setCurrentAccount(account);\n setScope(account.path);\n initVfsRealtimeWs(account.accountId);\n // Clear any mounted subaccount/space \u2014 switching account resets the mount\n setMountedPath(null);\n }\n }, [switcherAccounts]);\n\n const mountScope = useCallback((scopePath: string) => {\n // Mount a different scope within the current billing context.\n // This is purely UI state \u2014 like mounting an external drive in macOS.\n // It does NOT change _scope_path sent to the kernel. The kernel boundary\n // stays at the switcher account path (the billing context).\n // The mounted path tells the UI which volume/space to show as active.\n\n // Unmount previous realtime scope if switching\n if (mountedPath) {\n unmountRealtimeScope(mountedPath);\n }\n setMountedPath(scopePath);\n // Subscribe to realtime events for the newly mounted scope\n mountRealtimeScope(scopePath);\n }, [mountedPath]);\n\n return {\n accounts: switcherAccounts,\n allMemberships,\n currentAccount,\n mountedScope: mountedPath,\n switchAccount,\n mountScope,\n loading: query.isLoading,\n error: query.error as Error | null,\n };\n}\n\n// \u2500\u2500 Auth Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface AuthState {\n user: any | null;\n session: any | null;\n loading: boolean;\n signIn: (params: { email?: string; password?: string; provider?: string; redirectTo?: string }) => Promise<any>;\n signUp: (params: { email: string; password: string; metadata?: Record<string, any> }) => Promise<any>;\n signOut: () => Promise<void>;\n resetPassword: (email: string) => Promise<void>;\n signInWithMagicLink: (email: string, redirectTo?: string) => Promise<void>;\n}\n\n/** Reactive auth hook backed by Supabase auth. */\nexport function useAuth(): AuthState {\n const [user, setUser] = useState<any | null>(null);\n const [session, setSession] = useState<any | null>(null);\n const [loading, setLoading] = useState(true);\n const subscriptionRef = useRef<{ unsubscribe: () => void } | null>(null);\n\n useEffect(() => {\n supabase.auth.getSession().then(({ data, error }: any) => {\n if (error) {\n // Stale/invalid refresh token \u2014 clear persisted session so the app\n // falls through to the login page instead of showing a blank screen.\n console.warn('[useAuth] getSession error, clearing stale session:', error.message);\n supabase.auth.signOut().catch(() => {});\n setSession(null);\n setUser(null);\n setLoading(false);\n return;\n }\n setSession(data?.session ?? null);\n setUser(data?.session?.user ?? null);\n setLoading(false);\n }).catch((err: any) => {\n console.warn('[useAuth] getSession threw, clearing stale session:', err?.message);\n supabase.auth.signOut().catch(() => {});\n setSession(null);\n setUser(null);\n setLoading(false);\n });\n\n const { data: { subscription } } = supabase.auth.onAuthStateChange(\n (event: string, newSession: any) => {\n // If Supabase fires TOKEN_REFRESHED with null session, the refresh\n // failed \u2014 treat as sign-out to avoid a stuck blank screen.\n if (event === 'TOKEN_REFRESHED' && !newSession) {\n console.warn('[useAuth] TOKEN_REFRESHED with null session \u2014 signing out');\n supabase.auth.signOut().catch(() => {});\n setSession(null);\n setUser(null);\n setLoading(false);\n return;\n }\n setSession(newSession);\n setUser(newSession?.user ?? null);\n setLoading(false);\n },\n );\n subscriptionRef.current = subscription;\n\n return () => {\n subscription?.unsubscribe();\n };\n }, []);\n\n const signIn = useCallback(async (params: {\n email?: string;\n password?: string;\n provider?: string;\n redirectTo?: string;\n }) => {\n if (params.provider) {\n return supabase.auth.signInWithOAuth({\n provider: params.provider as any,\n options: params.redirectTo ? { redirectTo: params.redirectTo } : { redirectTo: window.location.href },\n });\n }\n return supabase.auth.signInWithPassword({\n email: params.email!,\n password: params.password!,\n });\n }, []);\n\n const signUp = useCallback(async (params: { email: string; password: string; metadata?: Record<string, any> }) => {\n return supabase.auth.signUp({\n email: params.email,\n password: params.password,\n options: { data: params.metadata || {} },\n });\n }, []);\n\n const signOut = useCallback(async () => {\n await supabase.auth.signOut();\n resetAllSdkState();\n queryClient.clear();\n }, []);\n\n const resetPassword = useCallback(async (email: string) => {\n const { error } = await supabase.auth.resetPasswordForEmail(email);\n if (error) throw error;\n }, []);\n\n const signInWithMagicLink = useCallback(async (email: string, redirectTo?: string) => {\n const { error } = await supabase.auth.signInWithOtp({\n email,\n options: redirectTo ? { emailRedirectTo: redirectTo } : { emailRedirectTo: window.location.href },\n });\n if (error) throw error;\n }, []);\n\n return { user, session, loading, signIn, signUp, signOut, resetPassword, signInWithMagicLink };\n}\n\n// \u2500\u2500 Asset Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface AssetData {\n url: string;\n id?: string;\n name?: string;\n mimeType?: string;\n width?: number;\n height?: number;\n sizeBytes?: number;\n}\n\n/** Resolve an asset by UUID or path. */\nexport function useAsset(idOrPath: string | undefined | null) {\n const [data, setData] = useState<AssetData | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!idOrPath) {\n setData(null);\n setLoading(false);\n return;\n }\n\n const isUUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(idOrPath);\n\n if (isUUID) {\n setLoading(true);\n gatewayCall('resolve-asset', { asset_id: idOrPath })\n .then((result: any) => {\n if (result.success && result.public_url) {\n setData({\n url: result.public_url,\n id: result.asset_id,\n name: result.name,\n mimeType: result.mime_type,\n width: result.width,\n height: result.height,\n sizeBytes: result.size_bytes,\n });\n } else {\n setError(new Error(result.error || 'Asset not found'));\n }\n setLoading(false);\n })\n .catch((e: any) => {\n setError(e instanceof Error ? e : new Error(String(e)));\n setLoading(false);\n });\n } else {\n const config = (typeof window !== 'undefined' && (window as any).__FSAOS_CONFIG__) || {};\n const edgeBaseUrl = config.edgeBaseUrl || '';\n setData({ url: edgeBaseUrl + idOrPath });\n setLoading(false);\n }\n }, [idOrPath]);\n\n return { data, loading, error };\n}\n\n// \u2500\u2500 Component Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst componentCache: Record<string, any> = {};\nconst componentCssCache: Record<string, HTMLStyleElement> = {};\n\nregisterCleanup(() => {\n for (const key of Object.keys(componentCache)) {\n delete componentCache[key];\n }\n});\n\nlet _sdkExports: Record<string, unknown> | null = null;\n\n/**\n * Called by index.ts at module init to register the full SDK export map.\n * @internal\n */\nexport function __registerSdkExports(exports: Record<string, unknown>): void {\n _sdkExports = exports;\n if (typeof window !== 'undefined' && !(window as any).__FSAOS_GATEWAY__) {\n (window as any).__FSAOS_GATEWAY__ = exports;\n }\n}\n\nfunction sdkRequireShim(name: string): unknown {\n switch (name) {\n case 'react':\n return (typeof window !== 'undefined' && (window as any).React) || React;\n case 'react-dom':\n case 'react-dom/client':\n return (typeof window !== 'undefined' && (window as any).ReactDOM) || ReactDOM;\n case 'react/jsx-runtime':\n case 'react/jsx-dev-runtime':\n return (typeof window !== 'undefined' && (window as any).React)\n ? { jsx: (window as any).React.createElement, jsxs: (window as any).React.createElement, Fragment: (window as any).React.Fragment }\n : JsxRuntime;\n case '@fsaos/gateway':\n case '@fsaos/react':\n return (typeof window !== 'undefined' && (window as any).__FSAOS_GATEWAY__) || _sdkExports || {};\n case '@fsaos/ui':\n return (typeof window !== 'undefined' && (window as any).__FSAOS_UI__) || {};\n case '@fsaos/theme':\n return {};\n default:\n console.warn(`[useComponent] Unknown module requested: ${name}`);\n return {};\n }\n}\n\nfunction scopeComponentCss(cssText: string, scopeClass: string): string {\n return cssText.replace(\n /^(\\s*)(:root|body)(\\s*[{,])/gm,\n (_match, ws, _sel, rest) => `${ws}.${scopeClass}${rest}`,\n );\n}\n\nasync function loadComponentCss(cssUrl: string, scopeId?: string): Promise<void> {\n if (componentCssCache[cssUrl]) return;\n\n try {\n const response = await fetch(cssUrl);\n if (!response.ok) return;\n\n let cssText = await response.text();\n if (!cssText.trim()) return;\n if (cssText.includes('No CSS bundle for this component')) return;\n\n if (scopeId && !cssText.includes(`.fsaos-c-${scopeId}`)) {\n cssText = scopeComponentCss(cssText, `fsaos-c-${scopeId}`);\n }\n\n const style = document.createElement('style');\n style.setAttribute('data-fsaos-component-css', cssUrl);\n if (scopeId) style.setAttribute('data-fsaos-component-id', scopeId);\n style.textContent = cssText;\n document.head.appendChild(style);\n componentCssCache[cssUrl] = style;\n } catch {\n // ignore\n }\n}\n\nfunction evaluateBundle(jsCode: string): any {\n let registered: any = null;\n const previousRegister = (window as any).__FSAOS_REGISTER__;\n (window as any).__FSAOS_REGISTER__ = (component: any) => {\n registered = component;\n };\n\n try {\n const wrappedCode = [\n 'var require = arguments[0];',\n jsCode,\n 'return window.__FSAOS_COMPONENT__;',\n ].join('\\n');\n\n const fn = new Function(wrappedCode);\n const fromIife = fn(sdkRequireShim);\n\n const exported = registered ?? fromIife;\n if (!exported) return null;\n\n return (exported as any).default || exported;\n } finally {\n if (previousRegister !== undefined) {\n (window as any).__FSAOS_REGISTER__ = previousRegister;\n } else {\n delete (window as any).__FSAOS_REGISTER__;\n }\n }\n}\n\n/** Dynamically load a component from the edge. */\nexport function useComponent(path: string | undefined | null) {\n const [Component, setComponent] = useState<any>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!path) return;\n\n let cancelled = false;\n setLoading(true);\n setError(null);\n\n const config = (typeof window !== 'undefined' && (window as any).__FSAOS_CONFIG__) || {};\n const edgeBaseUrl = config.edgeBaseUrl || '';\n\n (async () => {\n try {\n let version = 1;\n let cacheKey = path + '@v1';\n let bundleUrl = edgeBaseUrl + path + '/__bundle.js';\n\n try {\n const metaResponse = await fetch(edgeBaseUrl + path + '/__meta', { cache: 'no-store' });\n if (metaResponse.ok) {\n const meta = await metaResponse.json();\n version = meta.version || 1;\n cacheKey = path + '@v' + version;\n bundleUrl = edgeBaseUrl + path + '/__bundle.v' + version + '.js';\n }\n } catch {\n bundleUrl = edgeBaseUrl + path + '/__bundle.js?v=' + Date.now();\n }\n\n if (cancelled) return;\n\n if (componentCache[cacheKey]) {\n setComponent(() => componentCache[cacheKey]);\n setLoading(false);\n return;\n }\n\n const jsResponse = await fetch(bundleUrl);\n if (!jsResponse.ok) {\n throw new Error(\n `Failed to fetch bundle: ${jsResponse.status} ${jsResponse.statusText} (${bundleUrl})`,\n );\n }\n const jsCode = await jsResponse.text();\n\n if (cancelled) return;\n\n const cssUrl = bundleUrl.replace(/__bundle(\\.v\\d+)?\\.js(\\?.*)?$/, '__bundle$1.css');\n loadComponentCss(cssUrl).catch(() => {});\n\n const resolved = evaluateBundle(jsCode);\n\n if (!resolved) {\n throw new Error(\n 'Bundle did not export a component. ' +\n 'Expected window.__FSAOS_COMPONENT__ (FSAOS build) or a __FSAOS_REGISTER__(Component) call.',\n );\n }\n\n if (typeof resolved !== 'function') {\n throw new Error(`Bundle export is not a React component (got ${typeof resolved})`);\n }\n\n componentCache[cacheKey] = resolved;\n\n if (!cancelled) {\n setComponent(() => resolved);\n setLoading(false);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setLoading(false);\n }\n }\n })();\n\n return () => { cancelled = true; };\n }, [path]);\n\n return { Component, loading, error };\n}\n\n// \u2500\u2500 Theme Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst THEME_PROPERTIES = [\n '--color-primary', '--color-secondary', '--color-background',\n '--color-surface', '--color-text', '--color-text-secondary',\n '--color-border', '--color-accent', '--color-success',\n '--color-warning', '--color-error',\n '--font-family-heading', '--font-family-body',\n '--border-radius', '--spacing-unit',\n];\n\n/** Read CSS custom properties from the document root. */\nexport function useTheme() {\n const themeData = useMemo(() => {\n if (typeof document === 'undefined') return { tokens: {} };\n const vars: Record<string, string> = {};\n const style = getComputedStyle(document.documentElement);\n THEME_PROPERTIES.forEach((p) => {\n vars[p] = style.getPropertyValue(p).trim();\n });\n return { tokens: vars };\n }, []);\n return { data: themeData, loading: false, error: null };\n}\n\n// \u2500\u2500 Permission Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Check permission for an action on a path. */\nexport function usePermission(_action?: string, _path?: string) {\n return { data: { allowed: true }, loading: false, error: null };\n}\n\n/** Check multiple permissions at once. */\nexport function usePermissions(_path?: string, actions?: string[]) {\n const perms: Record<string, boolean> = {};\n (actions || []).forEach((a) => { perms[a] = true; });\n return { data: perms, loading: false, error: null };\n}\n\n// \u2500\u2500 Principal Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface PrincipalData {\n id: string;\n principalId: string | null;\n email?: string;\n role: string;\n authenticated: boolean;\n metadata?: Record<string, any>;\n}\n\nlet _principalIdCache: { authUserId: string; principalId: string | null } | null = null;\nlet _principalIdPromise: Promise<string | null> | null = null;\n\nregisterCleanup(() => {\n _principalIdCache = null;\n _principalIdPromise = null;\n});\n\n/** Resolve current user's FSAOS os_principals.id from auth ID. */\nexport async function resolvePrincipalId(authUserId?: string): Promise<string | null> {\n let uid = authUserId;\n if (!uid) {\n const { data } = await supabase.auth.getSession();\n uid = data?.session?.user?.id;\n }\n if (!uid) return null;\n\n if (_principalIdCache && _principalIdCache.authUserId === uid) {\n return _principalIdCache.principalId;\n }\n\n if (_principalIdPromise) return _principalIdPromise;\n\n _principalIdPromise = (async () => {\n try {\n const { data, error } = await supabase\n .from('os_principals')\n .select('id')\n .eq('auth_user_id', uid!)\n .eq('principal_type', 'user')\n .maybeSingle();\n\n if (error) {\n console.warn('[SDK] Could not resolve principal_id:', error.message);\n return null;\n }\n\n const principalId = data?.id ?? null;\n _principalIdCache = { authUserId: uid!, principalId };\n return principalId;\n } finally {\n _principalIdPromise = null;\n }\n })();\n\n return _principalIdPromise;\n}\n\n/** Returns the current principal (user identity). */\nexport function usePrincipal() {\n const authResult = useAuth();\n const user = authResult.user;\n const [principalId, setPrincipalId] = useState<string | null>(\n (_principalIdCache?.authUserId === user?.id ? _principalIdCache?.principalId : null) ?? null,\n );\n const prevUserIdRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (!user?.id) {\n setPrincipalId(null);\n prevUserIdRef.current = null;\n return;\n }\n if (prevUserIdRef.current === user.id && principalId !== null) return;\n prevUserIdRef.current = user.id;\n\n resolvePrincipalId(user.id).then((id) => {\n setPrincipalId(id);\n });\n }, [user?.id]);\n\n if (authResult.loading) {\n return { data: null as PrincipalData | null, loading: true, error: null };\n }\n\n if (!user) {\n return {\n data: { id: 'anonymous', principalId: null, role: 'viewer', authenticated: false } as PrincipalData,\n loading: false,\n error: null,\n };\n }\n\n return {\n data: {\n id: user.id,\n principalId,\n email: user.email,\n role: user.role || user.app_metadata?.role || 'user',\n authenticated: true,\n metadata: user.user_metadata || {},\n } as PrincipalData,\n loading: false,\n error: null,\n };\n}\n\n// \u2500\u2500 Tool Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Stub: useTool \u2014 returns null tool data. */\nexport function useTool() {\n return { data: null, loading: false, error: null };\n}\n\n// \u2500\u2500 ComponentRenderer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** <ComponentRenderer path=\"...\" /> \u2014 runtime composition primitive. */\nexport function ComponentRenderer(props: { path: string; [key: string]: any }) {\n const { path, ...rest } = props;\n const result = useComponent(path);\n const Comp = result.Component;\n const { loading, error } = result;\n\n if (loading) return createElement('div', { className: 'fsaos-loading' }, '');\n if (error) return createElement('div', { className: 'fsaos-error' }, 'Failed to load component');\n if (!Comp) return null;\n return createElement(Comp, rest);\n}\n\n// \u2500\u2500 KernelProvider \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Passthrough wrapper for backward compatibility. */\nexport function KernelProvider(props: { children: any }) {\n return props.children;\n}\n\n// \u2500\u2500 Channel Messages Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ChannelMessagesOptions {\n channelPath: string | undefined | null;\n parentMessageId?: string;\n realtime?: boolean;\n enabled?: boolean;\n}\n\n/** Fetch channel messages via the kernel's `get-channel-messages` method. */\nexport function useChannelMessages(options: ChannelMessagesOptions) {\n const scopeKey = useScopeKey();\n const {\n channelPath,\n parentMessageId,\n realtime = true,\n enabled: userEnabled,\n } = options;\n\n const isEnabled = userEnabled !== undefined ? userEnabled && !!channelPath : !!channelPath;\n\n const stableKey = useMemo(\n () => vfsKeys.channelMessages(channelPath ?? '', parentMessageId),\n [channelPath, parentMessageId, scopeKey],\n );\n\n const qc = useQueryClient();\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const query = useQuery({\n queryKey: stableKey,\n queryFn: () => fetchChannelMessages(channelPath!, parentMessageId),\n enabled: isEnabled,\n });\n\n useEffect(() => {\n if (!realtime || !isEnabled) return;\n\n const unsub = subscribeToEvents(\n 'vfs_change',\n () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n qc.invalidateQueries({ queryKey: stableKey });\n }, 500);\n },\n (data: any) => {\n return (\n data.item_type === 'message' &&\n typeof data.path === 'string' &&\n data.path.startsWith(channelPath!)\n );\n },\n );\n\n return () => {\n unsub();\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [realtime, isEnabled, channelPath, stableKey, qc]);\n\n const messages: ChannelMessage[] = query.data ?? [];\n\n return {\n messages,\n threads: useMemo(() => messages.filter(m => m.reply_count > 0), [messages]),\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch: query.refetch,\n };\n}\n\n// \u2500\u2500 Infinite Channel Messages (cursor-based pagination) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Options for useInfiniteChannelMessages. */\nexport interface InfiniteChannelMessagesOptions {\n /** VFS path of the channel. Required. */\n channelPath: string | undefined | null;\n /**\n * If set, fetches thread replies (forward pagination with after_seq).\n * If omitted, fetches top-level messages (backward pagination with before_seq).\n */\n parentMessageId?: string;\n /** Messages per page. Default 50, max 200. */\n limit?: number;\n /** Enable SSE-driven auto-refresh. Default: true. */\n realtime?: boolean;\n /** Standard useQuery enabled flag. Default: true (when channelPath is truthy). */\n enabled?: boolean;\n}\n\n/**\n * Infinite-scroll hook for channel messages.\n *\n * - **Top-level mode** (no parentMessageId): backward pagination.\n * Initial fetch returns the N most recent messages. `fetchPreviousPage`\n * loads older messages using `before_seq` = lowest seq in current data.\n *\n * - **Thread mode** (parentMessageId set): forward pagination.\n * Initial fetch returns the first N replies. `fetchNextPage` loads newer\n * replies using `after_seq` = highest seq in current data.\n *\n * Returns a flat `messages` array (deduped, sorted by seq ASC) plus\n * pagination state for scroll-triggered loading.\n */\nexport function useInfiniteChannelMessages(options: InfiniteChannelMessagesOptions) {\n useScopeKey();\n const { channelPath, parentMessageId, limit = 50, realtime = true, enabled = true } = options;\n const isThread = !!parentMessageId;\n const queryEnabled = enabled && !!channelPath;\n\n const query = useInfiniteQuery({\n queryKey: [...vfsKeys.channelMessages(channelPath || '', parentMessageId), 'infinite', limit],\n queryFn: async ({ pageParam }) => {\n return fetchChannelMessagesPage(channelPath!, {\n parentMessageId,\n limit,\n before_seq: isThread ? undefined : (pageParam as number | undefined),\n after_seq: isThread ? (pageParam as number | undefined) : undefined,\n });\n },\n initialPageParam: undefined as number | undefined,\n getNextPageParam: (lastPage) => {\n // Forward pagination (thread mode): cursor is max seq\n if (!isThread) return undefined;\n if (lastPage.messages.length < limit) return undefined;\n const maxSeq = lastPage.messages[lastPage.messages.length - 1]?.seq;\n return maxSeq;\n },\n getPreviousPageParam: (firstPage) => {\n // Backward pagination (top-level mode): cursor is min seq\n if (isThread) return undefined;\n if (firstPage.messages.length < limit) return undefined;\n const minSeq = firstPage.messages[0]?.seq;\n return minSeq;\n },\n enabled: queryEnabled,\n });\n\n // Flatten all pages into a single deduped, sorted array\n const messages = useMemo(() => {\n if (!query.data?.pages) return [] as ChannelMessage[];\n const seen = new Set<string>();\n const flat: ChannelMessage[] = [];\n for (const page of query.data.pages) {\n for (const msg of page.messages) {\n if (!seen.has(msg.id)) {\n seen.add(msg.id);\n flat.push(msg);\n }\n }\n }\n return flat.sort((a, b) => a.seq - b.seq);\n }, [query.data?.pages]);\n\n // SSE-driven auto-refresh: refetch latest page on vfs_change events\n useEffect(() => {\n if (!realtime || !channelPath || !queryEnabled) return;\n const unsub = subscribeToEvents(channelPath, (event) => {\n if (event.event_type === 'vfs_change') {\n query.refetch();\n }\n });\n return unsub;\n }, [realtime, channelPath, queryEnabled]);\n\n return {\n messages,\n threads: messages.filter(m => m.reply_count > 0),\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch: query.refetch,\n // Backward pagination (top-level: load older)\n hasPreviousPage: query.hasPreviousPage ?? false,\n fetchPreviousPage: query.fetchPreviousPage,\n isFetchingPreviousPage: query.isFetchingPreviousPage ?? false,\n // Forward pagination (thread: load newer)\n hasNextPage: query.hasNextPage ?? false,\n fetchNextPage: query.fetchNextPage,\n isFetchingNextPage: query.isFetchingNextPage ?? false,\n };\n}\n\n// \u2500\u2500 Channel Convenience Hooks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type ChannelAiMode = 'on' | 'off';\n\nfunction normalizeAiMode(value: unknown): ChannelAiMode {\n if (value === 'on' || value === 'auto') return 'on';\n return 'off';\n}\n\nexport interface Channel {\n id: string;\n path: string;\n name: string;\n displayName: string;\n /** Controls AI auto-response only: 'on' auto-responds, 'off' requires explicit invocation/member addressing. */\n aiMode: ChannelAiMode;\n isPrivate: boolean;\n isDm: boolean;\n messageCount: number;\n updatedAt: string;\n chatScopePath: string;\n contextId: string;\n contextPath: string;\n contextType: string;\n contextName: string;\n contextDisplayName: string;\n contextPrincipalId?: string;\n accountId: string;\n accountPath: string;\n accountDisplayName: string;\n memberRole: string;\n memberPath: string;\n modePath: string;\n autoPilot: boolean;\n}\n\nfunction normalizeChannel(raw: Record<string, unknown>): Channel {\n const td = (raw.type_data as Record<string, unknown>) || {};\n return {\n id: (raw.channel_id as string) || '',\n path: (raw.channel_path as string) || '',\n name: (raw.channel_name as string) || '',\n displayName: (raw.display_name as string) || (raw.channel_name as string) || '',\n aiMode: normalizeAiMode(raw.ai_mode),\n isPrivate: (raw.is_private as boolean) || false,\n isDm: (raw.is_dm as boolean) || false,\n messageCount: (raw.message_count as number) || 0,\n updatedAt: (raw.updated_at as string) || '',\n chatScopePath: (raw.chat_scope_path as string) || '',\n contextId: (raw.context_id as string) || '',\n contextPath: (raw.context_path as string) || '',\n contextType: (raw.context_type as string) || '',\n contextName: (raw.context_name as string) || '',\n contextDisplayName: (raw.context_display_name as string) || '',\n contextPrincipalId: raw.context_principal_id as string | undefined,\n accountId: (raw.account_id as string) || '',\n accountPath: (raw.account_path as string) || '',\n accountDisplayName: (raw.account_display_name as string) || '',\n memberRole: (raw.member_role as string) || 'member',\n memberPath: (raw.member_path as string) || '',\n modePath: (raw.mode_path as string) || '',\n autoPilot: (raw.auto_pilot as boolean) || (td.auto_pilot as boolean) || false,\n };\n}\n\nexport interface ChannelsOptions {\n realtime?: boolean;\n enabled?: boolean;\n}\n\n/** Fetch all channels (DMs + public) via `list-channels`. */\nexport function useAllChannels(options: ChannelsOptions = {}) {\n const scopeKey = useScopeKey();\n const { realtime = true, enabled = true } = options;\n\n const qc = useQueryClient();\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const stableKey = useMemo(() => vfsKeys.channels('all'), [scopeKey]);\n\n const query = useQuery({\n queryKey: stableKey,\n queryFn: async () => {\n const result = await gatewayCall('list-channels', {}) as Record<string, unknown>;\n const raw = (result.channels as Array<Record<string, unknown>>) || [];\n return raw.map(normalizeChannel);\n },\n enabled,\n });\n\n useEffect(() => {\n if (!realtime || !enabled) return;\n\n const unsub = subscribeToEvents(\n 'vfs_change',\n () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n qc.invalidateQueries({ queryKey: stableKey });\n }, 1000);\n },\n (data: any) => data.item_type === 'channel' || data.item_type === 'message',\n );\n\n const unsub2 = subscribeToEvents(\n 'ccm_change',\n () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n qc.invalidateQueries({ queryKey: stableKey });\n }, 1000);\n },\n (data: any) => data.item_type === 'channel' || data.item_type === 'message',\n );\n\n return () => {\n unsub();\n unsub2();\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [realtime, enabled, stableKey, qc]);\n\n const channels: Channel[] = query.data ?? [];\n\n return {\n channels,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch: query.refetch,\n };\n}\n\n/** Fetch public (non-DM) channels only. */\nexport function useChannels(options: ChannelsOptions = {}) {\n const result = useAllChannels(options);\n const filtered = useMemo(\n () => result.channels.filter(c => !c.isDm),\n [result.channels],\n );\n return { ...result, channels: filtered };\n}\n\n/** Fetch DM channels only. */\nexport function useDmChannels(options: ChannelsOptions = {}) {\n const result = useAllChannels(options);\n const filtered = useMemo(\n () => result.channels.filter(c => c.isDm),\n [result.channels],\n );\n return { ...result, channels: filtered };\n}\n\n// \u2500\u2500 Notification Hooks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface Notification {\n type: 'mention' | 'reply' | string;\n message_id: string;\n channel_id: string;\n channel_path: string;\n is_unread: boolean;\n}\n\nexport interface NotificationsOptions {\n filter?: 'unread' | 'all';\n limit?: number;\n realtime?: boolean;\n enabled?: boolean;\n}\n\n/** Fetch notifications via `get-notifications`. */\nexport function useNotifications(options: NotificationsOptions = {}) {\n const scopeKey = useScopeKey();\n const {\n filter = 'all',\n limit = 200,\n realtime = true,\n enabled = true,\n } = options;\n\n const qc = useQueryClient();\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const stableKey = useMemo(() => vfsKeys.notifications(filter, limit), [filter, limit, scopeKey]);\n\n const query = useQuery({\n queryKey: stableKey,\n queryFn: async () => {\n const params: Record<string, unknown> = { limit };\n if (filter === 'unread') params.filter = 'unread';\n const result = await gatewayCall('get-notifications', params) as Record<string, unknown>;\n return ((result.notifications as Notification[]) || []);\n },\n enabled,\n });\n\n useEffect(() => {\n if (!realtime || !enabled) return;\n\n const unsubs = ['vfs_change', 'ccm_change'].map(eventType =>\n subscribeToEvents(\n eventType,\n () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n qc.invalidateQueries({ queryKey: stableKey });\n }, 2000);\n },\n (data: any) => data.item_type === 'notification' || data.item_type === 'message',\n ),\n );\n\n return () => {\n unsubs.forEach(u => u());\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [realtime, enabled, stableKey, qc]);\n\n const notifications: Notification[] = query.data ?? [];\n\n return {\n notifications,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch: query.refetch,\n };\n}\n\nexport interface UnreadCountsOptions {\n channels?: Channel[];\n realtime?: boolean;\n enabled?: boolean;\n}\n\n/** Aggregated unread counts per channel. */\nexport function useUnreadCounts(options: UnreadCountsOptions = {}) {\n const { channels: channelList, realtime = true, enabled = true } = options;\n\n const { notifications, isLoading, isFetching, error, refetch } = useNotifications({\n filter: 'unread',\n limit: 200,\n realtime,\n enabled,\n });\n\n const unreadByChannel = useMemo(() => {\n const counts = new Map<string, number>();\n for (const n of notifications) {\n if (n.is_unread && n.channel_id) {\n counts.set(n.channel_id, (counts.get(n.channel_id) || 0) + 1);\n }\n }\n return counts;\n }, [notifications]);\n\n const totalUnread = useMemo(() => {\n let total = 0;\n unreadByChannel.forEach(v => { total += v; });\n return total;\n }, [unreadByChannel]);\n\n const { dmUnread, channelUnread } = useMemo(() => {\n if (!channelList) return { dmUnread: 0, channelUnread: 0 };\n\n const dmIds = new Set(channelList.filter(c => c.isDm).map(c => c.id));\n let dm = 0;\n let ch = 0;\n unreadByChannel.forEach((count, channelId) => {\n if (dmIds.has(channelId)) dm += count;\n else ch += count;\n });\n return { dmUnread: dm, channelUnread: ch };\n }, [channelList, unreadByChannel]);\n\n return {\n unreadByChannel,\n totalUnread,\n dmUnread,\n channelUnread,\n isLoading,\n isFetching,\n error,\n refetch,\n };\n}\n\n// \u2500\u2500 Mutation Hooks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Create a new VFS item. Invalidates parent's children on success. */\nexport function useCreate() {\n const qc = useQueryClient();\n return useTanstackMutation({\n mutationFn: (params: CreateParams) => gatewayCall('create', params),\n onSuccess: (_data: any, variables: CreateParams) => {\n const parentPath = variables.parent_path;\n if (parentPath) {\n qc.invalidateQueries({ queryKey: vfsKeys.children(parentPath) });\n }\n },\n });\n}\n\n/** Update an existing VFS item. */\nexport function useUpdate() {\n const qc = useQueryClient();\n return useTanstackMutation({\n mutationFn: (params: UpdateParams) => gatewayCall('update', params),\n onSuccess: (_data: any, variables: UpdateParams) => {\n const path = variables.path;\n if (path) {\n qc.invalidateQueries({ queryKey: vfsKeys.item(path) });\n const segments = path.split('/');\n segments.pop();\n const parentPath = segments.join('/');\n if (parentPath) {\n qc.invalidateQueries({ queryKey: vfsKeys.children(parentPath) });\n }\n }\n },\n });\n}\n\n/** Delete a VFS item. */\nexport function useDelete() {\n const qc = useQueryClient();\n return useTanstackMutation({\n mutationFn: (params: DeleteParams) => gatewayCall('delete', params),\n onSuccess: (_data: any, variables: DeleteParams) => {\n const path = variables.path;\n if (path) {\n qc.removeQueries({ queryKey: vfsKeys.item(path) });\n const segments = path.split('/');\n segments.pop();\n const parentPath = segments.join('/');\n if (parentPath) {\n qc.invalidateQueries({ queryKey: vfsKeys.children(parentPath) });\n }\n }\n },\n });\n}\n\n/** Move a VFS item. */\nexport function useMove() {\n const qc = useQueryClient();\n return useTanstackMutation({\n mutationFn: (params: MoveParams) => gatewayCall('move', params),\n onSuccess: (_data: any, variables: MoveParams) => {\n const path = variables.path;\n const newParentPath = variables.new_parent_path;\n if (path) {\n qc.invalidateQueries({ queryKey: vfsKeys.item(path) });\n const segments = path.split('/');\n segments.pop();\n const oldParentPath = segments.join('/');\n if (oldParentPath) {\n qc.invalidateQueries({ queryKey: vfsKeys.children(oldParentPath) });\n }\n }\n if (newParentPath) {\n qc.invalidateQueries({ queryKey: vfsKeys.children(newParentPath) });\n }\n },\n });\n}\n\n/** Create an edge between two items. Invalidates edges for both. */\nexport function useLink() {\n const qc = useQueryClient();\n return useTanstackMutation({\n mutationFn: (params: LinkParams) => gatewayCall('link', params),\n onSuccess: (_data: any, variables: LinkParams) => {\n const sourceId = variables.source_id;\n const targetId = variables.target_id;\n if (sourceId) {\n qc.invalidateQueries({ queryKey: vfsKeys.edges(sourceId) });\n }\n if (targetId) {\n qc.invalidateQueries({ queryKey: vfsKeys.edges(targetId) });\n }\n },\n });\n}\n\n// \u2500\u2500 Generic Mutation Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Generic mutation hook for arbitrary kernel methods.\n * For methods not covered by useCreate/useUpdate/useDelete/useMove/useLink.\n *\n * @example\n * const archiveTask = useMutation('archive-task');\n * await archiveTask.mutateAsync({ task_id: '...' });\n */\nexport function useMutation(method: string, options?: {\n onSuccess?: (data: any) => void;\n onError?: (error: any) => void;\n optimistic?: {\n queryKey: readonly unknown[];\n update: (old: any, params: Record<string, unknown>) => any;\n };\n}) {\n const qc = useQueryClient();\n const { optimistic, ...rest } = options ?? {};\n return useTanstackMutation({\n mutationFn: (params: Record<string, unknown>) => gatewayCall(method, params),\n onMutate: optimistic ? async (params: Record<string, unknown>) => {\n await qc.cancelQueries({ queryKey: optimistic.queryKey as any });\n const previous = qc.getQueryData(optimistic.queryKey as any);\n qc.setQueryData(optimistic.queryKey as any, (old: any) => optimistic.update(old, params));\n return { previous };\n } : undefined,\n onError: (err: any, _vars: any, context: any) => {\n if (optimistic && context?.previous !== undefined) {\n qc.setQueryData(optimistic.queryKey as any, context.previous);\n }\n rest.onError?.(err);\n },\n onSuccess: rest.onSuccess,\n onSettled: optimistic ? () => {\n qc.invalidateQueries({ queryKey: optimistic.queryKey as any });\n } : undefined,\n });\n}\n\n// \u2500\u2500 Event Stream Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Subscribe to SSE events of a given type.\n * Calls the handler whenever an event arrives, optionally filtered by predicate.\n *\n * @example\n * useEventStream('vfs_change', (event) => {\n * console.log('VFS changed:', event);\n * });\n */\nexport function useEventStream(\n handlerOrEventType: string | ((data: any) => void),\n handlerOrOptions?: ((data: any) => void) | { eventType: string; filter?: (data: any) => boolean; enabled?: boolean },\n filter?: (data: any) => boolean,\n) {\n // Normalize overloaded signatures:\n // 1. useEventStream(eventType, handler, filter?) \u2014 positional (legacy)\n // 2. useEventStream(handler, { eventType, filter, enabled }) \u2014 options-object\n let eventType: string;\n let handler: (data: any) => void;\n let resolvedFilter: ((data: any) => boolean) | undefined;\n let enabled = true;\n\n if (typeof handlerOrEventType === 'string') {\n // Legacy positional API\n eventType = handlerOrEventType;\n handler = handlerOrOptions as (data: any) => void;\n resolvedFilter = filter;\n } else {\n // Options-object API\n handler = handlerOrEventType;\n const opts = handlerOrOptions as { eventType: string; filter?: (data: any) => boolean; enabled?: boolean };\n eventType = opts.eventType;\n resolvedFilter = opts.filter;\n enabled = opts.enabled ?? true;\n }\n\n const handlerRef = useRef(handler);\n const filterRef = useRef(resolvedFilter);\n useEffect(() => {\n handlerRef.current = handler;\n filterRef.current = resolvedFilter;\n }, [handler, resolvedFilter]);\n useEffect(() => {\n if (!enabled) return;\n const unsub = subscribeToEvents(\n eventType,\n (data: any) => handlerRef.current(data),\n filterRef.current ? (data: any) => filterRef.current!(data) : undefined,\n );\n return unsub;\n }, [eventType, enabled]);\n}\n\n// \u2500\u2500 Realtime Query Hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * A useQuery wrapper that auto-refetches on matching SSE events.\n *\n * @example\n * const { data } = useRealtimeQuery({\n * queryKey: ['my-data'],\n * queryFn: () => fetchMyData(),\n * eventType: 'vfs_change',\n * filter: (data) => data.path.startsWith('/root/foo'),\n * });\n */\nexport function useRealtimeQuery<T>(options: {\n queryKey: readonly unknown[];\n queryFn: () => Promise<T>;\n eventType: string | string[];\n filter?: (data: any) => boolean;\n enabled?: boolean;\n debounceMs?: number;\n}) {\n const { queryKey, queryFn, eventType, filter, enabled = true, debounceMs = 500 } = options;\n const qc = useQueryClient();\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const query = useQuery({\n queryKey: queryKey as any,\n queryFn,\n enabled,\n });\n\n useEffect(() => {\n if (!enabled) return;\n\n const unsub = subscribeToEvents(\n eventType,\n () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n qc.invalidateQueries({ queryKey: queryKey as any });\n }, debounceMs);\n },\n filter,\n );\n\n return () => {\n unsub();\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [eventType, enabled, debounceMs, qc, JSON.stringify(queryKey)]);\n\n return query;\n}\n", "/**\n * @fsaos/gateway \u2014 Schema Interpretation Utilities\n *\n * Derives UI capabilities (filterable fields, sortable fields, table columns,\n * form fields) from a type definition's input_schema and system_schema.\n *\n * The type definition IS the contract. These utilities read it and return\n * structured metadata that UI components use to render generically.\n */\n\nimport type { TypeDefinition } from './types';\n\n// \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** A field descriptor derived from the type's JSON Schema. */\nexport interface FieldDescriptor {\n /** Field key (property name in type_data). */\n key: string;\n /** Human-readable label derived from schema title or key. */\n label: string;\n /** JSON Schema type (string, number, integer, boolean, array, object). */\n type: string;\n /** Description from schema. */\n description?: string;\n /** Enum values if constrained. */\n enum_values?: string[];\n /** Default value from default_data or field_defaults. */\n default_value?: any;\n /** Whether this field is user-editable (from input_schema) or system-managed. */\n editable: boolean;\n /** Whether this field can be used as a filter. */\n filterable: boolean;\n /** Whether this field can be sorted on. */\n sortable: boolean;\n /** Suggested filter widget type. */\n filter_widget: 'select' | 'text' | 'toggle' | 'range' | 'date' | 'none';\n}\n\n/** Complete schema interpretation result for a type. */\nexport interface TypeSchema {\n /** All fields (input + system), ordered as declared. */\n fields: FieldDescriptor[];\n /** Fields suitable for table columns (non-object, non-array). */\n columns: FieldDescriptor[];\n /** Fields that can be filtered on. */\n filterable: FieldDescriptor[];\n /** Fields that can be sorted on. */\n sortable: FieldDescriptor[];\n /** Fields for creation/edit forms (input_schema only). */\n form_fields: FieldDescriptor[];\n /** Fields that are system-managed (read-only display). */\n system_fields: FieldDescriptor[];\n}\n\n// \u2500\u2500 Utilities \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Convert a JSON Schema property key to a human-readable label.\n * \"display_name\" \u2192 \"Display Name\", \"is_dm\" \u2192 \"Is DM\"\n */\nfunction keyToLabel(key: string): string {\n return key\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Determine the filter widget type for a field based on its JSON Schema.\n */\nfunction inferFilterWidget(\n type: string,\n enumValues?: string[],\n): FieldDescriptor['filter_widget'] {\n if (enumValues && enumValues.length > 0) return 'select';\n if (type === 'boolean') return 'toggle';\n if (type === 'integer' || type === 'number') return 'range';\n if (type === 'string') return 'text';\n return 'none';\n}\n\n/**\n * Determine if a field is filterable based on its type.\n * Objects and arrays are not directly filterable.\n */\nfunction isFilterable(type: string, enumValues?: string[]): boolean {\n if (type === 'object' || type === 'array') return false;\n return true;\n}\n\n/**\n * Determine if a field is sortable.\n * Strings, numbers, integers, and booleans are sortable.\n */\nfunction isSortable(type: string): boolean {\n return ['string', 'number', 'integer', 'boolean'].includes(type);\n}\n\n/**\n * Determine if a field is suitable as a table column.\n * Objects and arrays are not good table columns.\n */\nfunction isColumnSuitable(type: string): boolean {\n return type !== 'object' && type !== 'array';\n}\n\n/**\n * Extract field descriptors from a JSON Schema properties object.\n */\nfunction extractFields(\n schema: Record<string, any>,\n editable: boolean,\n defaults: Record<string, any>,\n fieldDefaults: Record<string, any>,\n): FieldDescriptor[] {\n const properties = schema?.properties;\n if (!properties || typeof properties !== 'object') return [];\n\n const fields: FieldDescriptor[] = [];\n\n for (const [key, prop] of Object.entries(properties) as [string, any][]) {\n const type = prop.type || 'string';\n const enumValues = prop.enum;\n const filterable = isFilterable(type, enumValues);\n const sortable = isSortable(type);\n const filterWidget = inferFilterWidget(type, enumValues);\n\n fields.push({\n key,\n label: prop.title || keyToLabel(key),\n type,\n description: prop.description,\n enum_values: enumValues,\n default_value: defaults[key] ?? fieldDefaults[key] ?? prop.default,\n editable,\n filterable,\n sortable,\n filter_widget: filterWidget,\n });\n }\n\n return fields;\n}\n\n// \u2500\u2500 Main API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Interpret a type definition's schemas and return structured field metadata.\n *\n * @example\n * const typeDef = useType('project');\n * const schema = interpretSchema(typeDef);\n * // schema.columns \u2192 fields to show in table\n * // schema.filterable \u2192 fields to offer as filters\n * // schema.form_fields \u2192 fields for create/edit form\n */\nexport function interpretSchema(typeDef: TypeDefinition): TypeSchema {\n const defaults = typeDef.default_data || {};\n const fieldDefaults = typeDef.field_defaults || {};\n\n const inputFields = extractFields(\n typeDef.input_schema,\n true,\n defaults,\n fieldDefaults,\n );\n\n const systemFields = extractFields(\n typeDef.system_schema,\n false,\n defaults,\n fieldDefaults,\n );\n\n const allFields = [...inputFields, ...systemFields];\n const columns = allFields.filter((f) => isColumnSuitable(f.type));\n const filterable = allFields.filter((f) => f.filterable);\n const sortable = allFields.filter((f) => f.sortable);\n\n return {\n fields: allFields,\n columns,\n filterable,\n sortable,\n form_fields: inputFields,\n system_fields: systemFields,\n };\n}\n\n/**\n * Get the default sort field for a type.\n * Returns 'updated_at' as the universal default (column on os_items).\n */\nexport function getDefaultSort(_typeDef: TypeDefinition): {\n field: string;\n direction: 'asc' | 'desc';\n} {\n return { field: 'updated_at', direction: 'desc' };\n}\n\n/**\n * Get the creation form schema for a type \u2014 only editable fields\n * that don't have defaults (i.e., the user must provide them).\n */\nexport function getRequiredFormFields(typeDef: TypeDefinition): FieldDescriptor[] {\n const schema = interpretSchema(typeDef);\n const required = new Set(typeDef.input_schema?.required || []);\n return schema.form_fields.filter(\n (f) => required.has(f.key) || f.default_value === undefined,\n );\n}\n", "/**\n * @fsaos/gateway \u2014 File Upload\n *\n * Two exports:\n * - uploadFile() \u2014 imperative, returns a Promise. Use from Fractals, scripts,\n * non-React contexts, or anywhere you just need the result.\n * - useFileUpload() \u2014 React hook wrapping uploadFile() with reactive state\n * (progress tracking, retry, cancel, uploads list).\n *\n * Both orchestrate the same three-step dance:\n * 1. gatewayCall('create', { file_source }) \u2192 VFS item + storage instruction\n * 2. PUT binary \u2192 storage worker (direct upload, no gateway proxy)\n * 3. POST /storage/upload-complete \u2192 gateway verifies + commits file_ref\n *\n * The consumer never sees storage_instruction, upload_token, or the\n * upload-complete endpoint. They call upload(file, opts) and get a result.\n */\n\nimport { useState, useCallback, useRef } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { gatewayCall } from './client';\nimport { getAccessToken } from './session';\nimport { GATEWAY_URL } from './config';\nimport { vfsKeys } from './vfs-keys';\n\n// \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface FileRef {\n storage_key: string;\n provider: string;\n content_type: string;\n size_bytes: number;\n version: number;\n etag?: string;\n}\n\nexport interface UploadOptions {\n /** VFS path where the file item will be created (required). */\n parentPath: string;\n /** Override the file name (defaults to File.name). */\n name?: string;\n /** Override item_type (defaults to 'file'). */\n itemType?: string;\n /** Additional type_data fields to merge onto the created item. */\n typeData?: Record<string, unknown>;\n}\n\nexport interface UploadResult {\n itemId: string;\n itemPath: string;\n fileRef: FileRef;\n}\n\nexport interface UploadItem {\n /** Client-generated tracking ID. */\n id: string;\n /** The original File object. */\n file: File;\n /** Current status in the three-step dance. */\n status: 'creating' | 'uploading' | 'confirming' | 'complete' | 'error';\n /** Upload progress 0\u2013100 (only meaningful during 'uploading'). */\n progress: number;\n /** Error message if status is 'error'. */\n error: string | null;\n /** VFS item ID (available after 'creating' succeeds). */\n itemId: string | null;\n /** VFS item path. */\n itemPath: string | null;\n /** Completed file_ref (available when status is 'complete'). */\n fileRef: FileRef | null;\n /** The options that were passed to upload(). */\n options: UploadOptions;\n}\n\nexport interface UseFileUploadReturn {\n /** Upload a single file. */\n upload: (file: File, options: UploadOptions) => void;\n /** Upload multiple files to the same destination. */\n uploadMultiple: (files: File[], options: UploadOptions) => void;\n /** Reactive list of all uploads (in-progress, completed, failed). */\n uploads: UploadItem[];\n /** Retry a failed upload from the step it failed at. */\n retryUpload: (uploadId: string) => void;\n /** Cancel an in-progress upload (aborts XHR if uploading). */\n cancelUpload: (uploadId: string) => void;\n /** Remove a completed or failed upload from the list. */\n removeUpload: (uploadId: string) => void;\n /** Remove all completed uploads from the list. */\n clearCompleted: () => void;\n /** True if any upload is currently in progress. */\n isUploading: boolean;\n}\n\n// \u2500\u2500 Internal types for retry state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface InternalUploadState extends UploadItem {\n /** Storage key from Step 1 (needed for Steps 2 and 3). */\n _storageKey: string | null;\n /** Upload token from Step 1 (needed for Step 2). */\n _uploadToken: string | null;\n /** Storage worker URL from Step 1 (needed for Step 2). */\n _storageWorkerUrl: string | null;\n /** XHR reference for cancel support. */\n _xhr: XMLHttpRequest | null;\n /** Which step failed \u2014 used by retry to resume from the right place. */\n _failedAt: 'create' | 'upload' | 'confirm' | null;\n}\n\n// \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet _idCounter = 0;\nfunction generateUploadId(): string {\n return `upload_${Date.now()}_${++_idCounter}`;\n}\n\n// \u2500\u2500 uploadFile (imperative) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Upload a file to the VFS. Handles the full three-step dance:\n * create \u2192 upload binary \u2192 confirm.\n *\n * @param file The File or Blob to upload.\n * @param options Where to put it and what to call it.\n * @param onProgress Optional callback for upload progress (0\u2013100).\n * @param signal Optional AbortSignal for cancellation.\n * @returns The created item's ID, path, and committed file_ref.\n */\nexport async function uploadFile(\n file: File | Blob,\n options: UploadOptions,\n onProgress?: (percent: number) => void,\n signal?: AbortSignal,\n): Promise<UploadResult> {\n const fileName = options.name || (file instanceof File ? file.name : `file-${Date.now()}`);\n const contentType = file.type || 'application/octet-stream';\n const itemType = options.itemType || 'file';\n\n // \u2500\u2500 Step 1: Create VFS item with file_source intent \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const createResult = await gatewayCall('create', {\n parent_path: options.parentPath,\n item_type: itemType,\n name: fileName,\n type_data: {\n ...(options.typeData || {}),\n file_source: {\n type: 'upload',\n content_type: contentType,\n },\n },\n });\n\n const result = createResult as Record<string, any>;\n\n if (!result.id) {\n throw new Error(result.error || result.message || 'Failed to create file item');\n }\n\n const itemId = result.id as string;\n const itemPath = result.path as string;\n\n // If the gateway handled upload synchronously (inline/url source types),\n // file_ref is already committed \u2014 we're done.\n if (result.storage_completed && result.file_ref) {\n return { itemId, itemPath, fileRef: result.file_ref as FileRef };\n }\n\n // Extract storage instruction values for Steps 2 and 3.\n const storageKey = result.storage_key as string;\n const uploadToken = result.upload_token as string;\n const storageWorkerUrl = (result.storage_worker_url as string) || 'https://fsaos-storage.radns.workers.dev';\n\n if (!storageKey) {\n throw new Error('Gateway returned no storage_key \u2014 file_source may not be supported for this item type');\n }\n\n // \u2500\u2500 Step 2: Upload binary directly to storage worker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n await uploadBinaryXHR(storageWorkerUrl, storageKey, uploadToken, file, contentType, onProgress, signal);\n\n // \u2500\u2500 Step 3: Confirm upload via gateway \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const fileRef = await confirmUpload(itemId, storageKey, contentType);\n\n return { itemId, itemPath, fileRef };\n}\n\n// \u2500\u2500 Step 2 helper: XHR upload with progress \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction uploadBinaryXHR(\n storageWorkerUrl: string,\n storageKey: string,\n uploadToken: string,\n body: File | Blob,\n contentType: string,\n onProgress?: (percent: number) => void,\n signal?: AbortSignal,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('PUT', `${storageWorkerUrl}/upload`);\n xhr.setRequestHeader('X-Storage-Key', storageKey);\n xhr.setRequestHeader('Content-Type', contentType);\n if (uploadToken) {\n xhr.setRequestHeader('X-Upload-Token', uploadToken);\n }\n\n xhr.upload.onprogress = (e) => {\n if (e.lengthComputable && onProgress) {\n onProgress(Math.round((e.loaded / e.total) * 100));\n }\n };\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve();\n } else {\n reject(new Error(`Storage upload failed: HTTP ${xhr.status} \u2014 ${xhr.responseText?.slice(0, 300)}`));\n }\n };\n\n xhr.onerror = () => reject(new Error('Storage upload network error'));\n xhr.ontimeout = () => reject(new Error('Storage upload timed out'));\n\n // Cancellation support\n if (signal) {\n if (signal.aborted) {\n reject(new Error('Upload cancelled'));\n return;\n }\n signal.addEventListener('abort', () => {\n xhr.abort();\n reject(new Error('Upload cancelled'));\n });\n }\n\n xhr.send(body);\n });\n}\n\n// \u2500\u2500 Step 3 helper: confirm upload \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function confirmUpload(\n itemId: string,\n storageKey: string,\n contentType: string,\n): Promise<FileRef> {\n const token = await getAccessToken();\n\n const response = await fetch(`${GATEWAY_URL}/storage/upload-complete`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(token ? { 'Authorization': `Bearer ${token}` } : {}),\n },\n body: JSON.stringify({\n item_id: itemId,\n storage_key: storageKey,\n content_type: contentType,\n }),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(`Upload confirmation failed: HTTP ${response.status} \u2014 ${text.slice(0, 300)}`);\n }\n\n const result = await response.json();\n\n if (!result.success) {\n throw new Error(result.error || result.message || 'Upload confirmation rejected');\n }\n\n return result.file_ref as FileRef;\n}\n\n// \u2500\u2500 useFileUpload (React hook) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * React hook for file uploads. Wraps uploadFile() with reactive state:\n * tracks progress, supports retry from the failed step, cancel, and\n * manages a list of concurrent uploads.\n *\n * @example\n * ```tsx\n * const { upload, uploads, isUploading } = useFileUpload();\n *\n * const handleDrop = (files: File[]) => {\n * for (const file of files) {\n * upload(file, { parentPath: '/root/accounts/.../drive' });\n * }\n * };\n *\n * return (\n * <div onDrop={handleDrop}>\n * {uploads.map(u => (\n * <div key={u.id}>{u.file.name} \u2014 {u.status} \u2014 {u.progress}%</div>\n * ))}\n * </div>\n * );\n * ```\n */\nexport function useFileUpload(): UseFileUploadReturn {\n const [uploads, setUploads] = useState<InternalUploadState[]>([]);\n const qc = useQueryClient();\n // Keep a ref to the latest uploads so callbacks can read fresh state\n const uploadsRef = useRef(uploads);\n uploadsRef.current = uploads;\n\n // \u2500\u2500 State helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const updateUpload = useCallback((id: string, patch: Partial<InternalUploadState>) => {\n setUploads(prev => prev.map(u => u.id === id ? { ...u, ...patch } : u));\n }, []);\n\n const addUpload = useCallback((item: InternalUploadState) => {\n setUploads(prev => [...prev, item]);\n }, []);\n\n // \u2500\u2500 Core upload execution \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const executeUpload = useCallback(async (\n uploadId: string,\n file: File,\n options: UploadOptions,\n resumeFrom?: 'create' | 'upload' | 'confirm',\n existingState?: { storageKey: string; uploadToken: string; storageWorkerUrl: string; itemId: string; itemPath: string },\n ) => {\n const fileName = options.name || file.name;\n const contentType = file.type || 'application/octet-stream';\n const itemType = options.itemType || 'file';\n\n let itemId = existingState?.itemId || null;\n let itemPath = existingState?.itemPath || null;\n let storageKey = existingState?.storageKey || null;\n let uploadToken = existingState?.uploadToken || null;\n let storageWorkerUrl = existingState?.storageWorkerUrl || null;\n\n try {\n // \u2500\u2500 Step 1: Create \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (!resumeFrom || resumeFrom === 'create') {\n updateUpload(uploadId, { status: 'creating', error: null, _failedAt: null });\n\n const createResult = await gatewayCall('create', {\n parent_path: options.parentPath,\n item_type: itemType,\n name: fileName,\n type_data: {\n ...(options.typeData || {}),\n file_source: {\n type: 'upload',\n content_type: contentType,\n },\n },\n });\n\n const result = createResult as Record<string, any>;\n\n if (!result.id) {\n throw Object.assign(\n new Error(result.error || result.message || 'Failed to create file item'),\n { _step: 'create' as const },\n );\n }\n\n itemId = result.id;\n itemPath = result.path;\n\n updateUpload(uploadId, { itemId, itemPath });\n\n // Synchronous completion (inline/url file_source)\n if (result.storage_completed && result.file_ref) {\n updateUpload(uploadId, {\n status: 'complete',\n progress: 100,\n fileRef: result.file_ref,\n });\n qc.invalidateQueries({ queryKey: vfsKeys.children(options.parentPath) });\n return;\n }\n\n storageKey = result.storage_key;\n uploadToken = result.upload_token || '';\n storageWorkerUrl = result.storage_worker_url || 'https://fsaos-storage.radns.workers.dev';\n\n updateUpload(uploadId, {\n _storageKey: storageKey,\n _uploadToken: uploadToken,\n _storageWorkerUrl: storageWorkerUrl,\n });\n\n if (!storageKey) {\n throw Object.assign(\n new Error('Gateway returned no storage_key'),\n { _step: 'create' as const },\n );\n }\n }\n\n // \u2500\u2500 Step 2: Upload binary \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (!resumeFrom || resumeFrom === 'create' || resumeFrom === 'upload') {\n updateUpload(uploadId, { status: 'uploading', progress: 0, error: null, _failedAt: null });\n\n // Create XHR for cancel support\n const xhrPromise = new Promise<void>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n updateUpload(uploadId, { _xhr: xhr });\n\n xhr.open('PUT', `${storageWorkerUrl}/upload`);\n xhr.setRequestHeader('X-Storage-Key', storageKey!);\n xhr.setRequestHeader('Content-Type', contentType);\n if (uploadToken) {\n xhr.setRequestHeader('X-Upload-Token', uploadToken);\n }\n\n xhr.upload.onprogress = (e) => {\n if (e.lengthComputable) {\n updateUpload(uploadId, { progress: Math.round((e.loaded / e.total) * 100) });\n }\n };\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve();\n } else {\n reject(Object.assign(\n new Error(`Storage upload failed: HTTP ${xhr.status}`),\n { _step: 'upload' as const },\n ));\n }\n };\n\n xhr.onerror = () => reject(Object.assign(\n new Error('Storage upload network error'),\n { _step: 'upload' as const },\n ));\n\n xhr.ontimeout = () => reject(Object.assign(\n new Error('Storage upload timed out'),\n { _step: 'upload' as const },\n ));\n\n xhr.send(file);\n });\n\n await xhrPromise;\n updateUpload(uploadId, { progress: 100, _xhr: null });\n }\n\n // \u2500\u2500 Step 3: Confirm \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n updateUpload(uploadId, { status: 'confirming', error: null, _failedAt: null });\n\n const fileRef = await confirmUpload(itemId!, storageKey!, contentType);\n\n updateUpload(uploadId, {\n status: 'complete',\n fileRef,\n });\n\n // Invalidate the parent's children so the new item appears in lists\n qc.invalidateQueries({ queryKey: vfsKeys.children(options.parentPath) });\n\n } catch (err: any) {\n const message = err?.message || String(err);\n const failedAt = err?._step || 'create';\n updateUpload(uploadId, {\n status: 'error',\n error: message,\n _failedAt: failedAt,\n _xhr: null,\n });\n }\n }, [updateUpload, qc]);\n\n // \u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const upload = useCallback((file: File, options: UploadOptions) => {\n const id = generateUploadId();\n const item: InternalUploadState = {\n id,\n file,\n status: 'creating',\n progress: 0,\n error: null,\n itemId: null,\n itemPath: null,\n fileRef: null,\n options,\n _storageKey: null,\n _uploadToken: null,\n _storageWorkerUrl: null,\n _xhr: null,\n _failedAt: null,\n };\n addUpload(item);\n executeUpload(id, file, options);\n }, [addUpload, executeUpload]);\n\n const uploadMultiple = useCallback((files: File[], options: UploadOptions) => {\n for (const file of files) {\n upload(file, options);\n }\n }, [upload]);\n\n const retryUpload = useCallback((uploadId: string) => {\n const item = uploadsRef.current.find(u => u.id === uploadId);\n if (!item || item.status !== 'error') return;\n\n const resumeFrom = item._failedAt || 'create';\n const existingState = (item._storageKey && item.itemId) ? {\n storageKey: item._storageKey,\n uploadToken: item._uploadToken || '',\n storageWorkerUrl: item._storageWorkerUrl || 'https://fsaos-storage.radns.workers.dev',\n itemId: item.itemId,\n itemPath: item.itemPath || '',\n } : undefined;\n\n executeUpload(uploadId, item.file, item.options, resumeFrom, existingState);\n }, [executeUpload]);\n\n const cancelUpload = useCallback((uploadId: string) => {\n const item = uploadsRef.current.find(u => u.id === uploadId);\n if (!item) return;\n // Abort XHR if in-flight\n if (item._xhr) {\n item._xhr.abort();\n }\n updateUpload(uploadId, {\n status: 'error',\n error: 'Cancelled',\n _xhr: null,\n _failedAt: null,\n });\n }, [updateUpload]);\n\n const removeUpload = useCallback((uploadId: string) => {\n setUploads(prev => prev.filter(u => u.id !== uploadId));\n }, []);\n\n const clearCompleted = useCallback(() => {\n setUploads(prev => prev.filter(u => u.status !== 'complete'));\n }, []);\n\n const isUploading = uploads.some(u =>\n u.status === 'creating' || u.status === 'uploading' || u.status === 'confirming'\n );\n\n // Strip internal fields from the public-facing uploads array\n const publicUploads: UploadItem[] = uploads.map(({ _storageKey, _uploadToken, _storageWorkerUrl, _xhr, _failedAt, ...rest }) => rest);\n\n return {\n upload,\n uploadMultiple,\n uploads: publicUploads,\n retryUpload,\n cancelUpload,\n removeUpload,\n clearCompleted,\n isUploading,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["require_supabase_js", "__commonJSMin", "exports", "module", "require_react", "__commonJSMin", "exports", "module", "require_jsx_runtime", "__commonJSMin", "exports", "module", "require_client", "__commonJSMin", "exports", "module", "require_react_dom", "__commonJSMin", "exports", "module", "index_exports", "__export", "ComponentRenderer", "EnforcementDeniedError", "KernelProvider", "QueryClientProvider", "auth", "awaitScopeReady", "callTool", "clearCachedToken", "clearSession", "createItem", "disconnectSSE", "disposeVfsRealtimeWs", "emitEvent", "fetchChannelMessages", "fetchChannelMessagesPage", "fetchEdgesForItem", "fetchItemHistory", "fetchItems", "fetchMemberFocus", "fetchOpenEnvelope", "fetchRecentActivity", "fetchTypeDefinitions", "fetchVfsChildren", "fetchVfsChildrenPage", "fetchVfsItem", "fetchVfsItemById", "fetchVfsTree", "gatewayCall", "getAccessToken", "getAssetUrl", "getDefaultSort", "getRequiredFormFields", "getScope", "getScopeVersion", "getSessionEntry", "initSession", "initVfsRealtimeWs", "interpretSchema", "invalidateAllVfs", "invalidateChannelMessages", "invalidateChildren", "invalidateItem", "invalidateOpenEnvelope", "invalidatePathAndParent", "invalidateSubtree", "invalidateTypes", "isScopeReady", "listChildren", "mount", "mountRealtimeScope", "normalizeItem", "ping", "pushChanges", "queryClient", "readItem", "registerCleanup", "resetAllSdkState", "resolvePrincipalId", "setCachedToken", "setScope", "setupRequireShim", "signal", "subscribeScope", "subscribeToEvents", "subscribeToPath", "subscribeToScope", "unmountRealtimeScope", "updateItem", "uploadFile", "useAccounts", "useAllChannels", "useAsset", "useAuth", "useChannelMessages", "useChannels", "useChildren", "useComponent", "useCreate", "useDelete", "useDmChannels", "useEdges", "useEventStream", "useFileUpload", "useInfiniteChannelMessages", "useInfiniteChildren", "useInfiniteItems", "useItem", "useItemById", "useItemHistory", "useItems", "useLink", "useList", "useMemberFocus", "useMove", "useMutation", "useNotifications", "useOpen", "usePermission", "usePermissions", "usePrincipal", "useRealtimeQuery", "useRecentActivity", "useScope", "useScopeReady", "useSearch", "useTheme", "useTool", "useTree", "useType", "useTypeHelpers", "useTypes", "useUnreadCounts", "useUpdate", "vfsKeys", "EnforcementDeniedError", "_EnforcementDeniedError", "payload", "message", "__publicField", "enforcement", "err", "deniedBy", "import_supabase_js", "CONFIG", "SUPABASE_URL", "SUPABASE_ANON_KEY", "GATEWAY_URL", "supabase", "cachedToken", "tokenExpiresAt", "tokenReady", "resolveTokenReady", "tokenResolved", "resolve", "supabase", "_event", "session", "setCachedToken", "token", "expiresAt", "clearCachedToken", "getAccessToken", "currentScopePath", "scopeVersion", "scopeListeners", "scopeReady", "resolveScopeReady", "scopeResolved", "setScope", "scopePath", "changed", "listener", "e", "getScope", "getScopeVersion", "subscribeScope", "awaitScopeReady", "isScopeReady", "sessionEntry", "sessionPromise", "initSession", "hostname", "getHostname", "headers", "response", "GATEWAY_URL", "json", "entry", "getSessionEntry", "clearSession", "cleanupRegistry", "registerCleanup", "fn", "resetAllSdkState", "cfg", "SCOPE_INDEPENDENT_METHODS", "gatewayCall", "method", "params", "hostname", "getHostname", "url", "GATEWAY_URL", "headers", "token", "getAccessToken", "awaitScopeReady", "enrichedParams", "session", "getSessionEntry", "scopePath", "getScope", "response", "json", "err", "deniedBy", "EnforcementDeniedError", "Subscribable", "listener", "FocusManager", "_a", "Subscribable", "__privateAdd", "_focused", "_cleanup", "_setup", "__privateSet", "onFocus", "listener", "__privateGet", "setup", "focused", "isFocused", "focusManager", "defaultTimeoutProvider", "callback", "delay", "timeoutId", "intervalId", "TimeoutManager", "_a", "__privateAdd", "_provider", "_providerCalled", "provider", "__privateSet", "__privateGet", "timeoutManager", "systemSetTimeoutZero", "isServer", "noop", "functionalUpdate", "updater", "input", "isValidTimeout", "value", "timeUntilStale", "updatedAt", "staleTime", "resolveStaleTime", "query", "resolveEnabled", "enabled", "matchQuery", "filters", "type", "exact", "fetchStatus", "predicate", "queryKey", "stale", "hashQueryKeyByOptions", "partialMatchKey", "isActive", "matchMutation", "mutation", "status", "mutationKey", "hashKey", "options", "_", "val", "isPlainObject", "result", "key", "a", "b", "hasOwn", "replaceEqualDeep", "depth", "array", "isPlainArray", "aSize", "bItems", "bSize", "copy", "equalItems", "i", "aItem", "bItem", "v", "shallowEqualObjects", "o", "hasObjectPrototype", "ctor", "prot", "sleep", "timeout", "resolve", "timeoutManager", "replaceData", "prevData", "data", "addToEnd", "items", "item", "max", "newItems", "addToStart", "skipToken", "ensureQueryFn", "options", "fetchOptions", "shouldThrowError", "throwOnError", "params", "addConsumeAwareSignal", "object", "getSignal", "onCancelled", "consumed", "signal", "environmentManager", "isServerFn", "isServer", "isServerValue", "pendingThenable", "resolve", "reject", "thenable", "_resolve", "_reject", "finalize", "data", "value", "reason", "defaultScheduler", "systemSetTimeoutZero", "createNotifyManager", "queue", "transactions", "notifyFn", "callback", "batchNotifyFn", "scheduleFn", "schedule", "flush", "originalQueue", "result", "args", "fn", "notifyManager", "OnlineManager", "_a", "Subscribable", "__privateAdd", "_online", "_cleanup", "_setup", "__privateSet", "onOnline", "onlineListener", "offlineListener", "__privateGet", "setup", "online", "listener", "onlineManager", "defaultRetryDelay", "failureCount", "canFetch", "networkMode", "onlineManager", "CancelledError", "options", "createRetryer", "config", "isRetryCancelled", "failureCount", "continueFn", "thenable", "pendingThenable", "isResolved", "cancel", "cancelOptions", "error", "CancelledError", "reject", "cancelRetry", "continueRetry", "canContinue", "focusManager", "onlineManager", "canStart", "canFetch", "resolve", "value", "pause", "continueResolve", "run", "promiseOrValue", "initialPromise", "retry", "environmentManager", "retryDelay", "defaultRetryDelay", "delay", "shouldRetry", "sleep", "Removable", "_a", "__privateAdd", "_gcTimeout", "isValidTimeout", "__privateSet", "timeoutManager", "newGcTime", "environmentManager", "__privateGet", "Query", "_a", "Removable", "config", "__privateAdd", "_Query_instances", "_initialState", "_revertState", "_cache", "_client", "_retryer", "_defaultOptions", "_abortSignalConsumed", "__privateSet", "__privateGet", "getDefaultState", "options", "defaultState", "successState", "newData", "data", "replaceData", "__privateMethod", "dispatch_fn", "state", "setStateOptions", "promise", "noop", "observer", "resolveEnabled", "skipToken", "resolveStaleTime", "staleTime", "timeUntilStale", "x", "isInitialPausedFetch_fn", "fetchOptions", "abortController", "addSignalProperty", "object", "fetchFn", "queryFn", "ensureQueryFn", "queryFnContext", "context", "createRetryer", "error", "CancelledError", "failureCount", "action", "reducer", "fetchState", "newState", "notifyManager", "canFetch", "dataUpdatedAt", "hasData", "initialDataUpdatedAt", "QueryObserver", "_a", "Subscribable", "client", "options", "__privateAdd", "_QueryObserver_instances", "_client", "_currentQuery", "_currentQueryInitialState", "_currentResult", "_currentResultState", "_currentResultOptions", "_currentThenable", "_selectError", "_selectFn", "_selectResult", "_lastQueryWithDefinedData", "_staleTimeoutId", "_refetchIntervalId", "_currentRefetchInterval", "_trackedProps", "__privateSet", "pendingThenable", "__privateGet", "shouldFetchOnMount", "__privateMethod", "executeFetch_fn", "updateTimers_fn", "shouldFetchOn", "clearStaleTimeout_fn", "clearRefetchInterval_fn", "prevOptions", "prevQuery", "resolveEnabled", "updateQuery_fn", "shallowEqualObjects", "mounted", "shouldFetchOptionally", "resolveStaleTime", "updateStaleTimeout_fn", "nextRefetchInterval", "computeRefetchInterval_fn", "updateRefetchInterval_fn", "query", "result", "shouldAssignObserverCurrentProperties", "onPropTracked", "target", "key", "defaultedOptions", "fetchOptions", "prevResult", "prevResultState", "prevResultOptions", "queryInitialState", "state", "newState", "isPlaceholderData", "data", "fetchOnMount", "fetchOptionally", "fetchState", "error", "errorUpdatedAt", "status", "skipSelect", "placeholderData", "replaceData", "selectError", "isFetching", "isPending", "isError", "isLoading", "hasData", "nextResult", "isStale", "hasResultData", "isErrorWithoutData", "finalizeThenableIfPossible", "thenable", "recreateThenable", "pending", "prevThenable", "shouldNotifyListeners", "notifyOnChangeProps", "notifyOnChangePropsValue", "includedProps", "typedKey", "notify_fn", "promise", "noop", "staleTime", "environmentManager", "isValidTimeout", "timeout", "timeUntilStale", "timeoutManager", "nextInterval", "focusManager", "notifyOptions", "notifyManager", "listener", "shouldLoadOnMount", "field", "value", "observer", "optimisticResult", "infiniteQueryBehavior", "pages", "context", "query", "options", "direction", "oldPages", "oldPageParams", "result", "currentPage", "fetchFn", "cancelled", "addSignalProperty", "object", "addConsumeAwareSignal", "queryFn", "ensureQueryFn", "fetchPage", "data", "param", "previous", "queryFnContext", "page", "maxPages", "addTo", "addToStart", "addToEnd", "pageParamFn", "getPreviousPageParam", "getNextPageParam", "oldData", "remainingPages", "pageParams", "lastIndex", "hasNextPage", "hasPreviousPage", "InfiniteQueryObserver", "QueryObserver", "client", "options", "infiniteQueryBehavior", "query", "state", "parentResult", "isFetching", "isRefetching", "isError", "isRefetchError", "fetchDirection", "isFetchNextPageError", "isFetchingNextPage", "isFetchPreviousPageError", "isFetchingPreviousPage", "hasNextPage", "hasPreviousPage", "Mutation", "_a", "Removable", "config", "__privateAdd", "_Mutation_instances", "_client", "_observers", "_mutationCache", "_retryer", "__privateSet", "getDefaultState", "options", "observer", "__privateGet", "x", "variables", "onContinue", "__privateMethod", "dispatch_fn", "mutationFnContext", "createRetryer", "failureCount", "error", "restored", "isPaused", "context", "data", "e", "action", "reducer", "state", "notifyManager", "MutationCache", "_a", "Subscribable", "config", "__privateAdd", "_mutations", "_scopes", "_mutationId", "__privateSet", "client", "options", "state", "mutation", "Mutation", "__privateWrapper", "__privateGet", "scope", "scopeFor", "scopedMutations", "index", "firstPendingMutation", "m", "notifyManager", "filters", "defaultedFilters", "matchMutation", "event", "listener", "pausedMutations", "x", "noop", "MutationObserver", "_a", "Subscribable", "client", "options", "__privateAdd", "_MutationObserver_instances", "_client", "_currentResult", "_currentMutation", "_mutateOptions", "__privateSet", "__privateMethod", "updateResult_fn", "prevOptions", "__privateGet", "shallowEqualObjects", "hashKey", "action", "notify_fn", "variables", "state", "getDefaultState", "notifyManager", "onMutateResult", "context", "e", "listener", "QueryCache", "_a", "Subscribable", "config", "__privateAdd", "_queries", "__privateSet", "client", "options", "state", "queryKey", "queryHash", "hashQueryKeyByOptions", "query", "Query", "__privateGet", "queryInMap", "notifyManager", "filters", "defaultedFilters", "matchQuery", "queries", "event", "listener", "QueryClient", "_a", "config", "__privateAdd", "_queryCache", "_mutationCache", "_defaultOptions", "_queryDefaults", "_mutationDefaults", "_mountCount", "_unsubscribeFocus", "_unsubscribeOnline", "__privateSet", "QueryCache", "MutationCache", "__privateWrapper", "__privateGet", "focusManager", "focused", "onlineManager", "online", "_b", "filters", "queryKey", "options", "defaultedOptions", "query", "cachedData", "resolveStaleTime", "state", "data", "updater", "prevData", "functionalUpdate", "notifyManager", "queryCache", "cancelOptions", "defaultedCancelOptions", "promises", "noop", "fetchOptions", "promise", "infiniteQueryBehavior", "hashKey", "defaults", "result", "queryDefault", "partialMatchKey", "mutationKey", "hashQueryKeyByOptions", "skipToken", "React", "import_jsx_runtime", "QueryClientContext", "useQueryClient", "queryClient", "client", "QueryClientProvider", "children", "React", "IsRestoringContext", "useIsRestoring", "IsRestoringProvider", "React", "import_jsx_runtime", "createValue", "isReset", "QueryErrorResetBoundaryContext", "useQueryErrorResetBoundary", "React", "ensurePreventErrorBoundaryRetry", "options", "errorResetBoundary", "query", "throwOnError", "shouldThrowError", "useClearResetErrorBoundary", "getHasError", "result", "suspense", "ensureSuspenseTimers", "defaultedOptions", "clamp", "value", "originalStaleTime", "args", "willFetch", "result", "isRestoring", "shouldSuspend", "fetchOptimistic", "observer", "errorResetBoundary", "React", "useBaseQuery", "options", "Observer", "queryClient", "isRestoring", "useIsRestoring", "errorResetBoundary", "useQueryErrorResetBoundary", "client", "useQueryClient", "defaultedOptions", "query", "ensureSuspenseTimers", "ensurePreventErrorBoundaryRetry", "useClearResetErrorBoundary", "isNewCacheEntry", "observer", "result", "shouldSubscribe", "onStoreChange", "unsubscribe", "notifyManager", "noop", "shouldSuspend", "fetchOptimistic", "getHasError", "environmentManager", "willFetch", "useQuery", "options", "queryClient", "useBaseQuery", "QueryObserver", "React", "useMutation", "options", "queryClient", "client", "useQueryClient", "observer", "MutationObserver", "result", "onStoreChange", "notifyManager", "mutate", "variables", "mutateOptions", "noop", "shouldThrowError", "useInfiniteQuery", "options", "queryClient", "useBaseQuery", "InfiniteQueryObserver", "queryClient", "QueryClient", "sk", "getScope", "vfsKeys", "path", "id", "scopeId", "itemId", "query", "types", "type", "filters", "depth", "strategy", "a", "b", "c", "channelPath", "parentMessageId", "filter", "limit", "principalId", "nowISO", "randomId", "normalizeItem", "raw", "path", "segments", "parentPath", "typeData", "extractItems", "response", "fetchVfsItemById", "id", "gatewayCall", "item", "queryClient", "vfsKeys", "normalized", "fetchVfsItem", "fetchVfsChildren", "items", "err", "fetchVfsChildrenPage", "limit", "offset", "fetchTypeDefinitions", "scopeId", "rawItems", "types", "name", "td", "fetchEdgesForItem", "itemId", "outgoing", "incoming", "edges", "edge", "fetchVfsTree", "maxDepth", "itemTypes", "params", "fetchRecentActivity", "scopePath", "fetchItemHistory", "fetchMemberFocus", "fetchOpenEnvelope", "options", "r", "fetchItems", "filter", "filters", "key", "value", "parseChannelMessages", "i", "role", "metadata", "a", "b", "fetchChannelMessages", "channelPath", "parentMessageId", "fetchChannelMessagesPage", "invalidateChildren", "invalidateItem", "invalidatePathAndParent", "fallbackParent", "invalidateSubtree", "prefix", "query", "segment", "invalidateAllVfs", "invalidateTypes", "invalidateChannelMessages", "invalidateOpenEnvelope", "strategy", "DEBUG", "log", "args", "ws", "connectionInFlight", "reconnectTimer", "reconnectAttempts", "MAX_RECONNECT_DELAY", "CONNECTION_TIMEOUT_MS", "intentionalClose", "PING_INTERVAL_MS", "pingInterval", "visibilityListenerAttached", "startPing", "stopPing", "sendMessage", "handleVisibilityChange", "hasActiveSubscriptions", "ensureConnection", "attachVisibilityListener", "pathListeners", "typedListeners", "activeScopes", "activePaths", "hasListeners", "k", "config", "gatewayUrl", "GATEWAY_URL", "token", "getAccessToken", "scheduleReconnect", "wsProtocol", "wsHost", "wsUrl", "resolve", "reject", "timeout", "resubscribeAll", "event", "handleMessage", "delay", "sub", "msg", "raw", "eventType", "data", "cb", "entry", "maybeDisconnect", "subscribeToPath", "path", "callback", "listeners", "idx", "subscribeToEvents", "filter", "entries", "t", "subscribeToScope", "scopeId", "eventTypes", "emitEvent", "payload", "disconnectSSE", "key", "ping", "registerCleanup", "activeScopeSubs", "unsubEvents", "debounceTimers", "DEBOUNCE_MS", "initVfsRealtimeWs", "accountId", "disposeVfsRealtimeWs", "mountRealtimeScope", "subscribeToEvents", "data", "handleVfsChange", "scopeId", "unsub", "subscribeToScope", "unmountRealtimeScope", "timer", "registerCleanup", "path", "action", "segments", "parentPath", "existing", "applyInvalidation", "queryClient", "vfsKeys", "record", "normalized", "normalizeItem", "query", "key", "treePath", "import_react", "import_client", "readItem", "path", "gatewayCall", "listChildren", "options", "createItem", "params", "updateItem", "pushChanges", "callTool", "toolName", "scopePath", "signal", "targetId", "eventName", "payload", "getAssetUrl", "auth", "opts", "supabase", "resetAllSdkState", "queryClient", "r", "callback", "subscription", "event", "session", "email", "redirectTo", "mount", "rootEl", "comp", "RootComponent", "itemData", "props", "QueryClientProvider", "queryClient", "err", "setupRequireShim", "R", "RD", "gateway", "ui", "modules", "name", "import_react", "ReactDOM", "JsxRuntime", "useScopeKey", "subscribeScope", "getScopeVersion", "useScopeReady", "isScopeReady", "useItem", "path", "useQuery", "vfsKeys", "fetchVfsItem", "useItemById", "id", "fetchVfsItemById", "useList", "fetchVfsChildren", "useChildren", "query", "useTree", "depth", "fetchVfsTree", "useSearch", "itemTypes", "params", "response", "gatewayCall", "normalizeItem", "useItems", "filter", "stableFilter", "fetchItems", "result", "useInfiniteItems", "PAGE_SIZE", "useInfiniteQuery", "getScope", "pageParam", "lastPage", "_allPages", "lastPageParam", "seen", "flat", "page", "item", "useInfiniteChildren", "fetchVfsChildrenPage", "useEdges", "itemId", "fetchEdgesForItem", "useTypes", "scopeId", "fetchTypeDefinitions", "useType", "typeKey", "typesQuery", "useOpen", "options", "stableArgs", "stableMode", "stableStrategy", "fetchOpenEnvelope", "EDGE_TYPE_LABELS", "useTypeHelpers", "types", "key", "label", "edgeType", "useMemberFocus", "limit", "fetchMemberFocus", "useItemHistory", "offset", "fetchItemHistory", "useRecentActivity", "scopePath", "fetchRecentActivity", "useScope", "data", "setData", "loading", "setLoading", "error", "setError", "cancelled", "initSession", "entry", "config", "err", "useAccounts", "user", "useAuth", "currentAccount", "setCurrentAccount", "mountedPath", "setMountedPath", "autoSelectedRef", "query", "useQuery", "vfsKeys", "gatewayCall", "m", "allMemberships", "switcherAccounts", "a", "setScope", "initVfsRealtimeWs", "switchAccount", "accountPath", "account", "mountScope", "scopePath", "unmountRealtimeScope", "mountRealtimeScope", "setUser", "session", "setSession", "loading", "setLoading", "subscriptionRef", "supabase", "data", "error", "err", "subscription", "event", "newSession", "signIn", "params", "signUp", "signOut", "resetAllSdkState", "queryClient", "resetPassword", "email", "signInWithMagicLink", "redirectTo", "useAsset", "idOrPath", "setData", "setError", "result", "e", "edgeBaseUrl", "componentCache", "componentCssCache", "registerCleanup", "key", "_sdkExports", "__registerSdkExports", "exports", "sdkRequireShim", "name", "React", "ReactDOM", "JsxRuntime", "scopeComponentCss", "cssText", "scopeClass", "_match", "ws", "_sel", "rest", "loadComponentCss", "cssUrl", "scopeId", "response", "style", "evaluateBundle", "jsCode", "registered", "previousRegister", "component", "wrappedCode", "fromIife", "exported", "useComponent", "path", "Component", "setComponent", "cancelled", "version", "cacheKey", "bundleUrl", "metaResponse", "jsResponse", "resolved", "THEME_PROPERTIES", "useTheme", "vars", "p", "usePermission", "_action", "_path", "usePermissions", "actions", "perms", "_principalIdCache", "_principalIdPromise", "resolvePrincipalId", "authUserId", "uid", "principalId", "usePrincipal", "authResult", "setPrincipalId", "prevUserIdRef", "id", "useTool", "ComponentRenderer", "props", "Comp", "KernelProvider", "useChannelMessages", "options", "scopeKey", "useScopeKey", "channelPath", "parentMessageId", "realtime", "userEnabled", "isEnabled", "stableKey", "qc", "useQueryClient", "debounceRef", "fetchChannelMessages", "unsub", "subscribeToEvents", "messages", "useInfiniteChannelMessages", "limit", "enabled", "isThread", "queryEnabled", "useInfiniteQuery", "pageParam", "fetchChannelMessagesPage", "lastPage", "firstPage", "seen", "flat", "page", "msg", "b", "normalizeAiMode", "value", "normalizeChannel", "raw", "td", "useAllChannels", "unsub2", "useChannels", "filtered", "c", "useDmChannels", "useNotifications", "filter", "unsubs", "eventType", "u", "useUnreadCounts", "channelList", "notifications", "isLoading", "isFetching", "refetch", "unreadByChannel", "counts", "n", "totalUnread", "total", "v", "dmUnread", "channelUnread", "dmIds", "dm", "ch", "count", "channelId", "useCreate", "useMutation", "_data", "variables", "parentPath", "useUpdate", "segments", "useDelete", "useMove", "newParentPath", "oldParentPath", "useLink", "sourceId", "targetId", "method", "optimistic", "previous", "old", "_vars", "context", "useEventStream", "handlerOrEventType", "handlerOrOptions", "handler", "resolvedFilter", "opts", "handlerRef", "filterRef", "useRealtimeQuery", "queryKey", "queryFn", "debounceMs", "keyToLabel", "key", "word", "inferFilterWidget", "type", "enumValues", "isFilterable", "isSortable", "isColumnSuitable", "extractFields", "schema", "editable", "defaults", "fieldDefaults", "properties", "fields", "prop", "filterable", "sortable", "filterWidget", "interpretSchema", "typeDef", "inputFields", "systemFields", "allFields", "columns", "f", "getDefaultSort", "_typeDef", "getRequiredFormFields", "required", "import_react", "_idCounter", "generateUploadId", "uploadFile", "file", "options", "onProgress", "signal", "fileName", "contentType", "itemType", "result", "gatewayCall", "itemId", "itemPath", "storageKey", "uploadToken", "storageWorkerUrl", "uploadBinaryXHR", "fileRef", "confirmUpload", "body", "resolve", "reject", "xhr", "e", "token", "getAccessToken", "response", "GATEWAY_URL", "text", "useFileUpload", "uploads", "setUploads", "qc", "useQueryClient", "uploadsRef", "updateUpload", "id", "patch", "prev", "u", "addUpload", "item", "executeUpload", "uploadId", "resumeFrom", "existingState", "vfsKeys", "err", "message", "failedAt", "upload", "uploadMultiple", "files", "retryUpload", "cancelUpload", "removeUpload", "clearCompleted", "isUploading", "publicUploads", "_storageKey", "_uploadToken", "_storageWorkerUrl", "_xhr", "_failedAt", "rest", "__registerSdkExports", "index_exports"]
|
|
7
|
+
}
|