@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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/enforcement.ts","../src/config.ts","../src/session.ts","../src/client.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"],"names":["QueryClientProvider","item","ws","createElement","useTanstackMutation","signal","useState","useQueryClient","useRef","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @fsaos/gateway — 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 — 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// ── SDK Self-Registration ─────────────────────────────────────────────────────\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 — 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 — 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 — 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 — 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 → 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 → auto-selects or user picks an account\n * 2. setScope(accountPath) is called → sets the active scope path\n * 3. `scopeReady` promise resolves → all gated queries begin executing\n * 4. Scope subscribers are notified → React hooks re-render with new scope key\n * 5. On account switch, setScope(newPath) fires subscribers again →\n * query keys change → 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// ── Token cache ─────────────────────────────────────────────────────────────\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// ── Public API ──────────────────────────────────────────────────────────────\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// ── Scope (account-level) — Reactive ───────────────────────────────────────\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// ── Session (domain-scoped) ─────────────────────────────────────────────────\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 → 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// ── Full SDK Reset ─────────────────────────────────────────────────────────\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 — 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","/**\n * @fsaos/gateway — 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 — 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 —\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 — relative paths resolve per-scope). */\n item: (path: string) => ['vfs', sk(), 'item', path] as const,\n\n /** Single item by UUID (scope-independent — 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 — edges are by item UUID). */\n edges: (itemId: string) => ['vfs', 'edges', itemId] as const,\n\n /** Search results (scope-aware — 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 — 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 — 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 — 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 — 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// ── Helpers ─────────────────────────────────────────────────────────────────\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// ── Fetch Functions ─────────────────────────────────────────────────────────\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// ── Open Envelope ──────────────────────────────────────────────────────────\n/**\n * Fetch the kernel's open envelope for an item.\n *\n * This is the primary way to open an item — 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 — 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// ── Items Query ──────────────────────────────────────────────────────────────\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// ── Channel Messages ───────────────────────────────────────────────────────\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 — 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// ── Paginated Channel Messages ──────────────────────────────────────────────\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` — fetch messages with seq < value (for backward/older pagination)\n * - `after_seq` — 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// ── Cache Invalidation ──────────────────────────────────────────────────────\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 — 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) → unsubscribe\n * - subscribeToEvents(eventType, callback, filter?) → unsubscribe\n * - disconnectSSE() — tear down connection and clear all state\n *\n * Additionally exposes:\n * - emitEvent(scopeId, eventType, payload) — upstream events\n * - subscribeToScope(scopeId, eventTypes) — 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// ── Debug logging (production-safe — only logs in dev or when explicitly enabled) ─\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// ── State ─────────────────────────────────────────────────────────────────────\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// ── Ping / Visibility Lifecycle ──────────────────────────────────────────────\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 — stop pinging, let the connection die naturally.\n stopPing();\n } else {\n // Tab visible again — 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// ── Path-based listeners (backward compat with subscribeToPath) ───────────────\n\nconst pathListeners: Record<string, Array<(data: any) => void>> = {};\n\n// ── Type-based listeners (subscribeToEvents) ──────────────────────────────────\n\ninterface TypedListener {\n eventType: string;\n callback: (data: any) => void;\n filter?: (data: any) => boolean;\n}\n\nconst typedListeners: TypedListener[] = [];\n\n// ── Scope subscriptions (sent to server after connect) ────────────────────────\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// ── Connection management ─────────────────────────────────────────────────────\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 — 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 — 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 — 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 — 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 — 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) — 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// ── Public API ──────────────────────────────────────────────────────────────\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 — 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 — 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 — 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) — subscribe to account's vfs_change events\n * 2. mountRealtimeScope(id) — subscribe to an additional account/space\n * 3. unmountRealtimeScope(id) — unsubscribe from a mounted scope\n * 4. disposeVfsRealtimeWs() — 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// ── State ───────────────────────────────────────────────────────────────────\n\n/** Map of subscribed scope IDs → 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// ── Public API ──────────────────────────────────────────────────────────────\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 — 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// ── Event Handling ──────────────────────────────────────────────────────────\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 — 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// ── Imperative VFS Functions ───────────────────────────────────────────────\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// ── Auth Facade ────────────────────────────────────────────────────────────\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// ── Mount Logic ────────────────────────────────────────────────────────────\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 — 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// ── Scope Reactivity ──────────────────────────────────────────────────────────\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 → set\n useScopeKey();\n return isScopeReady();\n}\n\n// ── Read Hooks ──────────────────────────────────────────────────────────────\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 → 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// ── Open Hook ──────────────────────────────────────────────────────────────\n/**\n * Open a VFS item — 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 —\n * the client should fall back to a system action (item-detail/inspector).\n *\n * @example\n * // Default open — 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 — 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// ── Type Helpers Hook ──────────────────────────────────────────────────────\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// ── Member Focus Hook ──────────────────────────────────────────────────────\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// ── Item History Hook ──────────────────────────────────────────────────────\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// ── Recent Activity Hook ──────────────────────────────────────────────────\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// ── Scope Hook ──────────────────────────────────────────────────────────────\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// ── Accounts Hook ──────────────────────────────────────────────────────────\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 — 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 — 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 — 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 — 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 — 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 — 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// ── Auth Hook ───────────────────────────────────────────────────────────────\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 — 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 — 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 — 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// ── Asset Hook ─────────────────────────────────────────────────────────────\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// ── Component Hook ─────────────────────────────────────────────────────────\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// ── Theme Hook ─────────────────────────────────────────────────────────────\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// ── Permission Hook ────────────────────────────────────────────────────────\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// ── Principal Hook ─────────────────────────────────────────────────────────\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// ── Tool Hook ──────────────────────────────────────────────────────────────\n\n/** Stub: useTool — returns null tool data. */\nexport function useTool() {\n return { data: null, loading: false, error: null };\n}\n\n// ── ComponentRenderer ──────────────────────────────────────────────────────\n\n/** <ComponentRenderer path=\"...\" /> — 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// ── KernelProvider ─────────────────────────────────────────────────────────\n\n/** Passthrough wrapper for backward compatibility. */\nexport function KernelProvider(props: { children: any }) {\n return props.children;\n}\n\n// ── Channel Messages Hook ──────────────────────────────────────────────────\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// ── Infinite Channel Messages (cursor-based pagination) ────────────────────\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// ── Channel Convenience Hooks ──────────────────────────────────────────────\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// ── Notification Hooks ────────────────────────────────────────────────────\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// ── Mutation Hooks ──────────────────────────────────────────────────────────\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// ── Generic Mutation Hook ──────────────────────────────────────────────────\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// ── Event Stream Hook ──────────────────────────────────────────────────────\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?) — positional (legacy)\n // 2. useEventStream(handler, { eventType, filter, enabled }) — 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// ── Realtime Query Hook ────────────────────────────────────────────────────\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 — 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// ── Types ──────────────────────────────────────────────────────────────────\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// ── Utilities ──────────────────────────────────────────────────────────────\n\n/**\n * Convert a JSON Schema property key to a human-readable label.\n * \"display_name\" → \"Display Name\", \"is_dm\" → \"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// ── Main API ───────────────────────────────────────────────────────────────\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 → fields to show in table\n * // schema.filterable → fields to offer as filters\n * // schema.form_fields → 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 — 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 — File Upload\n *\n * Two exports:\n * - uploadFile() — imperative, returns a Promise. Use from Fractals, scripts,\n * non-React contexts, or anywhere you just need the result.\n * - useFileUpload() — 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 }) → VFS item + storage instruction\n * 2. PUT binary → storage worker (direct upload, no gateway proxy)\n * 3. POST /storage/upload-complete → 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// ── Types ────────────────────────────────────────────────────────────────────\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–100 (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// ── Internal types for retry state ───────────────────────────────────────────\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 — used by retry to resume from the right place. */\n _failedAt: 'create' | 'upload' | 'confirm' | null;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nlet _idCounter = 0;\nfunction generateUploadId(): string {\n return `upload_${Date.now()}_${++_idCounter}`;\n}\n\n// ── uploadFile (imperative) ─────────────────────────────────────────────────\n\n/**\n * Upload a file to the VFS. Handles the full three-step dance:\n * create → upload binary → 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–100).\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 // ── Step 1: Create VFS item with file_source intent ──────────────────────\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 — 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 — file_source may not be supported for this item type');\n }\n\n // ── Step 2: Upload binary directly to storage worker ─────────────────────\n\n await uploadBinaryXHR(storageWorkerUrl, storageKey, uploadToken, file, contentType, onProgress, signal);\n\n // ── Step 3: Confirm upload via gateway ───────────────────────────────────\n\n const fileRef = await confirmUpload(itemId, storageKey, contentType);\n\n return { itemId, itemPath, fileRef };\n}\n\n// ── Step 2 helper: XHR upload with progress ─────────────────────────────────\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} — ${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// ── Step 3 helper: confirm upload ───────────────────────────────────────────\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} — ${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// ── useFileUpload (React hook) ──────────────────────────────────────────────\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} — {u.status} — {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 // ── State helpers ─────────────────────────────────────────────────────────\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 // ── Core upload execution ─────────────────────────────────────────────────\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 // ── Step 1: Create ──────────────────────────────────────────────────\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 // ── Step 2: Upload binary ───────────────────────────────────────────\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 // ── Step 3: Confirm ─────────────────────────────────────────────────\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 // ── Public API ────────────────────────────────────────────────────────────\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"]}