@ai4b-team/fsaos-gateway-sdk 3.34.2 → 3.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/enforcement.ts","../src/config.ts","../src/session.ts","../src/server-clock.ts","../src/client.ts","../src/query-refresh.ts","../src/arrangement-realtime.ts","../src/query-client.ts","../src/item-query-realtime.ts","../src/vfs-keys.ts","../src/ws.ts","../src/vfs.ts","../src/memberships.ts","../src/vfs-realtime-ws.ts","../src/mounts.ts","../src/hooks.ts","../src/personal-item-order.ts","../src/interactions.ts","../src/workspace.ts","../src/initialize.ts","../src/execution-control.ts","../src/forms.ts","../src/runtime.ts","../src/schema-utils.ts","../src/upload.ts","../src/resolved-items.ts","../src/artifact-stream.ts","../src/timeline-history.ts","../src/pins.ts"],"names":["QueryClientProvider","mount","createClient","client","pending","QueryClient","item","useSyncExternalStore","useQuery","useMemo","useInfiniteQuery","useState","useEffect","useRef","anchorVersion","useCallback","React","ReactDOM","JsxRuntime","ws","createElement","useQueryClient","enabled","useTanstackMutation","useLayoutEffect","useMutation","index","initialization","UUID_PATTERN","createRoot","signal","change"],"mappings":"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","file":"index.cjs","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';\nexport { usePersonalItemOrder } from './personal-item-order';\nexport type { PersonalItemOrderKey } from './personal-item-order';\n\n// Canonical bootstrap for both generated pages and external applications.\nexport { initializeFsaos } from './initialize';\nexport type { InitializeFsaosOptions, FsaosRuntime } from './initialize';\nexport { initializeWorkspace } from './workspace';\nexport type { WorkspaceOptions, WorkspaceSession } from './workspace';\n\n// Session — anchor/mount model (anchor_mount_spec.md) + legacy scope shims\n// (shims die in the sprint-final cleanup commit).\n// NOTE: mounts.ts's imperative mount/unmount are intentionally NOT barrel-\n// exported — './runtime' already exports a different `mount`; use useMounts().\nexport { initSession, clearSession, getSessionEntry, getAccessToken, setCachedToken, clearCachedToken, setScope, getScope, getScopeVersion, subscribeScope, awaitScopeReady, isScopeReady, resetAllSdkState, registerCleanup, setAnchor, getAnchor, getAnchorRef, getAnchorVersion, subscribeAnchor, awaitAnchorReady, isAnchorReady, electHomeAnchor, getHomeAnchor, getMounts, getMountVersion, subscribeMounts } from './session';\nexport type { MountRef } from './session';\nexport { loadMounts, selectMount, replaceMounts } from './mounts';\nexport type { LoadMountsOptions } from './mounts';\n\n// Client\nexport { gatewayCall, GatewayRequestError } from './client';\n\n// Durable agent-turn control. The kernel owns arbitration and receipts; the\n// client only addresses the governed request-message identity.\nexport { cancelTurn, cancelQueuedTurn, steerTurn } from './execution-control';\nexport type {\n CancelQueuedTurnOptions,\n CancelQueuedTurnResponse,\n CancelQueuedTurnState,\n CancelTurnOptions,\n CancelTurnResponse,\n CancelTurnState,\n SteerTurnOptions,\n SteerTurnResponse,\n SteerTurnState,\n} from './execution-control';\n\n// Public form capability — same-origin, anonymous, release-bound ingress.\nexport { submitForm, FormSubmissionError } from './forms';\nexport type { SubmitFormOptions, FormSubmissionReceipt } from './forms';\n\n// Public, release-bound interaction capture. Identity is anonymous and\n// first-party; VFS ownership is resolved by the domain gateway and kernel.\nexport { trackEvent, trackPageView, trackAction, startTracking, InteractionTrackingError } from './interactions';\nexport type { TrackEventOptions, InteractionReceipt, StartTrackingOptions } from './interactions';\nexport type { PublicSourceConfig, SourceCaptureAdapter, SourceIdentityStorage } from './config';\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, getQueryClient, setQueryClient } from './query-client';\nexport { refreshQuery, isChannelPath } from './query-refresh';\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 fetchTurnQueueEntries,\n fetchTypeDefinitions,\n fetchItems,\n isListableItemsFilter,\n itemsFilterFromQueryFilter,\n fetchEdgesForItem,\n fetchVfsTree,\n fetchMemberFocus,\n fetchRecentActivity,\n fetchItemVersions,\n fetchItemHistory,\n fetchChannelMessages,\n fetchChannelMessagesWithCards,\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, ItemsFilterGroup, ItemsDiscovery, TurnQueueEntry, TurnQueueEntryState, ChannelMessage, ChannelCard, WorkCorrelation, ChannelMessagesResponse, ChannelMessagesPage, ItemVersionsOptions, ItemVersionsResult } from './vfs';\n\n// VFS Realtime via WebSocket\nexport { initVfsRealtimeWs, disposeVfsRealtimeWs, mountRealtimeScope, unmountRealtimeScope } from './vfs-realtime-ws';\n\n// WebSocket Transport\nexport {\n subscribeToPath,\n subscribeToEvents,\n subscribeToScope,\n emitEvent,\n disconnectSSE,\n ping,\n pathSubscriptionMatches,\n // Subscription readiness (2026-08-29): hold turn dispatch until the stream\n // is actually listening; express a real wire-level resubscribe.\n waitForPathReady,\n resubscribePath,\n getPathSubscriptionState,\n onConnectionStateChange,\n} from './ws';\nexport type { PathSubscriptionState, ConnectionState } 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 useResolve,\n useEdges,\n useTypes,\n useType,\n useOpen,\n useTypeHelpers,\n useMemberFocus,\n useItemVersions,\n useItemHistory,\n useRecentActivity,\n useScope,\n useScopeReady,\n useAuth,\n useAsset,\n useComponent,\n useTheme,\n usePermission,\n usePermissions,\n usePrincipal,\n useUpdatePrincipal,\n resolvePrincipalId,\n useAccounts,\n useMounts,\n useTool,\n useCreate,\n useUpdate,\n useDelete,\n useMove,\n useLink,\n useMutation,\n useEventStream,\n useMintedAsset,\n useChannelMessages,\n useInfiniteChannelMessages,\n useAllChannels,\n useChannels,\n useDmChannels,\n useNotifications,\n useUnreadCounts,\n useRealtimeQuery,\n useArrangement,\n ComponentRenderer,\n KernelProvider,\n} from './hooks';\nexport type {\n MintedAsset,\n MintedAssetState,\n ChannelMessagesOptions,\n InfiniteChannelMessagesOptions,\n InfiniteItemsOptions,\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// Frame-Aware Item Resolution (resolve-items kernel method)\nexport { useResolvedItems, fetchResolvedItems } from './resolved-items';\nexport type { ResolvedItem, ResolveItemsResponse } from './resolved-items';\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 ResolveParams,\n ResolveResponse,\n ResolveResultItem,\n} from './types';\n\nexport type { PrincipalData, UpdatePrincipalParams, AccountInfo, TypeHelpers } from './hooks';\n\n// Artifact Streaming\nexport { subscribeArtifactStream, useArtifactStream, useAgentTimeline } from './artifact-stream';\nexport type {\n ArtifactSurfaceType,\n ArtifactStatus,\n ArtifactOpenedEvent,\n ArtifactDeltaEvent,\n ArtifactDoneEvent,\n ArtifactEvent,\n ArtifactState,\n TimelineEvent,\n ArtifactStreamState,\n UseArtifactStreamReturn,\n} from './artifact-stream';\n\n// Timeline History (persisted agent-events dataset queries)\nexport { fetchTimelineHistory, useTimelineHistory } from './timeline-history';\nexport type {\n TimelineHistoryEvent,\n TimelineHistoryOptions,\n UseTimelineHistoryReturn,\n} from './timeline-history';\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// Server clock — deadline math that does not trust the local clock.\nexport {\n serverNow,\n hasServerClock,\n getServerClockOffsetMs,\n getServerClockSyncedAt,\n serverDeadlinePassed,\n serverMsUntil,\n} from './server-clock';\n\nexport { usePinnedItems } from \"./pins\";\nexport type { PinTarget, PinnedItem } from \"./pins\";\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\nexport interface SourceIdentityStorage {\n storage: 'local' | 'session' | 'memory';\n key: string;\n idle_seconds?: number;\n}\n\nexport interface SourceCaptureAdapter {\n type: 'page_view' | 'declared_action' | 'form_receipt';\n observation: string;\n attribute?: string;\n id_property?: string;\n element_property?: string;\n title_property?: string;\n history?: boolean;\n pageshow?: boolean;\n}\n\nexport interface PublicSourceConfig {\n id: string;\n version: number;\n default?: boolean;\n observations: string[];\n identity: {\n visitor: SourceIdentityStorage;\n session: SourceIdentityStorage & { idle_seconds: number };\n };\n source_keys?: {\n query?: string[];\n max_value_length?: number;\n };\n adapters: SourceCaptureAdapter[];\n}\n\ndeclare global {\n interface Window {\n __FSAOS_CONFIG__?: {\n supabaseUrl?: string;\n supabaseAnonKey?: string;\n gatewayUrl?: string;\n scopePath?: string;\n embedToken?: string | (() => Promise<string | null>) | null;\n edgeBaseUrl?: string;\n componentPath?: string;\n /** Source contracts frozen into this exact published release. */\n sources?: PublicSourceConfig[];\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 /** Set enabled:false before SDK load to suppress automatic tracking. */\n tracking?: { enabled?: boolean };\n };\n }\n}\n\nconst CONFIG = (typeof window !== 'undefined' && window.__FSAOS_CONFIG__) || {};\n\nexport const PUBLIC_SOURCES = Array.isArray(CONFIG.sources) ? CONFIG.sources : [];\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, the ANCHOR/MOUNT session model, and\n * domain-scoped session initialization.\n *\n * ⚠️ TERMINOLOGY — NOT the focus primitive. FSAOS has a `focus` system (focus\n * edges + kernel_build_focused_item_context) for attaching ITEMS to a\n * conversation. Unrelated. The session concept here is the ANCHOR.\n *\n * Session model (anchor_mount_spec.md):\n * homeAnchor — the account elected at login. Immutable for the session.\n * mounts[] — the working set: accounts AND spaces, all live, read-write.\n * Persisted as a settings declaration (see mounts.ts).\n * anchor — the current standing mount. Takes defaults: untargeted\n * actions land here; every gatewayCall carries its path as\n * _scope_path, from which the kernel derives the caller's seat\n * (account, or granted-under identity for spaces) and the\n * membership-derived confinement set.\n *\n * Two laws:\n * 1. Membership is the only wall — the client never asserts scope; the\n * kernel derives visibility from member items (+ mount declaration,\n * which narrows, never widens).\n * 2. The target governs every operation — the anchor decides defaults and\n * attribution only.\n *\n * Token flow (unchanged):\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\nimport { supabase, GATEWAY_URL } from './config';\nimport type { SessionEntry } from './types';\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\n/** A mountable/anchorable target: an account or a space the caller belongs to. */\nexport interface MountRef {\n /** os_items id of the account or space item (rename-stable identity). */\n id: string;\n /** VFS path — carried as _scope_path when this mount is the anchor. */\n path: string;\n kind: 'account' | 'space';\n /** Display name for UI grouping. */\n name?: string;\n /** For spaces: the account identity the membership was granted under.\n * Sidebar groups shared spaces by THIS, not by their host account. */\n grantedUnderAccountId?: string;\n}\n\n// ── Token cache (unchanged) ─────────────────────────────────────────────────\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\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\nsetTimeout(() => {\n if (!tokenResolved) {\n tokenResolved = true;\n resolveTokenReady();\n }\n}, 5000);\n\nexport function setCachedToken(token: string, expiresAt?: number): void {\n cachedToken = token;\n tokenExpiresAt = expiresAt ?? Math.floor(Date.now() / 1000) + 3600;\n}\n\nexport function clearCachedToken(): void {\n cachedToken = null;\n tokenExpiresAt = 0;\n}\n\nexport async function getAccessToken(): Promise<string | null> {\n // Embedded-client precedence: when a host app supplies an embed token\n // (string, or async provider for silent refresh), it is authoritative on\n // every lane — HTTP and WS both resolve through here. Embed boots also\n // skip the Supabase auth-event gate entirely (no 5 s wait).\n const cfg =\n (typeof window !== 'undefined' && (window as any).__FSAOS_CONFIG__) || {};\n if (cfg.embedToken) {\n if (typeof cfg.embedToken === 'function') {\n try {\n return (await cfg.embedToken()) ?? null;\n } catch {\n return null;\n }\n }\n return cfg.embedToken as string;\n }\n await tokenReady;\n return cachedToken;\n}\n\n// ── Anchor (current standing mount) — Reactive ──────────────────────────────\n\nlet currentAnchorPath: string | null = null;\nlet currentAnchorRef: MountRef | null = null;\n\n/** Monotonically increasing version counter for anchor changes (useSyncExternalStore). */\nlet anchorVersion = 0;\n\ntype AnchorListener = () => void;\nconst anchorListeners = new Set<AnchorListener>();\n\n/** One-shot gate: resolved when setAnchor() is first called (login election). */\nlet anchorReady: Promise<void>;\nlet resolveAnchorReady: () => void;\nlet anchorResolved = false;\n\nanchorReady = new Promise<void>((resolve) => {\n resolveAnchorReady = resolve;\n});\n\nfunction notifyAnchorListeners(): void {\n anchorVersion++;\n anchorListeners.forEach((listener) => {\n try {\n listener();\n } catch (e) {\n console.warn('[SDK] Anchor listener error:', e);\n }\n });\n}\n\n/**\n * Move the anchor — the current standing mount that takes defaults.\n *\n * Every gatewayCall carries the anchor's path as `_scope_path`; the kernel\n * derives the caller's seat from it (account_item_id for accounts; the\n * granted-under identity for spaces — space-anchoring, 2026-07-10) and applies\n * membership-derived confinement.\n *\n * Anchoring implies mounting: if the ref isn't in the mount set, it is added\n * (in-memory here; mounts.ts persists).\n *\n * Accepts a MountRef (preferred) or a bare path (account paths only — legacy\n * callers during migration).\n */\nexport function setAnchor(ref: MountRef | string): void {\n const path = typeof ref === 'string' ? ref : ref.path;\n const changed = currentAnchorPath !== path || currentAnchorRef?.id !== (typeof ref === 'string' ? undefined : ref.id);\n currentAnchorPath = path;\n currentAnchorRef = typeof ref === 'string' ? null : ref;\n\n if (typeof ref !== 'string' && !mountSet.some((m) => m.id === ref.id)) {\n mountSet = [...mountSet, ref];\n notifyMountListeners();\n }\n\n if (!anchorResolved) {\n anchorResolved = true;\n resolveAnchorReady();\n }\n\n if (changed) {\n notifyAnchorListeners();\n }\n}\n\n/** The anchor's VFS path, or null before login election. */\nexport function getAnchor(): string | null {\n return currentAnchorPath;\n}\n\n/** The anchor's full MountRef when known (set via setAnchor(ref)). */\nexport function getAnchorRef(): MountRef | null {\n return currentAnchorRef;\n}\n\nexport function getAnchorVersion(): number {\n return anchorVersion;\n}\n\nexport function subscribeAnchor(listener: AnchorListener): () => void {\n anchorListeners.add(listener);\n return () => { anchorListeners.delete(listener); };\n}\n\nexport function awaitAnchorReady(): Promise<void> {\n return anchorReady;\n}\n\nexport function isAnchorReady(): boolean {\n return anchorResolved;\n}\n\n// ── Home anchor (login-elected; immutable for the session) ──────────────────\n\nlet homeAnchor: MountRef | null = null;\n\n/**\n * Elect the home anchor at login. Sets the anchor to it as well.\n * Calling twice in one session is a programming error (logout re-elects).\n */\nexport function electHomeAnchor(ref: MountRef, options: { activate?: boolean } = {}): void {\n if (homeAnchor) {\n console.warn('[SDK] electHomeAnchor called twice; ignoring (logout to re-elect).');\n return;\n }\n homeAnchor = ref;\n // Workspace bootstrap can elect its internal account without briefly\n // releasing gated work queries at that account before the Space restores.\n if (options.activate !== false) setAnchor(ref);\n}\n\nexport function getHomeAnchor(): MountRef | null {\n return homeAnchor;\n}\n\n// ── Mounts (the working set) ────────────────────────────────────────────────\n// In-memory state + subscriptions. Persistence (the settings declaration) and\n// membership-validated mutation live in mounts.ts to avoid an import cycle\n// with client.ts.\n\nlet mountSet: MountRef[] = [];\n\ntype MountListener = () => void;\nconst mountListeners = new Set<MountListener>();\nlet mountVersion = 0;\n\nfunction notifyMountListeners(): void {\n mountVersion++;\n mountListeners.forEach((l) => {\n try {\n l();\n } catch (e) {\n console.warn('[SDK] Mount listener error:', e);\n }\n });\n}\n\nexport function getMounts(): MountRef[] {\n return mountSet;\n}\n\nexport function getMountVersion(): number {\n return mountVersion;\n}\n\nexport function subscribeMounts(listener: MountListener): () => void {\n mountListeners.add(listener);\n return () => { mountListeners.delete(listener); };\n}\n\n/** Replace the mount set (used by mounts.ts when loading the declaration). */\nexport function setMountsState(mounts: MountRef[]): void {\n mountSet = mounts;\n notifyMountListeners();\n}\n\n/** Publish a confirmed workspace change atomically, before notifying readers. */\nexport function commitMountSelection(mounts: MountRef[], anchor: MountRef): void {\n const mountsChanged = JSON.stringify(mountSet) !== JSON.stringify(mounts);\n const anchorChanged = currentAnchorPath !== anchor.path || currentAnchorRef?.id !== anchor.id;\n mountSet = mounts;\n currentAnchorPath = anchor.path;\n currentAnchorRef = anchor;\n if (!anchorResolved) {\n anchorResolved = true;\n resolveAnchorReady();\n }\n if (mountsChanged) notifyMountListeners();\n if (anchorChanged) notifyAnchorListeners();\n}\n\n/** Add to the mount set (in-memory; mounts.ts persists). */\nexport function addMountState(ref: MountRef): void {\n if (mountSet.some((m) => m.id === ref.id)) return;\n mountSet = [...mountSet, ref];\n notifyMountListeners();\n}\n\n/**\n * Remove from the mount set (in-memory; mounts.ts persists).\n * Unmounting the anchor moves the anchor to the home anchor.\n */\nexport function removeMountState(id: string): void {\n const removed = mountSet.find((m) => m.id === id);\n if (!removed) return;\n mountSet = mountSet.filter((m) => m.id !== id);\n notifyMountListeners();\n if (currentAnchorRef?.id === id && homeAnchor) {\n setAnchor(homeAnchor);\n }\n}\n\n// ── Session (domain-scoped) — unchanged ─────────────────────────────────────\n\nlet sessionEntry: SessionEntry | null = null;\nlet sessionPromise: Promise<SessionEntry> | null = null;\nlet sessionGeneration = 0;\n\n/** Internal identity epoch: pending requests cannot cross a session reset. */\nexport function getSessionGeneration(): number { return sessionGeneration; }\n\nexport async function initSession(): Promise<SessionEntry> {\n if (sessionEntry) return sessionEntry;\n if (sessionPromise) return sessionPromise;\n\n const generation = sessionGeneration;\n sessionPromise = (async () => {\n const hostname = getHostname();\n const token = await getAccessToken();\n if (generation !== sessionGeneration) throw new Error('Session changed during initialization');\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 if (generation !== sessionGeneration) throw new Error('Session changed during initialization');\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 // Present only on the seated path (a bearer was sent). The anonymous\n // resolver has no principal and omits the field entirely.\n principal_id: entry.principal_id || null,\n };\n\n return sessionEntry;\n })().catch(error => {\n if (generation === sessionGeneration) sessionPromise = null;\n throw error;\n });\n\n return sessionPromise;\n}\n\nexport function getSessionEntry(): SessionEntry | null {\n return sessionEntry;\n}\n\nexport function clearSession(): void {\n sessionGeneration++;\n sessionEntry = null;\n sessionPromise = null;\n currentAnchorPath = null;\n currentAnchorRef = null;\n homeAnchor = null;\n mountSet = [];\n}\n\n// ── Full SDK Reset ──────────────────────────────────────────────────────────\n\ntype CleanupFn = () => void;\nconst cleanupRegistry: CleanupFn[] = [];\n\nexport function registerCleanup(fn: CleanupFn): void {\n cleanupRegistry.push(fn);\n}\n\nexport function resetAllSdkState(): void {\n // 1. Clear session + anchor/mount state\n clearSession();\n\n // 2. Clear token cache\n clearCachedToken();\n\n // 3. Reset the anchor gate so next login must re-elect\n resolveAnchorReady(); // release old callers so their identity guard can reject\n anchorResolved = false;\n anchorReady = new Promise<void>((resolve) => {\n resolveAnchorReady = resolve;\n });\n notifyAnchorListeners();\n notifyMountListeners();\n\n // 4. Run all registered module cleanups\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\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// ── DEPRECATED compile-compat shims — DELETED in the hooks.ts migration ────\n// commit on this branch. Do not add new callers. (anchor_mount_spec.md: no\n// aliases in the merged result; these exist only between commits.)\n\n/** @deprecated use setAnchor */\nexport const setScope = setAnchor as (scopePath: string) => void;\n/** @deprecated use getAnchor */\nexport const getScope = getAnchor;\n/** @deprecated use getAnchorVersion */\nexport const getScopeVersion = getAnchorVersion;\n/** @deprecated use subscribeAnchor */\nexport const subscribeScope = subscribeAnchor;\n/** @deprecated use awaitAnchorReady */\nexport const awaitScopeReady = awaitAnchorReady;\n/** @deprecated use isAnchorReady */\nexport const isScopeReady = isAnchorReady;\n","/**\n * Server clock offset.\n *\n * Deadlines that matter (a drive lease's `active_session.expires_at`, a work\n * ticket's lease, anything the kernel enforces) are absolute SERVER timestamps.\n * Comparing them to `Date.now()` is wrong by exactly the client's clock skew —\n * and refetching does NOT correct that, because the deadline is identical on\n * every fetch while the local clock stays equally wrong. A machine three\n * minutes fast reads a four-minute lease as one minute long, permanently.\n *\n * The `read` syscall returns `server_now`. Every gateway response carrying it\n * updates the offset here, so `serverNow()` is the client's best estimate of\n * the server's clock without trusting the local one.\n *\n * Accuracy is bounded by request latency (the offset is measured against the\n * moment the response was parsed, so it lags by roughly the response leg).\n * Sub-second against leases measured in minutes.\n */\n\nlet offsetMs = 0;\nlet haveOffset = false;\nlet lastSyncedAt = 0;\n\n/** Record an offset from a response that carried `server_now`. Internal. */\nexport function recordServerNow(serverNowIso: unknown): void {\n if (typeof serverNowIso !== 'string') return;\n const parsed = Date.parse(serverNowIso);\n if (Number.isNaN(parsed)) return;\n offsetMs = parsed - Date.now();\n haveOffset = true;\n lastSyncedAt = Date.now();\n}\n\n/** Server time estimate in ms since epoch. Falls back to local time. */\nexport function serverNow(): number {\n return Date.now() + offsetMs;\n}\n\n/**\n * Has the offset ever been measured? Callers gating on a server deadline\n * should treat `false` as \"fall back to a conservative local check\" rather\n * than assuming the offset is zero.\n */\nexport function hasServerClock(): boolean {\n return haveOffset;\n}\n\n/** Current offset in ms (server minus client). Diagnostics. */\nexport function getServerClockOffsetMs(): number {\n return offsetMs;\n}\n\n/** When the offset was last measured, in local ms. 0 = never. */\nexport function getServerClockSyncedAt(): number {\n return lastSyncedAt;\n}\n\n/**\n * Has a server deadline passed? The single call sites should use.\n * Returns `null` when the deadline is absent or unparseable, so callers can\n * distinguish \"no deadline\" from \"expired\".\n */\nexport function serverDeadlinePassed(deadlineIso: unknown): boolean | null {\n if (typeof deadlineIso !== 'string') return null;\n const deadline = Date.parse(deadlineIso);\n if (Number.isNaN(deadline)) return null;\n return serverNow() >= deadline;\n}\n\n/** Ms remaining until a server deadline; null if absent, 0 if passed. */\nexport function serverMsUntil(deadlineIso: unknown): number | null {\n if (typeof deadlineIso !== 'string') return null;\n const deadline = Date.parse(deadlineIso);\n if (Number.isNaN(deadline)) return null;\n return Math.max(0, deadline - serverNow());\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 parameters automatically.\n *\n * ANCHOR GATING:\n * gatewayCall awaits `anchorReady` before sending any request that doesn't\n * already have an explicit `_scope_path`. This prevents race conditions where\n * hooks fire before login election completes.\n *\n * Every call carries the ANCHOR's path as `_scope_path` (unless the caller\n * explicitly targets another mount — the target governs the operation). The\n * kernel derives the caller's seat from it: account_item_id for account\n * anchors, the granted-under identity for space anchors (space-anchoring,\n * 2026-07-10), then applies membership-derived confinement\n * (kernel_caller_confinement — mounts declaration narrows, never widens).\n */\n\nimport { GATEWAY_URL } from './config';\nimport { EnforcementDeniedError } from './enforcement';\nimport { getAccessToken, getHostname, getSessionEntry, getAnchor, awaitAnchorReady, getSessionGeneration } from './session';\nimport type { GatewayParams, GatewayResponse, EnforcementPayload } from './types';\nimport { recordServerNow } from './server-clock';\n\n/**\n * Methods that can execute without the anchor being set.\n * These are bootstrap/auth methods needed before login election.\n */\nconst ANCHOR_INDEPENDENT_METHODS = new Set([\n 'list-memberships',\n 'init',\n]);\n\nexport class GatewayRequestError extends Error {\n public readonly name = 'GatewayRequestError';\n public readonly method: string;\n public readonly status: number;\n public readonly statusText: string;\n public readonly payload: GatewayResponse | null;\n public readonly responseBody: string;\n\n constructor(options: {\n method: string;\n status: number;\n statusText: string;\n payload: GatewayResponse | null;\n responseBody: string;\n }) {\n const code = typeof options.payload?.error === 'string'\n ? options.payload.error.trim()\n : '';\n const detail = typeof options.payload?.message === 'string'\n ? options.payload.message.trim()\n : '';\n const fallback = options.responseBody.trim()\n || `Gateway HTTP error: ${options.status} ${options.statusText}`.trim();\n const message = code && detail\n ? `${code}: ${detail}`\n : detail || code || fallback;\n\n super(message);\n this.method = options.method;\n this.status = options.status;\n this.statusText = options.statusText;\n this.payload = options.payload;\n this.responseBody = options.responseBody;\n }\n}\n\nexport async function gatewayCall(\n method: string,\n params: GatewayParams = {},\n): Promise<GatewayResponse> {\n const generation = getSessionGeneration();\n const requestedAnchor = getAnchor();\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 (generation !== getSessionGeneration()) throw new Error('Session changed before gateway request');\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n // Gate anchor-dependent calls until login election establishes the anchor.\n // Anchor-independent methods and calls with an explicit _scope_path bypass.\n if (!ANCHOR_INDEPENDENT_METHODS.has(method) && !params._scope_path) {\n await awaitAnchorReady();\n }\n if (generation !== getSessionGeneration()) throw new Error('Session changed before gateway request');\n\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 // Carry the anchor as _scope_path unless the caller explicitly targeted\n // another mount (the target governs the operation).\n const anchorPath = requestedAnchor ?? getAnchor();\n if (!enrichedParams._scope_path && anchorPath) {\n enrichedParams._scope_path = anchorPath;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ method, params: enrichedParams }),\n });\n\n // Read once before branching on status. Gateway failures are JSON envelopes,\n // and throwing on `response.ok` first used to discard their error code,\n // message and details — leaving consumers with only \"HTTP 500\".\n const responseBody = await response.text();\n if (generation !== getSessionGeneration()) throw new Error('Session changed during gateway request');\n let json: GatewayResponse | null = null;\n if (responseBody) {\n try {\n json = JSON.parse(responseBody) as GatewayResponse;\n } catch {\n // Preserve the raw body on GatewayRequestError below.\n }\n }\n\n if (!response.ok || !json) {\n throw new GatewayRequestError({\n method,\n status: response.status,\n statusText: response.statusText,\n payload: json,\n responseBody,\n });\n }\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 GatewayRequestError({\n method,\n status: response.status,\n statusText: response.statusText,\n payload: json,\n responseBody,\n });\n }\n\n // Any response carrying server_now updates the clock offset. Capturing it\n // here rather than in fetchVfsItem means every syscall that returns it keeps\n // the offset fresh, and no consumer has to remember to do it.\n if (json && (json as any).server_now !== undefined) {\n recordServerNow((json as any).server_now);\n }\n\n return json;\n}\n","/**\n * @fsaos/gateway — refresh without restarting a running load\n *\n * React Query's `invalidateQueries` defaults to `cancelRefetch: true`: a\n * refresh that lands while a load is running abandons that load and starts\n * another. The SDK's loaders are gateway calls with no abort signal, so the\n * abandoned request keeps going anyway — a burst of change notices during one\n * slow load turns into a stack of full loads running side by side.\n *\n * `refreshQuery` joins a running load instead. A change that lands while a\n * matching load is running may not be in that load's answer, so exactly one\n * reload is queued for when it settles; every further change before then\n * joins that same reload. With nothing running it refreshes at once.\n */\n\nimport type { QueryClient, QueryKey } from '@tanstack/react-query';\n\nconst trailing = new WeakMap<QueryClient, Map<string, Promise<void>>>();\n\nexport function refreshQuery(\n client: QueryClient,\n queryKey: QueryKey,\n options: { exact?: boolean } = {},\n): Promise<void> {\n const exact = options.exact === true;\n const refresh = () => client.invalidateQueries({ queryKey, exact }, { cancelRefetch: false });\n const running = client\n .getQueryCache()\n .findAll({ queryKey, exact, fetchStatus: 'fetching' })\n .flatMap((query) => (query.promise ? [query.promise] : []));\n if (running.length === 0) return refresh();\n\n const hash = `${exact ? '=' : '^'}${JSON.stringify(queryKey)}`;\n let queued = trailing.get(client);\n if (!queued) {\n queued = new Map();\n trailing.set(client, queued);\n }\n const pending = queued.get(hash);\n if (pending) return pending;\n const queue = queued;\n const next = Promise.allSettled(running).then(() => {\n queue.delete(hash);\n return refresh();\n });\n queue.set(hash, next);\n return next;\n}\n\n/** True when `path` is the channel itself or lies beneath it — never a\n * sibling that merely shares its prefix (`/c/general-2` is not under\n * `/c/general`). */\nexport function isChannelPath(path: unknown, channelPath: string): boolean {\n return typeof path === 'string' && (path === channelPath || path.startsWith(`${channelPath}/`));\n}\n","import type { Query, QueryClient, QueryKey } from '@tanstack/react-query';\nimport { refreshQuery } from './query-refresh';\n\nconst pending = new WeakMap<QueryClient, Map<string, ReturnType<typeof setTimeout>>>();\nconst enabled = (query: Query) => query.meta?.arrangementRealtime === true;\n\n/** One coalesced refresh per shared arrangement cache, including local writes. */\nexport function refreshArrangement(client: QueryClient, key: QueryKey): void {\n const query = client.getQueryCache().find({ queryKey: key, exact: true });\n if (!query) return;\n let timers = pending.get(client);\n if (!timers) { timers = new Map(); pending.set(client, timers); }\n const previous = timers.get(query.queryHash);\n if (previous) clearTimeout(previous);\n timers.set(query.queryHash, setTimeout(() => {\n timers.delete(query.queryHash);\n if (client.getQueryCache().get(query.queryHash) !== query) return;\n void refreshQuery(client, key, { exact: true });\n }, 250));\n}\n\nexport function handleArrangementChange(client: QueryClient, event: Record<string, any>): void {\n if (!event || typeof event !== 'object') return;\n for (const query of client.getQueryCache().getAll()) {\n if (!enabled(query)) continue;\n const data = query.state.data as any;\n if (!data?.item_id) continue;\n const matches = (id: string, path: string) => Boolean(\n (id && event.item_id === id) || (path && (event.path === path || event.old_path === path)),\n );\n if (matches(data.item_id, data.item_path)\n || event.parent_id === data.item_id || event.old_parent_id === data.item_id\n || [event.path, event.old_path].some(path => typeof path === 'string' && path.slice(0, path.lastIndexOf('/')) === data.item_path)\n || data.resolved_children?.some((child: any) => matches(child.id, child.symlink_path || child.path)\n || (child.target && matches(child.target.id, child.target.path)))) {\n refreshArrangement(client, query.queryKey);\n }\n }\n}\n\nexport function reconnectArrangements(client: QueryClient): void {\n for (const query of client.getQueryCache().getAll()) {\n if (enabled(query) && query.state.data !== undefined) refreshArrangement(client, query.queryKey);\n }\n}\n\nexport function clearArrangementRefreshes(client: QueryClient): void {\n pending.get(client)?.forEach(clearTimeout);\n pending.delete(client);\n}\n","/**\n * @fsaos/gateway — Query Client\n *\n * Holds the TanStack QueryClient used by the SDK's imperative cache\n * operations (invalidation helpers, realtime handlers, mutation cache\n * writes, signOut cleanup) and by `mount()` for VFS-bundled components.\n *\n * Two ownership modes:\n *\n * 1. Default (dumb shells, VFS-bundled components): nobody injects a\n * client, so `getQueryClient()` lazily creates one with VFS-tuned\n * defaults and every SDK consumer on the page shares it.\n *\n * 2. Host-owned (rich apps with their own React Query setup): the host\n * calls `setQueryClient(hostClient)` at boot, BEFORE rendering, and\n * all SDK cache operations act on the host's cache — so SDK hooks\n * (which bind to the host's provider via React context) and SDK\n * invalidation finally agree on which cache is real.\n *\n * Default options (mode 1) are tuned for VFS data:\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';\nimport { registerCleanup } from './session';\n\nlet client: QueryClient | null = null;\nregisterCleanup(() => {\n // UUID-keyed and membership caches must not outlive the authenticated user.\n // Host application queries are outside the SDK's ownership.\n if (!client) return;\n void client.cancelQueries({ queryKey: ['vfs'] });\n client.removeQueries({ queryKey: ['vfs'] });\n});\n\n/**\n * Inject the host application's QueryClient. Call once at startup, before\n * any SDK hook renders or realtime subscription starts. Throws if the SDK\n * has already created (or been given) a client, because queries cached in\n * the earlier client would be stranded.\n */\nexport function setQueryClient(custom: QueryClient): void {\n if (client && client !== custom) {\n throw new Error(\n '[fsaos-gateway-sdk] setQueryClient() called after a QueryClient was ' +\n 'already in use. Inject the host client before rendering or starting ' +\n 'realtime subscriptions.',\n );\n }\n client = custom;\n}\n\n/**\n * The QueryClient all SDK cache operations act on. Lazily creates the\n * default (mode 1) if no host client was injected.\n */\nexport function getQueryClient(): QueryClient {\n if (!client) {\n client = 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 return client;\n}\n\n/**\n * @deprecated Import `getQueryClient()` instead. Kept for backward\n * compatibility as a lazy proxy: property access resolves against the\n * current client, so it follows host injection instead of pinning the\n * client that existed at module-evaluation time. (An eager\n * `= getQueryClient()` here would create the default client on import and\n * make every later `setQueryClient()` call throw.)\n */\nexport const queryClient: QueryClient = new Proxy({} as QueryClient, {\n get(_target, prop, _receiver) {\n const real = getQueryClient() as unknown as Record<PropertyKey, unknown>;\n const value = real[prop];\n return typeof value === 'function' ? (value as (...a: unknown[]) => unknown).bind(real) : value;\n },\n});\n","import type { Query, QueryClient } from '@tanstack/react-query';\nimport type { ItemsFilter } from './vfs';\nimport { isChannelPath, refreshQuery } from './query-refresh';\n\n// Query metadata, not a second data cache. The existing WebSocket event\n// listener owns refreshes, once per cached query rather than once per hook.\nexport interface InfiniteItemsRealtimeMeta extends Record<string, unknown> {\n infiniteItemsRealtime?: { filter: ItemsFilter };\n}\n\nconst pending = new WeakMap<QueryClient, Map<string, ReturnType<typeof setTimeout>>>();\n\nfunction listingFilter(query: Query): ItemsFilter | undefined {\n return (query.meta as InfiniteItemsRealtimeMeta | undefined)?.infiniteItemsRealtime?.filter;\n}\n\nfunction containsChangedItem(query: Query, event: Record<string, any>): boolean {\n const pages = (query.state.data as { pages?: { items?: { id: string; path: string }[] }[] } | undefined)?.pages;\n return pages?.some(page => page.items?.some(item =>\n (event.item_id && item.id === event.item_id)\n || (event.path && item.path === event.path)\n || (event.old_path && item.path === event.old_path),\n )) ?? false;\n}\n\n/** Item types a listing can hold; null = any type (a group names none). */\nfunction listingTypes(filter: ItemsFilter): Set<string> | null {\n if (filter.type) return new Set([filter.type]);\n if (!filter.any_of?.length) return null;\n const types = new Set<string>();\n for (const group of filter.any_of) {\n if (!group.item_type) return null;\n types.add(group.item_type);\n }\n return types;\n}\n\nfunction affectsListing(query: Query, filter: ItemsFilter, event: Record<string, any>): boolean {\n // A loaded item may have been moved out, deleted or changed type. Its old\n // cache identity is sufficient even when the event carries only NEW fields.\n if (containsChangedItem(query, event)) return true;\n\n // With no explicit scope, the kernel can include mounted accounts/spaces;\n // the cache's anchor namespace is not a path confinement boundary.\n const scope = filter.scope;\n const scoped = typeof scope === 'string' && scope !== '__unscoped__';\n const hasPath = typeof event.path === 'string' || typeof event.old_path === 'string';\n if (scoped && hasPath && !isChannelPath(event.path, scope) && !isChannelPath(event.old_path, scope)) return false;\n\n // Kernel listings also resolve symlinks within their scope. A link change\n // can affect the listing even though the link is not the requested type.\n if (event.item_type === 'symlink' && scoped && hasPath) return true;\n const types = listingTypes(filter);\n if (event.item_type && types && !types.has(event.item_type)) return false;\n\n if (filter.parent_id && event.parent_id !== undefined) {\n if (event.parent_id !== filter.parent_id && event.old_parent_id !== filter.parent_id) return false;\n }\n\n // Do not turn a malformed notification into a refresh of every open query.\n return hasPath || Boolean(filter.parent_id && event.parent_id === filter.parent_id);\n}\n\nfunction schedule(client: QueryClient, query: Query): void {\n let timers = pending.get(client);\n if (!timers) { timers = new Map(); pending.set(client, timers); }\n const previous = timers.get(query.queryHash);\n if (previous) clearTimeout(previous);\n timers.set(query.queryHash, setTimeout(() => {\n timers.delete(query.queryHash);\n if (client.getQueryCache().get(query.queryHash) !== query || !listingFilter(query)) return;\n // Inactive queries are only marked stale. Opening them later performs one\n // normal SDK load; a closed channel never does background database work.\n void refreshQuery(client, query.queryKey, { exact: true });\n }, 500));\n}\n\nexport function handleInfiniteItemsChange(client: QueryClient, event: Record<string, any>): void {\n if (!event || typeof event !== 'object') return;\n for (const query of client.getQueryCache().getAll()) {\n const filter = listingFilter(query);\n if (filter && affectsListing(query, filter, event)) schedule(client, query);\n }\n}\n\nexport function refreshInfiniteItemsAfterReconnect(client: QueryClient): void {\n for (const query of client.getQueryCache().getAll()) {\n if (listingFilter(query) && query.state.data !== undefined) schedule(client, query);\n }\n}\n\nexport function clearInfiniteItemsRefreshes(client: QueryClient): void {\n pending.get(client)?.forEach(clearTimeout);\n pending.delete(client);\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(), 'get-activity-feed', a, b, c] as const,\n\n /** Item versions (scope-independent — by item UUID). */\n itemVersions: (a: string, b: string, c: string, d: string) =>\n ['vfs', 'item-versions', a, b, c, d] as const,\n\n /** @deprecated Use itemVersions instead. */\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","import { handleArrangementChange, reconnectArrangements, clearArrangementRefreshes } from './arrangement-realtime';\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';\nimport { getQueryClient } from './query-client';\nimport { handleInfiniteItemsChange, refreshInfiniteItemsAfterReconnect, clearInfiniteItemsRefreshes } from './item-query-realtime';\nimport { vfsKeys } from './vfs-keys';\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// Distinguishes a first connection from a reconnect. Only a reconnect implies\n// a gap in the event stream, and only a gap justifies refetching.\nlet hasConnectedBefore = false;\n\n// ── Ping / Visibility Lifecycle ──────────────────────────────────────────────\n\nconst PING_INTERVAL_MS = 30_000; // 30 seconds\n// Liveness: a socket dropped by a proxy/NAT stays readyState OPEN forever\n// (\"half-open\") — pings go into the void and no close event ever fires, so\n// ensureConnection sees \"already open\" and never reconnects. Track inbound\n// traffic (any frame, incl. pong) and force-close when two ping intervals\n// pass with total silence; onclose then drives the normal reconnect path.\nconst LIVENESS_TIMEOUT_MS = PING_INTERVAL_MS * 2 + 5_000;\nlet lastInboundAt = 0;\nlet pingInterval: ReturnType<typeof setInterval> | null = null;\nlet visibilityListenerAttached = false;\n\nfunction startPing(): void {\n stopPing();\n lastInboundAt = Date.now();\n pingInterval = setInterval(() => {\n if (\n ws &&\n ws.readyState === WebSocket.OPEN &&\n Date.now() - lastInboundAt > LIVENESS_TIMEOUT_MS\n ) {\n log('ping: no inbound traffic for', Date.now() - lastInboundAt, 'ms — closing half-open socket');\n try {\n ws.close(4000, 'liveness timeout');\n } catch (_e) {\n /* onclose still fires */\n }\n return; // onclose → scheduleReconnect with fresh token + resubscribeAll\n }\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/**\n * Match the gateway's VFS routing semantics exactly: a path subscription owns\n * the item at that path and every descendant, but never a similarly-prefixed\n * sibling (`/chat/revven` must not match `/chat/revven-agent`).\n *\n * This is what makes both supported stream levels work on one socket:\n * channel subscribers receive descendant thread events, while a thread-root\n * subscriber receives only events from that thread.\n */\nexport function pathSubscriptionMatches(\n subscribedPath: string,\n eventPath: string,\n): boolean {\n const subscribed = subscribedPath.replace(/\\/+$/, '');\n const event = eventPath.replace(/\\/+$/, '');\n if (!subscribed || !event) return subscribed === event;\n return event === subscribed || event.startsWith(`${subscribed}/`);\n}\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 ScopeLease {\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 scopeLeases: Map<string, Map<symbol, ScopeLease>> = new Map();\nconst activePaths: Map<string, PathSubscription> = new Map();\n\nfunction scopeEventTypes(scopeId: string): string[] {\n const leases = scopeLeases.get(scopeId);\n if (!leases) return [];\n return Array.from(\n new Set(Array.from(leases.values()).flatMap((lease) => lease.event_types)),\n ).sort();\n}\n\nfunction sameEventTypes(a: string[] | undefined, b: string[]): boolean {\n if (!a) return false;\n return a.length === b.length\n && a.every((eventType, index) => eventType === b[index]);\n}\n\nfunction refreshScopeSubscription(scopeId: string): ScopeSubscription | null {\n const eventTypes = scopeEventTypes(scopeId);\n if (eventTypes.length === 0) {\n activeScopes.delete(scopeId);\n return null;\n }\n const subscription = { scope_id: scopeId, event_types: eventTypes };\n activeScopes.set(scopeId, subscription);\n return subscription;\n}\n\n// ── Path subscription readiness (2026-08-29) ─────────────────────────────────\n// The gateway acks every subscribe_path with {type:'subscribed_path', path},\n// but those acks were discarded. Until the ack arrives the server-side\n// subscription may not exist yet — a fast agent reply emitted inside that gap\n// streams to nobody, and the UI only learns of it when transcript polling\n// shows the completed message all at once. Track per-path wire state so a\n// caller can hold a turn dispatch until the stream is actually listening.\nexport type PathSubscriptionState =\n | 'pending' // subscribe_path sent (or queued for connect), ack not yet seen\n | 'ready' // gateway acknowledged; events for this path will be delivered\n | 'disconnected'; // socket dropped since the last ack; resubscribe pending\n\nconst pathStates: Map<string, PathSubscriptionState> = new Map();\nconst pathReadyWaiters: Map<string, Array<() => void>> = new Map();\n\nexport type ConnectionState = 'connecting' | 'connected' | 'disconnected';\nlet connectionState: ConnectionState = 'disconnected';\nconst connectionListeners: Array<(s: ConnectionState) => void> = [];\n\nfunction setConnectionState(s: ConnectionState): void {\n if (connectionState === s) return;\n connectionState = s;\n for (const cb of [...connectionListeners]) {\n try {\n cb(s);\n } catch (_e) {\n /* listener errors must not break the transport */\n }\n }\n}\n\nfunction markPathReady(path: string): void {\n pathStates.set(path, 'ready');\n const waiters = pathReadyWaiters.get(path);\n if (waiters) {\n pathReadyWaiters.delete(path);\n for (const w of waiters) w();\n }\n}\n\nfunction markAllPathsDisconnected(): void {\n for (const key of pathStates.keys()) pathStates.set(key, 'disconnected');\n}\n\n/** Single choke point for subscribe_path frames: state moves to 'pending'\n * exactly when a frame goes on the wire (or is queued for the next connect). */\nfunction sendPathSubscribe(path: string, eventTypes: string[]): void {\n pathStates.set(path, 'pending');\n sendMessage({ type: 'subscribe_path', path, event_types: eventTypes });\n}\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\n // Resolve auth token — getAccessToken() is the single authority\n // (embed token, string or provider, takes precedence there).\n const token = await getAccessToken();\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 setConnectionState('connecting');\n ws = new WebSocket(wsUrl);\n // [2026-08-29] Stale-socket guard: handlers below belong to THIS socket.\n // Without the identity check, a dying socket's late onclose could null\n // out and reconnect over a newer, healthy connection.\n const socket = ws;\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 if (ws !== socket) return;\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 socket.onopen = () => {\n if (ws !== socket) return;\n clearTimeout(timeout);\n log('ensureConnection: CONNECTED');\n // Capture BEFORE the reset: a reconnect means events were missed\n // while the socket was down, so the cache for subscribed paths is\n // not trustworthy. A first connection has missed nothing.\n const isReconnect = hasConnectedBefore;\n hasConnectedBefore = true;\n reconnectAttempts = 0;\n setConnectionState('connected');\n // Re-subscribe to all active scopes and paths\n resubscribeAll(isReconnect);\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 socket.onmessage = (event) => {\n if (ws !== socket) return;\n handleMessage(event.data);\n };\n\n socket.onerror = () => {\n log('ensureConnection: WS error event');\n // Error is followed by close, so we handle reconnect there\n };\n\n socket.onclose = (event) => {\n clearTimeout(timeout);\n if (ws !== socket) {\n // A superseded socket closing must not touch live state.\n return;\n }\n log('ensureConnection: WS closed, code:', event.code, 'reason:', event.reason);\n ws = null;\n stopPing();\n markAllPathsDisconnected();\n setConnectionState('disconnected');\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(isReconnect = false): 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 sendPathSubscribe(sub.path, sub.event_types);\n }\n // Catch up on what was missed while the socket was down. Item caches hold\n // indefinitely (staleTime: Infinity) precisely BECAUSE events keep them\n // fresh; when the event stream had a gap, that guarantee lapsed for exactly\n // these paths. Scoped to active subscriptions, so this costs one refetch per\n // thing actually on screen, and only on a genuine reconnect.\n if (!isReconnect) return;\n try {\n const qc = getQueryClient();\n refreshInfiniteItemsAfterReconnect(qc);\n reconnectArrangements(qc);\n for (const sub of activePaths.values()) {\n void qc.invalidateQueries({ queryKey: vfsKeys.item(sub.path) });\n void qc.invalidateQueries({ queryKey: vfsKeys.children(sub.path) });\n }\n log('resubscribeAll: invalidated', activePaths.size, 'paths after reconnect');\n } catch (err) {\n // A missing query client must never break reconnection itself.\n log('resubscribeAll: cache invalidation skipped', err);\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 lastInboundAt = Date.now();\n try {\n const msg = JSON.parse(raw);\n\n // Ack for a path subscription: this is the moment the stream is actually\n // listening. Everything the readiness API promises hangs off this frame.\n if (msg.type === 'subscribed_path') {\n if (typeof msg.path === 'string') markPathReady(msg.path);\n return;\n }\n\n // Other protocol-level messages (ack, error, pong)\n if (msg.type === 'subscribed' ||\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 // One cache refresh decision per event, independent of how many React\n // consumers render the same listing. Reuse this account/path transport;\n // filtered listings do not install another subscription or connection.\n if (eventType === 'vfs_change') {\n handleInfiniteItemsChange(getQueryClient(), data);\n handleArrangementChange(getQueryClient(), data);\n }\n\n // Path-based dispatch mirrors the gateway's boundary-aware hierarchy.\n // The server may route a descendant thread event to a channel-level\n // subscriber; dispatching only by exact event.path silently dropped it\n // once streams became correctly addressed to their thread roots.\n if (typeof data.path === 'string') {\n for (const [subscribedPath, listeners] of Object.entries(pathListeners)) {\n if (subscribedPath === '*') continue;\n if (!pathSubscriptionMatches(subscribedPath, data.path)) continue;\n listeners.forEach((cb) => cb(data));\n }\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 sends\n // it on connect — either way the wire state starts as 'pending'.\n if (ws && ws.readyState === WebSocket.OPEN) {\n sendPathSubscribe(path, ['token_stream']);\n } else {\n pathStates.set(path, 'pending');\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 pathStates.delete(path);\n pathReadyWaiters.delete(path); // stragglers resolve false via their timeout\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 const leaseId = Symbol(scopeId);\n const normalizedEventTypes = Array.from(new Set(eventTypes)).sort();\n // Preserve the existing no-op semantics for an explicitly empty event list.\n if (normalizedEventTypes.length === 0) return () => {};\n\n const leases = scopeLeases.get(scopeId) ?? new Map<symbol, ScopeLease>();\n const previousEventTypes = activeScopes.get(scopeId)?.event_types;\n leases.set(leaseId, { event_types: normalizedEventTypes });\n scopeLeases.set(scopeId, leases);\n const subscription = refreshScopeSubscription(scopeId);\n if (!subscription) return () => {};\n\n log('subscribeToScope:', scopeId, subscription.event_types);\n // If WS is already open, send immediately when this lease expands the union;\n // otherwise resubscribeAll handles it on connect.\n if (\n ws\n && ws.readyState === WebSocket.OPEN\n && !sameEventTypes(previousEventTypes, subscription.event_types)\n ) {\n sendMessage({\n type: 'subscribe',\n scope_id: scopeId,\n event_types: subscription.event_types,\n });\n }\n ensureConnection();\n\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n\n const currentLeases = scopeLeases.get(scopeId);\n if (!currentLeases?.delete(leaseId)) return;\n\n const previous = activeScopes.get(scopeId)?.event_types;\n if (currentLeases.size === 0) {\n scopeLeases.delete(scopeId);\n activeScopes.delete(scopeId);\n sendMessage({ type: 'unsubscribe', scope_id: scopeId });\n } else {\n const next = refreshScopeSubscription(scopeId);\n if (\n next\n &&\n ws\n && ws.readyState === WebSocket.OPEN\n && !sameEventTypes(previous, next.event_types)\n ) {\n sendMessage({\n type: 'subscribe',\n scope_id: scopeId,\n event_types: next.event_types,\n });\n }\n }\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 clearInfiniteItemsRefreshes(getQueryClient());\n clearArrangementRefreshes(getQueryClient());\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 scopeLeases.clear();\n activePaths.clear();\n pathStates.clear();\n pathReadyWaiters.clear(); // stragglers resolve false via their timeout\n setConnectionState('disconnected');\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// ── Subscription readiness API (2026-08-29) ──────────────────────────────────\n\n/**\n * Wire-level state of a path subscription: 'unsubscribed' when no consumer\n * holds the path, otherwise pending/ready/disconnected per the gateway ack.\n */\nexport function getPathSubscriptionState(\n path: string,\n): PathSubscriptionState | 'unsubscribed' {\n if (!activePaths.has(path)) return 'unsubscribed';\n return pathStates.get(path) ?? 'pending';\n}\n\n/**\n * Resolves true once the gateway has acknowledged the path subscription on the\n * CURRENT socket — i.e. events for this path will actually be delivered.\n * Resolves false when the path has no subscription, or after timeoutMs.\n *\n * Never rejects and never blocks forever: readiness is a courtesy gate for\n * dispatching turns, not a hard dependency. Callers should proceed (and rely\n * on the transcript-polling fallback) when this returns false.\n */\nexport function waitForPathReady(path: string, timeoutMs = 5000): Promise<boolean> {\n if (!activePaths.has(path)) return Promise.resolve(false);\n if (\n pathStates.get(path) === 'ready' &&\n ws &&\n ws.readyState === WebSocket.OPEN\n ) {\n return Promise.resolve(true);\n }\n // Not ready — make sure a connection attempt is underway, then wait for the ack.\n ensureConnection();\n return new Promise((resolve) => {\n let settled = false;\n const waiters = pathReadyWaiters.get(path) ?? [];\n const onReady = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(true);\n };\n waiters.push(onReady);\n pathReadyWaiters.set(path, waiters);\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n const remaining = pathReadyWaiters.get(path);\n if (remaining) {\n const idx = remaining.indexOf(onReady);\n if (idx !== -1) remaining.splice(idx, 1);\n if (remaining.length === 0) pathReadyWaiters.delete(path);\n }\n resolve(false);\n }, timeoutMs);\n });\n}\n\n/**\n * Force a fresh subscribe_path frame for a path that already has consumers.\n * subscribeToPath deliberately dedupes (N consumers, one wire subscription),\n * which also means it cannot express \"I think the wire subscription is gone —\n * establish it again\". This can. Await waitForPathReady() afterwards to know\n * when the new subscription is live.\n */\nexport function resubscribePath(path: string): void {\n const sub = activePaths.get(path);\n if (!sub) {\n log('resubscribePath: no active subscription for', path);\n return;\n }\n if (ws && ws.readyState === WebSocket.OPEN) {\n log('resubscribePath: re-sending frame for', path);\n sendPathSubscribe(sub.path, sub.event_types);\n } else {\n // No socket — mark pending and connect; resubscribeAll sends the frame.\n pathStates.set(path, 'pending');\n ensureConnection();\n }\n}\n\n/**\n * Observe transport connection state ('connecting' | 'connected' |\n * 'disconnected'). Fires immediately with the current state, then on change.\n * Returns an unsubscribe function.\n */\nexport function onConnectionStateChange(\n callback: (state: ConnectionState) => void,\n): () => void {\n connectionListeners.push(callback);\n try {\n callback(connectionState);\n } catch (_e) {\n /* listener errors must not break the transport */\n }\n return () => {\n const idx = connectionListeners.indexOf(callback);\n if (idx !== -1) connectionListeners.splice(idx, 1);\n };\n}\n\n// Register with the SDK-wide cleanup registry so signOut() tears down WS.\nregisterCleanup(disconnectSSE);\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 { getQueryClient } 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 space_item_id: raw.space_item_id,\n account_item_id: raw.account_item_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 getQueryClient().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 getQueryClient().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 getQueryClient().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\nexport type TurnQueueEntryState =\n | 'queued'\n | 'dispatching'\n | 'promoted'\n | 'cancelled'\n | 'failed';\n\n/** Deferred send intent. It is deliberately not a chat transcript message. */\nexport interface TurnQueueEntry {\n id: string;\n path: string;\n content: string;\n state: TurnQueueEntryState;\n queue_seq: number;\n created_at: string;\n /** Canonical Channel-or-Message identity that owns this queue. */\n conversation_anchor_item_id: string;\n /** @deprecated Use conversation_anchor_item_id. */\n conversation_root_id: string;\n client_request_id?: string;\n promoted_message_id?: string;\n promoted_event_id?: string;\n}\n\n/**\n * Read queued send intents attached to one conversation anchor.\n *\n * The anchor may be a Channel (channel-level conversation) or a Message\n * (message-rooted thread). Querying by type + parent identity keeps this read\n * bounded even after a long-lived conversation has accumulated many\n * transcript messages and historical queue receipts. Queue entries are\n * deliberately not transcript messages.\n *\n * Parameter names remain positional, so this is backward compatible with\n * callers that previously treated every anchor as a message root.\n */\nexport async function fetchTurnQueueEntries(\n anchorPath: string,\n anchorItemId: string,\n): Promise<TurnQueueEntry[]> {\n const { items } = await fetchItems({\n type: 'turn_queue_entry',\n scope: anchorPath,\n parent_id: anchorItemId,\n fields: { state: 'queued' },\n sort_by: 'created_at',\n sort_dir: 'asc',\n limit: 100,\n });\n return items\n .map((item) => {\n const conversationAnchorItemId = String(\n item.type_data?.conversation_anchor_item_id\n ?? item.type_data?.conversation_root_id\n ?? anchorItemId,\n );\n return {\n id: item.id,\n path: item.path,\n content: String(item.type_data?.content ?? ''),\n state: String(item.type_data?.state ?? 'queued') as TurnQueueEntryState,\n queue_seq: Number(item.type_data?.queue_seq ?? 0),\n created_at: item.created_at,\n conversation_anchor_item_id: conversationAnchorItemId,\n conversation_root_id: conversationAnchorItemId,\n client_request_id: typeof item.type_data?.client_request_id === 'string'\n ? item.type_data.client_request_id : undefined,\n promoted_message_id: typeof item.type_data?.promoted_message_id === 'string'\n ? item.type_data.promoted_message_id : undefined,\n promoted_event_id: typeof item.type_data?.promoted_event_id === 'string'\n ? item.type_data.promoted_event_id : undefined,\n };\n })\n .sort((a, b) => a.queue_seq - b.queue_seq || a.created_at.localeCompare(b.created_at));\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 getQueryClient().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 getQueryClient().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('get-activity-feed', {\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 interface ItemVersionsOptions {\n limit?: number;\n offset?: number;\n include_snapshots?: boolean;\n}\n\nexport interface ItemVersionsResult {\n versions: any[];\n total: number;\n}\n\n/**\n * Fetch persisted version history for an item.\n * Uses the `item-versions` kernel method.\n */\nexport async function fetchItemVersions(\n itemId: string,\n options: ItemVersionsOptions = {},\n): Promise<ItemVersionsResult> {\n const { limit = 50, offset = 0, include_snapshots = false } = options;\n try {\n const response = await gatewayCall('item-versions', {\n id: itemId,\n limit,\n offset,\n include_snapshots,\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 versions for ${itemId}:`, err);\n return { versions: [], total: 0 };\n }\n}\n\n/**\n * @deprecated Use `fetchItemVersions` instead.\n */\nexport async function fetchItemHistory(\n itemId: string,\n limit: number = 50,\n offset: number = 0,\n): Promise<ItemVersionsResult> {\n return fetchItemVersions(itemId, { limit, offset });\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 getQueryClient().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/**\n * One OR-group of a listing that spans item types. Everything inside a group\n * is ANDed; an item is listed when ANY group matches it.\n */\nexport interface ItemsFilterGroup {\n /** Item type this group matches. */\n item_type?: string;\n /**\n * type_data field filters: exact match, or a prefix match when the value\n * ends in a single `*` (content_type \"image/*\").\n */\n fields?: Record<string, string | number | boolean>;\n /** type_data membership filters: the field's value is one of the list. */\n field_in?: Record<string, Array<string | number | boolean>>;\n}\n\n/** Where an item shows: on its own, only through its parent, or nowhere. */\nexport type ItemsDiscovery = 'catalog' | 'parent_only' | 'internal';\n\n/** Filters for useItems / useInfiniteItems / fetchItems. */\nexport interface ItemsFilter {\n /** Item type to query. Required unless `any_of` names the types. */\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 /**\n * type_data field filters. Keys are field names; values match exactly, or by\n * prefix when the value ends in a single `*` (content_type \"image/*\").\n */\n fields?: Record<string, string | number | boolean>;\n /** type_data membership filters: the field's value is one of the list. */\n field_in?: Record<string, Array<string | number | boolean>>;\n /**\n * Keep only the items that show there, as the kernel decides it from the\n * item, its kind and its type: 'catalog' = standalone things a person works\n * with, 'parent_only' = parts shown through their parent, 'internal' =\n * system records. Applied by the kernel before paging.\n */\n discovery?: ItemsDiscovery;\n /**\n * 1-10 OR-groups. One listing can span item types with one total and one\n * page order (image assets OR image files). Composes with every other\n * filter as AND. No nesting.\n */\n any_of?: ItemsFilterGroup[];\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/** True when a filter names what to list: one type, or OR-groups. */\nexport function isListableItemsFilter(filter: ItemsFilter | null | undefined): filter is ItemsFilter {\n return !!filter && (!!filter.type || (Array.isArray(filter.any_of) && filter.any_of.length > 0));\n}\n\nfunction kernelGroup(group: ItemsFilterGroup): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (group.item_type) out.item_type = group.item_type;\n for (const [key, value] of Object.entries(group.fields ?? {})) out[`field.${key}`] = String(value);\n for (const [key, values] of Object.entries(group.field_in ?? {})) out[`field_in.${key}`] = values.map(String);\n return out;\n}\n\nconst DISCOVERY_VALUES: readonly string[] = ['catalog', 'parent_only', 'internal'];\n\n/**\n * Turn a stored saved filter (a `query_filter` item's type_data, as an\n * arrangement returns it in `resolved_children`) into an ItemsFilter for\n * useInfiniteItems / useItems / fetchItems. The stored keys are the list\n * call's own: `type`, `sort_by`, `sort_dir`, `name`, `tag`, `discovery`,\n * `field.<key>`, `field_in.<key>` and `any_of`. Display keys (display_name,\n * icon, ...) are ignored. `extra` adds what the screen owns: scope, page size.\n * Returns null when the stored filter names nothing to list.\n */\nexport function itemsFilterFromQueryFilter(\n typeData: Record<string, unknown> | null | undefined,\n extra: Pick<ItemsFilter, 'scope' | 'limit' | 'name' | 'parent_id'> = {},\n): ItemsFilter | null {\n if (!typeData || typeof typeData !== 'object') return null;\n const scalar = (value: unknown): value is string | number | boolean =>\n typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n const readFields = (source: Record<string, unknown>) => {\n const fields: Record<string, string | number | boolean> = {};\n const field_in: Record<string, Array<string | number | boolean>> = {};\n for (const [key, value] of Object.entries(source)) {\n if (key.startsWith('field.') && key.length > 6 && scalar(value)) fields[key.slice(6)] = value;\n else if (key.startsWith('field_in.') && key.length > 9 && Array.isArray(value)) field_in[key.slice(9)] = value.filter(scalar);\n }\n return { fields, field_in };\n };\n const filter: ItemsFilter = {};\n if (typeof typeData.type === 'string' && typeData.type) filter.type = typeData.type;\n if (typeof typeData.sort_by === 'string') filter.sort_by = typeData.sort_by;\n if (typeData.sort_dir === 'asc' || typeData.sort_dir === 'desc') filter.sort_dir = typeData.sort_dir;\n if (typeof typeData.name === 'string' && typeData.name) filter.name = typeData.name;\n if (typeof typeData.tag === 'string' && typeData.tag) filter.tag = typeData.tag;\n if (typeof typeData.discovery === 'string' && DISCOVERY_VALUES.includes(typeData.discovery)) {\n filter.discovery = typeData.discovery as ItemsDiscovery;\n }\n const top = readFields(typeData);\n if (Object.keys(top.fields).length) filter.fields = top.fields;\n if (Object.keys(top.field_in).length) filter.field_in = top.field_in;\n if (Array.isArray(typeData.any_of)) {\n const groups: ItemsFilterGroup[] = [];\n for (const raw of typeData.any_of) {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) continue;\n const source = raw as Record<string, unknown>;\n const group: ItemsFilterGroup = {};\n if (typeof source.item_type === 'string' && source.item_type) group.item_type = source.item_type;\n const inner = readFields(source);\n if (Object.keys(inner.fields).length) group.fields = inner.fields;\n if (Object.keys(inner.field_in).length) group.field_in = inner.field_in;\n if (Object.keys(group).length) groups.push(group);\n }\n if (groups.length) filter.any_of = groups;\n }\n if (!isListableItemsFilter(filter)) return null;\n return { ...filter, ...extra };\n}\n\n/**\n * Fetch items with structured filters: one type, or OR-groups across types.\n * Calls kernel_query (gateway 'query' method). The kernel filters before it\n * pages, returns at most `limit` items and one total.\n */\nexport async function fetchItems(filter: ItemsFilter, options: { throwOnError?: boolean } = {}): Promise<{\n items: VFSItem[];\n total_hint?: number;\n}> {\n const params: Record<string, unknown> = {};\n if (filter.type) params.item_type = filter.type;\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 // Map field_in.* membership filters\n if (filter.field_in) {\n for (const [key, values] of Object.entries(filter.field_in)) {\n filters[`field_in.${key}`] = values.map(String);\n }\n }\n\n if (filter.discovery) filters.discovery = filter.discovery;\n if (filter.any_of?.length) filters.any_of = filter.any_of.map(kernelGroup);\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('query', params);\n const items = extractItems(response);\n // Cache individual items\n for (const item of items) {\n getQueryClient().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 ?? '(any_of)'}:`, err);\n if (options.throwOnError) throw 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 /** Durable lifecycle disposition declared on the message item. */\n status?: string;\n /** Durable lifecycle state for a real, already-dispatched user message. */\n delivery_state?:\n | 'dispatching'\n | 'dispatched'\n | 'completed'\n | 'cancelled'\n | 'steered';\n /** Cognition event created for this dispatched request message. */\n cognition_event_id?: string;\n seq: number;\n principal_id?: string;\n reply_count: number;\n parent_message_id?: string;\n intent_card?: Record<string, unknown>;\n /** Full message metadata from type_data.metadata (launch cards, custom card payloads, etc.). */\n metadata?: Record<string, unknown>;\n thread_summary?: Array<Record<string, unknown>>;\n}\n\n/** Runtime/kernel ownership shared by durable cards and execution activity. */\nexport interface WorkCorrelation {\n version: 1;\n workId: string;\n threadRootId?: string;\n requestMessageId?: string;\n replyMessageId?: string;\n replyMessagePath?: string;\n todoListId?: string;\n todoListPath?: string;\n stepId?: string;\n stepPath?: string;\n runId?: string;\n parentRunId?: string;\n toolCallId?: string;\n traceId?: string;\n}\n\nfunction parseWorkCorrelation(raw: unknown): WorkCorrelation | undefined {\n if (!raw || typeof raw !== 'object') return undefined;\n const value = raw as Record<string, unknown>;\n if (value.version !== 1 || typeof value.work_id !== 'string' || !value.work_id) {\n return undefined;\n }\n const optional = (key: string): string | undefined => {\n const candidate = value[key];\n return typeof candidate === 'string' && candidate ? candidate : undefined;\n };\n return {\n version: 1,\n workId: value.work_id,\n threadRootId: optional('thread_root_id'),\n requestMessageId: optional('request_message_id'),\n replyMessageId: optional('reply_message_id'),\n replyMessagePath: optional('reply_message_path'),\n todoListId: optional('todo_list_id'),\n todoListPath: optional('todo_list_path'),\n stepId: optional('step_id'),\n stepPath: optional('step_path'),\n runId: optional('run_id'),\n parentRunId: optional('parent_run_id'),\n toolCallId: optional('tool_call_id'),\n traceId: optional('trace_id'),\n };\n}\n\n/** A parsed card item bundled with channel messages from the kernel v2 response. */\nexport interface ChannelCard {\n id: string;\n path: string;\n name: string;\n createdAt: string;\n action: string;\n targetId?: string;\n targetPath: string;\n targetDisplayName: string;\n targetDescription: string;\n targetItemType: string;\n /** Derived tool use ID (name without 'card-' prefix). */\n toolId?: string;\n /** Path of the parent message (for child cards). Undefined for sibling cards. */\n parentMessagePath?: string;\n visibility: string;\n /** Launch cards (action='launch'): opener component path (type_data.payload.open_with). */\n openWith?: string;\n /** Launch cards: opener is bundled in the host app (payload.host_bundled). */\n hostBundled?: boolean;\n /** Launch cards: named export of the bundled opener (payload.bundle_export). */\n bundleExport?: string;\n /** Launch cards: arguments to pass to the opener (payload.launch_arguments). */\n launchArguments?: Record<string, unknown>;\n /** Launch cards: highlight the card to draw user attention (payload.requires_user_attention). */\n requiresUserAttention?: boolean;\n /** Durable ownership copied from the authoritative tool completion. */\n origin?: WorkCorrelation;\n /** Semantic urgency; visual treatment remains the host application's job. */\n presentationRole?: 'output' | 'user-request';\n}\n\n/** Full response from fetchChannelMessagesWithCards — includes bundled cards. */\nexport interface ChannelMessagesResponse {\n messages: ChannelMessage[];\n /** Cards that are direct children of messages in this page. Keyed by message path. */\n messageCards: Map<string, ChannelCard[]>;\n /** Cards that are direct siblings (children of the channel itself). */\n siblingCards: ChannelCard[];\n mode: 'top_level' | 'thread';\n}\n\n/**\n * Parse raw kernel card items into typed ChannelCard objects.\n * Filters to item_type === 'card' and sorts by createdAt.\n */\nfunction parseChannelCards(rawItems: Array<Record<string, unknown>>): ChannelCard[] {\n return rawItems\n .filter(i => (i.item_type as string) === 'card')\n .map((i): ChannelCard => {\n const td = (i.type_data as Record<string, unknown>) || {};\n const payload = (td.payload as Record<string, unknown>) || {};\n return {\n id: (i.id as string) || '',\n path: (i.path as string) || '',\n name: (i.name as string) || (i.path as string || '').split('/').pop() || '',\n createdAt: (i.created_at as string) || '',\n action: (td.action as string) || 'created',\n targetId: (td.target_id as string) || undefined,\n targetPath: (td.target_path as string) || '',\n targetDisplayName: (td.target_display_name as string) || '',\n targetDescription: (td.target_description as string) || '',\n targetItemType: (td.target_item_type as string) || '',\n toolId: ((i.name as string) || '').startsWith('card-')\n ? ((i.name as string) || '').substring(5)\n : undefined,\n parentMessagePath: (i.parent_message_path as string) || undefined,\n visibility: (td.visibility as string) || 'private',\n openWith: (payload.open_with as string) || undefined,\n hostBundled: payload.host_bundled === true ? true : undefined,\n bundleExport: (payload.bundle_export as string) || undefined,\n launchArguments: (payload.launch_arguments as Record<string, unknown>) || undefined,\n requiresUserAttention: payload.requires_user_attention === true ? true : undefined,\n origin: parseWorkCorrelation(td.origin),\n presentationRole: payload.presentation_role === 'user-request'\n ? 'user-request'\n : payload.presentation_role === 'output'\n ? 'output'\n : undefined,\n };\n })\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\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 status: typeof td.status === 'string' ? td.status : undefined,\n delivery_state: typeof td.delivery_state === 'string'\n ? td.delivery_state as ChannelMessage['delivery_state']\n : undefined,\n cognition_event_id: typeof td.cognition_event_id === 'string'\n ? td.cognition_event_id\n : undefined,\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 metadata: Object.keys(metadata).length > 0 ? metadata : 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/**\n * Fetch channel messages WITH bundled cards from the kernel v2 response.\n *\n * The kernel's get-channel-messages (v2) returns messages interleaved with\n * their associated cards (both sibling cards and child cards). This function\n * parses both and groups child cards by their parent message path.\n *\n * This eliminates the N+1 query problem where the frontend previously made\n * separate `list` calls for each message to fetch its cards.\n */\nexport async function fetchChannelMessagesWithCards(\n channelPath: string,\n parentMessageId?: string,\n): Promise<ChannelMessagesResponse> {\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 const messages = parseChannelMessages(items);\n const cards = parseChannelCards(items);\n\n // Group cards by parent message path\n const messageCards = new Map<string, ChannelCard[]>();\n const siblingCards: ChannelCard[] = [];\n\n for (const card of cards) {\n if (card.parentMessagePath) {\n const existing = messageCards.get(card.parentMessagePath) || [];\n existing.push(card);\n messageCards.set(card.parentMessagePath, existing);\n } else {\n siblingCards.push(card);\n }\n }\n\n return {\n messages,\n messageCards,\n siblingCards,\n mode: (raw.mode as 'top_level' | 'thread') || 'top_level',\n };\n } catch (err) {\n console.error(\n `[gateway] Failed to fetch channel messages with cards for ${channelPath}:`,\n err,\n );\n return { messages: [], messageCards: new Map(), siblingCards: [], mode: 'top_level' };\n }\n}\n\n// ── Paginated Channel Messages ──────────────────────────────────────────────\n\n/** Response shape from fetchChannelMessagesPage. */\nexport interface ChannelMessagesPage {\n messages: ChannelMessage[];\n /** Cards grouped by parent message path (child cards of messages in this page). */\n messageCards: Map<string, ChannelCard[]>;\n /** Cards that are direct siblings of the channel (not nested under a message). */\n siblingCards: ChannelCard[];\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 const cards = parseChannelCards(items);\n const messageCards = new Map<string, ChannelCard[]>();\n const siblingCards: ChannelCard[] = [];\n for (const card of cards) {\n if (card.parentMessagePath) {\n const existing = messageCards.get(card.parentMessagePath) || [];\n existing.push(card);\n messageCards.set(card.parentMessagePath, existing);\n } else {\n siblingCards.push(card);\n }\n }\n return {\n messages: parseChannelMessages(items),\n messageCards,\n siblingCards,\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: [], messageCards: new Map(), siblingCards: [], mode: 'top_level' };\n }\n}\n\n// ── Cache Invalidation ──────────────────────────────────────────────────────\n\nexport function invalidateChildren(path: string): void {\n getQueryClient().invalidateQueries({ queryKey: vfsKeys.children(path) });\n}\n\nexport function invalidateItem(path: string): void {\n getQueryClient().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 getQueryClient().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 getQueryClient().invalidateQueries({ queryKey: vfsKeys.all() });\n}\n\nexport function invalidateTypes(scopeId?: string): void {\n getQueryClient().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 getQueryClient().invalidateQueries({ queryKey: vfsKeys.channelMessages(channelPath, parentMessageId) });\n } else {\n getQueryClient().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 getQueryClient().invalidateQueries({ queryKey: vfsKeys.openEnvelope(path, strategy) });\n } else if (path) {\n getQueryClient().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 getQueryClient().invalidateQueries({ queryKey: vfsKeys.allOpenEnvelopes() });\n }\n}\n","import { gatewayCall } from './client';\nimport type { MountRef } from './session';\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 membershipPath?: string | null;\n personalSpaceId?: string | null;\n personalSpacePath?: string | null;\n}\n\n/** Convert a membership row into a MountRef (accounts and spaces alike). */\nexport function membershipToMountRef(m: AccountInfo): MountRef {\n return {\n id: m.accountId,\n path: m.path,\n kind: m.isSpace ? 'space' : 'account',\n name: m.name,\n grantedUnderAccountId: m.grantedUnderAccountId ?? undefined,\n };\n}\n\n/** Shared mapping for native-auth hooks and external-token bootstrap. */\nexport async function fetchMemberships(): Promise<AccountInfo[]> {\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 membershipPath: m.membership_path ?? null,\n personalSpaceId: m.personal_space_id ?? null,\n personalSpacePath: m.personal_space_path ?? null,\n })) as AccountInfo[];\n}\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 { getQueryClient } 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;\nlet unsubCcmEvents: (() => 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 // Selection/restoration can call this repeatedly. Keep existing mounted\n // scopes and pending invalidations; logout owns full disposal.\n if (unsubEvents) {\n mountRealtimeScope(accountId);\n return;\n }\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 // Edge changes ride the ccm_change stream (scope subscriptions already\n // include it — see mountRealtimeScope). Without this listener, edge\n // caches (vfsKeys.edges) never refresh on realtime pushes and useEdges\n // consumers go stale until manual invalidation.\n unsubCcmEvents = subscribeToEvents(\n 'ccm_change',\n (data: any) => handleCcmChange(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 if (unsubCcmEvents) {\n unsubCcmEvents();\n unsubCcmEvents = 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\n/**\n * Handle a ccm_change event. Edge mutations (link/unlink/focus/staging)\n * arrive on this stream with edge_type and the endpoint item IDs. Payload\n * shape is not guaranteed, so fail open: invalidate the endpoints we can\n * identify; if the event looks edge-related but names no endpoint, refresh\n * all edge queries (React Query only refetches mounted ones, so the blast\n * radius is what's actually on screen).\n */\nfunction handleCcmChange(data: any): void {\n if (!data || typeof data !== 'object') return;\n\n const sourceId = data.source_item_id || data.source_id;\n const targetId = data.target_item_id || data.target_id;\n const looksEdgeRelated =\n data.edge_type != null || sourceId != null || targetId != null;\n if (!looksEdgeRelated) return;\n\n // Debounce per endpoint pair to avoid invalidation storms on bulk edits.\n const debounceKey = `ccm:${sourceId ?? ''}:${targetId ?? ''}`;\n const existing = debounceTimers.get(debounceKey);\n if (existing) clearTimeout(existing);\n\n const timer = setTimeout(() => {\n debounceTimers.delete(debounceKey);\n if (sourceId) {\n getQueryClient().invalidateQueries({ queryKey: vfsKeys.edges(sourceId) });\n }\n if (targetId) {\n getQueryClient().invalidateQueries({ queryKey: vfsKeys.edges(targetId) });\n }\n if (!sourceId && !targetId) {\n getQueryClient().invalidateQueries({\n predicate: (query) =>\n query.queryKey[0] === 'vfs' && query.queryKey[1] === 'edges',\n });\n }\n }, DEBOUNCE_MS);\n\n debounceTimers.set(debounceKey, 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 getQueryClient().removeQueries({ queryKey: vfsKeys.item(path) });\n getQueryClient().removeQueries({ queryKey: vfsKeys.children(path) });\n getQueryClient().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 getQueryClient().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 getQueryClient().invalidateQueries({ queryKey: vfsKeys.children(parentPath) });\n\n // Invalidate any tree queries that include this path\n getQueryClient().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 getQueryClient().invalidateQueries({ queryKey: vfsKeys.itemById(data.item_id) });\n }\n}\n","/** Durable workspace mounts. The declaration narrows membership; it is not a\n * substitute for a selected-Space filter on reads, nor a permission grant. */\nimport { gatewayCall, GatewayRequestError } from './client';\nimport {\n type MountRef, commitMountSelection, getMounts, getHomeAnchor,\n getAnchorRef, registerCleanup, getSessionGeneration,\n} from './session';\nimport { initVfsRealtimeWs, mountRealtimeScope, unmountRealtimeScope } from './vfs-realtime-ws';\n\ninterface Declaration {\n generation: number;\n path: string;\n scope: string;\n resolve: (id: string) => MountRef | null;\n exists: boolean;\n ready: boolean;\n saved: string | null;\n loading?: Promise<MountRef[]>;\n queue: Promise<void>;\n}\nlet declaration: Declaration | null = null;\nregisterCleanup(() => { declaration = null; });\n\nfunction assertCurrent(owner: Declaration): void {\n if (owner !== declaration || owner.generation !== getSessionGeneration()) throw new Error('Workspace session changed');\n}\nfunction missing(error: unknown): boolean {\n // Verified kernel_read_item result. HTTP/auth/network failures are not absence.\n return error instanceof GatewayRequestError && error.payload?.error === 'item_not_found';\n}\nfunction canonical(owner: Declaration, ref: MountRef): MountRef {\n const current = owner.resolve(ref.id);\n if (!current || current.path !== ref.path || current.kind !== ref.kind) {\n throw new Error('Mount is not an available membership');\n }\n return current;\n}\nfunction withHome(refs: MountRef[]): MountRef[] {\n const home = getHomeAnchor();\n if (!home) throw new Error('Elect a home account before loading mounts');\n return [home, ...refs.filter((ref, index) => ref.id !== home.id && refs.findIndex(r => r.id === ref.id) === index)];\n}\nfunction signature(refs: MountRef[], anchor: MountRef): string {\n return JSON.stringify({ mounts: refs.map(ref => ref.id), last_anchor: anchor.id });\n}\nasync function save(owner: Declaration, refs: MountRef[], anchor: MountRef): Promise<void> {\n assertCurrent(owner);\n const next = signature(refs, anchor);\n if (owner.saved === next) return;\n const type_data = JSON.parse(next);\n // Capture the declaration's owning account. A later selection never retargets\n // this write. Create only after a read positively established absence.\n await gatewayCall(owner.exists ? 'update' : 'create', owner.exists ? {\n _scope_path: owner.scope, path: owner.path, type_data,\n } : {\n _scope_path: owner.scope, parent_path: owner.path.slice(0, owner.path.lastIndexOf('/')),\n name: 'mounts', item_type: 'file', type_data,\n });\n assertCurrent(owner);\n owner.exists = true;\n owner.saved = next;\n}\nfunction publish(refs: MountRef[], anchor: MountRef): void {\n const previous = getMounts();\n initVfsRealtimeWs(getHomeAnchor()!.id);\n for (const ref of previous) if (!refs.some(r => r.id === ref.id)) unmountRealtimeScope(ref.id);\n for (const ref of refs) mountRealtimeScope(ref.id);\n commitMountSelection(refs, anchor);\n}\n\nexport interface LoadMountsOptions {\n /** Verified default working Space, used only when no declaration exists. */\n initialAnchor?: MountRef;\n}\n\n/** One shared declaration read per session. Failures remain retryable and visible.\n * Existing saved exclusions are retained; restoration never mounts newly joined\n * Spaces. A fresh default is saved once before it is published. */\nexport async function loadMounts(\n memberSpacePath: string,\n resolveRef: (id: string) => MountRef | null,\n options: LoadMountsOptions = {},\n): Promise<MountRef[]> {\n const home = getHomeAnchor();\n if (!home) throw new Error('Elect a home account before loading mounts');\n const path = `${memberSpacePath}/settings/mounts`;\n if (declaration && declaration.path !== path) throw new Error('Reset the session before changing the mount declaration owner');\n const owner = declaration ??= {\n generation: getSessionGeneration(),\n path, scope: home.path, resolve: resolveRef, exists: false, ready: false,\n saved: null, queue: Promise.resolve(),\n };\n assertCurrent(owner);\n if (owner.loading) return owner.loading;\n if (owner.ready) return getMounts();\n owner.resolve = resolveRef;\n owner.loading = (async () => {\n let data: Record<string, unknown> | null = null;\n try {\n const response = await gatewayCall('read', { path, _scope_path: owner.scope });\n assertCurrent(owner);\n // kernel_read_item returns flat type_data; tolerate the older envelope.\n data = (response.type_data ?? (response.item as any)?.type_data) as Record<string, unknown>;\n if (!data || !Array.isArray(data.mounts) || !data.mounts.every(id => typeof id === 'string')) {\n throw new Error('Invalid saved mount declaration');\n }\n owner.exists = true;\n } catch (error) {\n assertCurrent(owner);\n if (!missing(error)) throw error;\n owner.exists = false;\n }\n const initial = options.initialAnchor ? canonical(owner, options.initialAnchor) : home;\n const refs = withHome(data\n ? (data.mounts as string[]).map(resolveRef).filter((ref): ref is MountRef => ref !== null)\n : [initial]);\n const anchor = data\n ? refs.find(ref => ref.id === data.last_anchor) ?? refs.find(ref => ref.kind === 'space') ?? home\n : initial;\n if (data) owner.saved = signature(refs, anchor);\n else if (options.initialAnchor) await save(owner, refs, anchor);\n assertCurrent(owner);\n owner.ready = true;\n publish(refs, anchor);\n return refs;\n })().finally(() => { owner.loading = undefined; });\n return owner.loading;\n}\n\ntype Change = (owner: Declaration) => { refs: MountRef[]; anchor: MountRef };\nfunction mutate(change: Change): Promise<void> {\n const owner = declaration;\n if (!owner?.ready) return Promise.reject(new Error('Workspace mounts are not loaded'));\n // Serialize user actions: each derives from the previous confirmed result.\n // Failed saves never publish optimistic state and never block later retries.\n const task = owner.queue.then(async () => {\n assertCurrent(owner);\n const { refs, anchor } = change(owner);\n await save(owner, refs, anchor);\n assertCurrent(owner);\n publish(refs, anchor);\n });\n owner.queue = task.catch(() => {});\n return task;\n}\n\nexport function mount(ref: MountRef): Promise<void> {\n return mutate(owner => ({ refs: withHome([...getMounts(), canonical(owner, ref)]), anchor: getAnchorRef()! }));\n}\nexport function unmount(id: string): Promise<void> {\n return mutate(() => {\n if (id === getHomeAnchor()!.id) throw new Error('The home account cannot be unmounted');\n const refs = withHome(getMounts().filter(ref => ref.id !== id));\n const anchor = refs.find(ref => ref.id === getAnchorRef()?.id) ?? refs.find(ref => ref.kind === 'space') ?? getHomeAnchor()!;\n return { refs, anchor };\n });\n}\n/** Open a membership; retain the other mounts and save last_anchor. */\nexport function selectMount(ref: MountRef): Promise<void> {\n return mutate(owner => {\n const anchor = canonical(owner, ref);\n return { refs: withHome([...getMounts(), anchor]), anchor };\n });\n}\n/** One explicit batch action (e.g. Account mount-all), never a render effect.\n * Consumers must separately implement a backend-supported aggregate read filter. */\nexport function replaceMounts(refs: MountRef[], anchor: MountRef): Promise<void> {\n return mutate(owner => {\n const next = withHome(refs.map(ref => canonical(owner, ref)));\n const selected = canonical(owner, anchor);\n if (!next.some(ref => ref.id === selected.id)) throw new Error('Selected mount must be in the working set');\n return { refs: next, anchor: selected };\n });\n}\nexport function persistAnchor(): Promise<void> {\n return mutate(() => ({ refs: getMounts(), anchor: getAnchorRef()! }));\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 getQueryClient().\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, useItemVersions, useItemHistory (deprecated), 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, useLayoutEffect, 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, subscribeToScope } 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 isListableItemsFilter,\n fetchMemberFocus,\n fetchRecentActivity,\n fetchItemHistory,\n fetchItemVersions,\n fetchChannelMessages,\n fetchChannelMessagesWithCards,\n fetchOpenEnvelope,\n fetchChannelMessagesPage,\n} from './vfs';\nimport type { ItemVersionsOptions } from './vfs';\nimport type { ItemsFilter, ChannelMessage, ChannelCard, ChannelMessagesResponse, ChannelMessagesPage } from './vfs';\nimport { supabase } from './config';\nimport { initSession, setScope, getScope, getScopeVersion, subscribeScope, isScopeReady, resetAllSdkState, registerCleanup, getSessionEntry } from './session';\nimport { electHomeAnchor, setAnchor, getMounts, getMountVersion, subscribeMounts, getHomeAnchor, getAnchorRef } from './session';\nimport type { MountRef } from './session';\nimport { fetchMemberships, membershipToMountRef, type AccountInfo } from './memberships';\nimport { mount as persistMount, unmount as persistUnmount, loadMounts, selectMount, replaceMounts } from './mounts';\nimport { initVfsRealtimeWs, mountRealtimeScope, unmountRealtimeScope } from './vfs-realtime-ws';\nimport { getQueryClient } from './query-client';\nimport { isChannelPath, refreshQuery } from './query-refresh';\nimport type {\n VFSItem,\n VFSEdge,\n TypeDefinition,\n CreateParams,\n UpdateParams,\n DeleteParams,\n MoveParams,\n LinkParams,\n OpenEnvelope,\n OpenOptions,\n ResolveParams,\n ResolveResponse,\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 // Items are kept fresh by subscription events, never by elapsed time.\n // With the default staleTime of 0, every remount and every invalidation\n // re-read the item over the gateway (~207ms each): one open session\n // issued 367k reads in 19 hours, 87% of all database time. Cache holds\n // until an event says otherwise; reconnect gaps are covered by\n // resubscribeAll's invalidation in ws.ts.\n staleTime: Infinity,\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 staleTime: Infinity, // event-driven; see useItem\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 || response.results || []).map(normalizeItem);\n },\n enabled: !!query && query.length > 0,\n });\n}\n\n/** Multi-signal search (exact + trigram + keyword + semantic vector) via kernel resolve. */\nexport function useResolve(params: ResolveParams | null | undefined) {\n useScopeKey();\n const stableParams = useMemo(() => params, [JSON.stringify(params)]);\n return useQuery({\n queryKey: ['vfs', getScope() ?? '__unscoped__', 'resolve', JSON.stringify(stableParams ?? {})],\n queryFn: async () => {\n const response = await gatewayCall('resolve', stableParams as unknown as Record<string, unknown>);\n return response as unknown as ResolveResponse;\n },\n enabled: !!stableParams?.query && stableParams.query.length > 0,\n });\n}\n\n/** Fetch items with structured filters: one type, or OR-groups across types. */\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: isListableItemsFilter(stableFilter),\n select: (result) => result.items,\n });\n}\n\nexport interface InfiniteItemsOptions {\n /** Keep this cached listing fresh through the SDK's existing realtime transport. No polling. Defaults to false. */\n realtime?: boolean;\n}\n\n/**\n * Infinite-scroll item fetching with kernel-side filtering before pagination.\n * The filter names one `type`, or `any_of` groups spanning types. Pages are\n * loaded by offset; a page shorter than the page size ends the listing.\n */\nexport function useInfiniteItems(filter: ItemsFilter | null | undefined, options: InfiniteItemsOptions = {}) {\n const scopeKey = useScopeKey();\n const { realtime = false } = options;\n const PAGE_SIZE = filter?.limit ?? 20;\n const stableFilter = useMemo(() => filter, [JSON.stringify(filter)]);\n const stableKey = useMemo(() => ['vfs', getScope() ?? '__unscoped__', 'infinite-items', stableFilter?.type ?? '', JSON.stringify(stableFilter ?? {})], [scopeKey, stableFilter]);\n\n const query = useInfiniteQuery({\n queryKey: stableKey,\n queryFn: async ({ pageParam = 0 }) => {\n return fetchItems({\n ...stableFilter!,\n limit: PAGE_SIZE,\n offset: pageParam as number,\n }, { throwOnError: true });\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: isListableItemsFilter(stableFilter),\n // Realtime marks the cache stale only on relevant changes or reconnect.\n // Expanding a channel or handing it to another observer reuses its pages.\n staleTime: realtime ? Infinity : undefined,\n meta: realtime && stableFilter ? { infiniteItemsRealtime: { filter: stableFilter } } : {},\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 refetch: query.refetch,\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 const stableWidth = options?.width;\n return useQuery({\n queryKey: [...vfsKeys.openEnvelope(path!, stableStrategy), stableWidth],\n queryFn: async () => {\n const envelope = await fetchOpenEnvelope(path!, {\n mode: stableMode,\n strategy: stableStrategy,\n arguments: stableArgs,\n });\n // Post-process: append &w= to render.props.url for thumbnail/preview\n if (stableWidth && envelope.render?.props?.url) {\n const url = envelope.render.props.url as string;\n const separator = url.includes('?') ? '&' : '?';\n envelope.render.props.url = `${url}${separator}w=${stableWidth}`;\n }\n return envelope;\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 Versions Hook ────────────────────────────────────────────────────\n\n/** Fetch the persisted version history of a VFS item. */\nexport function useItemVersions(\n itemId: string | undefined | null,\n options: ItemVersionsOptions = {},\n) {\n const { limit = 50, offset = 0, include_snapshots = false } = options;\n return useQuery({\n queryKey: vfsKeys.itemVersions(itemId!, String(limit), String(offset), String(include_snapshots)),\n queryFn: () => fetchItemVersions(itemId!, { limit, offset, include_snapshots }),\n enabled: !!itemId,\n });\n}\n\n/**\n * @deprecated Use `useItemVersions` instead.\n */\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 type { AccountInfo } from './memberships';\ninterface AccountsState {\n /** Election candidates — accounts the user can log into (top-level forest first). */\n accounts: AccountInfo[];\n /** Full membership list (accounts + spaces). Raw material for MountRefs. */\n allMemberships: AccountInfo[];\n /** The account ref of the current ANCHOR (was: billing-responsible account). */\n currentAccount: AccountInfo | null;\n /** @deprecated read useMounts() — kept until compass migrates this sprint. */\n mountedScope: string | null;\n /** Elect the HOME anchor (login) or move the anchor (in-session step-into). */\n switchAccount: (accountPath: string) => Promise<void>;\n /** Mount a membership into the working set (persists the declaration). */\n mountScope: (scopePath: string) => Promise<void>;\n loading: boolean;\n error: Error | null;\n}\n\n/** Returns the user's memberships and drives the anchor/mount session. */\nexport function useAccounts(): AccountsState {\n const { user } = useAuth();\n const autoSelectedRef = useRef<string | null>(null);\n const [mountError, setMountError] = useState<Error | null>(null);\n\n const query = useQuery({\n queryKey: vfsKeys.memberships(user?.id ?? 'anonymous'),\n queryFn: fetchMemberships,\n enabled: !!user?.id,\n staleTime: 1000 * 60 * 2,\n });\n\n const allMemberships = query.data ?? EMPTY_ACCOUNTS;\n\n // Election candidates: every ACCOUNT membership. Top-level forest roots\n // (an account whose parent-account isn't also mine) sort first — they are\n // the default login cards; the rest are the \"enter a specific account\"\n // tier. Top-levels are defaults, not walls (anchor_mount_spec.md).\n const accountMemberships = useMemo(\n () => allMemberships.filter((a) => a.isAccount !== false && !a.isSpace),\n [allMemberships],\n );\n\n const electionCandidates = useMemo(() => {\n const myAccountIds = new Set(accountMemberships.map((a) => a.accountId));\n const isTopLevel = (a: AccountInfo) =>\n !a.subordinateTo || !myAccountIds.has(a.subordinateTo);\n return [...accountMemberships].sort((a, b) =>\n Number(isTopLevel(b)) - Number(isTopLevel(a)));\n }, [accountMemberships]);\n\n // Track the anchor reactively so currentAccount re-renders on setAnchor.\n const anchorVersion = useSyncExternalStore(subscribeScope, getScopeVersion, getScopeVersion);\n const currentAccount = useMemo(() => {\n const ref = getAnchorRef();\n if (!ref) return null;\n return allMemberships.find((a) => a.accountId === ref.id) ?? null;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [anchorVersion, allMemberships]);\n\n // Single-account users: auto-elect the home anchor (no login friction).\n useEffect(() => {\n if (!user?.id) { autoSelectedRef.current = null; return; }\n if (autoSelectedRef.current === user.id) return;\n setMountError(null);\n if (electionCandidates.length === 1) {\n const only = electionCandidates[0];\n if (!getHomeAnchor()) electHomeAnchor(membershipToMountRef(only));\n initVfsRealtimeWs(only.accountId);\n if (only.personalSpacePath) {\n loadMounts(only.personalSpacePath, (id: string) => {\n const m = allMemberships.find((x) => x.accountId === id);\n return m ? membershipToMountRef(m) : null;\n }).catch(setMountError);\n }\n autoSelectedRef.current = user.id;\n } else if (electionCandidates.length > 1) {\n // Multiple candidates — login election screen decides; do not auto-elect.\n autoSelectedRef.current = user.id;\n }\n }, [user?.id, electionCandidates, allMemberships]);\n\n const switchAccount = useCallback(async (accountPath: string) => {\n const m = allMemberships.find((a) => a.path === accountPath);\n if (!m) throw new Error('Account membership is unavailable');\n const ref = membershipToMountRef(m);\n if (!getHomeAnchor()) {\n // First election of the session = the HOME anchor.\n electHomeAnchor(ref);\n }\n const home = allMemberships.find(a => a.accountId === getHomeAnchor()?.id);\n if (!home?.personalSpacePath) throw new Error('The home membership has no mount declaration location');\n // Cached after success; an explicit selection also retries a failed initial\n // declaration read, without reloading it on every focus change.\n await loadMounts(home.personalSpacePath, (id: string) => {\n const member = allMemberships.find(a => a.accountId === id);\n return member ? membershipToMountRef(member) : null;\n });\n await selectMount(ref);\n setMountError(null);\n initVfsRealtimeWs(m.accountId);\n }, [allMemberships]);\n\n const mountScope = useCallback(async (scopePath: string) => {\n const m = allMemberships.find((a) => a.path === scopePath);\n if (!m) throw new Error('Scope membership is unavailable');\n await persistMount(membershipToMountRef(m));\n }, [allMemberships]);\n\n return {\n accounts: electionCandidates,\n allMemberships,\n currentAccount,\n mountedScope: null,\n switchAccount,\n mountScope,\n loading: query.isLoading,\n error: (query.error as Error | null) ?? mountError,\n };\n}\n\n/** The working set (mounts) as reactive state, plus mount/unmount verbs. */\nexport function useMounts() {\n useScopeKey();\n const version = useSyncExternalStore(subscribeMounts, getMountVersion, getMountVersion);\n const mounts = useMemo(() => getMounts(), [version]);\n return {\n mounts,\n homeAnchor: getHomeAnchor(),\n anchor: getAnchorRef(),\n setAnchor: selectMount,\n replaceMounts,\n mount: persistMount,\n unmount: persistUnmount,\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 getQueryClient().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 /** Canonical display name from os_principals.display_name (NOT the VFS item name). */\n display_name?: string;\n /** os_principals.created_at — for \"member since\". */\n created_at?: string;\n /** The principal's top-level VFS folder (/root/principals/<slug>) — owned by\n * the principal; the natural parent for principal-scoped files (avatar). */\n vfs_path?: string;\n role: string;\n authenticated: boolean;\n /** Sourced from os_principals.metadata (avatar_file_id, language, timezone, …). */\n metadata?: Record<string, any>;\n}\n\n/**\n * Params for the `update-principal` kernel syscall. All fields optional; only\n * keys present in the call are written. The target principal is resolved from\n * the JWT server-side — there is intentionally no principal_id field.\n */\nexport interface UpdatePrincipalParams {\n /** New display name written to os_principals.display_name (+ mirrored VFS item). */\n display_name?: string;\n /** Avatar pointer written into os_principals.metadata; null clears it. */\n avatar_file_id?: string | null;\n language?: string;\n timezone?: string;\n [key: string]: unknown;\n}\n\n/** The current principal's identity fields, resolved from os_principals. */\ninterface PrincipalRecord {\n principalId: string | null;\n displayName: string | null;\n createdAt: string | null;\n metadata: Record<string, any> | null;\n /** The principal's top-level VFS folder path (/root/principals/<slug>). */\n vfsPath: string | null;\n}\n\nlet _principalIdCache: ({ authUserId: string } & PrincipalRecord) | null = null;\nlet _principalIdPromise: Promise<PrincipalRecord> | null = null;\n\n// usePrincipal derives its value from useAuth().user (which never changes on a\n// name edit) + this module cache. After useUpdatePrincipal patches the cache we\n// must nudge mounted usePrincipal() instances to re-read it — these listeners\n// are that nudge (a plain cache write alone would not re-render).\nconst _principalListeners = new Set<() => void>();\nfunction _notifyPrincipalChange(): void {\n _principalListeners.forEach((fn) => fn());\n}\n\nregisterCleanup(() => {\n _principalIdCache = null;\n _principalIdPromise = null;\n});\n\n/**\n * Resolve the current user's full principal record (id + display_name +\n * created_at + metadata) from os_principals, memoized per auth user.\n */\nasync function resolvePrincipalRecord(authUserId?: string): Promise<PrincipalRecord> {\n const empty: PrincipalRecord = {\n principalId: null,\n displayName: null,\n createdAt: null,\n metadata: null,\n vfsPath: null,\n };\n\n // [2026-09-15] SEATED IDENTITY FIRST. The seated init response carries the\n // principal the kernel already derived to seat this session. Prefer it: the\n // fallback below reads os_principals through this module's own supabase\n // client, and hosts that authenticate by setCachedToken() never sign that\n // client in -- so getSession() returns nothing AND anon holds no SELECT on\n // os_principals. Both failures are silent (principalId: null), which left\n // resolvePrincipalId() and usePrincipal() permanently dead in those hosts.\n const seatedPrincipalId = getSessionEntry()?.principal_id ?? null;\n if (seatedPrincipalId) {\n if (_principalIdCache && _principalIdCache.principalId === seatedPrincipalId) {\n const { principalId, displayName, createdAt, metadata, vfsPath } = _principalIdCache;\n return { principalId, displayName, createdAt, metadata, vfsPath };\n }\n return { ...empty, principalId: seatedPrincipalId };\n }\n\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 empty;\n\n if (_principalIdCache && _principalIdCache.authUserId === uid) {\n const { principalId, displayName, createdAt, metadata, vfsPath } = _principalIdCache;\n return { principalId, displayName, createdAt, metadata, vfsPath };\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, display_name, created_at, metadata')\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:', error.message);\n return empty;\n }\n\n const principalId = data?.id ?? null;\n\n // Resolve the principal's top-level VFS folder (/root/principals/<slug>).\n // The principal owns it; it is the natural parent for principal-scoped\n // files like the avatar. The AI shadow principal is a nested child, so we\n // keep only the path that sits directly under /root/principals.\n let vfsPath: string | null = null;\n if (principalId) {\n const { data: items } = await supabase\n .from('os_items')\n .select('path')\n .eq('owner_principal_id', principalId)\n .eq('item_type', 'principal')\n .eq('is_active', true)\n .like('path', '/root/principals/%');\n const paths = (items ?? []).map((i: any) => i.path as string);\n vfsPath = paths.find((p) => p.split('/').length === 4) ?? paths[0] ?? null;\n }\n\n const rec: PrincipalRecord = {\n principalId,\n displayName: (data as any)?.display_name ?? null,\n createdAt: (data as any)?.created_at ?? null,\n metadata: (data as any)?.metadata ?? null,\n vfsPath,\n };\n _principalIdCache = { authUserId: uid!, ...rec };\n return rec;\n } finally {\n _principalIdPromise = null;\n }\n })();\n\n return _principalIdPromise;\n}\n\n/** Resolve current user's FSAOS os_principals.id from auth ID. (back-compat shim) */\nexport async function resolvePrincipalId(authUserId?: string): Promise<string | null> {\n return (await resolvePrincipalRecord(authUserId)).principalId;\n}\n\n/** Returns the current principal (user identity). */\nexport function usePrincipal() {\n const authResult = useAuth();\n const user = authResult.user;\n const seed = _principalIdCache?.authUserId === user?.id ? _principalIdCache : null;\n const [record, setRecord] = useState<PrincipalRecord | null>(seed);\n const prevUserIdRef = useRef<string | null>(null);\n\n // Re-read the module cache whenever useUpdatePrincipal patches it (the auth\n // user object never changes on a name edit, so this is the only re-render path).\n useEffect(() => {\n const sub = () => {\n const c = _principalIdCache;\n if (c && c.authUserId === user?.id) {\n setRecord({\n principalId: c.principalId,\n displayName: c.displayName,\n createdAt: c.createdAt,\n metadata: c.metadata,\n vfsPath: c.vfsPath,\n });\n }\n };\n _principalListeners.add(sub);\n return () => {\n _principalListeners.delete(sub);\n };\n }, [user?.id]);\n\n useEffect(() => {\n if (!user?.id) {\n setRecord(null);\n prevUserIdRef.current = null;\n return;\n }\n if (prevUserIdRef.current === user.id && record?.principalId != null) return;\n prevUserIdRef.current = user.id;\n\n resolvePrincipalRecord(user.id).then((rec) => {\n setRecord(rec);\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: record?.principalId ?? null,\n email: user.email,\n // Canonical identity comes from os_principals, not the auth user blob.\n display_name: record?.displayName ?? undefined,\n created_at: record?.createdAt ?? undefined,\n vfs_path: record?.vfsPath ?? undefined,\n role: user.role || user.app_metadata?.role || 'user',\n authenticated: true,\n metadata: record?.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/**\n * Fetch channel messages via the kernel's `get-channel-messages` method.\n *\n * Now uses `fetchChannelMessagesWithCards` to get bundled cards in a single\n * request, eliminating the N+1 query problem. Cards are returned alongside\n * messages, grouped by parent message path.\n */\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: () => fetchChannelMessagesWithCards(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 // Join a load that is already running rather than restart it.\n void refreshQuery(qc, stableKey, { exact: true });\n }, 500);\n },\n (data: any) => {\n return (\n (data.item_type === 'message' || data.item_type === 'card') &&\n isChannelPath(data.path, 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 response: ChannelMessagesResponse | undefined = query.data;\n const messages: ChannelMessage[] = response?.messages ?? [];\n const messageCards: Map<string, ChannelCard[]> = response?.messageCards ?? new Map();\n const siblingCards: ChannelCard[] = response?.siblingCards ?? [];\n\n return {\n messages,\n /** Cards grouped by parent message path (child cards of messages). */\n messageCards,\n /** Cards that are direct siblings of the channel (not nested under a message). */\n siblingCards,\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 // Aggregate cards across all pages\n const { messageCards, siblingCards } = useMemo(() => {\n const mc = new Map<string, ChannelCard[]>();\n const sc: ChannelCard[] = [];\n if (!query.data?.pages) return { messageCards: mc, siblingCards: sc };\n const seenCards = new Set<string>();\n for (const page of query.data.pages) {\n // Merge messageCards from each page\n for (const [path, cards] of page.messageCards) {\n for (const card of cards) {\n if (seenCards.has(card.id)) continue;\n seenCards.add(card.id);\n const existing = mc.get(path) || [];\n existing.push(card);\n mc.set(path, existing);\n }\n }\n // Merge siblingCards from each page\n for (const card of page.siblingCards) {\n if (seenCards.has(card.id)) continue;\n seenCards.add(card.id);\n sc.push(card);\n }\n }\n return { messageCards: mc, siblingCards: sc };\n }, [query.data?.pages]);\n\n // SSE-driven live tail: on new messages/cards, fetch only what's new\n // (after_seq = max seq in current data) and append to the last page.\n // This prevents gaps that occur when invalidating all pages causes the\n // \"latest 50\" window to shift forward while older pages retain stale cursors.\n const qc = useQueryClient();\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const stableKey = useMemo(\n () => [...vfsKeys.channelMessages(channelPath || '', parentMessageId), 'infinite', limit],\n [channelPath, parentMessageId, limit],\n );\n\n useEffect(() => {\n if (!realtime || !channelPath || !queryEnabled) return;\n\n // A full reload joins one that is already running instead of restarting\n // it, and only one tail fetch runs at a time: a change that lands while\n // one is running queues exactly one more for when it finishes.\n const reload = () => void refreshQuery(qc, stableKey, { exact: true });\n let tailRunning = false;\n let tailAgain = false;\n let disposed = false;\n\n const tailOnce = async () => {\n // Find the max seq across all loaded pages\n const currentData = qc.getQueryData<{ pages: ChannelMessagesPage[]; pageParams: unknown[] }>(stableKey);\n if (!currentData?.pages?.length) {\n // No data yet — refresh, joining the initial load if it is running.\n reload();\n return;\n }\n\n let maxSeq = 0;\n for (const page of currentData.pages) {\n for (const msg of page.messages) {\n if (msg.seq > maxSeq) maxSeq = msg.seq;\n }\n }\n\n if (maxSeq === 0) {\n reload();\n return;\n }\n\n // Fetch only messages newer than what we have\n try {\n const newPage = await fetchChannelMessagesPage(channelPath!, {\n parentMessageId,\n limit,\n after_seq: maxSeq,\n });\n\n if (newPage.messages.length === 0 && newPage.siblingCards.length === 0) {\n // No new messages — might be a card update on existing message.\n // Refetch all pages to pick up card changes (cards are lightweight).\n reload();\n return;\n }\n\n // Sequence gap detection: if the lowest seq in the new batch is\n // more than 1 above our maxSeq, we missed messages (burst > limit).\n // Fall back to full invalidation to reload cleanly.\n if (newPage.messages.length > 0) {\n const minNewSeq = Math.min(...newPage.messages.map(m => m.seq));\n if (minNewSeq > maxSeq + 1) {\n console.warn(\n `[useInfiniteChannelMessages] sequence gap detected: maxSeq=${maxSeq}, minNewSeq=${minNewSeq}. Triggering full refetch.`,\n );\n reload();\n return;\n }\n }\n\n // Append new messages to the last page in the cache\n qc.setQueryData<{ pages: ChannelMessagesPage[]; pageParams: unknown[] }>(stableKey, (old) => {\n if (!old) return old;\n const pages = [...old.pages];\n const lastIdx = pages.length - 1;\n const lastPage = pages[lastIdx];\n\n // Merge new messages into the last page (dedup by id)\n const existingIds = new Set(lastPage.messages.map(m => m.id));\n const uniqueNew = newPage.messages.filter(m => !existingIds.has(m.id));\n const mergedMessages = [...lastPage.messages, ...uniqueNew].sort((a, b) => a.seq - b.seq);\n\n // Merge cards\n const mergedMsgCards = new Map(lastPage.messageCards);\n for (const [path, cards] of newPage.messageCards) {\n const existing = mergedMsgCards.get(path) || [];\n const existingCardIds = new Set(existing.map(c => c.id));\n const newCards = cards.filter(c => !existingCardIds.has(c.id));\n mergedMsgCards.set(path, [...existing, ...newCards]);\n }\n\n const existingSibIds = new Set(lastPage.siblingCards.map(c => c.id));\n const newSiblings = newPage.siblingCards.filter(c => !existingSibIds.has(c.id));\n const mergedSiblings = [...lastPage.siblingCards, ...newSiblings];\n\n pages[lastIdx] = {\n ...lastPage,\n messages: mergedMessages,\n messageCards: mergedMsgCards,\n siblingCards: mergedSiblings,\n };\n\n return { ...old, pages };\n });\n } catch (err) {\n // Fallback: invalidate all on error\n console.warn('[useInfiniteChannelMessages] live tail fetch failed, falling back to full invalidation:', err);\n reload();\n }\n };\n\n const tail = async () => {\n if (tailRunning) {\n tailAgain = true;\n return;\n }\n tailRunning = true;\n try {\n do {\n tailAgain = false;\n await tailOnce();\n } while (tailAgain && !disposed);\n } finally {\n tailRunning = false;\n }\n };\n\n const unsub = subscribeToEvents(\n 'vfs_change',\n () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n void tail();\n }, 500);\n },\n (data: any) => {\n return (\n (data.item_type === 'message' || data.item_type === 'card') &&\n isChannelPath(data.path, channelPath!)\n );\n },\n );\n\n return () => {\n disposed = true;\n unsub();\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [realtime, channelPath, queryEnabled, stableKey, qc, parentMessageId, limit]);\n\n return {\n messages,\n /** Cards grouped by parent message path (child cards of messages). */\n messageCards,\n /** Cards that are direct siblings of the channel (not nested under a message). */\n siblingCards,\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 /** Canonical creation time, used for channels without a saved manual position. */\n createdAt?: string;\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\n/**\n * Normalize a GENERIC kernel_query channel row (raw columns + type_data +\n * _reader enrichment) into the Channel shape. Replaces the bespoke\n * kernel_list_channels flattening — that fn is deprecated (anchor_mount_spec).\n * Account display names resolve client-side from useAccounts/allMemberships\n * (group by accountId).\n */\nfunction normalizeChannel(raw: Record<string, unknown>): Channel {\n const td = (raw.type_data as Record<string, unknown>) || {};\n const reader = (raw._reader as Record<string, unknown>) || {};\n const lineage = (reader.context_lineage as Record<string, unknown>) || {};\n return {\n id: (raw.id as string) || '',\n path: (raw.path as string) || '',\n name: (raw.name as string) || '',\n displayName: (td.display_name as string) || (raw.name as string) || '',\n aiMode: normalizeAiMode(td.ai_mode),\n isPrivate: (td.is_private as boolean) || false,\n isDm: (td.is_dm as boolean) || false,\n messageCount: (td.message_count as number) || 0,\n createdAt: (raw.created_at as string) || '',\n updatedAt: (raw.updated_at as string) || '',\n chatScopePath: (lineage.context_path as string) || '',\n contextId: (raw.scope_item_id as string) || '',\n contextPath: (lineage.context_path as string) || '',\n contextType: (lineage.context_type as string) || '',\n contextName: (lineage.context_name as string) || '',\n contextDisplayName: (lineage.context_name as string) || '',\n contextPrincipalId: undefined,\n accountId: (raw.account_item_id as string) || '',\n accountPath: '',\n accountDisplayName: '',\n memberRole: (reader.member_role as string) || 'member',\n memberPath: '',\n modePath: '',\n autoPilot: (td.auto_pilot as boolean) || false,\n };\n}\n\nexport interface ChannelsOptions {\n realtime?: boolean;\n enabled?: boolean;\n}\n\n/**\n * Fetch all channels (DMs + public) via the GENERIC kernel query\n * (item_type=channel + include_reader enrichment). MOUNT-AWARE: with a\n * mounts declaration, channels from every mounted account/space return in\n * one call — group client-side by `accountId`. Replaces `list-channels`\n * (kernel_list_channels is deprecated per anchor_mount_spec.md).\n */\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('query', {\n item_type: 'channel',\n include_reader: true,\n limit: 500,\n }) as Record<string, unknown>;\n const raw = (result.items 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/**\n * Write the authenticated principal's display name / metadata via the\n * `update-principal` kernel syscall.\n *\n * The kernel writes os_principals.display_name (+ avatar/language/timezone in\n * metadata), mirrors display_name onto the paired /root/principals/<slug> VFS\n * item, and emits an identity-changed event. The target principal is resolved\n * from the JWT server-side — callers never pass a principal_id.\n *\n * On success we patch the module-scoped principal cache and notify usePrincipal\n * subscribers so the new name renders immediately. usePrincipal reads identity\n * from os_principals (via that cache), not a TanStack query, so this patch — not\n * query invalidation — is the load-bearing coherence step. Without it the read\n * stays stale and a consumer's \"unsaved changes\" state never clears.\n */\nexport function useUpdatePrincipal() {\n return useTanstackMutation({\n mutationFn: (params: UpdatePrincipalParams) => gatewayCall('update-principal', params),\n onSuccess: (data: any, variables: UpdatePrincipalParams) => {\n if (!_principalIdCache) return;\n // Prefer the server's authoritative metadata; fall back to a local merge.\n const nextMeta =\n data && typeof data === 'object' && data.metadata\n ? (data.metadata as Record<string, any>)\n : {\n ...(_principalIdCache.metadata ?? {}),\n ...(typeof variables.language === 'string' ? { language: variables.language } : {}),\n ...(typeof variables.timezone === 'string' ? { timezone: variables.timezone } : {}),\n ...('avatar_file_id' in variables\n ? { avatar_file_id: variables.avatar_file_id }\n : {}),\n };\n _principalIdCache = {\n ..._principalIdCache,\n displayName:\n typeof variables.display_name === 'string'\n ? variables.display_name\n : _principalIdCache.displayName,\n metadata: nextMeta,\n };\n _notifyPrincipalChange();\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// ── Arrangement Hook ────────────────────────────────────────────────────────\n\n/**\n * Resolve an arrangement by semantic key with scope cascade.\n *\n * Calls `resolve-arrangement` with `{ key }` — the kernel cascades:\n * member scope → fractal scope → system scope → empty.\n *\n * Returns the fully resolved children (symlinks dereferenced, order/hidden\n * applied, can_do gated). The FE renders directly from `resolvedChildren`.\n *\n * For backward compatibility, passing a `parentPath` still works via the\n * legacy `item_id`/`path` resolution mode in the kernel.\n *\n * @example\n * // New key-based usage (recommended):\n * const { resolvedChildren, resolutionLevel } = useArrangement({ key: 'dock' });\n *\n * // Legacy path-based usage (backward compat):\n * const { resolvedChildren } = useArrangement({ path: '/root/system/arrangements/dock' });\n *\n * // Legacy string shorthand (backward compat):\n * const { resolvedChildren } = useArrangement('/root/system/arrangements/dock');\n */\nexport function useArrangement(\n paramsOrPath: string | { key?: string; path?: string; item_id?: string; scope_id?: string } | null | undefined,\n) {\n useScopeKey();\n\n // Normalize input: string → legacy path mode; object → new key mode\n const scopePath = getScope();\n const resolvedParams: { key?: string; path?: string; item_id?: string; scope_id?: string } | null = useMemo(() => {\n if (!paramsOrPath) return null;\n if (typeof paramsOrPath === 'string') return { path: paramsOrPath };\n return paramsOrPath;\n }, [typeof paramsOrPath === 'string' ? paramsOrPath : JSON.stringify(paramsOrPath)]);\n\n const enabled = !!scopePath && !!resolvedParams && !!(resolvedParams.key || resolvedParams.path || resolvedParams.item_id);\n\n const cacheKey = resolvedParams?.key ?? resolvedParams?.path ?? resolvedParams?.item_id ?? '';\n const arrangementQueryKey = ['vfs', scopePath ?? '__unscoped__', 'arrangement', cacheKey, resolvedParams?.scope_id ?? ''] as const;\n\n const query = useQuery({\n queryKey: arrangementQueryKey,\n staleTime: Infinity,\n retry: false,\n meta: { arrangementRealtime: true },\n queryFn: async () => {\n if (!resolvedParams) return null;\n const response: any = await gatewayCall('resolve-arrangement', { ...resolvedParams, _scope_path: scopePath! });\n if (response?.success === false) {\n throw new Error(response?.error || 'Arrangement could not be loaded');\n }\n return response ?? null;\n },\n enabled,\n });\n\n const arrangement = query.data ?? null;\n const resolvedChildren: any[] = useMemo(\n () => arrangement?.resolved_children ?? [],\n [arrangement],\n );\n const resolutionLevel: string | null = arrangement?.resolution_level ?? null;\n\n // Legacy applyTo helper — still useful if the caller has a separate child list\n const order: string[] | null = useMemo(() => {\n // In the new mode, order is already applied server-side.\n // But we expose it for callers that need the raw order array.\n const td = arrangement?.type_data ?? null;\n const o = td?.order;\n return Array.isArray(o) ? (o as string[]) : null;\n }, [arrangement]);\n\n const applyTo = useCallback(\n <T extends { id?: string; name?: string }>(children: T[]): T[] => {\n if (!order || !children?.length) return children ?? [];\n const key = (c: T) => c.id ?? c.name ?? '';\n const rank = new Map(order.map((k, i) => [k, i] as const));\n const listed: T[] = [];\n const rest: T[] = [];\n for (const c of children) {\n (rank.has(key(c)) ? listed : rest).push(c);\n }\n listed.sort((a, b) => (rank.get(key(a))! - rank.get(key(b))!));\n return [...listed, ...rest];\n },\n [order],\n );\n\n return {\n ...query,\n arrangement,\n resolvedChildren,\n resolutionLevel,\n order,\n sourceScopeId: arrangement?.scope_item_id ?? null,\n arrangementQueryKey,\n applyTo,\n };\n}\n\n/* ---------------------------- Minted assets ------------------------------ */\n\n/** The honest life of a tool-produced file, as the system actually reports it. */\nexport type MintedAssetState =\n | 'idle' // nothing to wait for\n | 'pending' // the tool minted a row; materialization has not landed yet\n | 'materializing' // the asset item exists, its bytes are not in storage yet\n | 'ready' // item + bytes both present — safe to render\n | 'failed'; // the producer reported a mint error\n\nexport interface MintedAsset {\n state: MintedAssetState;\n /** Set when `asset.materialized` identifies the durable item. */\n itemId?: string;\n itemPath?: string;\n displayName?: string;\n /** The tool's transient provider URL. Correct immediately; may expire. */\n fallbackUrl?: string;\n error?: string;\n}\n\n/**\n * Follow a tool result's file from \"the tool returned\" to \"safe to render\".\n *\n * WHY THIS EXISTS. A media tool returns a provider URL AND mints a durable FSAOS\n * asset, but the mint completes *after* the reply — deliberately, because waiting\n * in-reply just delays the user's answer. So at card-render time the asset does\n * not exist yet. Cards that looked for it found nothing and showed a bare link;\n * cards that showed the provider URL displayed something that later expires.\n *\n * The producer announces completion instead of the consumer asking: `kernel_signal`\n * emits `asset.materialized` when an item lands, carrying `origin` (the message\n * path that produced it) and `has_bytes`. Byte fetch is a separate async step, so\n * `has_bytes:false` is normal on arrival — `content.written` follows. Those two\n * events are what separate \"saving\" from \"ready\", and why this hook never claims\n * a file is displayable before its bytes exist.\n *\n * Correlation is by ORIGIN (the producing message), not by path or name, so a\n * rename or a move cannot break the link.\n *\n * NOTE ON CONNECTIONS: subscribeToEvents is a local listener — it does not open a\n * socket by itself and silently receives nothing unless a scope/path subscription\n * exists. That failure is invisible (a skeleton that never resolves), so this hook\n * holds its own scope subscription for as long as it is waiting. An indexed,\n * account-scoped asset lookup closes the startup/history gap when the\n * materialization event arrived before this consumer subscribed.\n */\nexport function useMintedAsset(params: {\n /** The message path stamped into the declared provenance field. */\n origin?: string | null;\n /** Tool-declared top-level provenance field used for historical recovery. */\n originField?: string | null;\n /** The tool's own URL, shown while the durable asset is still landing. */\n fallbackUrl?: string | null;\n /** The producer's mint error, if it reported one. */\n mintError?: string | null;\n /** Scope to subscribe under — required for the socket to be open. */\n scopeId?: string | null;\n /** Account scope path for indexed historical recovery. */\n scopePath?: string | null;\n}): MintedAsset {\n const { origin, originField, fallbackUrl, mintError, scopeId, scopePath } = params;\n const sdkGeneration = useScopeKey();\n const session = getSessionEntry();\n const resolvedScopeId = scopeId ?? session?.scope_id ?? null;\n const originAccountScope = useMemo(() => {\n if (!origin) return null;\n const marker = '/accounts/';\n const markerIndex = origin.indexOf(marker);\n if (markerIndex === -1) return null;\n const accountEnd = origin.indexOf('/', markerIndex + marker.length);\n return accountEnd === -1 ? origin : origin.slice(0, accountEnd);\n }, [origin]);\n const resolvedScopePath = scopePath ?? originAccountScope ?? session?.scope_path ?? null;\n const resolvedOriginField = originField?.trim() || null;\n const correlationKey = `${sdkGeneration}\\n${resolvedScopeId ?? ''}\\n${resolvedScopePath ?? ''}\\n${resolvedOriginField ?? ''}\\n${origin ?? ''}`;\n type FoundAsset = {\n key: string;\n itemId: string;\n itemPath?: string;\n displayName?: string;\n hasBytes: boolean;\n };\n const [found, setFound] = useState<FoundAsset | null>(null);\n const activeRef = useRef<{\n key: string;\n found: FoundAsset | null;\n earlyContentPaths: Set<string>;\n }>({\n key: correlationKey,\n found: null,\n earlyContentPaths: new Set(),\n });\n\n const currentFound = found?.key === correlationKey ? found : null;\n\n // Commit generation changes before passive effect cleanup/registration. This\n // prevents abandoned renders from invalidating the active card while still\n // rejecting callbacks from the previous committed generation.\n useLayoutEffect(() => {\n activeRef.current = {\n key: correlationKey,\n found: currentFound,\n earlyContentPaths: new Set(),\n };\n }, [correlationKey]);\n\n const recovery = useQuery({\n queryKey: [\n 'vfs',\n resolvedScopePath ?? '__unscoped__',\n 'minted-asset',\n resolvedOriginField ?? '',\n origin ?? '',\n ],\n queryFn: async () => {\n const response = await gatewayCall('query', {\n scope_path: resolvedScopePath!,\n filters: { [`field.${resolvedOriginField!}`]: origin! },\n limit: 1,\n });\n const rawItems = response.content?.items ?? response.items ?? [];\n const asset = rawItems[0] ? normalizeItem(rawItems[0]) : null;\n if (!asset) return null;\n const children = await fetchVfsChildren(asset.path);\n const hasBytes = children.some(\n (child) => child.item_type === 'file' && Boolean(child.type_data?.file_ref),\n );\n return { asset, hasBytes };\n },\n enabled: Boolean(origin && resolvedScopePath && resolvedOriginField && !mintError),\n refetchInterval: (query) => {\n if (activeRef.current.key === correlationKey && activeRef.current.found?.hasBytes) {\n return false;\n }\n return query.state.data?.hasBytes ? false : 1500;\n },\n });\n\n useEffect(() => {\n const recovered = recovery.data;\n if (!recovered || activeRef.current.key !== correlationKey) return;\n const previous = activeRef.current.found;\n const next: FoundAsset = {\n key: correlationKey,\n itemId: recovered.asset.id,\n itemPath: recovered.asset.path,\n displayName: typeof recovered.asset.type_data?.display_name === 'string'\n ? recovered.asset.type_data.display_name\n : recovered.asset.name,\n hasBytes: recovered.hasBytes\n || Boolean(previous?.itemId === recovered.asset.id && previous.hasBytes),\n };\n activeRef.current.found = next;\n setFound(next);\n }, [recovery.data, correlationKey]);\n\n const waiting = Boolean(origin && resolvedScopeId) && !mintError && !currentFound?.hasBytes;\n\n // Keep the socket open while waiting — see NOTE ON CONNECTIONS above.\n useEffect(() => {\n if (!waiting || !resolvedScopeId) return;\n return subscribeToScope(\n resolvedScopeId,\n ['asset.materialized', 'content.written'],\n );\n }, [waiting, resolvedScopeId]);\n\n useEffect(() => {\n if (!waiting || !origin || !resolvedScopeId) return;\n const generationKey = correlationKey;\n const payload = (data: any) => data?.payload ?? data;\n const eventScope = (data: any): string | undefined => {\n const p = payload(data);\n const value = p?.scope_id ?? data?.scope_id;\n return typeof value === 'string' ? value : undefined;\n };\n const contentPath = (data: any): string | undefined => {\n const p = payload(data);\n const value = p?.item_path ?? data?.item_path;\n return typeof value === 'string' && value ? value : undefined;\n };\n const belongsToAsset = (itemPath: string, assetPath: string): boolean => {\n const normalizedAssetPath = assetPath.replace(/\\/+$/, '');\n return itemPath === normalizedAssetPath\n || itemPath.startsWith(`${normalizedAssetPath}/`);\n };\n\n const unsubscribes = [\n subscribeToEvents('asset.materialized', (data: any) => {\n if (activeRef.current.key !== generationKey) return;\n const p = payload(data);\n if (typeof p?.item_id !== 'string' || !p.item_id) return;\n const previous = activeRef.current.found;\n const itemPath = typeof p.item_path === 'string' ? p.item_path : undefined;\n const hasBytes = Boolean(p.has_bytes)\n || Boolean(\n itemPath\n && Array.from(activeRef.current.earlyContentPaths)\n .some((path) => belongsToAsset(path, itemPath)),\n )\n || Boolean(previous && previous.itemId === p.item_id && previous.hasBytes);\n const next: FoundAsset = {\n key: generationKey,\n itemId: p.item_id,\n itemPath,\n displayName: typeof p.display_name === 'string' ? p.display_name : undefined,\n hasBytes,\n };\n activeRef.current.found = next;\n setFound(next);\n }, (data: any) => {\n const scope = eventScope(data);\n return (!scope || scope === resolvedScopeId) && payload(data)?.origin === origin;\n }),\n\n subscribeToEvents('content.written', (data: any) => {\n if (activeRef.current.key !== generationKey) return;\n const itemPath = contentPath(data);\n if (!itemPath) return;\n const previous = activeRef.current.found;\n if (!previous?.itemPath || !belongsToAsset(itemPath, previous.itemPath)) {\n // content.written can race ahead of asset.materialized. Buffer a\n // bounded set of paths until materialization identifies the parent.\n activeRef.current.earlyContentPaths.add(itemPath);\n if (activeRef.current.earlyContentPaths.size > 128) {\n const oldest = activeRef.current.earlyContentPaths.values().next().value;\n if (oldest) activeRef.current.earlyContentPaths.delete(oldest);\n }\n return;\n }\n if (previous.hasBytes) return;\n const next = { ...previous, hasBytes: true };\n activeRef.current.found = next;\n setFound(next);\n }, (data: any) => {\n const scope = eventScope(data);\n return (!scope || scope === resolvedScopeId) && Boolean(contentPath(data));\n }),\n ];\n return () => unsubscribes.forEach(fn => fn());\n }, [waiting, origin, resolvedScopeId, correlationKey]);\n\n const state: MintedAssetState =\n mintError ? 'failed'\n : !origin ? 'idle'\n : currentFound ? (currentFound.hasBytes ? 'ready' : 'materializing')\n : 'pending';\n\n return {\n state,\n itemId: currentFound?.itemId,\n itemPath: currentFound?.itemPath,\n displayName: currentFound?.displayName,\n fallbackUrl: fallbackUrl ?? undefined,\n error: mintError ?? undefined,\n };\n}\n","import { useMemo, useRef, useSyncExternalStore } from 'react';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { gatewayCall } from './client';\nimport { useArrangement } from './hooks';\nimport { getAnchorRef, getScope, getScopeVersion, subscribeScope } from './session';\nimport { refreshArrangement } from './arrangement-realtime';\n\nexport type PersonalItemOrderKey = 'channel-order' | 'project-order';\n\n/** Order a supplied complete collection using the selected Space member's arrangement.\n * Does not discover items, provision preferences, or change an item's parent.\n * Channels without a saved position appear first, newest creation first.\n * Unknown saved IDs retain their positions when the visible subset is reordered.\n * Paginated collection reads must apply arrangement order on the server before\n * cutting pages; this hook is not a substitute for that read contract.\n */\nexport function usePersonalItemOrder<T extends { id: string; createdAt?: string }>(key: PersonalItemOrderKey, items: readonly T[]) {\n const generation = useSyncExternalStore(subscribeScope, getScopeVersion, getScopeVersion);\n const anchor = getAnchorRef();\n const scopePath = getScope();\n const supported = anchor?.kind === 'space';\n const query = useArrangement(supported && scopePath ? { key, scope_id: anchor.id } : null);\n const orderedItems = useMemo(() => {\n const arranged = query.applyTo([...items]);\n if (key !== 'channel-order') return arranged;\n const savedIds = new Set(query.order ?? []);\n const unplaced = arranged.filter(item => !savedIds.has(item.id));\n // Use the existing channel payload, never activity timestamps or extra reads.\n // Equal/missing creation dates retain the supplied collection's stable order.\n const created = (item: T) => Date.parse(item.createdAt ?? '') || 0;\n unplaced.sort((a, b) => created(b) - created(a));\n return [...unplaced, ...arranged.filter(item => savedIds.has(item.id))];\n }, [key, items, query.applyTo, query.order]);\n const client = useQueryClient();\n const pending = useRef(false);\n const ready = Boolean(supported && !query.error && query.arrangement?.item_id\n && query.resolutionLevel === 'member' && query.arrangement.write_target_id === query.arrangement.item_id);\n const mutation = useMutation({\n mutationFn: async (change: { ids: string[]; scopePath: string; arrangementId: string; queryKey: typeof query.arrangementQueryKey }) => {\n const response = await gatewayCall('update', {\n _scope_path: change.scopePath, id: change.arrangementId, type_data: { order: change.ids },\n });\n if (response?.success === false) throw new Error(response.error || 'Order could not be saved');\n return response;\n },\n onSettled: (_data, _error, change) => refreshArrangement(client, change.queryKey),\n });\n async function reorder(ids: string[]) {\n if (!ready || !scopePath || generation !== getScopeVersion() || getScope() !== scopePath) {\n throw new Error('Personal order is not available in this Space');\n }\n if (pending.current) throw new Error('An order change is already being saved');\n const visibleIds = items.map(item => item.id);\n if (ids.length !== visibleIds.length || new Set(ids).size !== visibleIds.length\n || visibleIds.some(id => !ids.includes(id))) throw new Error('Order must include each displayed item exactly once');\n const cached = client.getQueryData(query.arrangementQueryKey) as typeof query.arrangement;\n if (cached?.item_id !== query.arrangement.item_id\n || JSON.stringify(cached?.type_data?.order ?? []) !== JSON.stringify(query.order ?? [])) {\n throw new Error('The saved order changed. Try dragging again');\n }\n const current = orderedItems.map(item => item.id);\n if (ids.every((id, index) => current[index] === id)) return;\n // Replace just the displayed slots, then append newly discovered items.\n // A temporarily inaccessible/off-page item must not lose its saved place.\n const visible = new Set(visibleIds);\n let index = 0;\n const saved = (query.order ?? []).map(id => visible.has(id) ? ids[index++] : id);\n const order = [...saved, ...ids.slice(index)];\n pending.current = true;\n try {\n return await mutation.mutateAsync({ ids: order, scopePath, arrangementId: query.arrangement.item_id,\n queryKey: query.arrangementQueryKey });\n } finally { pending.current = false; }\n }\n return { items: orderedItems, ready, supported, contextKey: `${generation}:${scopePath}:${key}`,\n isLoading: supported && query.isLoading, error: query.error, refetch: query.refetch,\n isSaving: mutation.isPending, saveError: mutation.error, reorder };\n}\n","import { GATEWAY_URL, PUBLIC_SOURCES } from './config';\nimport type { PublicSourceConfig, SourceCaptureAdapter, SourceIdentityStorage } from './config';\nimport { getHostname } from './session';\n\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst ATTRIBUTE_PATTERN = /^[A-Za-z_:][A-Za-z0-9_:.-]{0,127}$/;\n\nconst memoryVisitors = new Map<string, string>();\nconst memorySessions = new Map<string, { id: string; lastSeenAt: number }>();\n\nexport interface TrackEventOptions {\n /** Release-local source key. Item identity is resolved by trusted infrastructure. */\n source?: string;\n eventId?: string;\n occurredAt?: string;\n pageUrl?: string;\n referrer?: string;\n visitorId?: string;\n sessionId?: string;\n signal?: AbortSignal;\n keepalive?: boolean;\n}\n\nexport interface InteractionReceipt {\n success: true;\n requested: number;\n accepted: number;\n duplicates: number;\n release_id: string;\n}\n\nexport interface StartTrackingOptions {\n source?: string;\n pageViews?: boolean;\n declaredActions?: boolean;\n}\n\ninterface InteractionFailure {\n success?: false;\n error?: string;\n message?: string;\n}\n\nexport class InteractionTrackingError extends Error {\n readonly code: string;\n readonly status: number;\n readonly eventId: string;\n\n constructor(message: string, code: string, status: number, eventId: string) {\n super(message);\n this.name = 'InteractionTrackingError';\n this.code = code;\n this.status = status;\n this.eventId = eventId;\n }\n}\n\nfunction publicSource(id?: string): PublicSourceConfig {\n const source = id\n ? PUBLIC_SOURCES.find((candidate) => candidate.id === id)\n : PUBLIC_SOURCES.find((candidate) => candidate.default === true)\n ?? (PUBLIC_SOURCES.length === 1 ? PUBLIC_SOURCES[0] : undefined);\n if (!source) throw new TypeError('No unambiguous source is declared for this release');\n if (!source.id || !Number.isInteger(source.version) || source.version < 1) {\n throw new TypeError('The release source declaration is invalid');\n }\n return source;\n}\n\nfunction adapterFor(type: SourceCaptureAdapter['type'], source: PublicSourceConfig): SourceCaptureAdapter {\n const adapter = source.adapters?.find((candidate) => candidate.type === type);\n if (!adapter) throw new TypeError(`The source does not declare a ${type} adapter`);\n return adapter;\n}\n\nfunction validObservationName(value: string): boolean {\n return value.length > 0 && value.length <= 128 && !/[\\u0000-\\u001f\\u007f]/.test(value);\n}\n\nfunction assertDeclaredObservation(source: PublicSourceConfig, observation: string): void {\n if (!validObservationName(observation) || !source.observations?.includes(observation)) {\n throw new TypeError('The observation is not declared by this release source');\n }\n}\n\nfunction browserStorage(config: SourceIdentityStorage): Storage | undefined {\n if (typeof window === 'undefined' || config.storage === 'memory') return undefined;\n try {\n return config.storage === 'session' ? window.sessionStorage : window.localStorage;\n } catch {\n return undefined;\n }\n}\n\nfunction readStoredUuid(config: SourceIdentityStorage): string | undefined {\n try {\n const value = browserStorage(config)?.getItem(config.key) ?? undefined;\n return value && UUID_PATTERN.test(value) ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStorage(config: SourceIdentityStorage, value: string): void {\n try {\n browserStorage(config)?.setItem(config.key, value);\n } catch {\n // Privacy modes may disable storage. In-memory identity remains valid for\n // this document and capture never breaks the application.\n }\n}\n\nfunction visitorId(source: PublicSourceConfig): string {\n const config = source.identity?.visitor;\n if (!config?.key) throw new TypeError('The source visitor identity policy is invalid');\n const existing = readStoredUuid(config) ?? memoryVisitors.get(source.id);\n if (existing) return existing;\n const created = crypto.randomUUID();\n memoryVisitors.set(source.id, created);\n writeStorage(config, created);\n return created;\n}\n\nfunction sessionId(source: PublicSourceConfig, now = Date.now()): string {\n const config = source.identity?.session;\n if (!config?.key || !Number.isInteger(config.idle_seconds) || config.idle_seconds < 1) {\n throw new TypeError('The source session identity policy is invalid');\n }\n let stored: { id?: unknown; lastSeenAt?: unknown } | undefined;\n try {\n const raw = browserStorage(config)?.getItem(config.key);\n stored = raw ? JSON.parse(raw) as { id?: unknown; lastSeenAt?: unknown } : undefined;\n } catch {\n stored = undefined;\n }\n const memory = memorySessions.get(source.id);\n const candidate = stored && typeof stored.id === 'string' && UUID_PATTERN.test(stored.id)\n && typeof stored.lastSeenAt === 'number'\n ? { id: stored.id, lastSeenAt: stored.lastSeenAt }\n : memory;\n const idleMs = config.idle_seconds * 1000;\n const active = candidate && now - candidate.lastSeenAt >= 0 && now - candidate.lastSeenAt < idleMs;\n const session = active ? { id: candidate.id, lastSeenAt: now } : {\n id: crypto.randomUUID(),\n lastSeenAt: now,\n };\n memorySessions.set(source.id, session);\n writeStorage(config, JSON.stringify(session));\n return session.id;\n}\n\nfunction sourceKeysFrom(source: PublicSourceConfig, pageUrl: string): Record<string, string> | undefined {\n const keys = source.source_keys?.query;\n if (!Array.isArray(keys) || keys.length === 0) return undefined;\n let url: URL;\n try {\n url = new URL(pageUrl);\n } catch {\n return undefined;\n }\n const configuredMax = source.source_keys?.max_value_length;\n const maxLength = Number.isInteger(configuredMax)\n ? Math.min(Math.max(configuredMax ?? 1, 1), 4096)\n : 512;\n const values = Object.fromEntries(keys.flatMap((key) => {\n if (typeof key !== 'string' || key.length === 0 || key.length > 128) return [];\n const value = url.searchParams.get(key);\n return value ? [[key, value.slice(0, maxLength)]] : [];\n }));\n return Object.keys(values).length > 0 ? values : undefined;\n}\n\n/** Append one observation through a release-bound, declared source. */\nexport async function trackEvent(\n observation: string,\n properties: Record<string, unknown> = {},\n options: TrackEventOptions = {},\n): Promise<InteractionReceipt> {\n const source = publicSource(options.source);\n assertDeclaredObservation(source, observation);\n if (!properties || typeof properties !== 'object' || Array.isArray(properties)) {\n throw new TypeError('properties must be an object');\n }\n const eventId = options.eventId ?? crypto.randomUUID();\n const resolvedVisitorId = options.visitorId ?? visitorId(source);\n const resolvedSessionId = options.sessionId ?? sessionId(source);\n if (![eventId, resolvedVisitorId, resolvedSessionId].every((value) => UUID_PATTERN.test(value))) {\n throw new TypeError('event, visitor, and session IDs must be UUIDs');\n }\n const pageUrl = options.pageUrl ?? (typeof window !== 'undefined' ? window.location.href : undefined);\n if (!pageUrl) throw new TypeError('pageUrl is required outside a browser');\n const occurredAt = options.occurredAt ?? new Date().toISOString();\n if (Number.isNaN(Date.parse(occurredAt))) throw new TypeError('occurredAt is invalid');\n const referrer = options.referrer\n ?? (typeof document !== 'undefined' ? document.referrer || undefined : undefined);\n const sourceKeys = sourceKeysFrom(source, pageUrl);\n const eventProperties = sourceKeys ? { ...properties, source_keys: sourceKeys } : properties;\n const hostname = getHostname();\n const endpoint = `${GATEWAY_URL.replace(/\\/+$/, '')}/d/${encodeURIComponent(hostname)}/interactions`;\n\n let response: Response;\n try {\n response = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n body: JSON.stringify({\n source: source.id,\n page_url: pageUrl,\n visitor_id: resolvedVisitorId,\n session_id: resolvedSessionId,\n referrer,\n events: [{ id: eventId, event_type: observation, occurred_at: occurredAt, properties: eventProperties }],\n }),\n signal: options.signal,\n credentials: 'omit',\n keepalive: options.keepalive ?? false,\n });\n } catch (error) {\n throw new InteractionTrackingError(\n error instanceof Error ? error.message : 'Observation transport network error',\n 'OBSERVATION_NETWORK_ERROR', 0, eventId,\n );\n }\n\n let payload: InteractionReceipt | InteractionFailure | null = null;\n try {\n payload = await response.json() as InteractionReceipt | InteractionFailure;\n } catch {\n // Non-JSON is a transport failure, never a successful receipt.\n }\n if (!response.ok || payload?.success !== true) {\n const failure = payload as InteractionFailure | null;\n throw new InteractionTrackingError(\n failure?.message || failure?.error || `Observation transport failed (${response.status})`,\n failure?.error || 'OBSERVATION_TRANSPORT_FAILED', response.status, eventId,\n );\n }\n return payload;\n}\n\nexport function trackPageView(\n properties: Record<string, unknown> = {},\n options: TrackEventOptions = {},\n): Promise<InteractionReceipt> {\n const source = publicSource(options.source);\n const adapter = adapterFor('page_view', source);\n const defaults = typeof document === 'undefined' || !adapter.title_property\n ? {}\n : { [adapter.title_property]: document.title.slice(0, 512) };\n return trackEvent(adapter.observation, { ...defaults, ...properties }, { ...options, source: source.id });\n}\n\nexport function trackAction(\n actionId: string,\n properties: Record<string, unknown> = {},\n options: TrackEventOptions = {},\n): Promise<InteractionReceipt> {\n if (!actionId || actionId.length > 128) throw new TypeError('actionId is invalid');\n const source = publicSource(options.source);\n const adapter = adapterFor('declared_action', source);\n const adapterProperties = adapter.id_property ? { [adapter.id_property]: actionId } : {};\n return trackEvent(adapter.observation, { ...properties, ...adapterProperties }, { ...options, source: source.id });\n}\n\n/** Snapshot anonymous correlation for the durable form row. Never authenticates a person. */\nexport function formAttribution(): { visitor_id: string; session_id: string; source: string } | undefined {\n try {\n const source = publicSource();\n adapterFor('form_receipt', source);\n return { visitor_id: visitorId(source), session_id: sessionId(source), source: source.id };\n } catch {\n return undefined;\n }\n}\n\n/** Join an authoritative form receipt to the source stream when declared. */\nexport function trackFormReceipt(\n properties: Record<string, unknown>,\n options: TrackEventOptions = {},\n): Promise<InteractionReceipt> {\n const source = publicSource(options.source);\n const adapter = adapterFor('form_receipt', source);\n return trackEvent(adapter.observation, properties, { ...options, source: source.id });\n}\n\nlet trackingCleanup: (() => void) | undefined;\n\n/** Start only the browser adapters declared by the exact published source. */\nexport function startTracking(options: StartTrackingOptions = {}): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {};\n if (trackingCleanup) return trackingCleanup;\n if (window.__FSAOS_CONFIG__?.tracking?.enabled === false) return () => {};\n\n let source: PublicSourceConfig;\n try {\n source = publicSource(options.source);\n } catch {\n return () => {};\n }\n const pageAdapters = options.pageViews === false\n ? []\n : source.adapters.filter((adapter) => adapter.type === 'page_view');\n const actionAdapters = options.declaredActions === false\n ? []\n : source.adapters.filter((adapter) => adapter.type === 'declared_action');\n let lastPageUrl = '';\n const emitPageView = () => {\n if (window.location.href === lastPageUrl) return;\n lastPageUrl = window.location.href;\n for (const adapter of pageAdapters) {\n const properties = adapter.title_property\n ? { [adapter.title_property]: document.title.slice(0, 512) }\n : {};\n void trackEvent(adapter.observation, properties, { source: source.id, keepalive: true }).catch(() => {});\n }\n };\n const onDeclaredAction = (event: MouseEvent) => {\n if (!(event.target instanceof Element)) return;\n for (const adapter of actionAdapters) {\n const attribute = adapter.attribute;\n if (!attribute || !ATTRIBUTE_PATTERN.test(attribute)) continue;\n const target = event.target.closest<HTMLElement>(`[${attribute}]`);\n if (!target) continue;\n const actionId = target.getAttribute(attribute)?.trim();\n if (!actionId || actionId.length > 128) continue;\n const properties: Record<string, unknown> = {};\n if (adapter.id_property) properties[adapter.id_property] = actionId;\n if (adapter.element_property) properties[adapter.element_property] = target.tagName.toLowerCase();\n void trackEvent(adapter.observation, properties, { source: source.id, keepalive: true }).catch(() => {});\n }\n };\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n const afterHistoryChange = () => queueMicrotask(emitPageView);\n const watchesHistory = pageAdapters.some((adapter) => adapter.history === true);\n const watchesPageShow = pageAdapters.some((adapter) => adapter.pageshow === true);\n if (watchesHistory) {\n window.history.pushState = function pushState(...args) {\n originalPushState.apply(this, args);\n afterHistoryChange();\n };\n window.history.replaceState = function replaceState(...args) {\n originalReplaceState.apply(this, args);\n afterHistoryChange();\n };\n window.addEventListener('popstate', emitPageView);\n }\n if (watchesPageShow) window.addEventListener('pageshow', emitPageView);\n if (actionAdapters.length > 0) document.addEventListener('click', onDeclaredAction, { capture: true });\n if (pageAdapters.length > 0) queueMicrotask(emitPageView);\n\n trackingCleanup = () => {\n window.removeEventListener('popstate', emitPageView);\n window.removeEventListener('pageshow', emitPageView);\n document.removeEventListener('click', onDeclaredAction, { capture: true });\n if (watchesHistory) {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n }\n trackingCleanup = undefined;\n };\n return trackingCleanup;\n}\n","import { getQueryClient } from './query-client';\nimport { vfsKeys } from './vfs-keys';\nimport { fetchMemberships, membershipToMountRef, type AccountInfo } from './memberships';\nimport { loadMounts } from './mounts';\nimport { initSession, electHomeAnchor, getHomeAnchor, getSessionGeneration, registerCleanup, type MountRef } from './session';\n\nexport interface WorkspaceOptions {\n /** The authenticated account path returned by the host's token exchange. */\n accountPath: string;\n}\nexport interface WorkspaceSession {\n home: MountRef;\n defaultSpace: MountRef;\n memberships: AccountInfo[];\n}\nlet initialization: { accountPath: string; promise: Promise<WorkspaceSession> } | undefined;\nregisterCleanup(() => { initialization = undefined; });\n\n/** Shared bootstrap for external-token hosts as well as native-auth clients.\n * This performs one membership read and one declaration read. It does not load\n * channels, items, trees, or an aggregate Account view. Use useMounts() afterward.\n * A token refresh must call this with the same account, not reset the session. */\nexport function initializeWorkspace(options: WorkspaceOptions): Promise<WorkspaceSession> {\n if (initialization) {\n if (initialization.accountPath !== options.accountPath) return Promise.reject(new Error('Reset the session before changing accounts'));\n return initialization.promise;\n }\n const generation = getSessionGeneration();\n const check = () => {\n if (generation !== getSessionGeneration()) throw new Error('Workspace session changed');\n };\n const promise = (async () => {\n const entry = await initSession(); check();\n if (!entry.principal_id) throw new Error('Workspace initialization requires an authenticated principal');\n const memberships = await getQueryClient().fetchQuery({\n queryKey: vfsKeys.memberships(entry.principal_id), queryFn: fetchMemberships,\n staleTime: 120_000, retry: false,\n });\n check();\n const account = memberships.find(m => m.path === options.accountPath && m.isAccount && !m.isSpace);\n if (!account) throw new Error('Authenticated account membership is unavailable');\n const personal = memberships.find(m => m.isSpace && m.accountId === account.personalSpaceId && m.path === account.personalSpacePath);\n if (!personal || !account.personalSpacePath) throw new Error('A provisioned default Space membership is required');\n const home = membershipToMountRef(account);\n const defaultSpace = membershipToMountRef(personal);\n const elected = getHomeAnchor();\n if (elected && elected.id !== home.id) throw new Error('Reset the session before changing accounts');\n if (!elected) electHomeAnchor(home, {activate: false});\n await loadMounts(account.personalSpacePath, id => {\n const member = memberships.find(m => m.accountId === id && (m.isAccount || m.isSpace));\n return member ? membershipToMountRef(member) : null;\n }, {initialAnchor: defaultSpace});\n check();\n return { home, defaultSpace, memberships };\n })().catch(error => {\n if (generation === getSessionGeneration()) initialization = undefined;\n throw error;\n });\n initialization = { accountPath: options.accountPath, promise };\n return promise;\n}\n","import { initSession } from './session';\nimport { startTracking } from './interactions';\nimport type { StartTrackingOptions } from './interactions';\nimport type { SessionEntry } from './types';\nimport { initializeWorkspace, type WorkspaceOptions, type WorkspaceSession } from './workspace';\nimport { registerCleanup, getSessionGeneration } from './session';\n\nexport interface InitializeFsaosOptions {\n /** Resolve the registered hostname to its governed FSAOS scope. */\n session?: boolean;\n /** Start first-party page/action tracking, or provide adapter options. */\n tracking?: boolean | StartTrackingOptions;\n /** Opt in to the mounted workspace lifecycle after host authentication. */\n workspace?: WorkspaceOptions;\n}\n\nexport interface FsaosRuntime {\n session: SessionEntry | null;\n workspace?: WorkspaceSession;\n /** Stops the browser tracking adapter started by this runtime. */\n dispose(): void;\n}\n\nlet initialization: Promise<FsaosRuntime> | undefined;\nlet stopActiveTracking: (() => void) | undefined;\nlet workspaceAccount: string | undefined;\nregisterCleanup(() => {\n stopActiveTracking?.(); stopActiveTracking = undefined;\n initialization = undefined; workspaceAccount = undefined;\n});\n\n/**\n * Canonical one-call SDK bootstrap for RevDev pages and external React apps.\n * Configuration must be provided through window.__FSAOS_CONFIG__ before the\n * SDK module or IIFE loads, so every subsystem sees the same registered host.\n */\nexport function initializeFsaos(\n options: InitializeFsaosOptions = {},\n): Promise<FsaosRuntime> {\n if (initialization) {\n if (options.workspace && options.workspace.accountPath !== workspaceAccount) {\n return Promise.reject(new Error('Initialize workspace through initializeWorkspace, or dispose the existing runtime first'));\n }\n return initialization;\n }\n workspaceAccount = options.workspace?.accountPath;\n const generation = getSessionGeneration();\n\n initialization = (async () => {\n const tracking = options.tracking ?? true;\n const stopTracking = tracking === false\n ? () => {}\n : startTracking(typeof tracking === 'object' ? tracking : {});\n stopActiveTracking = stopTracking;\n try {\n const session = options.session === false ? null : await initSession();\n const workspace = options.workspace ? await initializeWorkspace(options.workspace) : undefined;\n if (generation !== getSessionGeneration()) throw new Error('Session changed during initialization');\n let disposed = false;\n const runtime: FsaosRuntime = {\n session,\n workspace,\n dispose() {\n if (disposed) return;\n disposed = true;\n stopTracking();\n if (generation === getSessionGeneration()) {\n initialization = undefined; workspaceAccount = undefined;\n stopActiveTracking = undefined;\n }\n },\n };\n return runtime;\n } catch (error) {\n stopTracking();\n if (generation === getSessionGeneration()) {\n initialization = undefined; workspaceAccount = undefined;\n stopActiveTracking = undefined;\n }\n throw error;\n }\n })();\n\n return initialization;\n}\n","/**\n * Governed execution control.\n *\n * The VFS/kernel owns the durable control receipt and resolves a user request\n * message to its cognition event. The browser never targets a runtime,\n * machine, process, or tool invocation directly.\n */\n\nimport { gatewayCall, GatewayRequestError } from './client';\nimport type { GatewayParams, GatewayResponse } from './types';\n\nexport type CancelTurnState =\n | 'cancel_requested'\n | 'cancelled'\n | 'already_cancelled'\n | 'already_completed';\n\nexport type SteerTurnState =\n | 'steer_requested'\n | 'steered'\n | 'already_steered'\n | 'already_completed';\n\nexport type CancelQueuedTurnState =\n | 'cancelled'\n | 'already_cancelled'\n | 'already_promoted';\n\nexport interface CancelTurnOptions {\n /** Override the acting mount when the caller is intentionally scoped. */\n scopePath?: string;\n /**\n * Override the durable replay key. Defaults to a stable key derived from\n * the request message so duplicate clicks/retries converge on one control.\n */\n idempotencyKey?: string;\n}\n\nexport interface CancelTurnResponse extends GatewayResponse {\n success?: true;\n outcome?: CancelTurnState;\n state?: CancelTurnState;\n status?: CancelTurnState;\n control_item_id?: string;\n event_id?: string;\n request_message_id?: string;\n /** Canonical Channel-or-Message identity that owns this turn. */\n conversation_anchor_item_id?: string;\n /** @deprecated Use conversation_anchor_item_id. */\n conversation_root_id?: string;\n runtime_acknowledged?: boolean;\n}\n\nexport interface SteerTurnOptions {\n /** Override the acting mount when the caller is intentionally scoped. */\n scopePath?: string;\n /**\n * Override the durable replay key. The default converges duplicate clicks\n * for the same active turn and selected queue entry.\n */\n idempotencyKey?: string;\n}\n\nexport interface SteerTurnResponse extends GatewayResponse {\n success?: true;\n outcome?: SteerTurnState;\n state?: SteerTurnState;\n status?: SteerTurnState;\n control_item_id?: string;\n event_id?: string;\n request_message_id?: string;\n selected_queue_entry_id?: string;\n activated_event_id?: string;\n /** Canonical Channel-or-Message identity that owns this turn. */\n conversation_anchor_item_id?: string;\n /** @deprecated Use conversation_anchor_item_id. */\n conversation_root_id?: string;\n runtime_acknowledged?: boolean;\n}\n\nexport interface CancelQueuedTurnOptions {\n /** Override the acting mount when the caller is intentionally scoped. */\n scopePath?: string;\n /** Override the replay key. Duplicate cancellation clicks converge. */\n idempotencyKey?: string;\n}\n\nexport interface CancelQueuedTurnResponse extends GatewayResponse {\n success?: true;\n outcome?: CancelQueuedTurnState;\n state?: 'cancelled' | 'promoted';\n status?: 'cancelled' | 'promoted';\n queue_entry_id?: string;\n /** Canonical Channel-or-Message identity that owns this queue entry. */\n conversation_anchor_item_id?: string;\n /** @deprecated Use conversation_anchor_item_id. */\n conversation_root_id?: string;\n promoted_message_id?: string;\n replayed?: boolean;\n}\n\ntype ConversationAnchorFields = {\n conversation_anchor_item_id?: string;\n conversation_root_id?: string;\n};\n\nasync function executionControlCall(params: GatewayParams): Promise<GatewayResponse> {\n try {\n return await gatewayCall('execution-control-transition', params);\n } catch (error) {\n // Every execution-control request carries a stable kernel idempotency key.\n // Retry one transient gateway failure with the identical request so a lost\n // response or short upstream outage converges on the same durable control\n // instead of leaving Stop/Steer as a failed UI-only click.\n if (!(error instanceof GatewayRequestError) || error.status < 500) {\n throw error;\n }\n await new Promise((resolve) => setTimeout(resolve, 250));\n return gatewayCall('execution-control-transition', params);\n }\n}\n\n/** Normalize old and new kernel generations without making topology a concern. */\nfunction withConversationAnchor<T extends ConversationAnchorFields>(response: T): T {\n const anchor = response.conversation_anchor_item_id ?? response.conversation_root_id;\n if (!anchor) return response;\n return {\n ...response,\n conversation_anchor_item_id: anchor,\n // Preserve the old public field until consumers have migrated.\n conversation_root_id: response.conversation_root_id ?? anchor,\n };\n}\n\n/**\n * Request cancellation of the exact turn caused by `requestMessageId`.\n *\n * This is a durable, replay-safe kernel transition. A successful response\n * means the kernel accepted or had already settled the control request; it\n * does not mean already-committed external side effects were rolled back.\n */\nexport async function cancelTurn(\n requestMessageId: string,\n options: CancelTurnOptions = {},\n): Promise<CancelTurnResponse> {\n const target = requestMessageId.trim();\n if (!target) {\n throw new TypeError('cancelTurn requires a request message id');\n }\n\n const idempotencyKey = (options.idempotencyKey ?? `cancel:${target}`).trim();\n if (!idempotencyKey) {\n throw new TypeError('cancelTurn requires a non-empty idempotency key');\n }\n if (idempotencyKey.length > 128) {\n throw new TypeError('cancelTurn idempotency key must be 128 characters or fewer');\n }\n\n const response = (await executionControlCall({\n op: 'request',\n command: 'cancel',\n delivery: 'immediate',\n request_message_id: target,\n idempotency_key: idempotencyKey,\n ...(options.scopePath ? { _scope_path: options.scopePath } : {}),\n })) as CancelTurnResponse;\n\n // The governed transition names its terminal arbitration field `outcome`.\n // Preserve that source field while normalizing `state` for SDK consumers.\n const state = response.outcome ?? response.state ?? response.status;\n return withConversationAnchor(state ? { ...response, state } : response);\n}\n\n/**\n * Interrupt the exact active turn and promote one queued send intent.\n *\n * The first identity is a durable request-message id; the second is a\n * turn_queue_entry id. A queue entry is not a transcript message. The kernel\n * creates the real message only when promotion wins arbitration.\n */\nexport async function steerTurn(\n requestMessageId: string,\n selectedQueueEntryId: string,\n options: SteerTurnOptions = {},\n): Promise<SteerTurnResponse> {\n const active = requestMessageId.trim();\n const selected = selectedQueueEntryId.trim();\n if (!active) {\n throw new TypeError('steerTurn requires an active request message id');\n }\n if (!selected) {\n throw new TypeError('steerTurn requires a selected queue entry id');\n }\n if (active === selected) {\n throw new TypeError('steerTurn cannot target the active request message');\n }\n\n const idempotencyKey = (\n options.idempotencyKey ?? `steer:${active}:${selected}`\n ).trim();\n if (!idempotencyKey) {\n throw new TypeError('steerTurn requires a non-empty idempotency key');\n }\n if (idempotencyKey.length > 128) {\n throw new TypeError('steerTurn idempotency key must be 128 characters or fewer');\n }\n\n const response = (await executionControlCall({\n op: 'request',\n command: 'steer',\n delivery: 'immediate',\n request_message_id: active,\n selected_queue_entry_id: selected,\n idempotency_key: idempotencyKey,\n ...(options.scopePath ? { _scope_path: options.scopePath } : {}),\n })) as SteerTurnResponse;\n\n const state = response.outcome ?? response.state ?? response.status;\n return withConversationAnchor(state ? { ...response, state } : response);\n}\n\n/**\n * Cancel one pending send intent without creating a transcript message.\n *\n * The kernel serializes this transition against promotion on the conversation\n * root. If promotion already won, the response reports `already_promoted`\n * and leaves the real message untouched.\n */\nexport async function cancelQueuedTurn(\n queueEntryId: string,\n options: CancelQueuedTurnOptions = {},\n): Promise<CancelQueuedTurnResponse> {\n const target = queueEntryId.trim();\n if (!target) {\n throw new TypeError('cancelQueuedTurn requires a queue entry id');\n }\n\n const idempotencyKey = (\n options.idempotencyKey ?? `cancel-queue:${target}`\n ).trim();\n if (!idempotencyKey) {\n throw new TypeError('cancelQueuedTurn requires a non-empty idempotency key');\n }\n if (idempotencyKey.length > 128) {\n throw new TypeError('cancelQueuedTurn idempotency key must be 128 characters or fewer');\n }\n\n const response = (await executionControlCall({\n op: 'cancel_queue_entry',\n queue_entry_id: target,\n idempotency_key: idempotencyKey,\n ...(options.scopePath ? { _scope_path: options.scopePath } : {}),\n })) as CancelQueuedTurnResponse;\n\n const state = response.outcome ?? response.state ?? response.status;\n return withConversationAnchor(\n state ? { ...response, outcome: state as CancelQueuedTurnState } : response,\n );\n}\n","import { GATEWAY_URL } from './config';\nimport { getHostname } from './session';\nimport { trackFormReceipt, formAttribution } from './interactions';\n\nexport interface SubmitFormOptions {\n /** Reuse this UUID when retrying an uncertain network result. */\n fillId?: string;\n /** Override the current page URL for non-browser clients and tests. */\n pageUrl?: string;\n signal?: AbortSignal;\n}\n\nexport interface FormSubmissionReceipt {\n success: true;\n fill_id: string;\n capability_id: string;\n release_id: string;\n received_at: string;\n /** Same-origin transition declared by the published capability. */\n next?: string;\n}\n\ninterface FormSubmissionFailure {\n success?: false;\n error?: string;\n message?: string;\n}\n\nconst CAPABILITY_ID_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/;\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport class FormSubmissionError extends Error {\n readonly code: string;\n readonly status: number;\n /** Retry with this ID if the response outcome was uncertain. */\n readonly fillId: string;\n\n constructor(message: string, code: string, status: number, fillId: string) {\n super(message);\n this.name = 'FormSubmissionError';\n this.code = code;\n this.status = status;\n this.fillId = fillId;\n }\n}\n\n/**\n * Submit a public page form through the domain gateway. The gateway derives\n * the published release capability from the registered hostname and page URL.\n * This carries no dataset identity, service credential, or JWT and works from\n * the IIFE, ESM, npm, or any other browser delivery format.\n */\nexport async function submitForm(\n capabilityId: string,\n fields: Record<string, unknown>,\n options: SubmitFormOptions = {},\n): Promise<FormSubmissionReceipt> {\n if (!CAPABILITY_ID_PATTERN.test(capabilityId)) {\n throw new TypeError('capabilityId is invalid');\n }\n if (!fields || typeof fields !== 'object' || Array.isArray(fields)) {\n throw new TypeError('fields must be an object');\n }\n const fillId = options.fillId ?? crypto.randomUUID();\n if (!UUID_PATTERN.test(fillId)) {\n throw new TypeError('fillId must be a UUID');\n }\n const hostname = getHostname();\n const pageUrl = options.pageUrl\n ?? (typeof window !== 'undefined' ? window.location.href : undefined);\n if (!pageUrl) {\n throw new TypeError('pageUrl is required outside a browser');\n }\n const endpoint = `${GATEWAY_URL.replace(/\\/+$/, '')}/d/${encodeURIComponent(hostname)}/actions/${encodeURIComponent(capabilityId)}`;\n\n const identity = formAttribution();\n const attribution = identity ? {visitor_id: identity.visitor_id, session_id: identity.session_id} : undefined;\n let response: Response;\n try {\n response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n body: JSON.stringify({ fill_id: fillId, page_url: pageUrl, fields, ...(attribution ? {attribution} : {}) }),\n signal: options.signal,\n credentials: 'omit',\n });\n } catch (error) {\n throw new FormSubmissionError(\n error instanceof Error ? error.message : 'Form submission network error',\n 'FORM_NETWORK_ERROR',\n 0,\n fillId,\n );\n }\n\n let payload: FormSubmissionReceipt | FormSubmissionFailure | null = null;\n try {\n payload = await response.json() as FormSubmissionReceipt | FormSubmissionFailure;\n } catch {\n // A non-JSON response is a transport failure, never a successful receipt.\n }\n if (!response.ok || payload?.success !== true) {\n const failure = payload as FormSubmissionFailure | null;\n throw new FormSubmissionError(\n failure?.message || failure?.error || `Form submission failed (${response.status})`,\n failure?.error || 'FORM_SUBMISSION_FAILED',\n response.status,\n fillId,\n );\n }\n // Join the canonical form row/business event to the same anonymous visitor\n // and session stream used by page and action tracking. Tracking failure must\n // never turn a successfully persisted form submission into a failed form.\n try {\n await trackFormReceipt({\n fill_id: fillId,\n action_id: capabilityId,\n release_id: payload.release_id,\n }, { eventId: fillId, pageUrl, signal: options.signal, keepalive: true, ...(identity ? {source: identity.source, visitorId: identity.visitor_id, sessionId: identity.session_id} : {}) });\n } catch {\n // The durable form receipt remains authoritative. Missing telemetry can be\n // reconciled from the row's server-stamped origin later.\n }\n return payload;\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 { getQueryClient } 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 getQueryClient().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: getQueryClient() },\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/kernel': gateway,\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 — 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 * Optional: emit a card under this path pointing to the uploaded file.\n * When provided, the kernel emits a card item as a child of the specified\n * path (typically a message or channel path) referencing the uploaded file.\n * If omitted, the kernel auto-detects conversational context and emits\n * a card automatically when the file is created under a channel.\n */\n cardParentPath?: string;\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 createParams: Record<string, unknown> = {\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 // When cardParentPath is provided, pass it so the kernel emits a card\n // under that path pointing to the newly created file.\n if (options.cardParentPath) {\n createParams.card_parent_path = options.cardParentPath;\n }\n\n const createResult = await gatewayCall('create', createParams);\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","/**\n * @fsaos/gateway — Frame-Aware Item Resolution\n *\n * Typed wrapper over the `resolve-items` kernel method: \"what items of this\n * type can THIS actor reach in THIS context?\" — the access question.\n *\n * Use this (not useItems) whenever the answer should depend on who is asking\n * or which channel they are in. useItems answers the location question\n * (\"what is at this path\"); useResolvedItems answers the access question\n * (union of account / member / space / system / licensed tiers, frame-bounded\n * to the acting principal, pref-cascade-aware for selectable types).\n *\n * Resolution, frames, shadows, entitlements, and preference cascade all live\n * in the kernel. Never reimplement any of it client-side.\n */\nimport { useSyncExternalStore } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { gatewayCall } from './client';\nimport { getScope, getScopeVersion, subscribeScope } from './session';\n\n/** One resolved item row (menu-safe: secrets/tokens/urls withheld by sealing). */\nexport interface ResolvedItem {\n /** Item id — the only key you should ever write back (never names). */\n id: string;\n name: string;\n path: string;\n /** Which tier resolved it: drives placement-grouped UI sections. */\n placement: 'account' | 'member' | 'space' | 'system' | 'licensed';\n entitled: boolean;\n /**\n * The item's config payload, SEALED through the kernel's access profile —\n * the reader sees exactly the fields their profile permits, nothing more.\n * This is what capability pickers render and apply from (a behavior's\n * temperature/prompt_modifier, a role's specialty/behavior/brain axis\n * paths, display_name/icon/color). Read-only projection: writes still go\n * through the `update` syscall against the item itself.\n */\n type_data?: Record<string, unknown>;\n /** Integration-family extras (present when the type has a pref_family). */\n service_name?: string;\n has_credential?: boolean;\n /** Toggle state from the (member, context) preference cascade. */\n active?: boolean;\n}\n\nexport interface ResolveItemsResponse {\n success: boolean;\n account_id: string;\n /** Provenance of the applied preference layer (person plane). */\n pref_source: 'channel' | 'account' | 'none';\n items: ResolvedItem[];\n}\n\n/** Imperative form — for non-React callers and prefetching. */\nexport async function fetchResolvedItems(\n contextId: string,\n itemType: string,\n): Promise<ResolveItemsResponse> {\n const response = await gatewayCall('resolve-items', {\n context_id: contextId,\n item_type: itemType,\n });\n return response as unknown as ResolveItemsResponse;\n}\n\n/**\n * React hook. `contextId` is the channel the member is composing in (thread\n * surfaces resolve to their ancestor channel first — threads have no prefs\n * of their own); any item id works for pure tier resolution.\n *\n * Scope-reactive: subscribes to scope changes so it re-resolves on account\n * switch, and keys the cache by scope so results never bleed across accounts.\n * Resolution is scope-dependent, so both are required for correctness — this\n * mirrors the scope handling every read hook in ./hooks performs internally.\n */\nexport function useResolvedItems(\n contextId: string | null | undefined,\n itemType: string,\n) {\n // Re-render on scope change → query key below picks up the new scope.\n useSyncExternalStore(subscribeScope, getScopeVersion, getScopeVersion);\n return useQuery({\n queryKey: ['vfs', getScope() ?? '__unscoped__', 'resolved-items', contextId ?? '', itemType],\n queryFn: () => fetchResolvedItems(contextId as string, itemType),\n enabled: Boolean(contextId && itemType),\n });\n}\n","/**\n * Artifact Streaming — Gateway SDK contract surface.\n *\n * This module provides the types, accumulation logic, and React hooks for\n * consuming artifact streaming events from the agent runtime. Any client\n * built on the gateway SDK gets live content preview as a first-class primitive.\n *\n * Design principle: \"What the agent sees, the user sees.\"\n * - All tool calls emit activity events (tool name, arguments streaming in, result)\n * - create/update/edit additionally emit file_editor events (content extraction)\n *\n * Usage:\n * import { useArtifactStream, useAgentTimeline } from '@fsaos/gateway';\n *\n * function ChatPanel({ channelPath }) {\n * const { artifacts, timeline } = useArtifactStream(channelPath);\n * // artifacts: Map<artifactId, ArtifactState>\n * // timeline: TimelineEvent[]\n * }\n */\n\nimport { useEffect, useRef, useState, useCallback } from 'react';\nimport { subscribeToPath } from './ws';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport type ArtifactSurfaceType = 'file_editor' | 'activity';\n\nexport type ArtifactStatus = 'streaming' | 'executing' | 'completed' | 'failed';\n\nexport interface ArtifactOpenedEvent {\n type: 'artifact_opened';\n event_type: 'artifact_opened';\n message_id: string;\n artifact_id: string;\n surface_type: ArtifactSurfaceType;\n tool_id: string;\n tool_name: string;\n target_uri: string | null;\n source: string;\n meta: Record<string, unknown>;\n}\n\nexport interface ArtifactDeltaEvent {\n type: 'artifact_delta';\n event_type: 'artifact_delta';\n message_id: string;\n artifact_id: string;\n surface_type: ArtifactSurfaceType;\n tool_id: string;\n tool_name: string;\n target_uri: string | null;\n content_delta: string;\n delta_index: number;\n source: string;\n meta: Record<string, unknown>;\n}\n\nexport interface ArtifactDoneEvent {\n type: 'artifact_done';\n event_type: 'artifact_done';\n message_id: string;\n artifact_id: string;\n surface_type: ArtifactSurfaceType;\n tool_id: string;\n tool_name: string;\n target_uri: string | null;\n artifact_item_uri: string | null;\n evidence_uri: string | null;\n source: string;\n total_chars: number;\n status: ArtifactStatus;\n meta: Record<string, unknown>;\n}\n\nexport type ArtifactEvent = ArtifactOpenedEvent | ArtifactDeltaEvent | ArtifactDoneEvent;\n\n/**\n * Accumulated state for a single artifact stream.\n * Updated incrementally as events arrive.\n */\nexport interface ArtifactState {\n artifact_id: string;\n surface_type: ArtifactSurfaceType;\n tool_id: string;\n tool_name: string;\n target_uri: string | null;\n status: ArtifactStatus;\n content: string;\n total_chars: number;\n delta_count: number;\n artifact_item_uri: string | null;\n evidence_uri: string | null;\n meta: Record<string, unknown>;\n started_at: number;\n completed_at: number | null;\n}\n\n/**\n * Timeline event — a high-level record of agent activity.\n * Each tool call produces one timeline entry.\n */\nexport interface TimelineEvent {\n tool_id: string;\n tool_name: string;\n status: 'started' | 'executing' | 'completed' | 'failed';\n target_uri: string | null;\n started_at: number;\n completed_at: number | null;\n /** Artifact IDs associated with this tool call */\n artifact_ids: string[];\n}\n\n// ─── Accumulator (imperative) ───────────────────────────────────────────────\n\nexport interface ArtifactStreamState {\n artifacts: Map<string, ArtifactState>;\n timeline: TimelineEvent[];\n}\n\n/**\n * Create an imperative artifact stream accumulator.\n * Subscribes to the channel path and accumulates artifact events into state.\n *\n * @param channelPath - The VFS path to subscribe to for token_stream events\n * @param onChange - Callback fired on every state change\n * @returns Unsubscribe function\n */\nexport function subscribeArtifactStream(\n channelPath: string,\n onChange: (state: ArtifactStreamState) => void,\n): () => void {\n const state: ArtifactStreamState = {\n artifacts: new Map(),\n timeline: [],\n };\n\n // Map tool_id → timeline index for fast lookup\n const toolTimelineIdx = new Map<string, number>();\n\n function handleEvent(data: any): void {\n // The gateway sends VfsChangeEvent with:\n // event_type: \"token_stream\" (always)\n // action: \"artifact_opened\" | \"artifact_delta\" | \"artifact_done\" | \"token\" | etc.\n // name: <payload string> (the token content)\n // So we use `data.action` to determine the event type — same field useChat reads.\n const action = data.action as string | undefined;\n\n // Only handle artifact events\n if (!action?.startsWith('artifact_')) return;\n\n // The payload is in `data.name` (gateway maps body.token → VfsChangeEvent.name).\n // It's a JSON-serialized ArtifactEvent.\n let event: ArtifactEvent;\n const payload = data.name as string | undefined;\n if (typeof payload === 'string' && payload.startsWith('{')) {\n try {\n event = JSON.parse(payload);\n } catch {\n return;\n }\n } else if (data.artifact_id) {\n // Fallback: the data itself might be the event (future direct dispatch)\n event = data as ArtifactEvent;\n } else {\n return;\n }\n\n switch (event.type) {\n case 'artifact_opened': {\n const now = Date.now();\n state.artifacts.set(event.artifact_id, {\n artifact_id: event.artifact_id,\n surface_type: event.surface_type,\n tool_id: event.tool_id,\n tool_name: event.tool_name,\n target_uri: event.target_uri,\n status: 'streaming',\n content: '',\n total_chars: 0,\n delta_count: 0,\n artifact_item_uri: null,\n evidence_uri: null,\n meta: event.meta,\n started_at: now,\n completed_at: null,\n });\n\n // Add timeline entry if this is the first artifact for this tool_id\n if (!toolTimelineIdx.has(event.tool_id)) {\n const idx = state.timeline.length;\n state.timeline.push({\n tool_id: event.tool_id,\n tool_name: event.tool_name,\n status: 'started',\n target_uri: event.target_uri,\n started_at: now,\n completed_at: null,\n artifact_ids: [event.artifact_id],\n });\n toolTimelineIdx.set(event.tool_id, idx);\n } else {\n // Additional artifact for same tool (e.g., activity + file_editor)\n const idx = toolTimelineIdx.get(event.tool_id)!;\n state.timeline[idx].artifact_ids.push(event.artifact_id);\n }\n break;\n }\n\n case 'artifact_delta': {\n const art = state.artifacts.get(event.artifact_id);\n if (art) {\n art.content += event.content_delta;\n art.total_chars += event.content_delta.length;\n art.delta_count += 1;\n if (event.target_uri && !art.target_uri) {\n art.target_uri = event.target_uri;\n }\n }\n break;\n }\n\n case 'artifact_done': {\n const art = state.artifacts.get(event.artifact_id);\n if (art) {\n art.status = event.status;\n art.total_chars = event.total_chars;\n art.artifact_item_uri = event.artifact_item_uri;\n art.evidence_uri = event.evidence_uri;\n if (event.target_uri) art.target_uri = event.target_uri;\n if (event.status === 'completed' || event.status === 'failed') {\n art.completed_at = Date.now();\n }\n }\n\n // Update timeline entry\n const idx = toolTimelineIdx.get(event.tool_id);\n if (idx !== undefined) {\n const entry = state.timeline[idx];\n if (event.status === 'executing') {\n entry.status = 'executing';\n } else if (event.status === 'completed') {\n entry.status = 'completed';\n entry.completed_at = Date.now();\n } else if (event.status === 'failed') {\n entry.status = 'failed';\n entry.completed_at = Date.now();\n }\n if (event.target_uri && !entry.target_uri) {\n entry.target_uri = event.target_uri;\n }\n }\n break;\n }\n }\n\n onChange(state);\n }\n\n const unsub = subscribeToPath(channelPath, handleEvent);\n return unsub;\n}\n\n// ─── React Hook ─────────────────────────────────────────────────────────────\n\nexport interface UseArtifactStreamReturn {\n /** All artifact states, keyed by artifact_id */\n artifacts: Map<string, ArtifactState>;\n /** Ordered timeline of tool calls */\n timeline: TimelineEvent[];\n /** Currently active (streaming) file_editor artifact, if any */\n activeEditor: ArtifactState | null;\n /** Currently active activity artifacts */\n activeActivities: ArtifactState[];\n /** Clear all accumulated state (e.g., on new turn) */\n reset: () => void;\n}\n\n/**\n * React hook for consuming artifact streaming events.\n *\n * Subscribes to the channel path and provides accumulated artifact state\n * and timeline events. Re-renders on every artifact event.\n *\n * @param channelPath - The VFS path to subscribe to (e.g., the message path)\n * @param enabled - Whether to subscribe (default: true)\n */\nexport function useArtifactStream(\n channelPath: string | null,\n enabled: boolean = true,\n): UseArtifactStreamReturn {\n const [artifacts, setArtifacts] = useState<Map<string, ArtifactState>>(new Map());\n const [timeline, setTimeline] = useState<TimelineEvent[]>([]);\n const stateRef = useRef<ArtifactStreamState>({ artifacts: new Map(), timeline: [] });\n\n useEffect(() => {\n if (!channelPath || !enabled) return;\n\n const unsub = subscribeArtifactStream(channelPath, (state) => {\n stateRef.current = state;\n // Create new references to trigger re-render\n setArtifacts(new Map(state.artifacts));\n setTimeline([...state.timeline]);\n });\n\n return unsub;\n }, [channelPath, enabled]);\n\n const reset = useCallback(() => {\n setArtifacts(new Map());\n setTimeline([]);\n stateRef.current = { artifacts: new Map(), timeline: [] };\n }, []);\n\n // Derived state\n const activeEditor = Array.from(artifacts.values()).find(\n (a) => a.surface_type === 'file_editor' && a.status === 'streaming',\n ) ?? null;\n\n const activeActivities = Array.from(artifacts.values()).filter(\n (a) => a.surface_type === 'activity' && (a.status === 'streaming' || a.status === 'executing'),\n );\n\n return { artifacts, timeline, activeEditor, activeActivities, reset };\n}\n\n/**\n * React hook for the agent activity timeline only (lighter than useArtifactStream).\n *\n * @param channelPath - The VFS path to subscribe to\n * @param enabled - Whether to subscribe (default: true)\n */\nexport function useAgentTimeline(\n channelPath: string | null,\n enabled: boolean = true,\n): { timeline: TimelineEvent[]; latestActivity: TimelineEvent | null } {\n const [timeline, setTimeline] = useState<TimelineEvent[]>([]);\n\n useEffect(() => {\n if (!channelPath || !enabled) return;\n\n const unsub = subscribeArtifactStream(channelPath, (state) => {\n setTimeline([...state.timeline]);\n });\n\n return unsub;\n }, [channelPath, enabled]);\n\n const latestActivity = timeline.length > 0 ? timeline[timeline.length - 1] : null;\n\n return { timeline, latestActivity };\n}\n","/**\n * Timeline History — Gateway SDK hook for querying persisted agent-events.\n *\n * The agent-events dataset stores a per-channel timeline of all agent work:\n * tool calls, thinking blocks, text emissions, errors, and turn bookends.\n * Each row is a single granular event with full timing and linking metadata.\n *\n * This module provides:\n * - `fetchTimelineHistory()` — imperative fetch for non-React contexts\n * - `useTimelineHistory()` — React hook with realtime auto-invalidation\n *\n * The hook bridges the gap between:\n * - Live ephemeral timeline (useAgentTimeline / useArtifactStream) — WebSocket only\n * - Persisted historical timeline (this hook) — kernel dataset query\n *\n * Usage:\n * import { useTimelineHistory } from '@fsaos/gateway';\n *\n * function TurnActivity({ channelPath, turnId }) {\n * const { events, isLoading } = useTimelineHistory(channelPath, { turnId });\n * // events: TimelineHistoryEvent[] — sorted by seq ascending\n * }\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { subscribeToEvents } from './ws';\nimport { gatewayCall } from './client';\nimport { vfsKeys } from './vfs-keys';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\n/**\n * A single persisted timeline event from the agent-events dataset.\n * Mirrors the dataset schema columns exactly.\n */\nexport interface TimelineHistoryEvent {\n /** Turn/message ID this event belongs to. */\n turn_id: string;\n /** Monotonic sequence number within the turn (1-based). */\n seq: number;\n /** Event kind: turn_started, tool_started, tool_completed, thinking, text_block, error, turn_completed, turn_failed, stage_transition */\n kind: string;\n /** Event status: started, completed, failed */\n status: string;\n /** Human-readable title (e.g., tool name, \"Thinking\", \"Response\") */\n title: string;\n /** Tool name (for tool_started/tool_completed events). */\n tool_name?: string;\n /** Tool call ID (for correlating started → completed). */\n tool_id?: string;\n /** VFS URI to the evidence item (for tool_completed events). */\n evidence_uri?: string;\n /** VFS URI to the produced artifact/file (for tool_completed events). */\n artifact_item_uri?: string;\n /** First ~200 chars of content (thinking text, response text, error message). */\n preview?: string;\n /** Execution duration in milliseconds. */\n duration_ms?: number;\n /** ISO timestamp when the event started. */\n started_at: string;\n /** ISO timestamp when the event completed (null for in-progress). */\n completed_at?: string;\n /** Error classification (for error events). */\n error_type?: string;\n /** Arbitrary metadata (JSON). */\n meta?: Record<string, unknown>;\n}\n\n/**\n * Options for querying timeline history.\n */\nexport interface TimelineHistoryOptions {\n /** Filter to a specific turn/message. When omitted, returns all events in the channel. */\n turnId?: string;\n /** Maximum number of events to return. Defaults to 500. */\n limit?: number;\n /** Offset for pagination. Defaults to 0. */\n offset?: number;\n /** Whether the hook is enabled. Defaults to true. */\n enabled?: boolean;\n /** Debounce interval for realtime invalidation (ms). Defaults to 300. */\n debounceMs?: number;\n}\n\n/**\n * Return type for useTimelineHistory.\n */\nexport interface UseTimelineHistoryReturn {\n /** Sorted timeline events (by seq ascending). */\n events: TimelineHistoryEvent[];\n /** Whether the initial fetch is in progress. */\n isLoading: boolean;\n /** Error from the query, if any. */\n error: Error | null;\n /** Whether a background refetch is happening. */\n isFetching: boolean;\n /** Manually trigger a refetch. */\n refetch: () => void;\n}\n\n// ─── Query Key ──────────────────────────────────────────────────────────────\n\n/**\n * Deterministic query key for timeline history queries.\n * Namespaced under vfsKeys pattern for consistency.\n */\nfunction timelineHistoryKey(\n datasetPath: string,\n turnId?: string,\n limit?: number,\n offset?: number,\n) {\n return [\n 'vfs',\n 'timeline-history',\n datasetPath,\n turnId ?? '__all__',\n limit ?? 500,\n offset ?? 0,\n ] as const;\n}\n\n// ─── Imperative Fetch ───────────────────────────────────────────────────────\n\n/**\n * Fetch timeline history events from the agent-events dataset.\n *\n * Uses the kernel `open` syscall with strategy='rows' to extract dataset rows.\n * The dataset path is derived from the channel path:\n * `{channelPath}/datasets/agent-events`\n *\n * @param channelPath - The VFS path of the channel\n * @param options - Query options (turnId filter, pagination)\n * @returns Sorted array of timeline events\n */\nexport async function fetchTimelineHistory(\n channelPath: string,\n options?: Pick<TimelineHistoryOptions, 'turnId' | 'limit' | 'offset'>,\n): Promise<TimelineHistoryEvent[]> {\n const datasetPath = `${channelPath}/datasets/agent-events`;\n const limit = options?.limit ?? 500;\n const offset = options?.offset ?? 0;\n\n // Build row query arguments\n const args: Record<string, unknown> = {\n limit,\n offset,\n sort: [{ key: 'seq', direction: 'asc' }],\n };\n\n // Filter by turn_id if provided\n if (options?.turnId) {\n args.filters = [\n { key: 'turn_id', operator: 'eq', value: options.turnId },\n ];\n }\n\n try {\n const response = await gatewayCall('open', {\n path: datasetPath,\n mode: 'extract',\n strategy: 'rows',\n arguments: args,\n });\n\n // The kernel returns rows in content.rows or content.items depending on version\n const content = (response as any)?.content;\n if (!content) return [];\n\n const rows: Array<Record<string, unknown>> =\n content.rows ?? content.items ?? content.data ?? [];\n\n return rows.map(normalizeRow).sort((a, b) => a.seq - b.seq);\n } catch (err: any) {\n // Dataset doesn't exist yet (no turns have run) — return empty\n if (err?.status === 404 || err?.message?.includes('not found')) {\n return [];\n }\n throw err;\n }\n}\n\n// ─── React Hook ─────────────────────────────────────────────────────────────\n\n/**\n * React hook for querying persisted timeline history from the agent-events dataset.\n *\n * Automatically invalidates and refetches when new timeline events are written\n * (via vfs_change events on the dataset path).\n *\n * @param channelPath - The VFS path of the channel (e.g., \"/root/channels/my-channel\")\n * @param options - Query and subscription options\n *\n * @example\n * // All events for a specific turn\n * const { events } = useTimelineHistory(channelPath, { turnId: messageId });\n *\n * @example\n * // Recent events across all turns (paginated)\n * const { events } = useTimelineHistory(channelPath, { limit: 100 });\n */\nexport function useTimelineHistory(\n channelPath: string | null | undefined,\n options?: TimelineHistoryOptions,\n): UseTimelineHistoryReturn {\n const {\n turnId,\n limit = 500,\n offset = 0,\n enabled = true,\n debounceMs = 300,\n } = options ?? {};\n\n const datasetPath = channelPath ? `${channelPath}/datasets/agent-events` : null;\n const qc = useQueryClient();\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const queryKey = datasetPath\n ? timelineHistoryKey(datasetPath, turnId, limit, offset)\n : ['vfs', 'timeline-history', '__disabled__'];\n\n const query = useQuery({\n queryKey: queryKey as any,\n queryFn: () => fetchTimelineHistory(channelPath!, { turnId, limit, offset }),\n enabled: !!channelPath && enabled,\n });\n\n // ── Realtime invalidation ─────────────────────────────────────────────\n // Subscribe to vfs_change events. When the dataset item is updated\n // (rows inserted), invalidate this query to trigger a refetch.\n useEffect(() => {\n if (!datasetPath || !enabled) return;\n\n const unsub = subscribeToEvents(\n 'vfs_change',\n () => {\n // Debounce rapid inserts (a single turn writes many rows quickly)\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n qc.invalidateQueries({ queryKey: queryKey as any });\n }, debounceMs);\n },\n // Filter: only react to changes on or under the dataset path\n (data: any) => {\n const eventPath = data?.path as string | undefined;\n if (!eventPath) return false;\n return eventPath === datasetPath || eventPath.startsWith(datasetPath + '/');\n },\n );\n\n return () => {\n unsub();\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [datasetPath, enabled, debounceMs, qc, JSON.stringify(queryKey)]);\n\n return {\n events: query.data ?? [],\n isLoading: query.isLoading,\n error: query.error as Error | null,\n isFetching: query.isFetching,\n refetch: () => { query.refetch(); },\n };\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Normalize a raw dataset row into a typed TimelineHistoryEvent.\n * Handles both camelCase and snake_case field names for robustness.\n */\nfunction normalizeRow(row: Record<string, unknown>): TimelineHistoryEvent {\n return {\n turn_id: String(row.turn_id ?? ''),\n seq: Number(row.seq ?? 0),\n kind: String(row.kind ?? ''),\n status: String(row.status ?? ''),\n title: String(row.title ?? ''),\n tool_name: row.tool_name != null ? String(row.tool_name) : undefined,\n tool_id: row.tool_id != null ? String(row.tool_id) : undefined,\n evidence_uri: row.evidence_uri != null ? String(row.evidence_uri) : undefined,\n artifact_item_uri: row.artifact_item_uri != null ? String(row.artifact_item_uri) : undefined,\n preview: row.preview != null ? String(row.preview) : undefined,\n duration_ms: row.duration_ms != null ? Number(row.duration_ms) : undefined,\n started_at: String(row.started_at ?? ''),\n completed_at: row.completed_at != null ? String(row.completed_at) : undefined,\n error_type: row.error_type != null ? String(row.error_type) : undefined,\n meta: row.meta != null ? (row.meta as Record<string, unknown>) : undefined,\n };\n}\n","import { useCallback, useSyncExternalStore } from 'react';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport type { QueryKey } from '@tanstack/react-query';\nimport { gatewayCall } from './client';\nimport { getAnchorRef, getScope, subscribeScope, getScopeVersion } from './session';\nimport { useArrangement } from './hooks';\nimport { refreshArrangement } from './arrangement-realtime';\n\nexport interface PinTarget {\n id: string;\n path?: string;\n item_type: 'channel' | 'message' | 'folder';\n name?: string;\n parent_id?: string;\n type_data?: Record<string, any>;\n}\nexport interface PinnedItem {\n id: string;\n symlink_path: string;\n symlink_type_data: { target_item_id: string };\n target: PinTarget | null;\n resolve_error?: string;\n}\n\ntype PinChange = { operation: 'pin'; target: PinTarget } | { operation: 'unpin'; entry: PinnedItem } | { operation: 'reorder'; ids: string[] };\ntype CapturedChange = PinChange & { scopePath: string; arrangementId: string; arrangementPath: string; queryKey: QueryKey };\n\n/** Personal pins use existing arrangement, symlink create/delete and order updates.\n * Provisioning and access decisions belong to FSAOS. This hook never creates a\n * missing arrangement and never falls back to another membership's collection.\n */\nexport function usePinnedItems() {\n useSyncExternalStore(subscribeScope, getScopeVersion, getScopeVersion);\n const scopePath = getScope();\n const anchor = getAnchorRef();\n const query = useArrangement(scopePath ? { key: 'pinned', ...(anchor ? { scope_id: anchor.id } : {}) } : null);\n const client = useQueryClient();\n const entries = query.resolvedChildren as PinnedItem[];\n const ready = Boolean(!query.error && query.arrangement?.item_id && query.resolutionLevel === 'member'\n && query.arrangement.write_target_id === query.arrangement.item_id);\n const mutation = useMutation({\n mutationFn: async (change: CapturedChange) => {\n let response: any;\n const context = { _scope_path: change.scopePath };\n if (change.operation === 'pin') {\n response = await gatewayCall('create', { ...context, parent_id: change.arrangementId,\n name: `pin-${change.target.id}`, item_type: 'symlink',\n type_data: { target_item_id: change.target.id, target_type: change.target.item_type } });\n } else if (change.operation === 'unpin') {\n response = await gatewayCall('delete', { ...context, id: change.entry.id });\n } else {\n response = await gatewayCall('update', { ...context, id: change.arrangementId, type_data: { order: change.ids } });\n }\n if (response?.success === false) throw new Error(response.error || 'Pins could not be saved');\n return response;\n },\n onSettled: (_data, _error, change) => refreshArrangement(client, change.queryKey),\n });\n const change = useCallback((value: PinChange) => {\n if (!ready || !scopePath || getScope() !== scopePath) return Promise.reject(new Error('Personal pins are not available in this context'));\n if (value.operation === 'unpin' && !entries.some(entry => entry.id === value.entry.id)) return Promise.reject(new Error('Pin is outside this arrangement'));\n if (value.operation === 'reorder' && (new Set(value.ids).size !== entries.length || value.ids.length !== entries.length\n || entries.some(entry => !value.ids.includes(entry.id)))) return Promise.reject(new Error('Order must include each pin exactly once'));\n if (value.operation === 'pin' && entries.some(entry => entry.symlink_type_data?.target_item_id === value.target.id)) return Promise.resolve(null);\n return mutation.mutateAsync({ ...value, scopePath, arrangementId: query.arrangement.item_id,\n arrangementPath: query.arrangement.item_path, queryKey: query.arrangementQueryKey });\n }, [ready, scopePath, entries, query.arrangement, query.arrangementQueryKey, mutation.mutateAsync]);\n return { entries, isLoading: query.isLoading, error: query.error, refetch: query.refetch, ready,\n isSaving: mutation.isPending, saveError: mutation.error,\n isPinned: (id: string) => entries.some(entry => entry.symlink_type_data?.target_item_id === id),\n pin: (target: PinTarget) => change({ operation: 'pin', target }),\n unpin: (id: string) => {\n const entry = entries.find(item => item.symlink_type_data?.target_item_id === id || item.id === id);\n return entry ? change({ operation: 'unpin', entry }) : Promise.resolve(null);\n },\n reorder: (ids: string[]) => change({ operation: 'reorder', ids }),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/enforcement.ts","../src/config.ts","../src/session.ts","../src/server-clock.ts","../src/client.ts","../src/query-refresh.ts","../src/arrangement-realtime.ts","../src/query-client.ts","../src/item-query-realtime.ts","../src/items-selection.ts","../src/vfs-keys.ts","../src/ws.ts","../src/vfs.ts","../src/memberships.ts","../src/vfs-realtime-ws.ts","../src/mounts.ts","../src/hooks.ts","../src/personal-item-order.ts","../src/interactions.ts","../src/workspace.ts","../src/initialize.ts","../src/execution-control.ts","../src/forms.ts","../src/runtime.ts","../src/schema-utils.ts","../src/upload.ts","../src/resolved-items.ts","../src/artifact-stream.ts","../src/timeline-history.ts","../src/pins.ts"],"names":["QueryClientProvider","mount","createClient","client","pending","QueryClient","item","useSyncExternalStore","useQuery","useMemo","useInfiniteQuery","useState","useEffect","useRef","anchorVersion","useCallback","React","ReactDOM","JsxRuntime","ws","createElement","useQueryClient","enabled","useTanstackMutation","useLayoutEffect","useMutation","index","initialization","UUID_PATTERN","createRoot","signal","change"],"mappings":"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","file":"index.cjs","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';\nexport { usePersonalItemOrder } from './personal-item-order';\nexport type { PersonalItemOrderKey } from './personal-item-order';\n\n// Canonical bootstrap for both generated pages and external applications.\nexport { initializeFsaos } from './initialize';\nexport type { InitializeFsaosOptions, FsaosRuntime } from './initialize';\nexport { initializeWorkspace } from './workspace';\nexport type { WorkspaceOptions, WorkspaceSession } from './workspace';\n\n// Session — anchor/mount model (anchor_mount_spec.md) + legacy scope shims\n// (shims die in the sprint-final cleanup commit).\n// NOTE: mounts.ts's imperative mount/unmount are intentionally NOT barrel-\n// exported — './runtime' already exports a different `mount`; use useMounts().\nexport { initSession, clearSession, getSessionEntry, getAccessToken, setCachedToken, clearCachedToken, setScope, getScope, getScopeVersion, subscribeScope, awaitScopeReady, isScopeReady, resetAllSdkState, registerCleanup, setAnchor, getAnchor, getAnchorRef, getAnchorVersion, subscribeAnchor, awaitAnchorReady, isAnchorReady, electHomeAnchor, getHomeAnchor, getMounts, getMountVersion, subscribeMounts } from './session';\nexport type { MountRef } from './session';\nexport { loadMounts, selectMount, replaceMounts } from './mounts';\nexport type { LoadMountsOptions } from './mounts';\n\n// Client\nexport { gatewayCall, GatewayRequestError } from './client';\n\n// Durable agent-turn control. The kernel owns arbitration and receipts; the\n// client only addresses the governed request-message identity.\nexport { cancelTurn, cancelQueuedTurn, steerTurn } from './execution-control';\nexport type {\n CancelQueuedTurnOptions,\n CancelQueuedTurnResponse,\n CancelQueuedTurnState,\n CancelTurnOptions,\n CancelTurnResponse,\n CancelTurnState,\n SteerTurnOptions,\n SteerTurnResponse,\n SteerTurnState,\n} from './execution-control';\n\n// Public form capability — same-origin, anonymous, release-bound ingress.\nexport { submitForm, FormSubmissionError } from './forms';\nexport type { SubmitFormOptions, FormSubmissionReceipt } from './forms';\n\n// Public, release-bound interaction capture. Identity is anonymous and\n// first-party; VFS ownership is resolved by the domain gateway and kernel.\nexport { trackEvent, trackPageView, trackAction, startTracking, InteractionTrackingError } from './interactions';\nexport type { TrackEventOptions, InteractionReceipt, StartTrackingOptions } from './interactions';\nexport type { PublicSourceConfig, SourceCaptureAdapter, SourceIdentityStorage } from './config';\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, getQueryClient, setQueryClient } from './query-client';\nexport { refreshQuery, isChannelPath } from './query-refresh';\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 fetchTurnQueueEntries,\n fetchTypeDefinitions,\n fetchItems,\n isListableItemsFilter,\n itemsFilterFromQueryFilter,\n fetchEdgesForItem,\n fetchVfsTree,\n fetchMemberFocus,\n fetchRecentActivity,\n fetchItemVersions,\n fetchItemHistory,\n fetchChannelMessages,\n fetchChannelMessagesWithCards,\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, ItemsFilterGroup, ItemsDiscovery, TurnQueueEntry, TurnQueueEntryState, ChannelMessage, ChannelCard, WorkCorrelation, ChannelMessagesResponse, ChannelMessagesPage, ItemVersionsOptions, ItemVersionsResult } from './vfs';\n\n// VFS Realtime via WebSocket\nexport { initVfsRealtimeWs, disposeVfsRealtimeWs, mountRealtimeScope, unmountRealtimeScope } from './vfs-realtime-ws';\n\n// WebSocket Transport\nexport {\n subscribeToPath,\n subscribeToEvents,\n subscribeToScope,\n emitEvent,\n disconnectSSE,\n ping,\n pathSubscriptionMatches,\n // Subscription readiness (2026-08-29): hold turn dispatch until the stream\n // is actually listening; express a real wire-level resubscribe.\n waitForPathReady,\n resubscribePath,\n getPathSubscriptionState,\n onConnectionStateChange,\n} from './ws';\nexport type { PathSubscriptionState, ConnectionState } 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 useResolve,\n useEdges,\n useTypes,\n useType,\n useOpen,\n useTypeHelpers,\n useMemberFocus,\n useItemVersions,\n useItemHistory,\n useRecentActivity,\n useScope,\n useScopeReady,\n useAuth,\n useAsset,\n useComponent,\n useTheme,\n usePermission,\n usePermissions,\n usePrincipal,\n useUpdatePrincipal,\n resolvePrincipalId,\n useAccounts,\n useMounts,\n useTool,\n useCreate,\n useUpdate,\n useDelete,\n useMove,\n useLink,\n useMutation,\n useEventStream,\n useMintedAsset,\n useChannelMessages,\n useInfiniteChannelMessages,\n useAllChannels,\n useChannels,\n useDmChannels,\n useNotifications,\n useUnreadCounts,\n useRealtimeQuery,\n useArrangement,\n ComponentRenderer,\n KernelProvider,\n} from './hooks';\nexport type {\n MintedAsset,\n MintedAssetState,\n ChannelMessagesOptions,\n InfiniteChannelMessagesOptions,\n InfiniteItemsOptions,\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// Frame-Aware Item Resolution (resolve-items kernel method)\nexport { useResolvedItems, fetchResolvedItems } from './resolved-items';\nexport type { ResolvedItem, ResolveItemsResponse } from './resolved-items';\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 ResolveParams,\n ResolveResponse,\n ResolveResultItem,\n} from './types';\n\nexport type { PrincipalData, UpdatePrincipalParams, AccountInfo, TypeHelpers } from './hooks';\n\n// Artifact Streaming\nexport { subscribeArtifactStream, useArtifactStream, useAgentTimeline } from './artifact-stream';\nexport type {\n ArtifactSurfaceType,\n ArtifactStatus,\n ArtifactOpenedEvent,\n ArtifactDeltaEvent,\n ArtifactDoneEvent,\n ArtifactEvent,\n ArtifactState,\n TimelineEvent,\n ArtifactStreamState,\n UseArtifactStreamReturn,\n} from './artifact-stream';\n\n// Timeline History (persisted agent-events dataset queries)\nexport { fetchTimelineHistory, useTimelineHistory } from './timeline-history';\nexport type {\n TimelineHistoryEvent,\n TimelineHistoryOptions,\n UseTimelineHistoryReturn,\n} from './timeline-history';\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// Server clock — deadline math that does not trust the local clock.\nexport {\n serverNow,\n hasServerClock,\n getServerClockOffsetMs,\n getServerClockSyncedAt,\n serverDeadlinePassed,\n serverMsUntil,\n} from './server-clock';\n\nexport { usePinnedItems } from \"./pins\";\nexport type { PinTarget, PinnedItem } from \"./pins\";\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\nexport interface SourceIdentityStorage {\n storage: 'local' | 'session' | 'memory';\n key: string;\n idle_seconds?: number;\n}\n\nexport interface SourceCaptureAdapter {\n type: 'page_view' | 'declared_action' | 'form_receipt';\n observation: string;\n attribute?: string;\n id_property?: string;\n element_property?: string;\n title_property?: string;\n history?: boolean;\n pageshow?: boolean;\n}\n\nexport interface PublicSourceConfig {\n id: string;\n version: number;\n default?: boolean;\n observations: string[];\n identity: {\n visitor: SourceIdentityStorage;\n session: SourceIdentityStorage & { idle_seconds: number };\n };\n source_keys?: {\n query?: string[];\n max_value_length?: number;\n };\n adapters: SourceCaptureAdapter[];\n}\n\ndeclare global {\n interface Window {\n __FSAOS_CONFIG__?: {\n supabaseUrl?: string;\n supabaseAnonKey?: string;\n gatewayUrl?: string;\n scopePath?: string;\n embedToken?: string | (() => Promise<string | null>) | null;\n edgeBaseUrl?: string;\n componentPath?: string;\n /** Source contracts frozen into this exact published release. */\n sources?: PublicSourceConfig[];\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 /** Set enabled:false before SDK load to suppress automatic tracking. */\n tracking?: { enabled?: boolean };\n };\n }\n}\n\nconst CONFIG = (typeof window !== 'undefined' && window.__FSAOS_CONFIG__) || {};\n\nexport const PUBLIC_SOURCES = Array.isArray(CONFIG.sources) ? CONFIG.sources : [];\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, the ANCHOR/MOUNT session model, and\n * domain-scoped session initialization.\n *\n * ⚠️ TERMINOLOGY — NOT the focus primitive. FSAOS has a `focus` system (focus\n * edges + kernel_build_focused_item_context) for attaching ITEMS to a\n * conversation. Unrelated. The session concept here is the ANCHOR.\n *\n * Session model (anchor_mount_spec.md):\n * homeAnchor — the account elected at login. Immutable for the session.\n * mounts[] — the working set: accounts AND spaces, all live, read-write.\n * Persisted as a settings declaration (see mounts.ts).\n * anchor — the current standing mount. Takes defaults: untargeted\n * actions land here; every gatewayCall carries its path as\n * _scope_path, from which the kernel derives the caller's seat\n * (account, or granted-under identity for spaces) and the\n * membership-derived confinement set.\n *\n * Two laws:\n * 1. Membership is the only wall — the client never asserts scope; the\n * kernel derives visibility from member items (+ mount declaration,\n * which narrows, never widens).\n * 2. The target governs every operation — the anchor decides defaults and\n * attribution only.\n *\n * Token flow (unchanged):\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\nimport { supabase, GATEWAY_URL } from './config';\nimport type { SessionEntry } from './types';\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\n/** A mountable/anchorable target: an account or a space the caller belongs to. */\nexport interface MountRef {\n /** os_items id of the account or space item (rename-stable identity). */\n id: string;\n /** VFS path — carried as _scope_path when this mount is the anchor. */\n path: string;\n kind: 'account' | 'space';\n /** Display name for UI grouping. */\n name?: string;\n /** For spaces: the account identity the membership was granted under.\n * Sidebar groups shared spaces by THIS, not by their host account. */\n grantedUnderAccountId?: string;\n}\n\n// ── Token cache (unchanged) ─────────────────────────────────────────────────\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\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\nsetTimeout(() => {\n if (!tokenResolved) {\n tokenResolved = true;\n resolveTokenReady();\n }\n}, 5000);\n\nexport function setCachedToken(token: string, expiresAt?: number): void {\n cachedToken = token;\n tokenExpiresAt = expiresAt ?? Math.floor(Date.now() / 1000) + 3600;\n}\n\nexport function clearCachedToken(): void {\n cachedToken = null;\n tokenExpiresAt = 0;\n}\n\nexport async function getAccessToken(): Promise<string | null> {\n // Embedded-client precedence: when a host app supplies an embed token\n // (string, or async provider for silent refresh), it is authoritative on\n // every lane — HTTP and WS both resolve through here. Embed boots also\n // skip the Supabase auth-event gate entirely (no 5 s wait).\n const cfg =\n (typeof window !== 'undefined' && (window as any).__FSAOS_CONFIG__) || {};\n if (cfg.embedToken) {\n if (typeof cfg.embedToken === 'function') {\n try {\n return (await cfg.embedToken()) ?? null;\n } catch {\n return null;\n }\n }\n return cfg.embedToken as string;\n }\n await tokenReady;\n return cachedToken;\n}\n\n// ── Anchor (current standing mount) — Reactive ──────────────────────────────\n\nlet currentAnchorPath: string | null = null;\nlet currentAnchorRef: MountRef | null = null;\n\n/** Monotonically increasing version counter for anchor changes (useSyncExternalStore). */\nlet anchorVersion = 0;\n\ntype AnchorListener = () => void;\nconst anchorListeners = new Set<AnchorListener>();\n\n/** One-shot gate: resolved when setAnchor() is first called (login election). */\nlet anchorReady: Promise<void>;\nlet resolveAnchorReady: () => void;\nlet anchorResolved = false;\n\nanchorReady = new Promise<void>((resolve) => {\n resolveAnchorReady = resolve;\n});\n\nfunction notifyAnchorListeners(): void {\n anchorVersion++;\n anchorListeners.forEach((listener) => {\n try {\n listener();\n } catch (e) {\n console.warn('[SDK] Anchor listener error:', e);\n }\n });\n}\n\n/**\n * Move the anchor — the current standing mount that takes defaults.\n *\n * Every gatewayCall carries the anchor's path as `_scope_path`; the kernel\n * derives the caller's seat from it (account_item_id for accounts; the\n * granted-under identity for spaces — space-anchoring, 2026-07-10) and applies\n * membership-derived confinement.\n *\n * Anchoring implies mounting: if the ref isn't in the mount set, it is added\n * (in-memory here; mounts.ts persists).\n *\n * Accepts a MountRef (preferred) or a bare path (account paths only — legacy\n * callers during migration).\n */\nexport function setAnchor(ref: MountRef | string): void {\n const path = typeof ref === 'string' ? ref : ref.path;\n const changed = currentAnchorPath !== path || currentAnchorRef?.id !== (typeof ref === 'string' ? undefined : ref.id);\n currentAnchorPath = path;\n currentAnchorRef = typeof ref === 'string' ? null : ref;\n\n if (typeof ref !== 'string' && !mountSet.some((m) => m.id === ref.id)) {\n mountSet = [...mountSet, ref];\n notifyMountListeners();\n }\n\n if (!anchorResolved) {\n anchorResolved = true;\n resolveAnchorReady();\n }\n\n if (changed) {\n notifyAnchorListeners();\n }\n}\n\n/** The anchor's VFS path, or null before login election. */\nexport function getAnchor(): string | null {\n return currentAnchorPath;\n}\n\n/** The anchor's full MountRef when known (set via setAnchor(ref)). */\nexport function getAnchorRef(): MountRef | null {\n return currentAnchorRef;\n}\n\nexport function getAnchorVersion(): number {\n return anchorVersion;\n}\n\nexport function subscribeAnchor(listener: AnchorListener): () => void {\n anchorListeners.add(listener);\n return () => { anchorListeners.delete(listener); };\n}\n\nexport function awaitAnchorReady(): Promise<void> {\n return anchorReady;\n}\n\nexport function isAnchorReady(): boolean {\n return anchorResolved;\n}\n\n// ── Home anchor (login-elected; immutable for the session) ──────────────────\n\nlet homeAnchor: MountRef | null = null;\n\n/**\n * Elect the home anchor at login. Sets the anchor to it as well.\n * Calling twice in one session is a programming error (logout re-elects).\n */\nexport function electHomeAnchor(ref: MountRef, options: { activate?: boolean } = {}): void {\n if (homeAnchor) {\n console.warn('[SDK] electHomeAnchor called twice; ignoring (logout to re-elect).');\n return;\n }\n homeAnchor = ref;\n // Workspace bootstrap can elect its internal account without briefly\n // releasing gated work queries at that account before the Space restores.\n if (options.activate !== false) setAnchor(ref);\n}\n\nexport function getHomeAnchor(): MountRef | null {\n return homeAnchor;\n}\n\n// ── Mounts (the working set) ────────────────────────────────────────────────\n// In-memory state + subscriptions. Persistence (the settings declaration) and\n// membership-validated mutation live in mounts.ts to avoid an import cycle\n// with client.ts.\n\nlet mountSet: MountRef[] = [];\n\ntype MountListener = () => void;\nconst mountListeners = new Set<MountListener>();\nlet mountVersion = 0;\n\nfunction notifyMountListeners(): void {\n mountVersion++;\n mountListeners.forEach((l) => {\n try {\n l();\n } catch (e) {\n console.warn('[SDK] Mount listener error:', e);\n }\n });\n}\n\nexport function getMounts(): MountRef[] {\n return mountSet;\n}\n\nexport function getMountVersion(): number {\n return mountVersion;\n}\n\nexport function subscribeMounts(listener: MountListener): () => void {\n mountListeners.add(listener);\n return () => { mountListeners.delete(listener); };\n}\n\n/** Replace the mount set (used by mounts.ts when loading the declaration). */\nexport function setMountsState(mounts: MountRef[]): void {\n mountSet = mounts;\n notifyMountListeners();\n}\n\n/** Publish a confirmed workspace change atomically, before notifying readers. */\nexport function commitMountSelection(mounts: MountRef[], anchor: MountRef): void {\n const mountsChanged = JSON.stringify(mountSet) !== JSON.stringify(mounts);\n const anchorChanged = currentAnchorPath !== anchor.path || currentAnchorRef?.id !== anchor.id;\n mountSet = mounts;\n currentAnchorPath = anchor.path;\n currentAnchorRef = anchor;\n if (!anchorResolved) {\n anchorResolved = true;\n resolveAnchorReady();\n }\n if (mountsChanged) notifyMountListeners();\n if (anchorChanged) notifyAnchorListeners();\n}\n\n/** Add to the mount set (in-memory; mounts.ts persists). */\nexport function addMountState(ref: MountRef): void {\n if (mountSet.some((m) => m.id === ref.id)) return;\n mountSet = [...mountSet, ref];\n notifyMountListeners();\n}\n\n/**\n * Remove from the mount set (in-memory; mounts.ts persists).\n * Unmounting the anchor moves the anchor to the home anchor.\n */\nexport function removeMountState(id: string): void {\n const removed = mountSet.find((m) => m.id === id);\n if (!removed) return;\n mountSet = mountSet.filter((m) => m.id !== id);\n notifyMountListeners();\n if (currentAnchorRef?.id === id && homeAnchor) {\n setAnchor(homeAnchor);\n }\n}\n\n// ── Session (domain-scoped) — unchanged ─────────────────────────────────────\n\nlet sessionEntry: SessionEntry | null = null;\nlet sessionPromise: Promise<SessionEntry> | null = null;\nlet sessionGeneration = 0;\n\n/** Internal identity epoch: pending requests cannot cross a session reset. */\nexport function getSessionGeneration(): number { return sessionGeneration; }\n\nexport async function initSession(): Promise<SessionEntry> {\n if (sessionEntry) return sessionEntry;\n if (sessionPromise) return sessionPromise;\n\n const generation = sessionGeneration;\n sessionPromise = (async () => {\n const hostname = getHostname();\n const token = await getAccessToken();\n if (generation !== sessionGeneration) throw new Error('Session changed during initialization');\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 if (generation !== sessionGeneration) throw new Error('Session changed during initialization');\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 // Present only on the seated path (a bearer was sent). The anonymous\n // resolver has no principal and omits the field entirely.\n principal_id: entry.principal_id || null,\n };\n\n return sessionEntry;\n })().catch(error => {\n if (generation === sessionGeneration) sessionPromise = null;\n throw error;\n });\n\n return sessionPromise;\n}\n\nexport function getSessionEntry(): SessionEntry | null {\n return sessionEntry;\n}\n\nexport function clearSession(): void {\n sessionGeneration++;\n sessionEntry = null;\n sessionPromise = null;\n currentAnchorPath = null;\n currentAnchorRef = null;\n homeAnchor = null;\n mountSet = [];\n}\n\n// ── Full SDK Reset ──────────────────────────────────────────────────────────\n\ntype CleanupFn = () => void;\nconst cleanupRegistry: CleanupFn[] = [];\n\nexport function registerCleanup(fn: CleanupFn): void {\n cleanupRegistry.push(fn);\n}\n\nexport function resetAllSdkState(): void {\n // 1. Clear session + anchor/mount state\n clearSession();\n\n // 2. Clear token cache\n clearCachedToken();\n\n // 3. Reset the anchor gate so next login must re-elect\n resolveAnchorReady(); // release old callers so their identity guard can reject\n anchorResolved = false;\n anchorReady = new Promise<void>((resolve) => {\n resolveAnchorReady = resolve;\n });\n notifyAnchorListeners();\n notifyMountListeners();\n\n // 4. Run all registered module cleanups\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\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// ── DEPRECATED compile-compat shims — DELETED in the hooks.ts migration ────\n// commit on this branch. Do not add new callers. (anchor_mount_spec.md: no\n// aliases in the merged result; these exist only between commits.)\n\n/** @deprecated use setAnchor */\nexport const setScope = setAnchor as (scopePath: string) => void;\n/** @deprecated use getAnchor */\nexport const getScope = getAnchor;\n/** @deprecated use getAnchorVersion */\nexport const getScopeVersion = getAnchorVersion;\n/** @deprecated use subscribeAnchor */\nexport const subscribeScope = subscribeAnchor;\n/** @deprecated use awaitAnchorReady */\nexport const awaitScopeReady = awaitAnchorReady;\n/** @deprecated use isAnchorReady */\nexport const isScopeReady = isAnchorReady;\n","/**\n * Server clock offset.\n *\n * Deadlines that matter (a drive lease's `active_session.expires_at`, a work\n * ticket's lease, anything the kernel enforces) are absolute SERVER timestamps.\n * Comparing them to `Date.now()` is wrong by exactly the client's clock skew —\n * and refetching does NOT correct that, because the deadline is identical on\n * every fetch while the local clock stays equally wrong. A machine three\n * minutes fast reads a four-minute lease as one minute long, permanently.\n *\n * The `read` syscall returns `server_now`. Every gateway response carrying it\n * updates the offset here, so `serverNow()` is the client's best estimate of\n * the server's clock without trusting the local one.\n *\n * Accuracy is bounded by request latency (the offset is measured against the\n * moment the response was parsed, so it lags by roughly the response leg).\n * Sub-second against leases measured in minutes.\n */\n\nlet offsetMs = 0;\nlet haveOffset = false;\nlet lastSyncedAt = 0;\n\n/** Record an offset from a response that carried `server_now`. Internal. */\nexport function recordServerNow(serverNowIso: unknown): void {\n if (typeof serverNowIso !== 'string') return;\n const parsed = Date.parse(serverNowIso);\n if (Number.isNaN(parsed)) return;\n offsetMs = parsed - Date.now();\n haveOffset = true;\n lastSyncedAt = Date.now();\n}\n\n/** Server time estimate in ms since epoch. Falls back to local time. */\nexport function serverNow(): number {\n return Date.now() + offsetMs;\n}\n\n/**\n * Has the offset ever been measured? Callers gating on a server deadline\n * should treat `false` as \"fall back to a conservative local check\" rather\n * than assuming the offset is zero.\n */\nexport function hasServerClock(): boolean {\n return haveOffset;\n}\n\n/** Current offset in ms (server minus client). Diagnostics. */\nexport function getServerClockOffsetMs(): number {\n return offsetMs;\n}\n\n/** When the offset was last measured, in local ms. 0 = never. */\nexport function getServerClockSyncedAt(): number {\n return lastSyncedAt;\n}\n\n/**\n * Has a server deadline passed? The single call sites should use.\n * Returns `null` when the deadline is absent or unparseable, so callers can\n * distinguish \"no deadline\" from \"expired\".\n */\nexport function serverDeadlinePassed(deadlineIso: unknown): boolean | null {\n if (typeof deadlineIso !== 'string') return null;\n const deadline = Date.parse(deadlineIso);\n if (Number.isNaN(deadline)) return null;\n return serverNow() >= deadline;\n}\n\n/** Ms remaining until a server deadline; null if absent, 0 if passed. */\nexport function serverMsUntil(deadlineIso: unknown): number | null {\n if (typeof deadlineIso !== 'string') return null;\n const deadline = Date.parse(deadlineIso);\n if (Number.isNaN(deadline)) return null;\n return Math.max(0, deadline - serverNow());\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 parameters automatically.\n *\n * ANCHOR GATING:\n * gatewayCall awaits `anchorReady` before sending any request that doesn't\n * already have an explicit `_scope_path`. This prevents race conditions where\n * hooks fire before login election completes.\n *\n * Every call carries the ANCHOR's path as `_scope_path` (unless the caller\n * explicitly targets another mount — the target governs the operation). The\n * kernel derives the caller's seat from it: account_item_id for account\n * anchors, the granted-under identity for space anchors (space-anchoring,\n * 2026-07-10), then applies membership-derived confinement\n * (kernel_caller_confinement — mounts declaration narrows, never widens).\n */\n\nimport { GATEWAY_URL } from './config';\nimport { EnforcementDeniedError } from './enforcement';\nimport { getAccessToken, getHostname, getSessionEntry, getAnchor, awaitAnchorReady, getSessionGeneration } from './session';\nimport type { GatewayParams, GatewayResponse, EnforcementPayload } from './types';\nimport { recordServerNow } from './server-clock';\n\n/**\n * Methods that can execute without the anchor being set.\n * These are bootstrap/auth methods needed before login election.\n */\nconst ANCHOR_INDEPENDENT_METHODS = new Set([\n 'list-memberships',\n 'init',\n]);\n\nexport class GatewayRequestError extends Error {\n public readonly name = 'GatewayRequestError';\n public readonly method: string;\n public readonly status: number;\n public readonly statusText: string;\n public readonly payload: GatewayResponse | null;\n public readonly responseBody: string;\n\n constructor(options: {\n method: string;\n status: number;\n statusText: string;\n payload: GatewayResponse | null;\n responseBody: string;\n }) {\n const code = typeof options.payload?.error === 'string'\n ? options.payload.error.trim()\n : '';\n const detail = typeof options.payload?.message === 'string'\n ? options.payload.message.trim()\n : '';\n const fallback = options.responseBody.trim()\n || `Gateway HTTP error: ${options.status} ${options.statusText}`.trim();\n const message = code && detail\n ? `${code}: ${detail}`\n : detail || code || fallback;\n\n super(message);\n this.method = options.method;\n this.status = options.status;\n this.statusText = options.statusText;\n this.payload = options.payload;\n this.responseBody = options.responseBody;\n }\n}\n\nexport async function gatewayCall(\n method: string,\n params: GatewayParams = {},\n): Promise<GatewayResponse> {\n const generation = getSessionGeneration();\n const requestedAnchor = getAnchor();\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 (generation !== getSessionGeneration()) throw new Error('Session changed before gateway request');\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n // Gate anchor-dependent calls until login election establishes the anchor.\n // Anchor-independent methods and calls with an explicit _scope_path bypass.\n if (!ANCHOR_INDEPENDENT_METHODS.has(method) && !params._scope_path) {\n await awaitAnchorReady();\n }\n if (generation !== getSessionGeneration()) throw new Error('Session changed before gateway request');\n\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 // Carry the anchor as _scope_path unless the caller explicitly targeted\n // another mount (the target governs the operation).\n const anchorPath = requestedAnchor ?? getAnchor();\n if (!enrichedParams._scope_path && anchorPath) {\n enrichedParams._scope_path = anchorPath;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ method, params: enrichedParams }),\n });\n\n // Read once before branching on status. Gateway failures are JSON envelopes,\n // and throwing on `response.ok` first used to discard their error code,\n // message and details — leaving consumers with only \"HTTP 500\".\n const responseBody = await response.text();\n if (generation !== getSessionGeneration()) throw new Error('Session changed during gateway request');\n let json: GatewayResponse | null = null;\n if (responseBody) {\n try {\n json = JSON.parse(responseBody) as GatewayResponse;\n } catch {\n // Preserve the raw body on GatewayRequestError below.\n }\n }\n\n if (!response.ok || !json) {\n throw new GatewayRequestError({\n method,\n status: response.status,\n statusText: response.statusText,\n payload: json,\n responseBody,\n });\n }\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 GatewayRequestError({\n method,\n status: response.status,\n statusText: response.statusText,\n payload: json,\n responseBody,\n });\n }\n\n // Any response carrying server_now updates the clock offset. Capturing it\n // here rather than in fetchVfsItem means every syscall that returns it keeps\n // the offset fresh, and no consumer has to remember to do it.\n if (json && (json as any).server_now !== undefined) {\n recordServerNow((json as any).server_now);\n }\n\n return json;\n}\n","/**\n * @fsaos/gateway — refresh without restarting a running load\n *\n * React Query's `invalidateQueries` defaults to `cancelRefetch: true`: a\n * refresh that lands while a load is running abandons that load and starts\n * another. The SDK's loaders are gateway calls with no abort signal, so the\n * abandoned request keeps going anyway — a burst of change notices during one\n * slow load turns into a stack of full loads running side by side.\n *\n * `refreshQuery` joins a running load instead. A change that lands while a\n * matching load is running may not be in that load's answer, so exactly one\n * reload is queued for when it settles; every further change before then\n * joins that same reload. With nothing running it refreshes at once.\n */\n\nimport type { QueryClient, QueryKey } from '@tanstack/react-query';\n\nconst trailing = new WeakMap<QueryClient, Map<string, Promise<void>>>();\n\nexport function refreshQuery(\n client: QueryClient,\n queryKey: QueryKey,\n options: { exact?: boolean } = {},\n): Promise<void> {\n const exact = options.exact === true;\n const refresh = () => client.invalidateQueries({ queryKey, exact }, { cancelRefetch: false });\n const running = client\n .getQueryCache()\n .findAll({ queryKey, exact, fetchStatus: 'fetching' })\n .flatMap((query) => (query.promise ? [query.promise] : []));\n if (running.length === 0) return refresh();\n\n const hash = `${exact ? '=' : '^'}${JSON.stringify(queryKey)}`;\n let queued = trailing.get(client);\n if (!queued) {\n queued = new Map();\n trailing.set(client, queued);\n }\n const pending = queued.get(hash);\n if (pending) return pending;\n const queue = queued;\n const next = Promise.allSettled(running).then(() => {\n queue.delete(hash);\n return refresh();\n });\n queue.set(hash, next);\n return next;\n}\n\n/** True when `path` is the channel itself or lies beneath it — never a\n * sibling that merely shares its prefix (`/c/general-2` is not under\n * `/c/general`). */\nexport function isChannelPath(path: unknown, channelPath: string): boolean {\n return typeof path === 'string' && (path === channelPath || path.startsWith(`${channelPath}/`));\n}\n","import type { Query, QueryClient, QueryKey } from '@tanstack/react-query';\nimport { refreshQuery } from './query-refresh';\n\nconst pending = new WeakMap<QueryClient, Map<string, ReturnType<typeof setTimeout>>>();\nconst enabled = (query: Query) => query.meta?.arrangementRealtime === true;\n\n/** One coalesced refresh per shared arrangement cache, including local writes. */\nexport function refreshArrangement(client: QueryClient, key: QueryKey): void {\n const query = client.getQueryCache().find({ queryKey: key, exact: true });\n if (!query) return;\n let timers = pending.get(client);\n if (!timers) { timers = new Map(); pending.set(client, timers); }\n const previous = timers.get(query.queryHash);\n if (previous) clearTimeout(previous);\n timers.set(query.queryHash, setTimeout(() => {\n timers.delete(query.queryHash);\n if (client.getQueryCache().get(query.queryHash) !== query) return;\n void refreshQuery(client, key, { exact: true });\n }, 250));\n}\n\nexport function handleArrangementChange(client: QueryClient, event: Record<string, any>): void {\n if (!event || typeof event !== 'object') return;\n for (const query of client.getQueryCache().getAll()) {\n if (!enabled(query)) continue;\n const data = query.state.data as any;\n if (!data?.item_id) continue;\n const matches = (id: string, path: string) => Boolean(\n (id && event.item_id === id) || (path && (event.path === path || event.old_path === path)),\n );\n if (matches(data.item_id, data.item_path)\n || event.parent_id === data.item_id || event.old_parent_id === data.item_id\n || [event.path, event.old_path].some(path => typeof path === 'string' && path.slice(0, path.lastIndexOf('/')) === data.item_path)\n || data.resolved_children?.some((child: any) => matches(child.id, child.symlink_path || child.path)\n || (child.target && matches(child.target.id, child.target.path)))) {\n refreshArrangement(client, query.queryKey);\n }\n }\n}\n\nexport function reconnectArrangements(client: QueryClient): void {\n for (const query of client.getQueryCache().getAll()) {\n if (enabled(query) && query.state.data !== undefined) refreshArrangement(client, query.queryKey);\n }\n}\n\nexport function clearArrangementRefreshes(client: QueryClient): void {\n pending.get(client)?.forEach(clearTimeout);\n pending.delete(client);\n}\n","/**\n * @fsaos/gateway — Query Client\n *\n * Holds the TanStack QueryClient used by the SDK's imperative cache\n * operations (invalidation helpers, realtime handlers, mutation cache\n * writes, signOut cleanup) and by `mount()` for VFS-bundled components.\n *\n * Two ownership modes:\n *\n * 1. Default (dumb shells, VFS-bundled components): nobody injects a\n * client, so `getQueryClient()` lazily creates one with VFS-tuned\n * defaults and every SDK consumer on the page shares it.\n *\n * 2. Host-owned (rich apps with their own React Query setup): the host\n * calls `setQueryClient(hostClient)` at boot, BEFORE rendering, and\n * all SDK cache operations act on the host's cache — so SDK hooks\n * (which bind to the host's provider via React context) and SDK\n * invalidation finally agree on which cache is real.\n *\n * Default options (mode 1) are tuned for VFS data:\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';\nimport { registerCleanup } from './session';\n\nlet client: QueryClient | null = null;\nregisterCleanup(() => {\n // UUID-keyed and membership caches must not outlive the authenticated user.\n // Host application queries are outside the SDK's ownership.\n if (!client) return;\n void client.cancelQueries({ queryKey: ['vfs'] });\n client.removeQueries({ queryKey: ['vfs'] });\n});\n\n/**\n * Inject the host application's QueryClient. Call once at startup, before\n * any SDK hook renders or realtime subscription starts. Throws if the SDK\n * has already created (or been given) a client, because queries cached in\n * the earlier client would be stranded.\n */\nexport function setQueryClient(custom: QueryClient): void {\n if (client && client !== custom) {\n throw new Error(\n '[fsaos-gateway-sdk] setQueryClient() called after a QueryClient was ' +\n 'already in use. Inject the host client before rendering or starting ' +\n 'realtime subscriptions.',\n );\n }\n client = custom;\n}\n\n/**\n * The QueryClient all SDK cache operations act on. Lazily creates the\n * default (mode 1) if no host client was injected.\n */\nexport function getQueryClient(): QueryClient {\n if (!client) {\n client = 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 return client;\n}\n\n/**\n * @deprecated Import `getQueryClient()` instead. Kept for backward\n * compatibility as a lazy proxy: property access resolves against the\n * current client, so it follows host injection instead of pinning the\n * client that existed at module-evaluation time. (An eager\n * `= getQueryClient()` here would create the default client on import and\n * make every later `setQueryClient()` call throw.)\n */\nexport const queryClient: QueryClient = new Proxy({} as QueryClient, {\n get(_target, prop, _receiver) {\n const real = getQueryClient() as unknown as Record<PropertyKey, unknown>;\n const value = real[prop];\n return typeof value === 'function' ? (value as (...a: unknown[]) => unknown).bind(real) : value;\n },\n});\n","import type { Query, QueryClient } from '@tanstack/react-query';\nimport type { ItemsFilter } from './vfs';\nimport { isChannelPath, refreshQuery } from './query-refresh';\n\n// Query metadata, not a second data cache. The existing WebSocket event\n// listener owns refreshes, once per cached query rather than once per hook.\nexport interface InfiniteItemsRealtimeMeta extends Record<string, unknown> {\n infiniteItemsRealtime?: { filter: ItemsFilter };\n}\n\nconst pending = new WeakMap<QueryClient, Map<string, ReturnType<typeof setTimeout>>>();\n\nfunction listingFilter(query: Query): ItemsFilter | undefined {\n return (query.meta as InfiniteItemsRealtimeMeta | undefined)?.infiniteItemsRealtime?.filter;\n}\n\nfunction containsChangedItem(query: Query, event: Record<string, any>): boolean {\n const pages = (query.state.data as { pages?: { items?: { id: string; path: string }[] }[] } | undefined)?.pages;\n return pages?.some(page => page.items?.some(item =>\n (event.item_id && item.id === event.item_id)\n || (event.path && item.path === event.path)\n || (event.old_path && item.path === event.old_path),\n )) ?? false;\n}\n\n/** Item types a listing can hold; null = any type (a group names none). */\nfunction listingTypes(filter: ItemsFilter): Set<string> | null {\n if (filter.type) return new Set([filter.type]);\n if (!filter.any_of?.length) return null;\n const types = new Set<string>();\n for (const group of filter.any_of) {\n if (!group.item_type) return null;\n types.add(group.item_type);\n }\n return types;\n}\n\nfunction affectsListing(query: Query, filter: ItemsFilter, event: Record<string, any>): boolean {\n // A loaded item may have been moved out, deleted or changed type. Its old\n // cache identity is sufficient even when the event carries only NEW fields.\n if (containsChangedItem(query, event)) return true;\n\n // Account streams also carry unselected Spaces. Known unrelated ownership\n // must not refresh this selection. Retain moved-out cached items above and\n // unknown/legacy payload handling below rather than guessing their origin.\n if (filter.spaceIds !== undefined) {\n if (!filter.spaceIds.length) return false;\n if (event.space_item_id !== undefined\n && !filter.spaceIds.includes(event.space_item_id)\n && !filter.spaceIds.includes(event.old_space_item_id)) return false;\n }\n\n // With no explicit scope, the kernel can include mounted accounts/spaces;\n // the cache's anchor namespace is not a path confinement boundary.\n const scope = filter.scope;\n const scoped = typeof scope === 'string' && scope !== '__unscoped__';\n const hasPath = typeof event.path === 'string' || typeof event.old_path === 'string';\n if (scoped && hasPath && !isChannelPath(event.path, scope) && !isChannelPath(event.old_path, scope)) return false;\n\n // Kernel listings also resolve symlinks within their scope. A link change\n // can affect the listing even though the link is not the requested type.\n if (event.item_type === 'symlink' && scoped && hasPath) return true;\n const types = listingTypes(filter);\n if (event.item_type && types && !types.has(event.item_type)) return false;\n\n if (filter.parent_id && event.parent_id !== undefined) {\n if (event.parent_id !== filter.parent_id && event.old_parent_id !== filter.parent_id) return false;\n }\n\n // Do not turn a malformed notification into a refresh of every open query.\n return hasPath || Boolean(filter.parent_id && event.parent_id === filter.parent_id);\n}\n\nfunction schedule(client: QueryClient, query: Query): void {\n let timers = pending.get(client);\n if (!timers) { timers = new Map(); pending.set(client, timers); }\n const previous = timers.get(query.queryHash);\n if (previous) clearTimeout(previous);\n timers.set(query.queryHash, setTimeout(() => {\n timers.delete(query.queryHash);\n if (client.getQueryCache().get(query.queryHash) !== query || !listingFilter(query)) return;\n // Inactive queries are only marked stale. Opening them later performs one\n // normal SDK load; a closed channel never does background database work.\n void refreshQuery(client, query.queryKey, { exact: true });\n }, 500));\n}\n\nexport function handleInfiniteItemsChange(client: QueryClient, event: Record<string, any>): void {\n if (!event || typeof event !== 'object') return;\n for (const query of client.getQueryCache().getAll()) {\n const filter = listingFilter(query);\n if (filter && affectsListing(query, filter, event)) schedule(client, query);\n }\n}\n\nexport function refreshInfiniteItemsAfterReconnect(client: QueryClient): void {\n for (const query of client.getQueryCache().getAll()) {\n if (listingFilter(query) && query.state.data !== undefined) schedule(client, query);\n }\n}\n\nexport function clearInfiniteItemsRefreshes(client: QueryClient): void {\n pending.get(client)?.forEach(clearTimeout);\n pending.delete(client);\n}\n","import type { ItemsFilter } from './vfs';\nimport { GatewayRequestError } from './client';\nimport { EnforcementDeniedError } from './enforcement';\n\nexport class SelectedSpaceContractError extends Error {\n constructor() { super('The server did not confirm the selected-Space listing contract'); }\n}\n\nexport function assertItemsSelection(requested: string[], returned: unknown): void {\n if (!Array.isArray(returned) || returned.some(id => typeof id !== 'string')\n || JSON.stringify([...new Set(returned)].sort()) !== JSON.stringify(requested)) {\n throw new SelectedSpaceContractError();\n }\n}\n\n/** A selected set has one cache identity regardless of checkbox order. */\nexport function normalizeItemsSelection<T extends ItemsFilter | null | undefined>(filter: T): T {\n if (!filter || filter.spaceIds === undefined) return filter;\n return { ...filter, spaceIds: [...new Set(filter.spaceIds.map(id => id.toLowerCase()))].sort(),\n ...(filter.limit !== undefined ? { limit: Math.max(1, Math.min(filter.limit, 500)) } : {}),\n } as T;\n}\n\n/** Permission failures must not leave a previously loaded selection visible. */\nexport function unavailableItemsSelection(error: unknown): boolean {\n return error instanceof SelectedSpaceContractError || error instanceof EnforcementDeniedError\n || error instanceof GatewayRequestError && (\n error.payload?.error === 'SPACE_SELECTION_UNAVAILABLE'\n || error.payload?.error === 'QUERY_PARAMS_INVALID'\n || error.status === 401 || error.status === 403\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';\nimport { normalizeItemsSelection } from './items-selection';\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(normalizeItemsSelection(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(), 'get-activity-feed', a, b, c] as const,\n\n /** Item versions (scope-independent — by item UUID). */\n itemVersions: (a: string, b: string, c: string, d: string) =>\n ['vfs', 'item-versions', a, b, c, d] as const,\n\n /** @deprecated Use itemVersions instead. */\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","import { handleArrangementChange, reconnectArrangements, clearArrangementRefreshes } from './arrangement-realtime';\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';\nimport { getQueryClient } from './query-client';\nimport { handleInfiniteItemsChange, refreshInfiniteItemsAfterReconnect, clearInfiniteItemsRefreshes } from './item-query-realtime';\nimport { vfsKeys } from './vfs-keys';\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// Distinguishes a first connection from a reconnect. Only a reconnect implies\n// a gap in the event stream, and only a gap justifies refetching.\nlet hasConnectedBefore = false;\n\n// ── Ping / Visibility Lifecycle ──────────────────────────────────────────────\n\nconst PING_INTERVAL_MS = 30_000; // 30 seconds\n// Liveness: a socket dropped by a proxy/NAT stays readyState OPEN forever\n// (\"half-open\") — pings go into the void and no close event ever fires, so\n// ensureConnection sees \"already open\" and never reconnects. Track inbound\n// traffic (any frame, incl. pong) and force-close when two ping intervals\n// pass with total silence; onclose then drives the normal reconnect path.\nconst LIVENESS_TIMEOUT_MS = PING_INTERVAL_MS * 2 + 5_000;\nlet lastInboundAt = 0;\nlet pingInterval: ReturnType<typeof setInterval> | null = null;\nlet visibilityListenerAttached = false;\n\nfunction startPing(): void {\n stopPing();\n lastInboundAt = Date.now();\n pingInterval = setInterval(() => {\n if (\n ws &&\n ws.readyState === WebSocket.OPEN &&\n Date.now() - lastInboundAt > LIVENESS_TIMEOUT_MS\n ) {\n log('ping: no inbound traffic for', Date.now() - lastInboundAt, 'ms — closing half-open socket');\n try {\n ws.close(4000, 'liveness timeout');\n } catch (_e) {\n /* onclose still fires */\n }\n return; // onclose → scheduleReconnect with fresh token + resubscribeAll\n }\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/**\n * Match the gateway's VFS routing semantics exactly: a path subscription owns\n * the item at that path and every descendant, but never a similarly-prefixed\n * sibling (`/chat/revven` must not match `/chat/revven-agent`).\n *\n * This is what makes both supported stream levels work on one socket:\n * channel subscribers receive descendant thread events, while a thread-root\n * subscriber receives only events from that thread.\n */\nexport function pathSubscriptionMatches(\n subscribedPath: string,\n eventPath: string,\n): boolean {\n const subscribed = subscribedPath.replace(/\\/+$/, '');\n const event = eventPath.replace(/\\/+$/, '');\n if (!subscribed || !event) return subscribed === event;\n return event === subscribed || event.startsWith(`${subscribed}/`);\n}\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 ScopeLease {\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 scopeLeases: Map<string, Map<symbol, ScopeLease>> = new Map();\nconst activePaths: Map<string, PathSubscription> = new Map();\n\nfunction scopeEventTypes(scopeId: string): string[] {\n const leases = scopeLeases.get(scopeId);\n if (!leases) return [];\n return Array.from(\n new Set(Array.from(leases.values()).flatMap((lease) => lease.event_types)),\n ).sort();\n}\n\nfunction sameEventTypes(a: string[] | undefined, b: string[]): boolean {\n if (!a) return false;\n return a.length === b.length\n && a.every((eventType, index) => eventType === b[index]);\n}\n\nfunction refreshScopeSubscription(scopeId: string): ScopeSubscription | null {\n const eventTypes = scopeEventTypes(scopeId);\n if (eventTypes.length === 0) {\n activeScopes.delete(scopeId);\n return null;\n }\n const subscription = { scope_id: scopeId, event_types: eventTypes };\n activeScopes.set(scopeId, subscription);\n return subscription;\n}\n\n// ── Path subscription readiness (2026-08-29) ─────────────────────────────────\n// The gateway acks every subscribe_path with {type:'subscribed_path', path},\n// but those acks were discarded. Until the ack arrives the server-side\n// subscription may not exist yet — a fast agent reply emitted inside that gap\n// streams to nobody, and the UI only learns of it when transcript polling\n// shows the completed message all at once. Track per-path wire state so a\n// caller can hold a turn dispatch until the stream is actually listening.\nexport type PathSubscriptionState =\n | 'pending' // subscribe_path sent (or queued for connect), ack not yet seen\n | 'ready' // gateway acknowledged; events for this path will be delivered\n | 'disconnected'; // socket dropped since the last ack; resubscribe pending\n\nconst pathStates: Map<string, PathSubscriptionState> = new Map();\nconst pathReadyWaiters: Map<string, Array<() => void>> = new Map();\n\nexport type ConnectionState = 'connecting' | 'connected' | 'disconnected';\nlet connectionState: ConnectionState = 'disconnected';\nconst connectionListeners: Array<(s: ConnectionState) => void> = [];\n\nfunction setConnectionState(s: ConnectionState): void {\n if (connectionState === s) return;\n connectionState = s;\n for (const cb of [...connectionListeners]) {\n try {\n cb(s);\n } catch (_e) {\n /* listener errors must not break the transport */\n }\n }\n}\n\nfunction markPathReady(path: string): void {\n pathStates.set(path, 'ready');\n const waiters = pathReadyWaiters.get(path);\n if (waiters) {\n pathReadyWaiters.delete(path);\n for (const w of waiters) w();\n }\n}\n\nfunction markAllPathsDisconnected(): void {\n for (const key of pathStates.keys()) pathStates.set(key, 'disconnected');\n}\n\n/** Single choke point for subscribe_path frames: state moves to 'pending'\n * exactly when a frame goes on the wire (or is queued for the next connect). */\nfunction sendPathSubscribe(path: string, eventTypes: string[]): void {\n pathStates.set(path, 'pending');\n sendMessage({ type: 'subscribe_path', path, event_types: eventTypes });\n}\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\n // Resolve auth token — getAccessToken() is the single authority\n // (embed token, string or provider, takes precedence there).\n const token = await getAccessToken();\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 setConnectionState('connecting');\n ws = new WebSocket(wsUrl);\n // [2026-08-29] Stale-socket guard: handlers below belong to THIS socket.\n // Without the identity check, a dying socket's late onclose could null\n // out and reconnect over a newer, healthy connection.\n const socket = ws;\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 if (ws !== socket) return;\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 socket.onopen = () => {\n if (ws !== socket) return;\n clearTimeout(timeout);\n log('ensureConnection: CONNECTED');\n // Capture BEFORE the reset: a reconnect means events were missed\n // while the socket was down, so the cache for subscribed paths is\n // not trustworthy. A first connection has missed nothing.\n const isReconnect = hasConnectedBefore;\n hasConnectedBefore = true;\n reconnectAttempts = 0;\n setConnectionState('connected');\n // Re-subscribe to all active scopes and paths\n resubscribeAll(isReconnect);\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 socket.onmessage = (event) => {\n if (ws !== socket) return;\n handleMessage(event.data);\n };\n\n socket.onerror = () => {\n log('ensureConnection: WS error event');\n // Error is followed by close, so we handle reconnect there\n };\n\n socket.onclose = (event) => {\n clearTimeout(timeout);\n if (ws !== socket) {\n // A superseded socket closing must not touch live state.\n return;\n }\n log('ensureConnection: WS closed, code:', event.code, 'reason:', event.reason);\n ws = null;\n stopPing();\n markAllPathsDisconnected();\n setConnectionState('disconnected');\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(isReconnect = false): 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 sendPathSubscribe(sub.path, sub.event_types);\n }\n // Catch up on what was missed while the socket was down. Item caches hold\n // indefinitely (staleTime: Infinity) precisely BECAUSE events keep them\n // fresh; when the event stream had a gap, that guarantee lapsed for exactly\n // these paths. Scoped to active subscriptions, so this costs one refetch per\n // thing actually on screen, and only on a genuine reconnect.\n if (!isReconnect) return;\n try {\n const qc = getQueryClient();\n refreshInfiniteItemsAfterReconnect(qc);\n reconnectArrangements(qc);\n for (const sub of activePaths.values()) {\n void qc.invalidateQueries({ queryKey: vfsKeys.item(sub.path) });\n void qc.invalidateQueries({ queryKey: vfsKeys.children(sub.path) });\n }\n log('resubscribeAll: invalidated', activePaths.size, 'paths after reconnect');\n } catch (err) {\n // A missing query client must never break reconnection itself.\n log('resubscribeAll: cache invalidation skipped', err);\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 lastInboundAt = Date.now();\n try {\n const msg = JSON.parse(raw);\n\n // Ack for a path subscription: this is the moment the stream is actually\n // listening. Everything the readiness API promises hangs off this frame.\n if (msg.type === 'subscribed_path') {\n if (typeof msg.path === 'string') markPathReady(msg.path);\n return;\n }\n\n // Other protocol-level messages (ack, error, pong)\n if (msg.type === 'subscribed' ||\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 // One cache refresh decision per event, independent of how many React\n // consumers render the same listing. Reuse this account/path transport;\n // filtered listings do not install another subscription or connection.\n if (eventType === 'vfs_change') {\n handleInfiniteItemsChange(getQueryClient(), data);\n handleArrangementChange(getQueryClient(), data);\n }\n\n // Path-based dispatch mirrors the gateway's boundary-aware hierarchy.\n // The server may route a descendant thread event to a channel-level\n // subscriber; dispatching only by exact event.path silently dropped it\n // once streams became correctly addressed to their thread roots.\n if (typeof data.path === 'string') {\n for (const [subscribedPath, listeners] of Object.entries(pathListeners)) {\n if (subscribedPath === '*') continue;\n if (!pathSubscriptionMatches(subscribedPath, data.path)) continue;\n listeners.forEach((cb) => cb(data));\n }\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 sends\n // it on connect — either way the wire state starts as 'pending'.\n if (ws && ws.readyState === WebSocket.OPEN) {\n sendPathSubscribe(path, ['token_stream']);\n } else {\n pathStates.set(path, 'pending');\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 pathStates.delete(path);\n pathReadyWaiters.delete(path); // stragglers resolve false via their timeout\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 const leaseId = Symbol(scopeId);\n const normalizedEventTypes = Array.from(new Set(eventTypes)).sort();\n // Preserve the existing no-op semantics for an explicitly empty event list.\n if (normalizedEventTypes.length === 0) return () => {};\n\n const leases = scopeLeases.get(scopeId) ?? new Map<symbol, ScopeLease>();\n const previousEventTypes = activeScopes.get(scopeId)?.event_types;\n leases.set(leaseId, { event_types: normalizedEventTypes });\n scopeLeases.set(scopeId, leases);\n const subscription = refreshScopeSubscription(scopeId);\n if (!subscription) return () => {};\n\n log('subscribeToScope:', scopeId, subscription.event_types);\n // If WS is already open, send immediately when this lease expands the union;\n // otherwise resubscribeAll handles it on connect.\n if (\n ws\n && ws.readyState === WebSocket.OPEN\n && !sameEventTypes(previousEventTypes, subscription.event_types)\n ) {\n sendMessage({\n type: 'subscribe',\n scope_id: scopeId,\n event_types: subscription.event_types,\n });\n }\n ensureConnection();\n\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n\n const currentLeases = scopeLeases.get(scopeId);\n if (!currentLeases?.delete(leaseId)) return;\n\n const previous = activeScopes.get(scopeId)?.event_types;\n if (currentLeases.size === 0) {\n scopeLeases.delete(scopeId);\n activeScopes.delete(scopeId);\n sendMessage({ type: 'unsubscribe', scope_id: scopeId });\n } else {\n const next = refreshScopeSubscription(scopeId);\n if (\n next\n &&\n ws\n && ws.readyState === WebSocket.OPEN\n && !sameEventTypes(previous, next.event_types)\n ) {\n sendMessage({\n type: 'subscribe',\n scope_id: scopeId,\n event_types: next.event_types,\n });\n }\n }\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 clearInfiniteItemsRefreshes(getQueryClient());\n clearArrangementRefreshes(getQueryClient());\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 scopeLeases.clear();\n activePaths.clear();\n pathStates.clear();\n pathReadyWaiters.clear(); // stragglers resolve false via their timeout\n setConnectionState('disconnected');\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// ── Subscription readiness API (2026-08-29) ──────────────────────────────────\n\n/**\n * Wire-level state of a path subscription: 'unsubscribed' when no consumer\n * holds the path, otherwise pending/ready/disconnected per the gateway ack.\n */\nexport function getPathSubscriptionState(\n path: string,\n): PathSubscriptionState | 'unsubscribed' {\n if (!activePaths.has(path)) return 'unsubscribed';\n return pathStates.get(path) ?? 'pending';\n}\n\n/**\n * Resolves true once the gateway has acknowledged the path subscription on the\n * CURRENT socket — i.e. events for this path will actually be delivered.\n * Resolves false when the path has no subscription, or after timeoutMs.\n *\n * Never rejects and never blocks forever: readiness is a courtesy gate for\n * dispatching turns, not a hard dependency. Callers should proceed (and rely\n * on the transcript-polling fallback) when this returns false.\n */\nexport function waitForPathReady(path: string, timeoutMs = 5000): Promise<boolean> {\n if (!activePaths.has(path)) return Promise.resolve(false);\n if (\n pathStates.get(path) === 'ready' &&\n ws &&\n ws.readyState === WebSocket.OPEN\n ) {\n return Promise.resolve(true);\n }\n // Not ready — make sure a connection attempt is underway, then wait for the ack.\n ensureConnection();\n return new Promise((resolve) => {\n let settled = false;\n const waiters = pathReadyWaiters.get(path) ?? [];\n const onReady = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(true);\n };\n waiters.push(onReady);\n pathReadyWaiters.set(path, waiters);\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n const remaining = pathReadyWaiters.get(path);\n if (remaining) {\n const idx = remaining.indexOf(onReady);\n if (idx !== -1) remaining.splice(idx, 1);\n if (remaining.length === 0) pathReadyWaiters.delete(path);\n }\n resolve(false);\n }, timeoutMs);\n });\n}\n\n/**\n * Force a fresh subscribe_path frame for a path that already has consumers.\n * subscribeToPath deliberately dedupes (N consumers, one wire subscription),\n * which also means it cannot express \"I think the wire subscription is gone —\n * establish it again\". This can. Await waitForPathReady() afterwards to know\n * when the new subscription is live.\n */\nexport function resubscribePath(path: string): void {\n const sub = activePaths.get(path);\n if (!sub) {\n log('resubscribePath: no active subscription for', path);\n return;\n }\n if (ws && ws.readyState === WebSocket.OPEN) {\n log('resubscribePath: re-sending frame for', path);\n sendPathSubscribe(sub.path, sub.event_types);\n } else {\n // No socket — mark pending and connect; resubscribeAll sends the frame.\n pathStates.set(path, 'pending');\n ensureConnection();\n }\n}\n\n/**\n * Observe transport connection state ('connecting' | 'connected' |\n * 'disconnected'). Fires immediately with the current state, then on change.\n * Returns an unsubscribe function.\n */\nexport function onConnectionStateChange(\n callback: (state: ConnectionState) => void,\n): () => void {\n connectionListeners.push(callback);\n try {\n callback(connectionState);\n } catch (_e) {\n /* listener errors must not break the transport */\n }\n return () => {\n const idx = connectionListeners.indexOf(callback);\n if (idx !== -1) connectionListeners.splice(idx, 1);\n };\n}\n\n// Register with the SDK-wide cleanup registry so signOut() tears down WS.\nregisterCleanup(disconnectSSE);\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 { normalizeItemsSelection, assertItemsSelection } from './items-selection';\nimport { getQueryClient } 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 space_item_id: raw.space_item_id,\n account_item_id: raw.account_item_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 getQueryClient().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 getQueryClient().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 getQueryClient().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\nexport type TurnQueueEntryState =\n | 'queued'\n | 'dispatching'\n | 'promoted'\n | 'cancelled'\n | 'failed';\n\n/** Deferred send intent. It is deliberately not a chat transcript message. */\nexport interface TurnQueueEntry {\n id: string;\n path: string;\n content: string;\n state: TurnQueueEntryState;\n queue_seq: number;\n created_at: string;\n /** Canonical Channel-or-Message identity that owns this queue. */\n conversation_anchor_item_id: string;\n /** @deprecated Use conversation_anchor_item_id. */\n conversation_root_id: string;\n client_request_id?: string;\n promoted_message_id?: string;\n promoted_event_id?: string;\n}\n\n/**\n * Read queued send intents attached to one conversation anchor.\n *\n * The anchor may be a Channel (channel-level conversation) or a Message\n * (message-rooted thread). Querying by type + parent identity keeps this read\n * bounded even after a long-lived conversation has accumulated many\n * transcript messages and historical queue receipts. Queue entries are\n * deliberately not transcript messages.\n *\n * Parameter names remain positional, so this is backward compatible with\n * callers that previously treated every anchor as a message root.\n */\nexport async function fetchTurnQueueEntries(\n anchorPath: string,\n anchorItemId: string,\n): Promise<TurnQueueEntry[]> {\n const { items } = await fetchItems({\n type: 'turn_queue_entry',\n scope: anchorPath,\n parent_id: anchorItemId,\n fields: { state: 'queued' },\n sort_by: 'created_at',\n sort_dir: 'asc',\n limit: 100,\n });\n return items\n .map((item) => {\n const conversationAnchorItemId = String(\n item.type_data?.conversation_anchor_item_id\n ?? item.type_data?.conversation_root_id\n ?? anchorItemId,\n );\n return {\n id: item.id,\n path: item.path,\n content: String(item.type_data?.content ?? ''),\n state: String(item.type_data?.state ?? 'queued') as TurnQueueEntryState,\n queue_seq: Number(item.type_data?.queue_seq ?? 0),\n created_at: item.created_at,\n conversation_anchor_item_id: conversationAnchorItemId,\n conversation_root_id: conversationAnchorItemId,\n client_request_id: typeof item.type_data?.client_request_id === 'string'\n ? item.type_data.client_request_id : undefined,\n promoted_message_id: typeof item.type_data?.promoted_message_id === 'string'\n ? item.type_data.promoted_message_id : undefined,\n promoted_event_id: typeof item.type_data?.promoted_event_id === 'string'\n ? item.type_data.promoted_event_id : undefined,\n };\n })\n .sort((a, b) => a.queue_seq - b.queue_seq || a.created_at.localeCompare(b.created_at));\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 getQueryClient().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 getQueryClient().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('get-activity-feed', {\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 interface ItemVersionsOptions {\n limit?: number;\n offset?: number;\n include_snapshots?: boolean;\n}\n\nexport interface ItemVersionsResult {\n versions: any[];\n total: number;\n}\n\n/**\n * Fetch persisted version history for an item.\n * Uses the `item-versions` kernel method.\n */\nexport async function fetchItemVersions(\n itemId: string,\n options: ItemVersionsOptions = {},\n): Promise<ItemVersionsResult> {\n const { limit = 50, offset = 0, include_snapshots = false } = options;\n try {\n const response = await gatewayCall('item-versions', {\n id: itemId,\n limit,\n offset,\n include_snapshots,\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 versions for ${itemId}:`, err);\n return { versions: [], total: 0 };\n }\n}\n\n/**\n * @deprecated Use `fetchItemVersions` instead.\n */\nexport async function fetchItemHistory(\n itemId: string,\n limit: number = 50,\n offset: number = 0,\n): Promise<ItemVersionsResult> {\n return fetchItemVersions(itemId, { limit, offset });\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 getQueryClient().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/**\n * One OR-group of a listing that spans item types. Everything inside a group\n * is ANDed; an item is listed when ANY group matches it.\n */\nexport interface ItemsFilterGroup {\n /** Item type this group matches. */\n item_type?: string;\n /**\n * type_data field filters: exact match, or a prefix match when the value\n * ends in a single `*` (content_type \"image/*\").\n */\n fields?: Record<string, string | number | boolean>;\n /** type_data membership filters: the field's value is one of the list. */\n field_in?: Record<string, Array<string | number | boolean>>;\n}\n\n/** Where an item shows: on its own, only through its parent, or nowhere. */\nexport type ItemsDiscovery = 'catalog' | 'parent_only' | 'internal';\n\n/** Filters for useItems / useInfiniteItems / fetchItems. */\nexport interface ItemsFilter {\n /** Item type to query. Required unless `any_of` names the types. */\n type?: string;\n /** Scope path boundary. Defaults to session scope. */\n scope?: string;\n /** Explicit mounted Space UUIDs, filtered by the kernel before pagination.\n * [] returns no work. Omitted preserves legacy scope behavior. This is a\n * read selection, never a write target or permission grant. */\n spaceIds?: 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 /**\n * type_data field filters. Keys are field names; values match exactly, or by\n * prefix when the value ends in a single `*` (content_type \"image/*\").\n */\n fields?: Record<string, string | number | boolean>;\n /** type_data membership filters: the field's value is one of the list. */\n field_in?: Record<string, Array<string | number | boolean>>;\n /**\n * Keep only the items that show there, as the kernel decides it from the\n * item, its kind and its type: 'catalog' = standalone things a person works\n * with, 'parent_only' = parts shown through their parent, 'internal' =\n * system records. Applied by the kernel before paging.\n */\n discovery?: ItemsDiscovery;\n /**\n * 1-10 OR-groups. One listing can span item types with one total and one\n * page order (image assets OR image files). Composes with every other\n * filter as AND. No nesting.\n */\n any_of?: ItemsFilterGroup[];\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/** True when a filter names what to list: one type, or OR-groups. */\nexport function isListableItemsFilter(filter: ItemsFilter | null | undefined): filter is ItemsFilter {\n return !!filter && (!!filter.type || (Array.isArray(filter.any_of) && filter.any_of.length > 0));\n}\n\nfunction kernelGroup(group: ItemsFilterGroup): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (group.item_type) out.item_type = group.item_type;\n for (const [key, value] of Object.entries(group.fields ?? {})) out[`field.${key}`] = String(value);\n for (const [key, values] of Object.entries(group.field_in ?? {})) out[`field_in.${key}`] = values.map(String);\n return out;\n}\n\nconst DISCOVERY_VALUES: readonly string[] = ['catalog', 'parent_only', 'internal'];\n\n/**\n * Turn a stored saved filter (a `query_filter` item's type_data, as an\n * arrangement returns it in `resolved_children`) into an ItemsFilter for\n * useInfiniteItems / useItems / fetchItems. The stored keys are the list\n * call's own: `type`, `sort_by`, `sort_dir`, `name`, `tag`, `discovery`,\n * `field.<key>`, `field_in.<key>` and `any_of`. Display keys (display_name,\n * icon, ...) are ignored. `extra` adds what the screen owns: scope, page size.\n * Returns null when the stored filter names nothing to list.\n */\nexport function itemsFilterFromQueryFilter(\n typeData: Record<string, unknown> | null | undefined,\n extra: Pick<ItemsFilter, 'scope' | 'spaceIds' | 'limit' | 'name' | 'parent_id'> = {},\n): ItemsFilter | null {\n if (!typeData || typeof typeData !== 'object') return null;\n const scalar = (value: unknown): value is string | number | boolean =>\n typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n const readFields = (source: Record<string, unknown>) => {\n const fields: Record<string, string | number | boolean> = {};\n const field_in: Record<string, Array<string | number | boolean>> = {};\n for (const [key, value] of Object.entries(source)) {\n if (key.startsWith('field.') && key.length > 6 && scalar(value)) fields[key.slice(6)] = value;\n else if (key.startsWith('field_in.') && key.length > 9 && Array.isArray(value)) field_in[key.slice(9)] = value.filter(scalar);\n }\n return { fields, field_in };\n };\n const filter: ItemsFilter = {};\n if (typeof typeData.type === 'string' && typeData.type) filter.type = typeData.type;\n if (typeof typeData.sort_by === 'string') filter.sort_by = typeData.sort_by;\n if (typeData.sort_dir === 'asc' || typeData.sort_dir === 'desc') filter.sort_dir = typeData.sort_dir;\n if (typeof typeData.name === 'string' && typeData.name) filter.name = typeData.name;\n if (typeof typeData.tag === 'string' && typeData.tag) filter.tag = typeData.tag;\n if (typeof typeData.discovery === 'string' && DISCOVERY_VALUES.includes(typeData.discovery)) {\n filter.discovery = typeData.discovery as ItemsDiscovery;\n }\n const top = readFields(typeData);\n if (Object.keys(top.fields).length) filter.fields = top.fields;\n if (Object.keys(top.field_in).length) filter.field_in = top.field_in;\n if (Array.isArray(typeData.any_of)) {\n const groups: ItemsFilterGroup[] = [];\n for (const raw of typeData.any_of) {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) continue;\n const source = raw as Record<string, unknown>;\n const group: ItemsFilterGroup = {};\n if (typeof source.item_type === 'string' && source.item_type) group.item_type = source.item_type;\n const inner = readFields(source);\n if (Object.keys(inner.fields).length) group.fields = inner.fields;\n if (Object.keys(inner.field_in).length) group.field_in = inner.field_in;\n if (Object.keys(group).length) groups.push(group);\n }\n if (groups.length) filter.any_of = groups;\n }\n if (!isListableItemsFilter(filter)) return null;\n return { ...filter, ...extra };\n}\n\n/**\n * Fetch items with structured filters: one type, or OR-groups across types.\n * Calls kernel_query (gateway 'query' method). The kernel filters before it\n * pages, returns at most `limit` items and one total.\n */\nexport async function fetchItems(filter: ItemsFilter, options: { throwOnError?: boolean } = {}): Promise<{\n items: VFSItem[];\n total_hint?: number;\n}> {\n filter = normalizeItemsSelection(filter);\n if (filter.spaceIds?.length === 0) return { items: [], total_hint: 0 };\n const params: Record<string, unknown> = {};\n if (filter.type) params.item_type = filter.type;\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.spaceIds !== undefined) filters.space_ids = filter.spaceIds;\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 // Map field_in.* membership filters\n if (filter.field_in) {\n for (const [key, values] of Object.entries(filter.field_in)) {\n filters[`field_in.${key}`] = values.map(String);\n }\n }\n\n if (filter.discovery) filters.discovery = filter.discovery;\n if (filter.any_of?.length) filters.any_of = filter.any_of.map(kernelGroup);\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('query', params);\n if (filter.spaceIds !== undefined) {\n assertItemsSelection(filter.spaceIds, response.selected_space_ids ?? response.content?.selected_space_ids);\n }\n const items = extractItems(response);\n // Cache individual items\n for (const item of items) {\n getQueryClient().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 ?? '(any_of)'}:`, err);\n if (options.throwOnError || filter.spaceIds !== undefined) throw 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 /** Durable lifecycle disposition declared on the message item. */\n status?: string;\n /** Durable lifecycle state for a real, already-dispatched user message. */\n delivery_state?:\n | 'dispatching'\n | 'dispatched'\n | 'completed'\n | 'cancelled'\n | 'steered';\n /** Cognition event created for this dispatched request message. */\n cognition_event_id?: string;\n seq: number;\n principal_id?: string;\n reply_count: number;\n parent_message_id?: string;\n intent_card?: Record<string, unknown>;\n /** Full message metadata from type_data.metadata (launch cards, custom card payloads, etc.). */\n metadata?: Record<string, unknown>;\n thread_summary?: Array<Record<string, unknown>>;\n}\n\n/** Runtime/kernel ownership shared by durable cards and execution activity. */\nexport interface WorkCorrelation {\n version: 1;\n workId: string;\n threadRootId?: string;\n requestMessageId?: string;\n replyMessageId?: string;\n replyMessagePath?: string;\n todoListId?: string;\n todoListPath?: string;\n stepId?: string;\n stepPath?: string;\n runId?: string;\n parentRunId?: string;\n toolCallId?: string;\n traceId?: string;\n}\n\nfunction parseWorkCorrelation(raw: unknown): WorkCorrelation | undefined {\n if (!raw || typeof raw !== 'object') return undefined;\n const value = raw as Record<string, unknown>;\n if (value.version !== 1 || typeof value.work_id !== 'string' || !value.work_id) {\n return undefined;\n }\n const optional = (key: string): string | undefined => {\n const candidate = value[key];\n return typeof candidate === 'string' && candidate ? candidate : undefined;\n };\n return {\n version: 1,\n workId: value.work_id,\n threadRootId: optional('thread_root_id'),\n requestMessageId: optional('request_message_id'),\n replyMessageId: optional('reply_message_id'),\n replyMessagePath: optional('reply_message_path'),\n todoListId: optional('todo_list_id'),\n todoListPath: optional('todo_list_path'),\n stepId: optional('step_id'),\n stepPath: optional('step_path'),\n runId: optional('run_id'),\n parentRunId: optional('parent_run_id'),\n toolCallId: optional('tool_call_id'),\n traceId: optional('trace_id'),\n };\n}\n\n/** A parsed card item bundled with channel messages from the kernel v2 response. */\nexport interface ChannelCard {\n id: string;\n path: string;\n name: string;\n createdAt: string;\n action: string;\n targetId?: string;\n targetPath: string;\n targetDisplayName: string;\n targetDescription: string;\n targetItemType: string;\n /** Derived tool use ID (name without 'card-' prefix). */\n toolId?: string;\n /** Path of the parent message (for child cards). Undefined for sibling cards. */\n parentMessagePath?: string;\n visibility: string;\n /** Launch cards (action='launch'): opener component path (type_data.payload.open_with). */\n openWith?: string;\n /** Launch cards: opener is bundled in the host app (payload.host_bundled). */\n hostBundled?: boolean;\n /** Launch cards: named export of the bundled opener (payload.bundle_export). */\n bundleExport?: string;\n /** Launch cards: arguments to pass to the opener (payload.launch_arguments). */\n launchArguments?: Record<string, unknown>;\n /** Launch cards: highlight the card to draw user attention (payload.requires_user_attention). */\n requiresUserAttention?: boolean;\n /** Durable ownership copied from the authoritative tool completion. */\n origin?: WorkCorrelation;\n /** Semantic urgency; visual treatment remains the host application's job. */\n presentationRole?: 'output' | 'user-request';\n}\n\n/** Full response from fetchChannelMessagesWithCards — includes bundled cards. */\nexport interface ChannelMessagesResponse {\n messages: ChannelMessage[];\n /** Cards that are direct children of messages in this page. Keyed by message path. */\n messageCards: Map<string, ChannelCard[]>;\n /** Cards that are direct siblings (children of the channel itself). */\n siblingCards: ChannelCard[];\n mode: 'top_level' | 'thread';\n}\n\n/**\n * Parse raw kernel card items into typed ChannelCard objects.\n * Filters to item_type === 'card' and sorts by createdAt.\n */\nfunction parseChannelCards(rawItems: Array<Record<string, unknown>>): ChannelCard[] {\n return rawItems\n .filter(i => (i.item_type as string) === 'card')\n .map((i): ChannelCard => {\n const td = (i.type_data as Record<string, unknown>) || {};\n const payload = (td.payload as Record<string, unknown>) || {};\n return {\n id: (i.id as string) || '',\n path: (i.path as string) || '',\n name: (i.name as string) || (i.path as string || '').split('/').pop() || '',\n createdAt: (i.created_at as string) || '',\n action: (td.action as string) || 'created',\n targetId: (td.target_id as string) || undefined,\n targetPath: (td.target_path as string) || '',\n targetDisplayName: (td.target_display_name as string) || '',\n targetDescription: (td.target_description as string) || '',\n targetItemType: (td.target_item_type as string) || '',\n toolId: ((i.name as string) || '').startsWith('card-')\n ? ((i.name as string) || '').substring(5)\n : undefined,\n parentMessagePath: (i.parent_message_path as string) || undefined,\n visibility: (td.visibility as string) || 'private',\n openWith: (payload.open_with as string) || undefined,\n hostBundled: payload.host_bundled === true ? true : undefined,\n bundleExport: (payload.bundle_export as string) || undefined,\n launchArguments: (payload.launch_arguments as Record<string, unknown>) || undefined,\n requiresUserAttention: payload.requires_user_attention === true ? true : undefined,\n origin: parseWorkCorrelation(td.origin),\n presentationRole: payload.presentation_role === 'user-request'\n ? 'user-request'\n : payload.presentation_role === 'output'\n ? 'output'\n : undefined,\n };\n })\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\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 status: typeof td.status === 'string' ? td.status : undefined,\n delivery_state: typeof td.delivery_state === 'string'\n ? td.delivery_state as ChannelMessage['delivery_state']\n : undefined,\n cognition_event_id: typeof td.cognition_event_id === 'string'\n ? td.cognition_event_id\n : undefined,\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 metadata: Object.keys(metadata).length > 0 ? metadata : 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/**\n * Fetch channel messages WITH bundled cards from the kernel v2 response.\n *\n * The kernel's get-channel-messages (v2) returns messages interleaved with\n * their associated cards (both sibling cards and child cards). This function\n * parses both and groups child cards by their parent message path.\n *\n * This eliminates the N+1 query problem where the frontend previously made\n * separate `list` calls for each message to fetch its cards.\n */\nexport async function fetchChannelMessagesWithCards(\n channelPath: string,\n parentMessageId?: string,\n): Promise<ChannelMessagesResponse> {\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 const messages = parseChannelMessages(items);\n const cards = parseChannelCards(items);\n\n // Group cards by parent message path\n const messageCards = new Map<string, ChannelCard[]>();\n const siblingCards: ChannelCard[] = [];\n\n for (const card of cards) {\n if (card.parentMessagePath) {\n const existing = messageCards.get(card.parentMessagePath) || [];\n existing.push(card);\n messageCards.set(card.parentMessagePath, existing);\n } else {\n siblingCards.push(card);\n }\n }\n\n return {\n messages,\n messageCards,\n siblingCards,\n mode: (raw.mode as 'top_level' | 'thread') || 'top_level',\n };\n } catch (err) {\n console.error(\n `[gateway] Failed to fetch channel messages with cards for ${channelPath}:`,\n err,\n );\n return { messages: [], messageCards: new Map(), siblingCards: [], mode: 'top_level' };\n }\n}\n\n// ── Paginated Channel Messages ──────────────────────────────────────────────\n\n/** Response shape from fetchChannelMessagesPage. */\nexport interface ChannelMessagesPage {\n messages: ChannelMessage[];\n /** Cards grouped by parent message path (child cards of messages in this page). */\n messageCards: Map<string, ChannelCard[]>;\n /** Cards that are direct siblings of the channel (not nested under a message). */\n siblingCards: ChannelCard[];\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 const cards = parseChannelCards(items);\n const messageCards = new Map<string, ChannelCard[]>();\n const siblingCards: ChannelCard[] = [];\n for (const card of cards) {\n if (card.parentMessagePath) {\n const existing = messageCards.get(card.parentMessagePath) || [];\n existing.push(card);\n messageCards.set(card.parentMessagePath, existing);\n } else {\n siblingCards.push(card);\n }\n }\n return {\n messages: parseChannelMessages(items),\n messageCards,\n siblingCards,\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: [], messageCards: new Map(), siblingCards: [], mode: 'top_level' };\n }\n}\n\n// ── Cache Invalidation ──────────────────────────────────────────────────────\n\nexport function invalidateChildren(path: string): void {\n getQueryClient().invalidateQueries({ queryKey: vfsKeys.children(path) });\n}\n\nexport function invalidateItem(path: string): void {\n getQueryClient().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 getQueryClient().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 getQueryClient().invalidateQueries({ queryKey: vfsKeys.all() });\n}\n\nexport function invalidateTypes(scopeId?: string): void {\n getQueryClient().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 getQueryClient().invalidateQueries({ queryKey: vfsKeys.channelMessages(channelPath, parentMessageId) });\n } else {\n getQueryClient().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 getQueryClient().invalidateQueries({ queryKey: vfsKeys.openEnvelope(path, strategy) });\n } else if (path) {\n getQueryClient().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 getQueryClient().invalidateQueries({ queryKey: vfsKeys.allOpenEnvelopes() });\n }\n}\n","import { gatewayCall } from './client';\nimport type { MountRef } from './session';\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 membershipPath?: string | null;\n personalSpaceId?: string | null;\n personalSpacePath?: string | null;\n}\n\n/** Convert a membership row into a MountRef (accounts and spaces alike). */\nexport function membershipToMountRef(m: AccountInfo): MountRef {\n return {\n id: m.accountId,\n path: m.path,\n kind: m.isSpace ? 'space' : 'account',\n name: m.name,\n grantedUnderAccountId: m.grantedUnderAccountId ?? undefined,\n };\n}\n\n/** Shared mapping for native-auth hooks and external-token bootstrap. */\nexport async function fetchMemberships(): Promise<AccountInfo[]> {\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 membershipPath: m.membership_path ?? null,\n personalSpaceId: m.personal_space_id ?? null,\n personalSpacePath: m.personal_space_path ?? null,\n })) as AccountInfo[];\n}\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 { getQueryClient } 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;\nlet unsubCcmEvents: (() => 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 // Selection/restoration can call this repeatedly. Keep existing mounted\n // scopes and pending invalidations; logout owns full disposal.\n if (unsubEvents) {\n mountRealtimeScope(accountId);\n return;\n }\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 // Edge changes ride the ccm_change stream (scope subscriptions already\n // include it — see mountRealtimeScope). Without this listener, edge\n // caches (vfsKeys.edges) never refresh on realtime pushes and useEdges\n // consumers go stale until manual invalidation.\n unsubCcmEvents = subscribeToEvents(\n 'ccm_change',\n (data: any) => handleCcmChange(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 if (unsubCcmEvents) {\n unsubCcmEvents();\n unsubCcmEvents = 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\n/**\n * Handle a ccm_change event. Edge mutations (link/unlink/focus/staging)\n * arrive on this stream with edge_type and the endpoint item IDs. Payload\n * shape is not guaranteed, so fail open: invalidate the endpoints we can\n * identify; if the event looks edge-related but names no endpoint, refresh\n * all edge queries (React Query only refetches mounted ones, so the blast\n * radius is what's actually on screen).\n */\nfunction handleCcmChange(data: any): void {\n if (!data || typeof data !== 'object') return;\n\n const sourceId = data.source_item_id || data.source_id;\n const targetId = data.target_item_id || data.target_id;\n const looksEdgeRelated =\n data.edge_type != null || sourceId != null || targetId != null;\n if (!looksEdgeRelated) return;\n\n // Debounce per endpoint pair to avoid invalidation storms on bulk edits.\n const debounceKey = `ccm:${sourceId ?? ''}:${targetId ?? ''}`;\n const existing = debounceTimers.get(debounceKey);\n if (existing) clearTimeout(existing);\n\n const timer = setTimeout(() => {\n debounceTimers.delete(debounceKey);\n if (sourceId) {\n getQueryClient().invalidateQueries({ queryKey: vfsKeys.edges(sourceId) });\n }\n if (targetId) {\n getQueryClient().invalidateQueries({ queryKey: vfsKeys.edges(targetId) });\n }\n if (!sourceId && !targetId) {\n getQueryClient().invalidateQueries({\n predicate: (query) =>\n query.queryKey[0] === 'vfs' && query.queryKey[1] === 'edges',\n });\n }\n }, DEBOUNCE_MS);\n\n debounceTimers.set(debounceKey, 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 getQueryClient().removeQueries({ queryKey: vfsKeys.item(path) });\n getQueryClient().removeQueries({ queryKey: vfsKeys.children(path) });\n getQueryClient().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 getQueryClient().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 getQueryClient().invalidateQueries({ queryKey: vfsKeys.children(parentPath) });\n\n // Invalidate any tree queries that include this path\n getQueryClient().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 getQueryClient().invalidateQueries({ queryKey: vfsKeys.itemById(data.item_id) });\n }\n}\n","/** Durable workspace mounts. The declaration narrows membership; it is not a\n * substitute for a selected-Space filter on reads, nor a permission grant. */\nimport { gatewayCall, GatewayRequestError } from './client';\nimport {\n type MountRef, commitMountSelection, getMounts, getHomeAnchor,\n getAnchorRef, registerCleanup, getSessionGeneration,\n} from './session';\nimport { initVfsRealtimeWs, mountRealtimeScope, unmountRealtimeScope } from './vfs-realtime-ws';\n\ninterface Declaration {\n generation: number;\n path: string;\n scope: string;\n resolve: (id: string) => MountRef | null;\n exists: boolean;\n ready: boolean;\n saved: string | null;\n loading?: Promise<MountRef[]>;\n queue: Promise<void>;\n}\nlet declaration: Declaration | null = null;\nregisterCleanup(() => { declaration = null; });\n\nfunction assertCurrent(owner: Declaration): void {\n if (owner !== declaration || owner.generation !== getSessionGeneration()) throw new Error('Workspace session changed');\n}\nfunction missing(error: unknown): boolean {\n // Verified kernel_read_item result. HTTP/auth/network failures are not absence.\n return error instanceof GatewayRequestError && error.payload?.error === 'item_not_found';\n}\nfunction canonical(owner: Declaration, ref: MountRef): MountRef {\n const current = owner.resolve(ref.id);\n if (!current || current.path !== ref.path || current.kind !== ref.kind) {\n throw new Error('Mount is not an available membership');\n }\n return current;\n}\nfunction withHome(refs: MountRef[]): MountRef[] {\n const home = getHomeAnchor();\n if (!home) throw new Error('Elect a home account before loading mounts');\n return [home, ...refs.filter((ref, index) => ref.id !== home.id && refs.findIndex(r => r.id === ref.id) === index)];\n}\nfunction signature(refs: MountRef[], anchor: MountRef): string {\n return JSON.stringify({ mounts: refs.map(ref => ref.id), last_anchor: anchor.id });\n}\nasync function save(owner: Declaration, refs: MountRef[], anchor: MountRef): Promise<void> {\n assertCurrent(owner);\n const next = signature(refs, anchor);\n if (owner.saved === next) return;\n const type_data = JSON.parse(next);\n // Capture the declaration's owning account. A later selection never retargets\n // this write. Create only after a read positively established absence.\n await gatewayCall(owner.exists ? 'update' : 'create', owner.exists ? {\n _scope_path: owner.scope, path: owner.path, type_data,\n } : {\n _scope_path: owner.scope, parent_path: owner.path.slice(0, owner.path.lastIndexOf('/')),\n name: 'mounts', item_type: 'file', type_data,\n });\n assertCurrent(owner);\n owner.exists = true;\n owner.saved = next;\n}\nfunction publish(refs: MountRef[], anchor: MountRef): void {\n const previous = getMounts();\n initVfsRealtimeWs(getHomeAnchor()!.id);\n for (const ref of previous) if (!refs.some(r => r.id === ref.id)) unmountRealtimeScope(ref.id);\n for (const ref of refs) mountRealtimeScope(ref.id);\n commitMountSelection(refs, anchor);\n}\n\nexport interface LoadMountsOptions {\n /** Verified default working Space, used only when no declaration exists. */\n initialAnchor?: MountRef;\n}\n\n/** One shared declaration read per session. Failures remain retryable and visible.\n * Existing saved exclusions are retained; restoration never mounts newly joined\n * Spaces. A fresh default is saved once before it is published. */\nexport async function loadMounts(\n memberSpacePath: string,\n resolveRef: (id: string) => MountRef | null,\n options: LoadMountsOptions = {},\n): Promise<MountRef[]> {\n const home = getHomeAnchor();\n if (!home) throw new Error('Elect a home account before loading mounts');\n const path = `${memberSpacePath}/settings/mounts`;\n if (declaration && declaration.path !== path) throw new Error('Reset the session before changing the mount declaration owner');\n const owner = declaration ??= {\n generation: getSessionGeneration(),\n path, scope: home.path, resolve: resolveRef, exists: false, ready: false,\n saved: null, queue: Promise.resolve(),\n };\n assertCurrent(owner);\n if (owner.loading) return owner.loading;\n if (owner.ready) return getMounts();\n owner.resolve = resolveRef;\n owner.loading = (async () => {\n let data: Record<string, unknown> | null = null;\n try {\n const response = await gatewayCall('read', { path, _scope_path: owner.scope });\n assertCurrent(owner);\n // kernel_read_item returns flat type_data; tolerate the older envelope.\n data = (response.type_data ?? (response.item as any)?.type_data) as Record<string, unknown>;\n if (!data || !Array.isArray(data.mounts) || !data.mounts.every(id => typeof id === 'string')) {\n throw new Error('Invalid saved mount declaration');\n }\n owner.exists = true;\n } catch (error) {\n assertCurrent(owner);\n if (!missing(error)) throw error;\n owner.exists = false;\n }\n const initial = options.initialAnchor ? canonical(owner, options.initialAnchor) : home;\n const refs = withHome(data\n ? (data.mounts as string[]).map(resolveRef).filter((ref): ref is MountRef => ref !== null)\n : [initial]);\n const anchor = data\n ? refs.find(ref => ref.id === data.last_anchor) ?? refs.find(ref => ref.kind === 'space') ?? home\n : initial;\n if (data) owner.saved = signature(refs, anchor);\n else if (options.initialAnchor) await save(owner, refs, anchor);\n assertCurrent(owner);\n owner.ready = true;\n publish(refs, anchor);\n return refs;\n })().finally(() => { owner.loading = undefined; });\n return owner.loading;\n}\n\ntype Change = (owner: Declaration) => { refs: MountRef[]; anchor: MountRef };\nfunction mutate(change: Change): Promise<void> {\n const owner = declaration;\n if (!owner?.ready) return Promise.reject(new Error('Workspace mounts are not loaded'));\n // Serialize user actions: each derives from the previous confirmed result.\n // Failed saves never publish optimistic state and never block later retries.\n const task = owner.queue.then(async () => {\n assertCurrent(owner);\n const { refs, anchor } = change(owner);\n await save(owner, refs, anchor);\n assertCurrent(owner);\n publish(refs, anchor);\n });\n owner.queue = task.catch(() => {});\n return task;\n}\n\nexport function mount(ref: MountRef): Promise<void> {\n return mutate(owner => ({ refs: withHome([...getMounts(), canonical(owner, ref)]), anchor: getAnchorRef()! }));\n}\nexport function unmount(id: string): Promise<void> {\n return mutate(() => {\n if (id === getHomeAnchor()!.id) throw new Error('The home account cannot be unmounted');\n const refs = withHome(getMounts().filter(ref => ref.id !== id));\n const anchor = refs.find(ref => ref.id === getAnchorRef()?.id) ?? refs.find(ref => ref.kind === 'space') ?? getHomeAnchor()!;\n return { refs, anchor };\n });\n}\n/** Open a membership; retain the other mounts and save last_anchor. */\nexport function selectMount(ref: MountRef): Promise<void> {\n return mutate(owner => {\n const anchor = canonical(owner, ref);\n return { refs: withHome([...getMounts(), anchor]), anchor };\n });\n}\n/** One explicit batch action (e.g. Account mount-all), never a render effect.\n * Consumers must separately implement a backend-supported aggregate read filter. */\nexport function replaceMounts(refs: MountRef[], anchor: MountRef): Promise<void> {\n return mutate(owner => {\n const next = withHome(refs.map(ref => canonical(owner, ref)));\n const selected = canonical(owner, anchor);\n if (!next.some(ref => ref.id === selected.id)) throw new Error('Selected mount must be in the working set');\n return { refs: next, anchor: selected };\n });\n}\nexport function persistAnchor(): Promise<void> {\n return mutate(() => ({ refs: getMounts(), anchor: getAnchorRef()! }));\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 getQueryClient().\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, useItemVersions, useItemHistory (deprecated), 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, useLayoutEffect, 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, subscribeToScope } from './ws';\nimport { gatewayCall } from './client';\nimport { vfsKeys } from './vfs-keys';\nimport { normalizeItemsSelection, unavailableItemsSelection } from './items-selection';\nimport { normalizeItem } from './vfs';\nimport {\n fetchVfsItem,\n fetchVfsItemById,\n fetchVfsChildren,\n fetchVfsChildrenPage,\n fetchVfsTree,\n fetchEdgesForItem,\n fetchTypeDefinitions,\n fetchItems,\n isListableItemsFilter,\n fetchMemberFocus,\n fetchRecentActivity,\n fetchItemHistory,\n fetchItemVersions,\n fetchChannelMessages,\n fetchChannelMessagesWithCards,\n fetchOpenEnvelope,\n fetchChannelMessagesPage,\n} from './vfs';\nimport type { ItemVersionsOptions } from './vfs';\nimport type { ItemsFilter, ChannelMessage, ChannelCard, ChannelMessagesResponse, ChannelMessagesPage } from './vfs';\nimport { supabase } from './config';\nimport { initSession, setScope, getScope, getScopeVersion, subscribeScope, isScopeReady, resetAllSdkState, registerCleanup, getSessionEntry } from './session';\nimport { electHomeAnchor, setAnchor, getMounts, getMountVersion, subscribeMounts, getHomeAnchor, getAnchorRef } from './session';\nimport type { MountRef } from './session';\nimport { fetchMemberships, membershipToMountRef, type AccountInfo } from './memberships';\nimport { mount as persistMount, unmount as persistUnmount, loadMounts, selectMount, replaceMounts } from './mounts';\nimport { initVfsRealtimeWs, mountRealtimeScope, unmountRealtimeScope } from './vfs-realtime-ws';\nimport { getQueryClient } from './query-client';\nimport { isChannelPath, refreshQuery } from './query-refresh';\nimport type {\n VFSItem,\n VFSEdge,\n TypeDefinition,\n CreateParams,\n UpdateParams,\n DeleteParams,\n MoveParams,\n LinkParams,\n OpenEnvelope,\n OpenOptions,\n ResolveParams,\n ResolveResponse,\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 // Items are kept fresh by subscription events, never by elapsed time.\n // With the default staleTime of 0, every remount and every invalidation\n // re-read the item over the gateway (~207ms each): one open session\n // issued 367k reads in 19 hours, 87% of all database time. Cache holds\n // until an event says otherwise; reconnect gaps are covered by\n // resubscribeAll's invalidation in ws.ts.\n staleTime: Infinity,\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 staleTime: Infinity, // event-driven; see useItem\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 || response.results || []).map(normalizeItem);\n },\n enabled: !!query && query.length > 0,\n });\n}\n\n/** Multi-signal search (exact + trigram + keyword + semantic vector) via kernel resolve. */\nexport function useResolve(params: ResolveParams | null | undefined) {\n useScopeKey();\n const stableParams = useMemo(() => params, [JSON.stringify(params)]);\n return useQuery({\n queryKey: ['vfs', getScope() ?? '__unscoped__', 'resolve', JSON.stringify(stableParams ?? {})],\n queryFn: async () => {\n const response = await gatewayCall('resolve', stableParams as unknown as Record<string, unknown>);\n return response as unknown as ResolveResponse;\n },\n enabled: !!stableParams?.query && stableParams.query.length > 0,\n });\n}\n\n/** Fetch items with structured filters: one type, or OR-groups across types. */\nexport function useItems(filter: ItemsFilter | null | undefined) {\n useScopeKey();\n const selected = normalizeItemsSelection(filter);\n const stableFilter = useMemo(() => selected, [JSON.stringify(selected)]);\n const query = useQuery({\n queryKey: vfsKeys.items(\n stableFilter?.type ?? '',\n stableFilter as unknown as Record<string, unknown> | undefined,\n ),\n queryFn: () => fetchItems(stableFilter!),\n enabled: isListableItemsFilter(stableFilter),\n ...(stableFilter?.spaceIds !== undefined ? {\n retry: (attempt: number, error: Error) => !unavailableItemsSelection(error) && attempt < 1,\n } : {}),\n select: (result) => result.items,\n });\n return stableFilter?.spaceIds !== undefined && unavailableItemsSelection(query.error)\n ? { ...query, data: undefined } : query;\n}\n\nexport interface InfiniteItemsOptions {\n /** Keep this cached listing fresh through the SDK's existing realtime transport. No polling. Defaults to false. */\n realtime?: boolean;\n}\n\n/**\n * Infinite-scroll item fetching with kernel-side filtering before pagination.\n * The filter names one `type`, or `any_of` groups spanning types. Pages are\n * loaded by offset; a page shorter than the page size ends the listing.\n */\nexport function useInfiniteItems(filter: ItemsFilter | null | undefined, options: InfiniteItemsOptions = {}) {\n const scopeKey = useScopeKey();\n const { realtime = false } = options;\n const selected = normalizeItemsSelection(filter);\n const PAGE_SIZE = selected?.limit ?? 20;\n const stableFilter = useMemo(() => selected, [JSON.stringify(selected)]);\n const stableKey = useMemo(() => ['vfs', getScope() ?? '__unscoped__', 'infinite-items', stableFilter?.type ?? '', JSON.stringify(stableFilter ?? {})], [scopeKey, stableFilter]);\n\n const query = useInfiniteQuery({\n queryKey: stableKey,\n queryFn: async ({ pageParam = 0 }) => {\n return fetchItems({\n ...stableFilter!,\n limit: PAGE_SIZE,\n offset: pageParam as number,\n }, { throwOnError: true });\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage, _allPages, lastPageParam) => {\n if (stableFilter?.spaceIds !== undefined && lastPage.total_hint !== undefined\n && (lastPageParam as number) + lastPage.items.length >= lastPage.total_hint) return undefined;\n if (lastPage.items.length < PAGE_SIZE) return undefined;\n return (lastPageParam as number) + lastPage.items.length;\n },\n enabled: isListableItemsFilter(stableFilter),\n ...(stableFilter?.spaceIds !== undefined ? {\n retry: (attempt: number, error: Error) => !unavailableItemsSelection(error) && attempt < 1,\n } : {}),\n // Realtime marks the cache stale only on relevant changes or reconnect.\n // Expanding a channel or handing it to another observer reuses its pages.\n staleTime: realtime ? Infinity : undefined,\n meta: realtime && stableFilter ? { infiniteItemsRealtime: { filter: stableFilter } } : {},\n });\n\n const allItems = useMemo(() => {\n if (stableFilter?.spaceIds !== undefined && unavailableItemsSelection(query.error)) return [];\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, query.error, stableFilter]);\n const unavailable = stableFilter?.spaceIds !== undefined && unavailableItemsSelection(query.error);\n\n return {\n allItems,\n refetch: query.refetch,\n fetchNextPage: query.fetchNextPage,\n isFetchingNextPage: query.isFetchingNextPage,\n isExhausted: unavailable || !query.hasNextPage,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n totalHint: unavailable ? undefined : 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 const stableWidth = options?.width;\n return useQuery({\n queryKey: [...vfsKeys.openEnvelope(path!, stableStrategy), stableWidth],\n queryFn: async () => {\n const envelope = await fetchOpenEnvelope(path!, {\n mode: stableMode,\n strategy: stableStrategy,\n arguments: stableArgs,\n });\n // Post-process: append &w= to render.props.url for thumbnail/preview\n if (stableWidth && envelope.render?.props?.url) {\n const url = envelope.render.props.url as string;\n const separator = url.includes('?') ? '&' : '?';\n envelope.render.props.url = `${url}${separator}w=${stableWidth}`;\n }\n return envelope;\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 Versions Hook ────────────────────────────────────────────────────\n\n/** Fetch the persisted version history of a VFS item. */\nexport function useItemVersions(\n itemId: string | undefined | null,\n options: ItemVersionsOptions = {},\n) {\n const { limit = 50, offset = 0, include_snapshots = false } = options;\n return useQuery({\n queryKey: vfsKeys.itemVersions(itemId!, String(limit), String(offset), String(include_snapshots)),\n queryFn: () => fetchItemVersions(itemId!, { limit, offset, include_snapshots }),\n enabled: !!itemId,\n });\n}\n\n/**\n * @deprecated Use `useItemVersions` instead.\n */\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 type { AccountInfo } from './memberships';\ninterface AccountsState {\n /** Election candidates — accounts the user can log into (top-level forest first). */\n accounts: AccountInfo[];\n /** Full membership list (accounts + spaces). Raw material for MountRefs. */\n allMemberships: AccountInfo[];\n /** The account ref of the current ANCHOR (was: billing-responsible account). */\n currentAccount: AccountInfo | null;\n /** @deprecated read useMounts() — kept until compass migrates this sprint. */\n mountedScope: string | null;\n /** Elect the HOME anchor (login) or move the anchor (in-session step-into). */\n switchAccount: (accountPath: string) => Promise<void>;\n /** Mount a membership into the working set (persists the declaration). */\n mountScope: (scopePath: string) => Promise<void>;\n loading: boolean;\n error: Error | null;\n}\n\n/** Returns the user's memberships and drives the anchor/mount session. */\nexport function useAccounts(): AccountsState {\n const { user } = useAuth();\n const autoSelectedRef = useRef<string | null>(null);\n const [mountError, setMountError] = useState<Error | null>(null);\n\n const query = useQuery({\n queryKey: vfsKeys.memberships(user?.id ?? 'anonymous'),\n queryFn: fetchMemberships,\n enabled: !!user?.id,\n staleTime: 1000 * 60 * 2,\n });\n\n const allMemberships = query.data ?? EMPTY_ACCOUNTS;\n\n // Election candidates: every ACCOUNT membership. Top-level forest roots\n // (an account whose parent-account isn't also mine) sort first — they are\n // the default login cards; the rest are the \"enter a specific account\"\n // tier. Top-levels are defaults, not walls (anchor_mount_spec.md).\n const accountMemberships = useMemo(\n () => allMemberships.filter((a) => a.isAccount !== false && !a.isSpace),\n [allMemberships],\n );\n\n const electionCandidates = useMemo(() => {\n const myAccountIds = new Set(accountMemberships.map((a) => a.accountId));\n const isTopLevel = (a: AccountInfo) =>\n !a.subordinateTo || !myAccountIds.has(a.subordinateTo);\n return [...accountMemberships].sort((a, b) =>\n Number(isTopLevel(b)) - Number(isTopLevel(a)));\n }, [accountMemberships]);\n\n // Track the anchor reactively so currentAccount re-renders on setAnchor.\n const anchorVersion = useSyncExternalStore(subscribeScope, getScopeVersion, getScopeVersion);\n const currentAccount = useMemo(() => {\n const ref = getAnchorRef();\n if (!ref) return null;\n return allMemberships.find((a) => a.accountId === ref.id) ?? null;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [anchorVersion, allMemberships]);\n\n // Single-account users: auto-elect the home anchor (no login friction).\n useEffect(() => {\n if (!user?.id) { autoSelectedRef.current = null; return; }\n if (autoSelectedRef.current === user.id) return;\n setMountError(null);\n if (electionCandidates.length === 1) {\n const only = electionCandidates[0];\n if (!getHomeAnchor()) electHomeAnchor(membershipToMountRef(only));\n initVfsRealtimeWs(only.accountId);\n if (only.personalSpacePath) {\n loadMounts(only.personalSpacePath, (id: string) => {\n const m = allMemberships.find((x) => x.accountId === id);\n return m ? membershipToMountRef(m) : null;\n }).catch(setMountError);\n }\n autoSelectedRef.current = user.id;\n } else if (electionCandidates.length > 1) {\n // Multiple candidates — login election screen decides; do not auto-elect.\n autoSelectedRef.current = user.id;\n }\n }, [user?.id, electionCandidates, allMemberships]);\n\n const switchAccount = useCallback(async (accountPath: string) => {\n const m = allMemberships.find((a) => a.path === accountPath);\n if (!m) throw new Error('Account membership is unavailable');\n const ref = membershipToMountRef(m);\n if (!getHomeAnchor()) {\n // First election of the session = the HOME anchor.\n electHomeAnchor(ref);\n }\n const home = allMemberships.find(a => a.accountId === getHomeAnchor()?.id);\n if (!home?.personalSpacePath) throw new Error('The home membership has no mount declaration location');\n // Cached after success; an explicit selection also retries a failed initial\n // declaration read, without reloading it on every focus change.\n await loadMounts(home.personalSpacePath, (id: string) => {\n const member = allMemberships.find(a => a.accountId === id);\n return member ? membershipToMountRef(member) : null;\n });\n await selectMount(ref);\n setMountError(null);\n initVfsRealtimeWs(m.accountId);\n }, [allMemberships]);\n\n const mountScope = useCallback(async (scopePath: string) => {\n const m = allMemberships.find((a) => a.path === scopePath);\n if (!m) throw new Error('Scope membership is unavailable');\n await persistMount(membershipToMountRef(m));\n }, [allMemberships]);\n\n return {\n accounts: electionCandidates,\n allMemberships,\n currentAccount,\n mountedScope: null,\n switchAccount,\n mountScope,\n loading: query.isLoading,\n error: (query.error as Error | null) ?? mountError,\n };\n}\n\n/** The working set (mounts) as reactive state, plus mount/unmount verbs. */\nexport function useMounts() {\n useScopeKey();\n const version = useSyncExternalStore(subscribeMounts, getMountVersion, getMountVersion);\n const mounts = useMemo(() => getMounts(), [version]);\n const anchor = getAnchorRef();\n // One SDK-owned read selection for every destination. The internal Account\n // mount never becomes a Space, nor a fallback account-root work query.\n const selectedSpaces = useMemo(() => mounts.filter(ref => ref.kind === 'space'\n && (anchor?.kind === 'account' || ref.id === anchor?.id)), [mounts, anchor]);\n const readSpaceIds = useMemo(() => selectedSpaces.map(ref => ref.id).sort(), [selectedSpaces]);\n return {\n mounts,\n selectedSpaces,\n readSpaceIds,\n homeAnchor: getHomeAnchor(),\n anchor,\n setAnchor: selectMount,\n replaceMounts,\n mount: persistMount,\n unmount: persistUnmount,\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 getQueryClient().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 /** Canonical display name from os_principals.display_name (NOT the VFS item name). */\n display_name?: string;\n /** os_principals.created_at — for \"member since\". */\n created_at?: string;\n /** The principal's top-level VFS folder (/root/principals/<slug>) — owned by\n * the principal; the natural parent for principal-scoped files (avatar). */\n vfs_path?: string;\n role: string;\n authenticated: boolean;\n /** Sourced from os_principals.metadata (avatar_file_id, language, timezone, …). */\n metadata?: Record<string, any>;\n}\n\n/**\n * Params for the `update-principal` kernel syscall. All fields optional; only\n * keys present in the call are written. The target principal is resolved from\n * the JWT server-side — there is intentionally no principal_id field.\n */\nexport interface UpdatePrincipalParams {\n /** New display name written to os_principals.display_name (+ mirrored VFS item). */\n display_name?: string;\n /** Avatar pointer written into os_principals.metadata; null clears it. */\n avatar_file_id?: string | null;\n language?: string;\n timezone?: string;\n [key: string]: unknown;\n}\n\n/** The current principal's identity fields, resolved from os_principals. */\ninterface PrincipalRecord {\n principalId: string | null;\n displayName: string | null;\n createdAt: string | null;\n metadata: Record<string, any> | null;\n /** The principal's top-level VFS folder path (/root/principals/<slug>). */\n vfsPath: string | null;\n}\n\nlet _principalIdCache: ({ authUserId: string } & PrincipalRecord) | null = null;\nlet _principalIdPromise: Promise<PrincipalRecord> | null = null;\n\n// usePrincipal derives its value from useAuth().user (which never changes on a\n// name edit) + this module cache. After useUpdatePrincipal patches the cache we\n// must nudge mounted usePrincipal() instances to re-read it — these listeners\n// are that nudge (a plain cache write alone would not re-render).\nconst _principalListeners = new Set<() => void>();\nfunction _notifyPrincipalChange(): void {\n _principalListeners.forEach((fn) => fn());\n}\n\nregisterCleanup(() => {\n _principalIdCache = null;\n _principalIdPromise = null;\n});\n\n/**\n * Resolve the current user's full principal record (id + display_name +\n * created_at + metadata) from os_principals, memoized per auth user.\n */\nasync function resolvePrincipalRecord(authUserId?: string): Promise<PrincipalRecord> {\n const empty: PrincipalRecord = {\n principalId: null,\n displayName: null,\n createdAt: null,\n metadata: null,\n vfsPath: null,\n };\n\n // [2026-09-15] SEATED IDENTITY FIRST. The seated init response carries the\n // principal the kernel already derived to seat this session. Prefer it: the\n // fallback below reads os_principals through this module's own supabase\n // client, and hosts that authenticate by setCachedToken() never sign that\n // client in -- so getSession() returns nothing AND anon holds no SELECT on\n // os_principals. Both failures are silent (principalId: null), which left\n // resolvePrincipalId() and usePrincipal() permanently dead in those hosts.\n const seatedPrincipalId = getSessionEntry()?.principal_id ?? null;\n if (seatedPrincipalId) {\n if (_principalIdCache && _principalIdCache.principalId === seatedPrincipalId) {\n const { principalId, displayName, createdAt, metadata, vfsPath } = _principalIdCache;\n return { principalId, displayName, createdAt, metadata, vfsPath };\n }\n return { ...empty, principalId: seatedPrincipalId };\n }\n\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 empty;\n\n if (_principalIdCache && _principalIdCache.authUserId === uid) {\n const { principalId, displayName, createdAt, metadata, vfsPath } = _principalIdCache;\n return { principalId, displayName, createdAt, metadata, vfsPath };\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, display_name, created_at, metadata')\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:', error.message);\n return empty;\n }\n\n const principalId = data?.id ?? null;\n\n // Resolve the principal's top-level VFS folder (/root/principals/<slug>).\n // The principal owns it; it is the natural parent for principal-scoped\n // files like the avatar. The AI shadow principal is a nested child, so we\n // keep only the path that sits directly under /root/principals.\n let vfsPath: string | null = null;\n if (principalId) {\n const { data: items } = await supabase\n .from('os_items')\n .select('path')\n .eq('owner_principal_id', principalId)\n .eq('item_type', 'principal')\n .eq('is_active', true)\n .like('path', '/root/principals/%');\n const paths = (items ?? []).map((i: any) => i.path as string);\n vfsPath = paths.find((p) => p.split('/').length === 4) ?? paths[0] ?? null;\n }\n\n const rec: PrincipalRecord = {\n principalId,\n displayName: (data as any)?.display_name ?? null,\n createdAt: (data as any)?.created_at ?? null,\n metadata: (data as any)?.metadata ?? null,\n vfsPath,\n };\n _principalIdCache = { authUserId: uid!, ...rec };\n return rec;\n } finally {\n _principalIdPromise = null;\n }\n })();\n\n return _principalIdPromise;\n}\n\n/** Resolve current user's FSAOS os_principals.id from auth ID. (back-compat shim) */\nexport async function resolvePrincipalId(authUserId?: string): Promise<string | null> {\n return (await resolvePrincipalRecord(authUserId)).principalId;\n}\n\n/** Returns the current principal (user identity). */\nexport function usePrincipal() {\n const authResult = useAuth();\n const user = authResult.user;\n const seed = _principalIdCache?.authUserId === user?.id ? _principalIdCache : null;\n const [record, setRecord] = useState<PrincipalRecord | null>(seed);\n const prevUserIdRef = useRef<string | null>(null);\n\n // Re-read the module cache whenever useUpdatePrincipal patches it (the auth\n // user object never changes on a name edit, so this is the only re-render path).\n useEffect(() => {\n const sub = () => {\n const c = _principalIdCache;\n if (c && c.authUserId === user?.id) {\n setRecord({\n principalId: c.principalId,\n displayName: c.displayName,\n createdAt: c.createdAt,\n metadata: c.metadata,\n vfsPath: c.vfsPath,\n });\n }\n };\n _principalListeners.add(sub);\n return () => {\n _principalListeners.delete(sub);\n };\n }, [user?.id]);\n\n useEffect(() => {\n if (!user?.id) {\n setRecord(null);\n prevUserIdRef.current = null;\n return;\n }\n if (prevUserIdRef.current === user.id && record?.principalId != null) return;\n prevUserIdRef.current = user.id;\n\n resolvePrincipalRecord(user.id).then((rec) => {\n setRecord(rec);\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: record?.principalId ?? null,\n email: user.email,\n // Canonical identity comes from os_principals, not the auth user blob.\n display_name: record?.displayName ?? undefined,\n created_at: record?.createdAt ?? undefined,\n vfs_path: record?.vfsPath ?? undefined,\n role: user.role || user.app_metadata?.role || 'user',\n authenticated: true,\n metadata: record?.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/**\n * Fetch channel messages via the kernel's `get-channel-messages` method.\n *\n * Now uses `fetchChannelMessagesWithCards` to get bundled cards in a single\n * request, eliminating the N+1 query problem. Cards are returned alongside\n * messages, grouped by parent message path.\n */\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: () => fetchChannelMessagesWithCards(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 // Join a load that is already running rather than restart it.\n void refreshQuery(qc, stableKey, { exact: true });\n }, 500);\n },\n (data: any) => {\n return (\n (data.item_type === 'message' || data.item_type === 'card') &&\n isChannelPath(data.path, 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 response: ChannelMessagesResponse | undefined = query.data;\n const messages: ChannelMessage[] = response?.messages ?? [];\n const messageCards: Map<string, ChannelCard[]> = response?.messageCards ?? new Map();\n const siblingCards: ChannelCard[] = response?.siblingCards ?? [];\n\n return {\n messages,\n /** Cards grouped by parent message path (child cards of messages). */\n messageCards,\n /** Cards that are direct siblings of the channel (not nested under a message). */\n siblingCards,\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 // Aggregate cards across all pages\n const { messageCards, siblingCards } = useMemo(() => {\n const mc = new Map<string, ChannelCard[]>();\n const sc: ChannelCard[] = [];\n if (!query.data?.pages) return { messageCards: mc, siblingCards: sc };\n const seenCards = new Set<string>();\n for (const page of query.data.pages) {\n // Merge messageCards from each page\n for (const [path, cards] of page.messageCards) {\n for (const card of cards) {\n if (seenCards.has(card.id)) continue;\n seenCards.add(card.id);\n const existing = mc.get(path) || [];\n existing.push(card);\n mc.set(path, existing);\n }\n }\n // Merge siblingCards from each page\n for (const card of page.siblingCards) {\n if (seenCards.has(card.id)) continue;\n seenCards.add(card.id);\n sc.push(card);\n }\n }\n return { messageCards: mc, siblingCards: sc };\n }, [query.data?.pages]);\n\n // SSE-driven live tail: on new messages/cards, fetch only what's new\n // (after_seq = max seq in current data) and append to the last page.\n // This prevents gaps that occur when invalidating all pages causes the\n // \"latest 50\" window to shift forward while older pages retain stale cursors.\n const qc = useQueryClient();\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const stableKey = useMemo(\n () => [...vfsKeys.channelMessages(channelPath || '', parentMessageId), 'infinite', limit],\n [channelPath, parentMessageId, limit],\n );\n\n useEffect(() => {\n if (!realtime || !channelPath || !queryEnabled) return;\n\n // A full reload joins one that is already running instead of restarting\n // it, and only one tail fetch runs at a time: a change that lands while\n // one is running queues exactly one more for when it finishes.\n const reload = () => void refreshQuery(qc, stableKey, { exact: true });\n let tailRunning = false;\n let tailAgain = false;\n let disposed = false;\n\n const tailOnce = async () => {\n // Find the max seq across all loaded pages\n const currentData = qc.getQueryData<{ pages: ChannelMessagesPage[]; pageParams: unknown[] }>(stableKey);\n if (!currentData?.pages?.length) {\n // No data yet — refresh, joining the initial load if it is running.\n reload();\n return;\n }\n\n let maxSeq = 0;\n for (const page of currentData.pages) {\n for (const msg of page.messages) {\n if (msg.seq > maxSeq) maxSeq = msg.seq;\n }\n }\n\n if (maxSeq === 0) {\n reload();\n return;\n }\n\n // Fetch only messages newer than what we have\n try {\n const newPage = await fetchChannelMessagesPage(channelPath!, {\n parentMessageId,\n limit,\n after_seq: maxSeq,\n });\n\n if (newPage.messages.length === 0 && newPage.siblingCards.length === 0) {\n // No new messages — might be a card update on existing message.\n // Refetch all pages to pick up card changes (cards are lightweight).\n reload();\n return;\n }\n\n // Sequence gap detection: if the lowest seq in the new batch is\n // more than 1 above our maxSeq, we missed messages (burst > limit).\n // Fall back to full invalidation to reload cleanly.\n if (newPage.messages.length > 0) {\n const minNewSeq = Math.min(...newPage.messages.map(m => m.seq));\n if (minNewSeq > maxSeq + 1) {\n console.warn(\n `[useInfiniteChannelMessages] sequence gap detected: maxSeq=${maxSeq}, minNewSeq=${minNewSeq}. Triggering full refetch.`,\n );\n reload();\n return;\n }\n }\n\n // Append new messages to the last page in the cache\n qc.setQueryData<{ pages: ChannelMessagesPage[]; pageParams: unknown[] }>(stableKey, (old) => {\n if (!old) return old;\n const pages = [...old.pages];\n const lastIdx = pages.length - 1;\n const lastPage = pages[lastIdx];\n\n // Merge new messages into the last page (dedup by id)\n const existingIds = new Set(lastPage.messages.map(m => m.id));\n const uniqueNew = newPage.messages.filter(m => !existingIds.has(m.id));\n const mergedMessages = [...lastPage.messages, ...uniqueNew].sort((a, b) => a.seq - b.seq);\n\n // Merge cards\n const mergedMsgCards = new Map(lastPage.messageCards);\n for (const [path, cards] of newPage.messageCards) {\n const existing = mergedMsgCards.get(path) || [];\n const existingCardIds = new Set(existing.map(c => c.id));\n const newCards = cards.filter(c => !existingCardIds.has(c.id));\n mergedMsgCards.set(path, [...existing, ...newCards]);\n }\n\n const existingSibIds = new Set(lastPage.siblingCards.map(c => c.id));\n const newSiblings = newPage.siblingCards.filter(c => !existingSibIds.has(c.id));\n const mergedSiblings = [...lastPage.siblingCards, ...newSiblings];\n\n pages[lastIdx] = {\n ...lastPage,\n messages: mergedMessages,\n messageCards: mergedMsgCards,\n siblingCards: mergedSiblings,\n };\n\n return { ...old, pages };\n });\n } catch (err) {\n // Fallback: invalidate all on error\n console.warn('[useInfiniteChannelMessages] live tail fetch failed, falling back to full invalidation:', err);\n reload();\n }\n };\n\n const tail = async () => {\n if (tailRunning) {\n tailAgain = true;\n return;\n }\n tailRunning = true;\n try {\n do {\n tailAgain = false;\n await tailOnce();\n } while (tailAgain && !disposed);\n } finally {\n tailRunning = false;\n }\n };\n\n const unsub = subscribeToEvents(\n 'vfs_change',\n () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n void tail();\n }, 500);\n },\n (data: any) => {\n return (\n (data.item_type === 'message' || data.item_type === 'card') &&\n isChannelPath(data.path, channelPath!)\n );\n },\n );\n\n return () => {\n disposed = true;\n unsub();\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [realtime, channelPath, queryEnabled, stableKey, qc, parentMessageId, limit]);\n\n return {\n messages,\n /** Cards grouped by parent message path (child cards of messages). */\n messageCards,\n /** Cards that are direct siblings of the channel (not nested under a message). */\n siblingCards,\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 /** Canonical creation time, used for channels without a saved manual position. */\n createdAt?: string;\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\n/**\n * Normalize a GENERIC kernel_query channel row (raw columns + type_data +\n * _reader enrichment) into the Channel shape. Replaces the bespoke\n * kernel_list_channels flattening — that fn is deprecated (anchor_mount_spec).\n * Account display names resolve client-side from useAccounts/allMemberships\n * (group by accountId).\n */\nfunction normalizeChannel(raw: Record<string, unknown>): Channel {\n const td = (raw.type_data as Record<string, unknown>) || {};\n const reader = (raw._reader as Record<string, unknown>) || {};\n const lineage = (reader.context_lineage as Record<string, unknown>) || {};\n return {\n id: (raw.id as string) || '',\n path: (raw.path as string) || '',\n name: (raw.name as string) || '',\n displayName: (td.display_name as string) || (raw.name as string) || '',\n aiMode: normalizeAiMode(td.ai_mode),\n isPrivate: (td.is_private as boolean) || false,\n isDm: (td.is_dm as boolean) || false,\n messageCount: (td.message_count as number) || 0,\n createdAt: (raw.created_at as string) || '',\n updatedAt: (raw.updated_at as string) || '',\n chatScopePath: (lineage.context_path as string) || '',\n contextId: (raw.scope_item_id as string) || '',\n contextPath: (lineage.context_path as string) || '',\n contextType: (lineage.context_type as string) || '',\n contextName: (lineage.context_name as string) || '',\n contextDisplayName: (lineage.context_name as string) || '',\n contextPrincipalId: undefined,\n accountId: (raw.account_item_id as string) || '',\n accountPath: '',\n accountDisplayName: '',\n memberRole: (reader.member_role as string) || 'member',\n memberPath: '',\n modePath: '',\n autoPilot: (td.auto_pilot as boolean) || false,\n };\n}\n\nexport interface ChannelsOptions {\n realtime?: boolean;\n enabled?: boolean;\n}\n\n/**\n * Fetch all channels (DMs + public) via the GENERIC kernel query\n * (item_type=channel + include_reader enrichment). MOUNT-AWARE: with a\n * mounts declaration, channels from every mounted account/space return in\n * one call — group client-side by `accountId`. Replaces `list-channels`\n * (kernel_list_channels is deprecated per anchor_mount_spec.md).\n */\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('query', {\n item_type: 'channel',\n include_reader: true,\n limit: 500,\n }) as Record<string, unknown>;\n const raw = (result.items 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/**\n * Write the authenticated principal's display name / metadata via the\n * `update-principal` kernel syscall.\n *\n * The kernel writes os_principals.display_name (+ avatar/language/timezone in\n * metadata), mirrors display_name onto the paired /root/principals/<slug> VFS\n * item, and emits an identity-changed event. The target principal is resolved\n * from the JWT server-side — callers never pass a principal_id.\n *\n * On success we patch the module-scoped principal cache and notify usePrincipal\n * subscribers so the new name renders immediately. usePrincipal reads identity\n * from os_principals (via that cache), not a TanStack query, so this patch — not\n * query invalidation — is the load-bearing coherence step. Without it the read\n * stays stale and a consumer's \"unsaved changes\" state never clears.\n */\nexport function useUpdatePrincipal() {\n return useTanstackMutation({\n mutationFn: (params: UpdatePrincipalParams) => gatewayCall('update-principal', params),\n onSuccess: (data: any, variables: UpdatePrincipalParams) => {\n if (!_principalIdCache) return;\n // Prefer the server's authoritative metadata; fall back to a local merge.\n const nextMeta =\n data && typeof data === 'object' && data.metadata\n ? (data.metadata as Record<string, any>)\n : {\n ...(_principalIdCache.metadata ?? {}),\n ...(typeof variables.language === 'string' ? { language: variables.language } : {}),\n ...(typeof variables.timezone === 'string' ? { timezone: variables.timezone } : {}),\n ...('avatar_file_id' in variables\n ? { avatar_file_id: variables.avatar_file_id }\n : {}),\n };\n _principalIdCache = {\n ..._principalIdCache,\n displayName:\n typeof variables.display_name === 'string'\n ? variables.display_name\n : _principalIdCache.displayName,\n metadata: nextMeta,\n };\n _notifyPrincipalChange();\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// ── Arrangement Hook ────────────────────────────────────────────────────────\n\n/**\n * Resolve an arrangement by semantic key with scope cascade.\n *\n * Calls `resolve-arrangement` with `{ key }` — the kernel cascades:\n * member scope → fractal scope → system scope → empty.\n *\n * Returns the fully resolved children (symlinks dereferenced, order/hidden\n * applied, can_do gated). The FE renders directly from `resolvedChildren`.\n *\n * For backward compatibility, passing a `parentPath` still works via the\n * legacy `item_id`/`path` resolution mode in the kernel.\n *\n * @example\n * // New key-based usage (recommended):\n * const { resolvedChildren, resolutionLevel } = useArrangement({ key: 'dock' });\n *\n * // Legacy path-based usage (backward compat):\n * const { resolvedChildren } = useArrangement({ path: '/root/system/arrangements/dock' });\n *\n * // Legacy string shorthand (backward compat):\n * const { resolvedChildren } = useArrangement('/root/system/arrangements/dock');\n */\nexport function useArrangement(\n paramsOrPath: string | { key?: string; path?: string; item_id?: string; scope_id?: string } | null | undefined,\n) {\n useScopeKey();\n\n // Normalize input: string → legacy path mode; object → new key mode\n const scopePath = getScope();\n const resolvedParams: { key?: string; path?: string; item_id?: string; scope_id?: string } | null = useMemo(() => {\n if (!paramsOrPath) return null;\n if (typeof paramsOrPath === 'string') return { path: paramsOrPath };\n return paramsOrPath;\n }, [typeof paramsOrPath === 'string' ? paramsOrPath : JSON.stringify(paramsOrPath)]);\n\n const enabled = !!scopePath && !!resolvedParams && !!(resolvedParams.key || resolvedParams.path || resolvedParams.item_id);\n\n const cacheKey = resolvedParams?.key ?? resolvedParams?.path ?? resolvedParams?.item_id ?? '';\n const arrangementQueryKey = ['vfs', scopePath ?? '__unscoped__', 'arrangement', cacheKey, resolvedParams?.scope_id ?? ''] as const;\n\n const query = useQuery({\n queryKey: arrangementQueryKey,\n staleTime: Infinity,\n retry: false,\n meta: { arrangementRealtime: true },\n queryFn: async () => {\n if (!resolvedParams) return null;\n const response: any = await gatewayCall('resolve-arrangement', { ...resolvedParams, _scope_path: scopePath! });\n if (response?.success === false) {\n throw new Error(response?.error || 'Arrangement could not be loaded');\n }\n return response ?? null;\n },\n enabled,\n });\n\n const arrangement = query.data ?? null;\n const resolvedChildren: any[] = useMemo(\n () => arrangement?.resolved_children ?? [],\n [arrangement],\n );\n const resolutionLevel: string | null = arrangement?.resolution_level ?? null;\n\n // Legacy applyTo helper — still useful if the caller has a separate child list\n const order: string[] | null = useMemo(() => {\n // In the new mode, order is already applied server-side.\n // But we expose it for callers that need the raw order array.\n const td = arrangement?.type_data ?? null;\n const o = td?.order;\n return Array.isArray(o) ? (o as string[]) : null;\n }, [arrangement]);\n\n const applyTo = useCallback(\n <T extends { id?: string; name?: string }>(children: T[]): T[] => {\n if (!order || !children?.length) return children ?? [];\n const key = (c: T) => c.id ?? c.name ?? '';\n const rank = new Map(order.map((k, i) => [k, i] as const));\n const listed: T[] = [];\n const rest: T[] = [];\n for (const c of children) {\n (rank.has(key(c)) ? listed : rest).push(c);\n }\n listed.sort((a, b) => (rank.get(key(a))! - rank.get(key(b))!));\n return [...listed, ...rest];\n },\n [order],\n );\n\n return {\n ...query,\n arrangement,\n resolvedChildren,\n resolutionLevel,\n order,\n sourceScopeId: arrangement?.scope_item_id ?? null,\n arrangementQueryKey,\n applyTo,\n };\n}\n\n/* ---------------------------- Minted assets ------------------------------ */\n\n/** The honest life of a tool-produced file, as the system actually reports it. */\nexport type MintedAssetState =\n | 'idle' // nothing to wait for\n | 'pending' // the tool minted a row; materialization has not landed yet\n | 'materializing' // the asset item exists, its bytes are not in storage yet\n | 'ready' // item + bytes both present — safe to render\n | 'failed'; // the producer reported a mint error\n\nexport interface MintedAsset {\n state: MintedAssetState;\n /** Set when `asset.materialized` identifies the durable item. */\n itemId?: string;\n itemPath?: string;\n displayName?: string;\n /** The tool's transient provider URL. Correct immediately; may expire. */\n fallbackUrl?: string;\n error?: string;\n}\n\n/**\n * Follow a tool result's file from \"the tool returned\" to \"safe to render\".\n *\n * WHY THIS EXISTS. A media tool returns a provider URL AND mints a durable FSAOS\n * asset, but the mint completes *after* the reply — deliberately, because waiting\n * in-reply just delays the user's answer. So at card-render time the asset does\n * not exist yet. Cards that looked for it found nothing and showed a bare link;\n * cards that showed the provider URL displayed something that later expires.\n *\n * The producer announces completion instead of the consumer asking: `kernel_signal`\n * emits `asset.materialized` when an item lands, carrying `origin` (the message\n * path that produced it) and `has_bytes`. Byte fetch is a separate async step, so\n * `has_bytes:false` is normal on arrival — `content.written` follows. Those two\n * events are what separate \"saving\" from \"ready\", and why this hook never claims\n * a file is displayable before its bytes exist.\n *\n * Correlation is by ORIGIN (the producing message), not by path or name, so a\n * rename or a move cannot break the link.\n *\n * NOTE ON CONNECTIONS: subscribeToEvents is a local listener — it does not open a\n * socket by itself and silently receives nothing unless a scope/path subscription\n * exists. That failure is invisible (a skeleton that never resolves), so this hook\n * holds its own scope subscription for as long as it is waiting. An indexed,\n * account-scoped asset lookup closes the startup/history gap when the\n * materialization event arrived before this consumer subscribed.\n */\nexport function useMintedAsset(params: {\n /** The message path stamped into the declared provenance field. */\n origin?: string | null;\n /** Tool-declared top-level provenance field used for historical recovery. */\n originField?: string | null;\n /** The tool's own URL, shown while the durable asset is still landing. */\n fallbackUrl?: string | null;\n /** The producer's mint error, if it reported one. */\n mintError?: string | null;\n /** Scope to subscribe under — required for the socket to be open. */\n scopeId?: string | null;\n /** Account scope path for indexed historical recovery. */\n scopePath?: string | null;\n}): MintedAsset {\n const { origin, originField, fallbackUrl, mintError, scopeId, scopePath } = params;\n const sdkGeneration = useScopeKey();\n const session = getSessionEntry();\n const resolvedScopeId = scopeId ?? session?.scope_id ?? null;\n const originAccountScope = useMemo(() => {\n if (!origin) return null;\n const marker = '/accounts/';\n const markerIndex = origin.indexOf(marker);\n if (markerIndex === -1) return null;\n const accountEnd = origin.indexOf('/', markerIndex + marker.length);\n return accountEnd === -1 ? origin : origin.slice(0, accountEnd);\n }, [origin]);\n const resolvedScopePath = scopePath ?? originAccountScope ?? session?.scope_path ?? null;\n const resolvedOriginField = originField?.trim() || null;\n const correlationKey = `${sdkGeneration}\\n${resolvedScopeId ?? ''}\\n${resolvedScopePath ?? ''}\\n${resolvedOriginField ?? ''}\\n${origin ?? ''}`;\n type FoundAsset = {\n key: string;\n itemId: string;\n itemPath?: string;\n displayName?: string;\n hasBytes: boolean;\n };\n const [found, setFound] = useState<FoundAsset | null>(null);\n const activeRef = useRef<{\n key: string;\n found: FoundAsset | null;\n earlyContentPaths: Set<string>;\n }>({\n key: correlationKey,\n found: null,\n earlyContentPaths: new Set(),\n });\n\n const currentFound = found?.key === correlationKey ? found : null;\n\n // Commit generation changes before passive effect cleanup/registration. This\n // prevents abandoned renders from invalidating the active card while still\n // rejecting callbacks from the previous committed generation.\n useLayoutEffect(() => {\n activeRef.current = {\n key: correlationKey,\n found: currentFound,\n earlyContentPaths: new Set(),\n };\n }, [correlationKey]);\n\n const recovery = useQuery({\n queryKey: [\n 'vfs',\n resolvedScopePath ?? '__unscoped__',\n 'minted-asset',\n resolvedOriginField ?? '',\n origin ?? '',\n ],\n queryFn: async () => {\n const response = await gatewayCall('query', {\n scope_path: resolvedScopePath!,\n filters: { [`field.${resolvedOriginField!}`]: origin! },\n limit: 1,\n });\n const rawItems = response.content?.items ?? response.items ?? [];\n const asset = rawItems[0] ? normalizeItem(rawItems[0]) : null;\n if (!asset) return null;\n const children = await fetchVfsChildren(asset.path);\n const hasBytes = children.some(\n (child) => child.item_type === 'file' && Boolean(child.type_data?.file_ref),\n );\n return { asset, hasBytes };\n },\n enabled: Boolean(origin && resolvedScopePath && resolvedOriginField && !mintError),\n refetchInterval: (query) => {\n if (activeRef.current.key === correlationKey && activeRef.current.found?.hasBytes) {\n return false;\n }\n return query.state.data?.hasBytes ? false : 1500;\n },\n });\n\n useEffect(() => {\n const recovered = recovery.data;\n if (!recovered || activeRef.current.key !== correlationKey) return;\n const previous = activeRef.current.found;\n const next: FoundAsset = {\n key: correlationKey,\n itemId: recovered.asset.id,\n itemPath: recovered.asset.path,\n displayName: typeof recovered.asset.type_data?.display_name === 'string'\n ? recovered.asset.type_data.display_name\n : recovered.asset.name,\n hasBytes: recovered.hasBytes\n || Boolean(previous?.itemId === recovered.asset.id && previous.hasBytes),\n };\n activeRef.current.found = next;\n setFound(next);\n }, [recovery.data, correlationKey]);\n\n const waiting = Boolean(origin && resolvedScopeId) && !mintError && !currentFound?.hasBytes;\n\n // Keep the socket open while waiting — see NOTE ON CONNECTIONS above.\n useEffect(() => {\n if (!waiting || !resolvedScopeId) return;\n return subscribeToScope(\n resolvedScopeId,\n ['asset.materialized', 'content.written'],\n );\n }, [waiting, resolvedScopeId]);\n\n useEffect(() => {\n if (!waiting || !origin || !resolvedScopeId) return;\n const generationKey = correlationKey;\n const payload = (data: any) => data?.payload ?? data;\n const eventScope = (data: any): string | undefined => {\n const p = payload(data);\n const value = p?.scope_id ?? data?.scope_id;\n return typeof value === 'string' ? value : undefined;\n };\n const contentPath = (data: any): string | undefined => {\n const p = payload(data);\n const value = p?.item_path ?? data?.item_path;\n return typeof value === 'string' && value ? value : undefined;\n };\n const belongsToAsset = (itemPath: string, assetPath: string): boolean => {\n const normalizedAssetPath = assetPath.replace(/\\/+$/, '');\n return itemPath === normalizedAssetPath\n || itemPath.startsWith(`${normalizedAssetPath}/`);\n };\n\n const unsubscribes = [\n subscribeToEvents('asset.materialized', (data: any) => {\n if (activeRef.current.key !== generationKey) return;\n const p = payload(data);\n if (typeof p?.item_id !== 'string' || !p.item_id) return;\n const previous = activeRef.current.found;\n const itemPath = typeof p.item_path === 'string' ? p.item_path : undefined;\n const hasBytes = Boolean(p.has_bytes)\n || Boolean(\n itemPath\n && Array.from(activeRef.current.earlyContentPaths)\n .some((path) => belongsToAsset(path, itemPath)),\n )\n || Boolean(previous && previous.itemId === p.item_id && previous.hasBytes);\n const next: FoundAsset = {\n key: generationKey,\n itemId: p.item_id,\n itemPath,\n displayName: typeof p.display_name === 'string' ? p.display_name : undefined,\n hasBytes,\n };\n activeRef.current.found = next;\n setFound(next);\n }, (data: any) => {\n const scope = eventScope(data);\n return (!scope || scope === resolvedScopeId) && payload(data)?.origin === origin;\n }),\n\n subscribeToEvents('content.written', (data: any) => {\n if (activeRef.current.key !== generationKey) return;\n const itemPath = contentPath(data);\n if (!itemPath) return;\n const previous = activeRef.current.found;\n if (!previous?.itemPath || !belongsToAsset(itemPath, previous.itemPath)) {\n // content.written can race ahead of asset.materialized. Buffer a\n // bounded set of paths until materialization identifies the parent.\n activeRef.current.earlyContentPaths.add(itemPath);\n if (activeRef.current.earlyContentPaths.size > 128) {\n const oldest = activeRef.current.earlyContentPaths.values().next().value;\n if (oldest) activeRef.current.earlyContentPaths.delete(oldest);\n }\n return;\n }\n if (previous.hasBytes) return;\n const next = { ...previous, hasBytes: true };\n activeRef.current.found = next;\n setFound(next);\n }, (data: any) => {\n const scope = eventScope(data);\n return (!scope || scope === resolvedScopeId) && Boolean(contentPath(data));\n }),\n ];\n return () => unsubscribes.forEach(fn => fn());\n }, [waiting, origin, resolvedScopeId, correlationKey]);\n\n const state: MintedAssetState =\n mintError ? 'failed'\n : !origin ? 'idle'\n : currentFound ? (currentFound.hasBytes ? 'ready' : 'materializing')\n : 'pending';\n\n return {\n state,\n itemId: currentFound?.itemId,\n itemPath: currentFound?.itemPath,\n displayName: currentFound?.displayName,\n fallbackUrl: fallbackUrl ?? undefined,\n error: mintError ?? undefined,\n };\n}\n","import { useMemo, useRef, useSyncExternalStore } from 'react';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { gatewayCall } from './client';\nimport { useArrangement } from './hooks';\nimport { getAnchorRef, getScope, getScopeVersion, subscribeScope } from './session';\nimport { refreshArrangement } from './arrangement-realtime';\n\nexport type PersonalItemOrderKey = 'channel-order' | 'project-order';\n\n/** Order a supplied complete collection using the selected Space member's arrangement.\n * Does not discover items, provision preferences, or change an item's parent.\n * Channels without a saved position appear first, newest creation first.\n * Unknown saved IDs retain their positions when the visible subset is reordered.\n * Paginated collection reads must apply arrangement order on the server before\n * cutting pages; this hook is not a substitute for that read contract.\n */\nexport function usePersonalItemOrder<T extends { id: string; createdAt?: string }>(key: PersonalItemOrderKey, items: readonly T[]) {\n const generation = useSyncExternalStore(subscribeScope, getScopeVersion, getScopeVersion);\n const anchor = getAnchorRef();\n const scopePath = getScope();\n const supported = anchor?.kind === 'space';\n const query = useArrangement(supported && scopePath ? { key, scope_id: anchor.id } : null);\n const orderedItems = useMemo(() => {\n const arranged = query.applyTo([...items]);\n if (key !== 'channel-order') return arranged;\n const savedIds = new Set(query.order ?? []);\n const unplaced = arranged.filter(item => !savedIds.has(item.id));\n // Use the existing channel payload, never activity timestamps or extra reads.\n // Equal/missing creation dates retain the supplied collection's stable order.\n const created = (item: T) => Date.parse(item.createdAt ?? '') || 0;\n unplaced.sort((a, b) => created(b) - created(a));\n return [...unplaced, ...arranged.filter(item => savedIds.has(item.id))];\n }, [key, items, query.applyTo, query.order]);\n const client = useQueryClient();\n const pending = useRef(false);\n const ready = Boolean(supported && !query.error && query.arrangement?.item_id\n && query.resolutionLevel === 'member' && query.arrangement.write_target_id === query.arrangement.item_id);\n const mutation = useMutation({\n mutationFn: async (change: { ids: string[]; scopePath: string; arrangementId: string; queryKey: typeof query.arrangementQueryKey }) => {\n const response = await gatewayCall('update', {\n _scope_path: change.scopePath, id: change.arrangementId, type_data: { order: change.ids },\n });\n if (response?.success === false) throw new Error(response.error || 'Order could not be saved');\n return response;\n },\n onSettled: (_data, _error, change) => refreshArrangement(client, change.queryKey),\n });\n async function reorder(ids: string[]) {\n if (!ready || !scopePath || generation !== getScopeVersion() || getScope() !== scopePath) {\n throw new Error('Personal order is not available in this Space');\n }\n if (pending.current) throw new Error('An order change is already being saved');\n const visibleIds = items.map(item => item.id);\n if (ids.length !== visibleIds.length || new Set(ids).size !== visibleIds.length\n || visibleIds.some(id => !ids.includes(id))) throw new Error('Order must include each displayed item exactly once');\n const cached = client.getQueryData(query.arrangementQueryKey) as typeof query.arrangement;\n if (cached?.item_id !== query.arrangement.item_id\n || JSON.stringify(cached?.type_data?.order ?? []) !== JSON.stringify(query.order ?? [])) {\n throw new Error('The saved order changed. Try dragging again');\n }\n const current = orderedItems.map(item => item.id);\n if (ids.every((id, index) => current[index] === id)) return;\n // Replace just the displayed slots, then append newly discovered items.\n // A temporarily inaccessible/off-page item must not lose its saved place.\n const visible = new Set(visibleIds);\n let index = 0;\n const saved = (query.order ?? []).map(id => visible.has(id) ? ids[index++] : id);\n const order = [...saved, ...ids.slice(index)];\n pending.current = true;\n try {\n return await mutation.mutateAsync({ ids: order, scopePath, arrangementId: query.arrangement.item_id,\n queryKey: query.arrangementQueryKey });\n } finally { pending.current = false; }\n }\n return { items: orderedItems, ready, supported, contextKey: `${generation}:${scopePath}:${key}`,\n isLoading: supported && query.isLoading, error: query.error, refetch: query.refetch,\n isSaving: mutation.isPending, saveError: mutation.error, reorder };\n}\n","import { GATEWAY_URL, PUBLIC_SOURCES } from './config';\nimport type { PublicSourceConfig, SourceCaptureAdapter, SourceIdentityStorage } from './config';\nimport { getHostname } from './session';\n\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst ATTRIBUTE_PATTERN = /^[A-Za-z_:][A-Za-z0-9_:.-]{0,127}$/;\n\nconst memoryVisitors = new Map<string, string>();\nconst memorySessions = new Map<string, { id: string; lastSeenAt: number }>();\n\nexport interface TrackEventOptions {\n /** Release-local source key. Item identity is resolved by trusted infrastructure. */\n source?: string;\n eventId?: string;\n occurredAt?: string;\n pageUrl?: string;\n referrer?: string;\n visitorId?: string;\n sessionId?: string;\n signal?: AbortSignal;\n keepalive?: boolean;\n}\n\nexport interface InteractionReceipt {\n success: true;\n requested: number;\n accepted: number;\n duplicates: number;\n release_id: string;\n}\n\nexport interface StartTrackingOptions {\n source?: string;\n pageViews?: boolean;\n declaredActions?: boolean;\n}\n\ninterface InteractionFailure {\n success?: false;\n error?: string;\n message?: string;\n}\n\nexport class InteractionTrackingError extends Error {\n readonly code: string;\n readonly status: number;\n readonly eventId: string;\n\n constructor(message: string, code: string, status: number, eventId: string) {\n super(message);\n this.name = 'InteractionTrackingError';\n this.code = code;\n this.status = status;\n this.eventId = eventId;\n }\n}\n\nfunction publicSource(id?: string): PublicSourceConfig {\n const source = id\n ? PUBLIC_SOURCES.find((candidate) => candidate.id === id)\n : PUBLIC_SOURCES.find((candidate) => candidate.default === true)\n ?? (PUBLIC_SOURCES.length === 1 ? PUBLIC_SOURCES[0] : undefined);\n if (!source) throw new TypeError('No unambiguous source is declared for this release');\n if (!source.id || !Number.isInteger(source.version) || source.version < 1) {\n throw new TypeError('The release source declaration is invalid');\n }\n return source;\n}\n\nfunction adapterFor(type: SourceCaptureAdapter['type'], source: PublicSourceConfig): SourceCaptureAdapter {\n const adapter = source.adapters?.find((candidate) => candidate.type === type);\n if (!adapter) throw new TypeError(`The source does not declare a ${type} adapter`);\n return adapter;\n}\n\nfunction validObservationName(value: string): boolean {\n return value.length > 0 && value.length <= 128 && !/[\\u0000-\\u001f\\u007f]/.test(value);\n}\n\nfunction assertDeclaredObservation(source: PublicSourceConfig, observation: string): void {\n if (!validObservationName(observation) || !source.observations?.includes(observation)) {\n throw new TypeError('The observation is not declared by this release source');\n }\n}\n\nfunction browserStorage(config: SourceIdentityStorage): Storage | undefined {\n if (typeof window === 'undefined' || config.storage === 'memory') return undefined;\n try {\n return config.storage === 'session' ? window.sessionStorage : window.localStorage;\n } catch {\n return undefined;\n }\n}\n\nfunction readStoredUuid(config: SourceIdentityStorage): string | undefined {\n try {\n const value = browserStorage(config)?.getItem(config.key) ?? undefined;\n return value && UUID_PATTERN.test(value) ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStorage(config: SourceIdentityStorage, value: string): void {\n try {\n browserStorage(config)?.setItem(config.key, value);\n } catch {\n // Privacy modes may disable storage. In-memory identity remains valid for\n // this document and capture never breaks the application.\n }\n}\n\nfunction visitorId(source: PublicSourceConfig): string {\n const config = source.identity?.visitor;\n if (!config?.key) throw new TypeError('The source visitor identity policy is invalid');\n const existing = readStoredUuid(config) ?? memoryVisitors.get(source.id);\n if (existing) return existing;\n const created = crypto.randomUUID();\n memoryVisitors.set(source.id, created);\n writeStorage(config, created);\n return created;\n}\n\nfunction sessionId(source: PublicSourceConfig, now = Date.now()): string {\n const config = source.identity?.session;\n if (!config?.key || !Number.isInteger(config.idle_seconds) || config.idle_seconds < 1) {\n throw new TypeError('The source session identity policy is invalid');\n }\n let stored: { id?: unknown; lastSeenAt?: unknown } | undefined;\n try {\n const raw = browserStorage(config)?.getItem(config.key);\n stored = raw ? JSON.parse(raw) as { id?: unknown; lastSeenAt?: unknown } : undefined;\n } catch {\n stored = undefined;\n }\n const memory = memorySessions.get(source.id);\n const candidate = stored && typeof stored.id === 'string' && UUID_PATTERN.test(stored.id)\n && typeof stored.lastSeenAt === 'number'\n ? { id: stored.id, lastSeenAt: stored.lastSeenAt }\n : memory;\n const idleMs = config.idle_seconds * 1000;\n const active = candidate && now - candidate.lastSeenAt >= 0 && now - candidate.lastSeenAt < idleMs;\n const session = active ? { id: candidate.id, lastSeenAt: now } : {\n id: crypto.randomUUID(),\n lastSeenAt: now,\n };\n memorySessions.set(source.id, session);\n writeStorage(config, JSON.stringify(session));\n return session.id;\n}\n\nfunction sourceKeysFrom(source: PublicSourceConfig, pageUrl: string): Record<string, string> | undefined {\n const keys = source.source_keys?.query;\n if (!Array.isArray(keys) || keys.length === 0) return undefined;\n let url: URL;\n try {\n url = new URL(pageUrl);\n } catch {\n return undefined;\n }\n const configuredMax = source.source_keys?.max_value_length;\n const maxLength = Number.isInteger(configuredMax)\n ? Math.min(Math.max(configuredMax ?? 1, 1), 4096)\n : 512;\n const values = Object.fromEntries(keys.flatMap((key) => {\n if (typeof key !== 'string' || key.length === 0 || key.length > 128) return [];\n const value = url.searchParams.get(key);\n return value ? [[key, value.slice(0, maxLength)]] : [];\n }));\n return Object.keys(values).length > 0 ? values : undefined;\n}\n\n/** Append one observation through a release-bound, declared source. */\nexport async function trackEvent(\n observation: string,\n properties: Record<string, unknown> = {},\n options: TrackEventOptions = {},\n): Promise<InteractionReceipt> {\n const source = publicSource(options.source);\n assertDeclaredObservation(source, observation);\n if (!properties || typeof properties !== 'object' || Array.isArray(properties)) {\n throw new TypeError('properties must be an object');\n }\n const eventId = options.eventId ?? crypto.randomUUID();\n const resolvedVisitorId = options.visitorId ?? visitorId(source);\n const resolvedSessionId = options.sessionId ?? sessionId(source);\n if (![eventId, resolvedVisitorId, resolvedSessionId].every((value) => UUID_PATTERN.test(value))) {\n throw new TypeError('event, visitor, and session IDs must be UUIDs');\n }\n const pageUrl = options.pageUrl ?? (typeof window !== 'undefined' ? window.location.href : undefined);\n if (!pageUrl) throw new TypeError('pageUrl is required outside a browser');\n const occurredAt = options.occurredAt ?? new Date().toISOString();\n if (Number.isNaN(Date.parse(occurredAt))) throw new TypeError('occurredAt is invalid');\n const referrer = options.referrer\n ?? (typeof document !== 'undefined' ? document.referrer || undefined : undefined);\n const sourceKeys = sourceKeysFrom(source, pageUrl);\n const eventProperties = sourceKeys ? { ...properties, source_keys: sourceKeys } : properties;\n const hostname = getHostname();\n const endpoint = `${GATEWAY_URL.replace(/\\/+$/, '')}/d/${encodeURIComponent(hostname)}/interactions`;\n\n let response: Response;\n try {\n response = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n body: JSON.stringify({\n source: source.id,\n page_url: pageUrl,\n visitor_id: resolvedVisitorId,\n session_id: resolvedSessionId,\n referrer,\n events: [{ id: eventId, event_type: observation, occurred_at: occurredAt, properties: eventProperties }],\n }),\n signal: options.signal,\n credentials: 'omit',\n keepalive: options.keepalive ?? false,\n });\n } catch (error) {\n throw new InteractionTrackingError(\n error instanceof Error ? error.message : 'Observation transport network error',\n 'OBSERVATION_NETWORK_ERROR', 0, eventId,\n );\n }\n\n let payload: InteractionReceipt | InteractionFailure | null = null;\n try {\n payload = await response.json() as InteractionReceipt | InteractionFailure;\n } catch {\n // Non-JSON is a transport failure, never a successful receipt.\n }\n if (!response.ok || payload?.success !== true) {\n const failure = payload as InteractionFailure | null;\n throw new InteractionTrackingError(\n failure?.message || failure?.error || `Observation transport failed (${response.status})`,\n failure?.error || 'OBSERVATION_TRANSPORT_FAILED', response.status, eventId,\n );\n }\n return payload;\n}\n\nexport function trackPageView(\n properties: Record<string, unknown> = {},\n options: TrackEventOptions = {},\n): Promise<InteractionReceipt> {\n const source = publicSource(options.source);\n const adapter = adapterFor('page_view', source);\n const defaults = typeof document === 'undefined' || !adapter.title_property\n ? {}\n : { [adapter.title_property]: document.title.slice(0, 512) };\n return trackEvent(adapter.observation, { ...defaults, ...properties }, { ...options, source: source.id });\n}\n\nexport function trackAction(\n actionId: string,\n properties: Record<string, unknown> = {},\n options: TrackEventOptions = {},\n): Promise<InteractionReceipt> {\n if (!actionId || actionId.length > 128) throw new TypeError('actionId is invalid');\n const source = publicSource(options.source);\n const adapter = adapterFor('declared_action', source);\n const adapterProperties = adapter.id_property ? { [adapter.id_property]: actionId } : {};\n return trackEvent(adapter.observation, { ...properties, ...adapterProperties }, { ...options, source: source.id });\n}\n\n/** Snapshot anonymous correlation for the durable form row. Never authenticates a person. */\nexport function formAttribution(): { visitor_id: string; session_id: string; source: string } | undefined {\n try {\n const source = publicSource();\n adapterFor('form_receipt', source);\n return { visitor_id: visitorId(source), session_id: sessionId(source), source: source.id };\n } catch {\n return undefined;\n }\n}\n\n/** Join an authoritative form receipt to the source stream when declared. */\nexport function trackFormReceipt(\n properties: Record<string, unknown>,\n options: TrackEventOptions = {},\n): Promise<InteractionReceipt> {\n const source = publicSource(options.source);\n const adapter = adapterFor('form_receipt', source);\n return trackEvent(adapter.observation, properties, { ...options, source: source.id });\n}\n\nlet trackingCleanup: (() => void) | undefined;\n\n/** Start only the browser adapters declared by the exact published source. */\nexport function startTracking(options: StartTrackingOptions = {}): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {};\n if (trackingCleanup) return trackingCleanup;\n if (window.__FSAOS_CONFIG__?.tracking?.enabled === false) return () => {};\n\n let source: PublicSourceConfig;\n try {\n source = publicSource(options.source);\n } catch {\n return () => {};\n }\n const pageAdapters = options.pageViews === false\n ? []\n : source.adapters.filter((adapter) => adapter.type === 'page_view');\n const actionAdapters = options.declaredActions === false\n ? []\n : source.adapters.filter((adapter) => adapter.type === 'declared_action');\n let lastPageUrl = '';\n const emitPageView = () => {\n if (window.location.href === lastPageUrl) return;\n lastPageUrl = window.location.href;\n for (const adapter of pageAdapters) {\n const properties = adapter.title_property\n ? { [adapter.title_property]: document.title.slice(0, 512) }\n : {};\n void trackEvent(adapter.observation, properties, { source: source.id, keepalive: true }).catch(() => {});\n }\n };\n const onDeclaredAction = (event: MouseEvent) => {\n if (!(event.target instanceof Element)) return;\n for (const adapter of actionAdapters) {\n const attribute = adapter.attribute;\n if (!attribute || !ATTRIBUTE_PATTERN.test(attribute)) continue;\n const target = event.target.closest<HTMLElement>(`[${attribute}]`);\n if (!target) continue;\n const actionId = target.getAttribute(attribute)?.trim();\n if (!actionId || actionId.length > 128) continue;\n const properties: Record<string, unknown> = {};\n if (adapter.id_property) properties[adapter.id_property] = actionId;\n if (adapter.element_property) properties[adapter.element_property] = target.tagName.toLowerCase();\n void trackEvent(adapter.observation, properties, { source: source.id, keepalive: true }).catch(() => {});\n }\n };\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n const afterHistoryChange = () => queueMicrotask(emitPageView);\n const watchesHistory = pageAdapters.some((adapter) => adapter.history === true);\n const watchesPageShow = pageAdapters.some((adapter) => adapter.pageshow === true);\n if (watchesHistory) {\n window.history.pushState = function pushState(...args) {\n originalPushState.apply(this, args);\n afterHistoryChange();\n };\n window.history.replaceState = function replaceState(...args) {\n originalReplaceState.apply(this, args);\n afterHistoryChange();\n };\n window.addEventListener('popstate', emitPageView);\n }\n if (watchesPageShow) window.addEventListener('pageshow', emitPageView);\n if (actionAdapters.length > 0) document.addEventListener('click', onDeclaredAction, { capture: true });\n if (pageAdapters.length > 0) queueMicrotask(emitPageView);\n\n trackingCleanup = () => {\n window.removeEventListener('popstate', emitPageView);\n window.removeEventListener('pageshow', emitPageView);\n document.removeEventListener('click', onDeclaredAction, { capture: true });\n if (watchesHistory) {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n }\n trackingCleanup = undefined;\n };\n return trackingCleanup;\n}\n","import { getQueryClient } from './query-client';\nimport { vfsKeys } from './vfs-keys';\nimport { fetchMemberships, membershipToMountRef, type AccountInfo } from './memberships';\nimport { loadMounts } from './mounts';\nimport { initSession, electHomeAnchor, getHomeAnchor, getSessionGeneration, registerCleanup, type MountRef } from './session';\n\nexport interface WorkspaceOptions {\n /** The authenticated account path returned by the host's token exchange. */\n accountPath: string;\n}\nexport interface WorkspaceSession {\n home: MountRef;\n defaultSpace: MountRef;\n memberships: AccountInfo[];\n}\nlet initialization: { accountPath: string; promise: Promise<WorkspaceSession> } | undefined;\nregisterCleanup(() => { initialization = undefined; });\n\n/** Shared bootstrap for external-token hosts as well as native-auth clients.\n * This performs one membership read and one declaration read. It does not load\n * channels, items, trees, or an aggregate Account view. Use useMounts() afterward.\n * A token refresh must call this with the same account, not reset the session. */\nexport function initializeWorkspace(options: WorkspaceOptions): Promise<WorkspaceSession> {\n if (initialization) {\n if (initialization.accountPath !== options.accountPath) return Promise.reject(new Error('Reset the session before changing accounts'));\n return initialization.promise;\n }\n const generation = getSessionGeneration();\n const check = () => {\n if (generation !== getSessionGeneration()) throw new Error('Workspace session changed');\n };\n const promise = (async () => {\n const entry = await initSession(); check();\n if (!entry.principal_id) throw new Error('Workspace initialization requires an authenticated principal');\n const memberships = await getQueryClient().fetchQuery({\n queryKey: vfsKeys.memberships(entry.principal_id), queryFn: fetchMemberships,\n staleTime: 120_000, retry: false,\n });\n check();\n const account = memberships.find(m => m.path === options.accountPath && m.isAccount && !m.isSpace);\n if (!account) throw new Error('Authenticated account membership is unavailable');\n const personal = memberships.find(m => m.isSpace && m.accountId === account.personalSpaceId && m.path === account.personalSpacePath);\n if (!personal || !account.personalSpacePath) throw new Error('A provisioned default Space membership is required');\n const home = membershipToMountRef(account);\n const defaultSpace = membershipToMountRef(personal);\n const elected = getHomeAnchor();\n if (elected && elected.id !== home.id) throw new Error('Reset the session before changing accounts');\n if (!elected) electHomeAnchor(home, {activate: false});\n await loadMounts(account.personalSpacePath, id => {\n const member = memberships.find(m => m.accountId === id && (m.isAccount || m.isSpace));\n return member ? membershipToMountRef(member) : null;\n }, {initialAnchor: defaultSpace});\n check();\n return { home, defaultSpace, memberships };\n })().catch(error => {\n if (generation === getSessionGeneration()) initialization = undefined;\n throw error;\n });\n initialization = { accountPath: options.accountPath, promise };\n return promise;\n}\n","import { initSession } from './session';\nimport { startTracking } from './interactions';\nimport type { StartTrackingOptions } from './interactions';\nimport type { SessionEntry } from './types';\nimport { initializeWorkspace, type WorkspaceOptions, type WorkspaceSession } from './workspace';\nimport { registerCleanup, getSessionGeneration } from './session';\n\nexport interface InitializeFsaosOptions {\n /** Resolve the registered hostname to its governed FSAOS scope. */\n session?: boolean;\n /** Start first-party page/action tracking, or provide adapter options. */\n tracking?: boolean | StartTrackingOptions;\n /** Opt in to the mounted workspace lifecycle after host authentication. */\n workspace?: WorkspaceOptions;\n}\n\nexport interface FsaosRuntime {\n session: SessionEntry | null;\n workspace?: WorkspaceSession;\n /** Stops the browser tracking adapter started by this runtime. */\n dispose(): void;\n}\n\nlet initialization: Promise<FsaosRuntime> | undefined;\nlet stopActiveTracking: (() => void) | undefined;\nlet workspaceAccount: string | undefined;\nregisterCleanup(() => {\n stopActiveTracking?.(); stopActiveTracking = undefined;\n initialization = undefined; workspaceAccount = undefined;\n});\n\n/**\n * Canonical one-call SDK bootstrap for RevDev pages and external React apps.\n * Configuration must be provided through window.__FSAOS_CONFIG__ before the\n * SDK module or IIFE loads, so every subsystem sees the same registered host.\n */\nexport function initializeFsaos(\n options: InitializeFsaosOptions = {},\n): Promise<FsaosRuntime> {\n if (initialization) {\n if (options.workspace && options.workspace.accountPath !== workspaceAccount) {\n return Promise.reject(new Error('Initialize workspace through initializeWorkspace, or dispose the existing runtime first'));\n }\n return initialization;\n }\n workspaceAccount = options.workspace?.accountPath;\n const generation = getSessionGeneration();\n\n initialization = (async () => {\n const tracking = options.tracking ?? true;\n const stopTracking = tracking === false\n ? () => {}\n : startTracking(typeof tracking === 'object' ? tracking : {});\n stopActiveTracking = stopTracking;\n try {\n const session = options.session === false ? null : await initSession();\n const workspace = options.workspace ? await initializeWorkspace(options.workspace) : undefined;\n if (generation !== getSessionGeneration()) throw new Error('Session changed during initialization');\n let disposed = false;\n const runtime: FsaosRuntime = {\n session,\n workspace,\n dispose() {\n if (disposed) return;\n disposed = true;\n stopTracking();\n if (generation === getSessionGeneration()) {\n initialization = undefined; workspaceAccount = undefined;\n stopActiveTracking = undefined;\n }\n },\n };\n return runtime;\n } catch (error) {\n stopTracking();\n if (generation === getSessionGeneration()) {\n initialization = undefined; workspaceAccount = undefined;\n stopActiveTracking = undefined;\n }\n throw error;\n }\n })();\n\n return initialization;\n}\n","/**\n * Governed execution control.\n *\n * The VFS/kernel owns the durable control receipt and resolves a user request\n * message to its cognition event. The browser never targets a runtime,\n * machine, process, or tool invocation directly.\n */\n\nimport { gatewayCall, GatewayRequestError } from './client';\nimport type { GatewayParams, GatewayResponse } from './types';\n\nexport type CancelTurnState =\n | 'cancel_requested'\n | 'cancelled'\n | 'already_cancelled'\n | 'already_completed';\n\nexport type SteerTurnState =\n | 'steer_requested'\n | 'steered'\n | 'already_steered'\n | 'already_completed';\n\nexport type CancelQueuedTurnState =\n | 'cancelled'\n | 'already_cancelled'\n | 'already_promoted';\n\nexport interface CancelTurnOptions {\n /** Override the acting mount when the caller is intentionally scoped. */\n scopePath?: string;\n /**\n * Override the durable replay key. Defaults to a stable key derived from\n * the request message so duplicate clicks/retries converge on one control.\n */\n idempotencyKey?: string;\n}\n\nexport interface CancelTurnResponse extends GatewayResponse {\n success?: true;\n outcome?: CancelTurnState;\n state?: CancelTurnState;\n status?: CancelTurnState;\n control_item_id?: string;\n event_id?: string;\n request_message_id?: string;\n /** Canonical Channel-or-Message identity that owns this turn. */\n conversation_anchor_item_id?: string;\n /** @deprecated Use conversation_anchor_item_id. */\n conversation_root_id?: string;\n runtime_acknowledged?: boolean;\n}\n\nexport interface SteerTurnOptions {\n /** Override the acting mount when the caller is intentionally scoped. */\n scopePath?: string;\n /**\n * Override the durable replay key. The default converges duplicate clicks\n * for the same active turn and selected queue entry.\n */\n idempotencyKey?: string;\n}\n\nexport interface SteerTurnResponse extends GatewayResponse {\n success?: true;\n outcome?: SteerTurnState;\n state?: SteerTurnState;\n status?: SteerTurnState;\n control_item_id?: string;\n event_id?: string;\n request_message_id?: string;\n selected_queue_entry_id?: string;\n activated_event_id?: string;\n /** Canonical Channel-or-Message identity that owns this turn. */\n conversation_anchor_item_id?: string;\n /** @deprecated Use conversation_anchor_item_id. */\n conversation_root_id?: string;\n runtime_acknowledged?: boolean;\n}\n\nexport interface CancelQueuedTurnOptions {\n /** Override the acting mount when the caller is intentionally scoped. */\n scopePath?: string;\n /** Override the replay key. Duplicate cancellation clicks converge. */\n idempotencyKey?: string;\n}\n\nexport interface CancelQueuedTurnResponse extends GatewayResponse {\n success?: true;\n outcome?: CancelQueuedTurnState;\n state?: 'cancelled' | 'promoted';\n status?: 'cancelled' | 'promoted';\n queue_entry_id?: string;\n /** Canonical Channel-or-Message identity that owns this queue entry. */\n conversation_anchor_item_id?: string;\n /** @deprecated Use conversation_anchor_item_id. */\n conversation_root_id?: string;\n promoted_message_id?: string;\n replayed?: boolean;\n}\n\ntype ConversationAnchorFields = {\n conversation_anchor_item_id?: string;\n conversation_root_id?: string;\n};\n\nasync function executionControlCall(params: GatewayParams): Promise<GatewayResponse> {\n try {\n return await gatewayCall('execution-control-transition', params);\n } catch (error) {\n // Every execution-control request carries a stable kernel idempotency key.\n // Retry one transient gateway failure with the identical request so a lost\n // response or short upstream outage converges on the same durable control\n // instead of leaving Stop/Steer as a failed UI-only click.\n if (!(error instanceof GatewayRequestError) || error.status < 500) {\n throw error;\n }\n await new Promise((resolve) => setTimeout(resolve, 250));\n return gatewayCall('execution-control-transition', params);\n }\n}\n\n/** Normalize old and new kernel generations without making topology a concern. */\nfunction withConversationAnchor<T extends ConversationAnchorFields>(response: T): T {\n const anchor = response.conversation_anchor_item_id ?? response.conversation_root_id;\n if (!anchor) return response;\n return {\n ...response,\n conversation_anchor_item_id: anchor,\n // Preserve the old public field until consumers have migrated.\n conversation_root_id: response.conversation_root_id ?? anchor,\n };\n}\n\n/**\n * Request cancellation of the exact turn caused by `requestMessageId`.\n *\n * This is a durable, replay-safe kernel transition. A successful response\n * means the kernel accepted or had already settled the control request; it\n * does not mean already-committed external side effects were rolled back.\n */\nexport async function cancelTurn(\n requestMessageId: string,\n options: CancelTurnOptions = {},\n): Promise<CancelTurnResponse> {\n const target = requestMessageId.trim();\n if (!target) {\n throw new TypeError('cancelTurn requires a request message id');\n }\n\n const idempotencyKey = (options.idempotencyKey ?? `cancel:${target}`).trim();\n if (!idempotencyKey) {\n throw new TypeError('cancelTurn requires a non-empty idempotency key');\n }\n if (idempotencyKey.length > 128) {\n throw new TypeError('cancelTurn idempotency key must be 128 characters or fewer');\n }\n\n const response = (await executionControlCall({\n op: 'request',\n command: 'cancel',\n delivery: 'immediate',\n request_message_id: target,\n idempotency_key: idempotencyKey,\n ...(options.scopePath ? { _scope_path: options.scopePath } : {}),\n })) as CancelTurnResponse;\n\n // The governed transition names its terminal arbitration field `outcome`.\n // Preserve that source field while normalizing `state` for SDK consumers.\n const state = response.outcome ?? response.state ?? response.status;\n return withConversationAnchor(state ? { ...response, state } : response);\n}\n\n/**\n * Interrupt the exact active turn and promote one queued send intent.\n *\n * The first identity is a durable request-message id; the second is a\n * turn_queue_entry id. A queue entry is not a transcript message. The kernel\n * creates the real message only when promotion wins arbitration.\n */\nexport async function steerTurn(\n requestMessageId: string,\n selectedQueueEntryId: string,\n options: SteerTurnOptions = {},\n): Promise<SteerTurnResponse> {\n const active = requestMessageId.trim();\n const selected = selectedQueueEntryId.trim();\n if (!active) {\n throw new TypeError('steerTurn requires an active request message id');\n }\n if (!selected) {\n throw new TypeError('steerTurn requires a selected queue entry id');\n }\n if (active === selected) {\n throw new TypeError('steerTurn cannot target the active request message');\n }\n\n const idempotencyKey = (\n options.idempotencyKey ?? `steer:${active}:${selected}`\n ).trim();\n if (!idempotencyKey) {\n throw new TypeError('steerTurn requires a non-empty idempotency key');\n }\n if (idempotencyKey.length > 128) {\n throw new TypeError('steerTurn idempotency key must be 128 characters or fewer');\n }\n\n const response = (await executionControlCall({\n op: 'request',\n command: 'steer',\n delivery: 'immediate',\n request_message_id: active,\n selected_queue_entry_id: selected,\n idempotency_key: idempotencyKey,\n ...(options.scopePath ? { _scope_path: options.scopePath } : {}),\n })) as SteerTurnResponse;\n\n const state = response.outcome ?? response.state ?? response.status;\n return withConversationAnchor(state ? { ...response, state } : response);\n}\n\n/**\n * Cancel one pending send intent without creating a transcript message.\n *\n * The kernel serializes this transition against promotion on the conversation\n * root. If promotion already won, the response reports `already_promoted`\n * and leaves the real message untouched.\n */\nexport async function cancelQueuedTurn(\n queueEntryId: string,\n options: CancelQueuedTurnOptions = {},\n): Promise<CancelQueuedTurnResponse> {\n const target = queueEntryId.trim();\n if (!target) {\n throw new TypeError('cancelQueuedTurn requires a queue entry id');\n }\n\n const idempotencyKey = (\n options.idempotencyKey ?? `cancel-queue:${target}`\n ).trim();\n if (!idempotencyKey) {\n throw new TypeError('cancelQueuedTurn requires a non-empty idempotency key');\n }\n if (idempotencyKey.length > 128) {\n throw new TypeError('cancelQueuedTurn idempotency key must be 128 characters or fewer');\n }\n\n const response = (await executionControlCall({\n op: 'cancel_queue_entry',\n queue_entry_id: target,\n idempotency_key: idempotencyKey,\n ...(options.scopePath ? { _scope_path: options.scopePath } : {}),\n })) as CancelQueuedTurnResponse;\n\n const state = response.outcome ?? response.state ?? response.status;\n return withConversationAnchor(\n state ? { ...response, outcome: state as CancelQueuedTurnState } : response,\n );\n}\n","import { GATEWAY_URL } from './config';\nimport { getHostname } from './session';\nimport { trackFormReceipt, formAttribution } from './interactions';\n\nexport interface SubmitFormOptions {\n /** Reuse this UUID when retrying an uncertain network result. */\n fillId?: string;\n /** Override the current page URL for non-browser clients and tests. */\n pageUrl?: string;\n signal?: AbortSignal;\n}\n\nexport interface FormSubmissionReceipt {\n success: true;\n fill_id: string;\n capability_id: string;\n release_id: string;\n received_at: string;\n /** Same-origin transition declared by the published capability. */\n next?: string;\n}\n\ninterface FormSubmissionFailure {\n success?: false;\n error?: string;\n message?: string;\n}\n\nconst CAPABILITY_ID_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/;\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport class FormSubmissionError extends Error {\n readonly code: string;\n readonly status: number;\n /** Retry with this ID if the response outcome was uncertain. */\n readonly fillId: string;\n\n constructor(message: string, code: string, status: number, fillId: string) {\n super(message);\n this.name = 'FormSubmissionError';\n this.code = code;\n this.status = status;\n this.fillId = fillId;\n }\n}\n\n/**\n * Submit a public page form through the domain gateway. The gateway derives\n * the published release capability from the registered hostname and page URL.\n * This carries no dataset identity, service credential, or JWT and works from\n * the IIFE, ESM, npm, or any other browser delivery format.\n */\nexport async function submitForm(\n capabilityId: string,\n fields: Record<string, unknown>,\n options: SubmitFormOptions = {},\n): Promise<FormSubmissionReceipt> {\n if (!CAPABILITY_ID_PATTERN.test(capabilityId)) {\n throw new TypeError('capabilityId is invalid');\n }\n if (!fields || typeof fields !== 'object' || Array.isArray(fields)) {\n throw new TypeError('fields must be an object');\n }\n const fillId = options.fillId ?? crypto.randomUUID();\n if (!UUID_PATTERN.test(fillId)) {\n throw new TypeError('fillId must be a UUID');\n }\n const hostname = getHostname();\n const pageUrl = options.pageUrl\n ?? (typeof window !== 'undefined' ? window.location.href : undefined);\n if (!pageUrl) {\n throw new TypeError('pageUrl is required outside a browser');\n }\n const endpoint = `${GATEWAY_URL.replace(/\\/+$/, '')}/d/${encodeURIComponent(hostname)}/actions/${encodeURIComponent(capabilityId)}`;\n\n const identity = formAttribution();\n const attribution = identity ? {visitor_id: identity.visitor_id, session_id: identity.session_id} : undefined;\n let response: Response;\n try {\n response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n body: JSON.stringify({ fill_id: fillId, page_url: pageUrl, fields, ...(attribution ? {attribution} : {}) }),\n signal: options.signal,\n credentials: 'omit',\n });\n } catch (error) {\n throw new FormSubmissionError(\n error instanceof Error ? error.message : 'Form submission network error',\n 'FORM_NETWORK_ERROR',\n 0,\n fillId,\n );\n }\n\n let payload: FormSubmissionReceipt | FormSubmissionFailure | null = null;\n try {\n payload = await response.json() as FormSubmissionReceipt | FormSubmissionFailure;\n } catch {\n // A non-JSON response is a transport failure, never a successful receipt.\n }\n if (!response.ok || payload?.success !== true) {\n const failure = payload as FormSubmissionFailure | null;\n throw new FormSubmissionError(\n failure?.message || failure?.error || `Form submission failed (${response.status})`,\n failure?.error || 'FORM_SUBMISSION_FAILED',\n response.status,\n fillId,\n );\n }\n // Join the canonical form row/business event to the same anonymous visitor\n // and session stream used by page and action tracking. Tracking failure must\n // never turn a successfully persisted form submission into a failed form.\n try {\n await trackFormReceipt({\n fill_id: fillId,\n action_id: capabilityId,\n release_id: payload.release_id,\n }, { eventId: fillId, pageUrl, signal: options.signal, keepalive: true, ...(identity ? {source: identity.source, visitorId: identity.visitor_id, sessionId: identity.session_id} : {}) });\n } catch {\n // The durable form receipt remains authoritative. Missing telemetry can be\n // reconciled from the row's server-stamped origin later.\n }\n return payload;\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 { getQueryClient } 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 getQueryClient().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: getQueryClient() },\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/kernel': gateway,\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 — 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 * Optional: emit a card under this path pointing to the uploaded file.\n * When provided, the kernel emits a card item as a child of the specified\n * path (typically a message or channel path) referencing the uploaded file.\n * If omitted, the kernel auto-detects conversational context and emits\n * a card automatically when the file is created under a channel.\n */\n cardParentPath?: string;\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 createParams: Record<string, unknown> = {\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 // When cardParentPath is provided, pass it so the kernel emits a card\n // under that path pointing to the newly created file.\n if (options.cardParentPath) {\n createParams.card_parent_path = options.cardParentPath;\n }\n\n const createResult = await gatewayCall('create', createParams);\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","/**\n * @fsaos/gateway — Frame-Aware Item Resolution\n *\n * Typed wrapper over the `resolve-items` kernel method: \"what items of this\n * type can THIS actor reach in THIS context?\" — the access question.\n *\n * Use this (not useItems) whenever the answer should depend on who is asking\n * or which channel they are in. useItems answers the location question\n * (\"what is at this path\"); useResolvedItems answers the access question\n * (union of account / member / space / system / licensed tiers, frame-bounded\n * to the acting principal, pref-cascade-aware for selectable types).\n *\n * Resolution, frames, shadows, entitlements, and preference cascade all live\n * in the kernel. Never reimplement any of it client-side.\n */\nimport { useSyncExternalStore } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { gatewayCall } from './client';\nimport { getScope, getScopeVersion, subscribeScope } from './session';\n\n/** One resolved item row (menu-safe: secrets/tokens/urls withheld by sealing). */\nexport interface ResolvedItem {\n /** Item id — the only key you should ever write back (never names). */\n id: string;\n name: string;\n path: string;\n /** Which tier resolved it: drives placement-grouped UI sections. */\n placement: 'account' | 'member' | 'space' | 'system' | 'licensed';\n entitled: boolean;\n /**\n * The item's config payload, SEALED through the kernel's access profile —\n * the reader sees exactly the fields their profile permits, nothing more.\n * This is what capability pickers render and apply from (a behavior's\n * temperature/prompt_modifier, a role's specialty/behavior/brain axis\n * paths, display_name/icon/color). Read-only projection: writes still go\n * through the `update` syscall against the item itself.\n */\n type_data?: Record<string, unknown>;\n /** Integration-family extras (present when the type has a pref_family). */\n service_name?: string;\n has_credential?: boolean;\n /** Toggle state from the (member, context) preference cascade. */\n active?: boolean;\n}\n\nexport interface ResolveItemsResponse {\n success: boolean;\n account_id: string;\n /** Provenance of the applied preference layer (person plane). */\n pref_source: 'channel' | 'account' | 'none';\n items: ResolvedItem[];\n}\n\n/** Imperative form — for non-React callers and prefetching. */\nexport async function fetchResolvedItems(\n contextId: string,\n itemType: string,\n): Promise<ResolveItemsResponse> {\n const response = await gatewayCall('resolve-items', {\n context_id: contextId,\n item_type: itemType,\n });\n return response as unknown as ResolveItemsResponse;\n}\n\n/**\n * React hook. `contextId` is the channel the member is composing in (thread\n * surfaces resolve to their ancestor channel first — threads have no prefs\n * of their own); any item id works for pure tier resolution.\n *\n * Scope-reactive: subscribes to scope changes so it re-resolves on account\n * switch, and keys the cache by scope so results never bleed across accounts.\n * Resolution is scope-dependent, so both are required for correctness — this\n * mirrors the scope handling every read hook in ./hooks performs internally.\n */\nexport function useResolvedItems(\n contextId: string | null | undefined,\n itemType: string,\n) {\n // Re-render on scope change → query key below picks up the new scope.\n useSyncExternalStore(subscribeScope, getScopeVersion, getScopeVersion);\n return useQuery({\n queryKey: ['vfs', getScope() ?? '__unscoped__', 'resolved-items', contextId ?? '', itemType],\n queryFn: () => fetchResolvedItems(contextId as string, itemType),\n enabled: Boolean(contextId && itemType),\n });\n}\n","/**\n * Artifact Streaming — Gateway SDK contract surface.\n *\n * This module provides the types, accumulation logic, and React hooks for\n * consuming artifact streaming events from the agent runtime. Any client\n * built on the gateway SDK gets live content preview as a first-class primitive.\n *\n * Design principle: \"What the agent sees, the user sees.\"\n * - All tool calls emit activity events (tool name, arguments streaming in, result)\n * - create/update/edit additionally emit file_editor events (content extraction)\n *\n * Usage:\n * import { useArtifactStream, useAgentTimeline } from '@fsaos/gateway';\n *\n * function ChatPanel({ channelPath }) {\n * const { artifacts, timeline } = useArtifactStream(channelPath);\n * // artifacts: Map<artifactId, ArtifactState>\n * // timeline: TimelineEvent[]\n * }\n */\n\nimport { useEffect, useRef, useState, useCallback } from 'react';\nimport { subscribeToPath } from './ws';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport type ArtifactSurfaceType = 'file_editor' | 'activity';\n\nexport type ArtifactStatus = 'streaming' | 'executing' | 'completed' | 'failed';\n\nexport interface ArtifactOpenedEvent {\n type: 'artifact_opened';\n event_type: 'artifact_opened';\n message_id: string;\n artifact_id: string;\n surface_type: ArtifactSurfaceType;\n tool_id: string;\n tool_name: string;\n target_uri: string | null;\n source: string;\n meta: Record<string, unknown>;\n}\n\nexport interface ArtifactDeltaEvent {\n type: 'artifact_delta';\n event_type: 'artifact_delta';\n message_id: string;\n artifact_id: string;\n surface_type: ArtifactSurfaceType;\n tool_id: string;\n tool_name: string;\n target_uri: string | null;\n content_delta: string;\n delta_index: number;\n source: string;\n meta: Record<string, unknown>;\n}\n\nexport interface ArtifactDoneEvent {\n type: 'artifact_done';\n event_type: 'artifact_done';\n message_id: string;\n artifact_id: string;\n surface_type: ArtifactSurfaceType;\n tool_id: string;\n tool_name: string;\n target_uri: string | null;\n artifact_item_uri: string | null;\n evidence_uri: string | null;\n source: string;\n total_chars: number;\n status: ArtifactStatus;\n meta: Record<string, unknown>;\n}\n\nexport type ArtifactEvent = ArtifactOpenedEvent | ArtifactDeltaEvent | ArtifactDoneEvent;\n\n/**\n * Accumulated state for a single artifact stream.\n * Updated incrementally as events arrive.\n */\nexport interface ArtifactState {\n artifact_id: string;\n surface_type: ArtifactSurfaceType;\n tool_id: string;\n tool_name: string;\n target_uri: string | null;\n status: ArtifactStatus;\n content: string;\n total_chars: number;\n delta_count: number;\n artifact_item_uri: string | null;\n evidence_uri: string | null;\n meta: Record<string, unknown>;\n started_at: number;\n completed_at: number | null;\n}\n\n/**\n * Timeline event — a high-level record of agent activity.\n * Each tool call produces one timeline entry.\n */\nexport interface TimelineEvent {\n tool_id: string;\n tool_name: string;\n status: 'started' | 'executing' | 'completed' | 'failed';\n target_uri: string | null;\n started_at: number;\n completed_at: number | null;\n /** Artifact IDs associated with this tool call */\n artifact_ids: string[];\n}\n\n// ─── Accumulator (imperative) ───────────────────────────────────────────────\n\nexport interface ArtifactStreamState {\n artifacts: Map<string, ArtifactState>;\n timeline: TimelineEvent[];\n}\n\n/**\n * Create an imperative artifact stream accumulator.\n * Subscribes to the channel path and accumulates artifact events into state.\n *\n * @param channelPath - The VFS path to subscribe to for token_stream events\n * @param onChange - Callback fired on every state change\n * @returns Unsubscribe function\n */\nexport function subscribeArtifactStream(\n channelPath: string,\n onChange: (state: ArtifactStreamState) => void,\n): () => void {\n const state: ArtifactStreamState = {\n artifacts: new Map(),\n timeline: [],\n };\n\n // Map tool_id → timeline index for fast lookup\n const toolTimelineIdx = new Map<string, number>();\n\n function handleEvent(data: any): void {\n // The gateway sends VfsChangeEvent with:\n // event_type: \"token_stream\" (always)\n // action: \"artifact_opened\" | \"artifact_delta\" | \"artifact_done\" | \"token\" | etc.\n // name: <payload string> (the token content)\n // So we use `data.action` to determine the event type — same field useChat reads.\n const action = data.action as string | undefined;\n\n // Only handle artifact events\n if (!action?.startsWith('artifact_')) return;\n\n // The payload is in `data.name` (gateway maps body.token → VfsChangeEvent.name).\n // It's a JSON-serialized ArtifactEvent.\n let event: ArtifactEvent;\n const payload = data.name as string | undefined;\n if (typeof payload === 'string' && payload.startsWith('{')) {\n try {\n event = JSON.parse(payload);\n } catch {\n return;\n }\n } else if (data.artifact_id) {\n // Fallback: the data itself might be the event (future direct dispatch)\n event = data as ArtifactEvent;\n } else {\n return;\n }\n\n switch (event.type) {\n case 'artifact_opened': {\n const now = Date.now();\n state.artifacts.set(event.artifact_id, {\n artifact_id: event.artifact_id,\n surface_type: event.surface_type,\n tool_id: event.tool_id,\n tool_name: event.tool_name,\n target_uri: event.target_uri,\n status: 'streaming',\n content: '',\n total_chars: 0,\n delta_count: 0,\n artifact_item_uri: null,\n evidence_uri: null,\n meta: event.meta,\n started_at: now,\n completed_at: null,\n });\n\n // Add timeline entry if this is the first artifact for this tool_id\n if (!toolTimelineIdx.has(event.tool_id)) {\n const idx = state.timeline.length;\n state.timeline.push({\n tool_id: event.tool_id,\n tool_name: event.tool_name,\n status: 'started',\n target_uri: event.target_uri,\n started_at: now,\n completed_at: null,\n artifact_ids: [event.artifact_id],\n });\n toolTimelineIdx.set(event.tool_id, idx);\n } else {\n // Additional artifact for same tool (e.g., activity + file_editor)\n const idx = toolTimelineIdx.get(event.tool_id)!;\n state.timeline[idx].artifact_ids.push(event.artifact_id);\n }\n break;\n }\n\n case 'artifact_delta': {\n const art = state.artifacts.get(event.artifact_id);\n if (art) {\n art.content += event.content_delta;\n art.total_chars += event.content_delta.length;\n art.delta_count += 1;\n if (event.target_uri && !art.target_uri) {\n art.target_uri = event.target_uri;\n }\n }\n break;\n }\n\n case 'artifact_done': {\n const art = state.artifacts.get(event.artifact_id);\n if (art) {\n art.status = event.status;\n art.total_chars = event.total_chars;\n art.artifact_item_uri = event.artifact_item_uri;\n art.evidence_uri = event.evidence_uri;\n if (event.target_uri) art.target_uri = event.target_uri;\n if (event.status === 'completed' || event.status === 'failed') {\n art.completed_at = Date.now();\n }\n }\n\n // Update timeline entry\n const idx = toolTimelineIdx.get(event.tool_id);\n if (idx !== undefined) {\n const entry = state.timeline[idx];\n if (event.status === 'executing') {\n entry.status = 'executing';\n } else if (event.status === 'completed') {\n entry.status = 'completed';\n entry.completed_at = Date.now();\n } else if (event.status === 'failed') {\n entry.status = 'failed';\n entry.completed_at = Date.now();\n }\n if (event.target_uri && !entry.target_uri) {\n entry.target_uri = event.target_uri;\n }\n }\n break;\n }\n }\n\n onChange(state);\n }\n\n const unsub = subscribeToPath(channelPath, handleEvent);\n return unsub;\n}\n\n// ─── React Hook ─────────────────────────────────────────────────────────────\n\nexport interface UseArtifactStreamReturn {\n /** All artifact states, keyed by artifact_id */\n artifacts: Map<string, ArtifactState>;\n /** Ordered timeline of tool calls */\n timeline: TimelineEvent[];\n /** Currently active (streaming) file_editor artifact, if any */\n activeEditor: ArtifactState | null;\n /** Currently active activity artifacts */\n activeActivities: ArtifactState[];\n /** Clear all accumulated state (e.g., on new turn) */\n reset: () => void;\n}\n\n/**\n * React hook for consuming artifact streaming events.\n *\n * Subscribes to the channel path and provides accumulated artifact state\n * and timeline events. Re-renders on every artifact event.\n *\n * @param channelPath - The VFS path to subscribe to (e.g., the message path)\n * @param enabled - Whether to subscribe (default: true)\n */\nexport function useArtifactStream(\n channelPath: string | null,\n enabled: boolean = true,\n): UseArtifactStreamReturn {\n const [artifacts, setArtifacts] = useState<Map<string, ArtifactState>>(new Map());\n const [timeline, setTimeline] = useState<TimelineEvent[]>([]);\n const stateRef = useRef<ArtifactStreamState>({ artifacts: new Map(), timeline: [] });\n\n useEffect(() => {\n if (!channelPath || !enabled) return;\n\n const unsub = subscribeArtifactStream(channelPath, (state) => {\n stateRef.current = state;\n // Create new references to trigger re-render\n setArtifacts(new Map(state.artifacts));\n setTimeline([...state.timeline]);\n });\n\n return unsub;\n }, [channelPath, enabled]);\n\n const reset = useCallback(() => {\n setArtifacts(new Map());\n setTimeline([]);\n stateRef.current = { artifacts: new Map(), timeline: [] };\n }, []);\n\n // Derived state\n const activeEditor = Array.from(artifacts.values()).find(\n (a) => a.surface_type === 'file_editor' && a.status === 'streaming',\n ) ?? null;\n\n const activeActivities = Array.from(artifacts.values()).filter(\n (a) => a.surface_type === 'activity' && (a.status === 'streaming' || a.status === 'executing'),\n );\n\n return { artifacts, timeline, activeEditor, activeActivities, reset };\n}\n\n/**\n * React hook for the agent activity timeline only (lighter than useArtifactStream).\n *\n * @param channelPath - The VFS path to subscribe to\n * @param enabled - Whether to subscribe (default: true)\n */\nexport function useAgentTimeline(\n channelPath: string | null,\n enabled: boolean = true,\n): { timeline: TimelineEvent[]; latestActivity: TimelineEvent | null } {\n const [timeline, setTimeline] = useState<TimelineEvent[]>([]);\n\n useEffect(() => {\n if (!channelPath || !enabled) return;\n\n const unsub = subscribeArtifactStream(channelPath, (state) => {\n setTimeline([...state.timeline]);\n });\n\n return unsub;\n }, [channelPath, enabled]);\n\n const latestActivity = timeline.length > 0 ? timeline[timeline.length - 1] : null;\n\n return { timeline, latestActivity };\n}\n","/**\n * Timeline History — Gateway SDK hook for querying persisted agent-events.\n *\n * The agent-events dataset stores a per-channel timeline of all agent work:\n * tool calls, thinking blocks, text emissions, errors, and turn bookends.\n * Each row is a single granular event with full timing and linking metadata.\n *\n * This module provides:\n * - `fetchTimelineHistory()` — imperative fetch for non-React contexts\n * - `useTimelineHistory()` — React hook with realtime auto-invalidation\n *\n * The hook bridges the gap between:\n * - Live ephemeral timeline (useAgentTimeline / useArtifactStream) — WebSocket only\n * - Persisted historical timeline (this hook) — kernel dataset query\n *\n * Usage:\n * import { useTimelineHistory } from '@fsaos/gateway';\n *\n * function TurnActivity({ channelPath, turnId }) {\n * const { events, isLoading } = useTimelineHistory(channelPath, { turnId });\n * // events: TimelineHistoryEvent[] — sorted by seq ascending\n * }\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { subscribeToEvents } from './ws';\nimport { gatewayCall } from './client';\nimport { vfsKeys } from './vfs-keys';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\n/**\n * A single persisted timeline event from the agent-events dataset.\n * Mirrors the dataset schema columns exactly.\n */\nexport interface TimelineHistoryEvent {\n /** Turn/message ID this event belongs to. */\n turn_id: string;\n /** Monotonic sequence number within the turn (1-based). */\n seq: number;\n /** Event kind: turn_started, tool_started, tool_completed, thinking, text_block, error, turn_completed, turn_failed, stage_transition */\n kind: string;\n /** Event status: started, completed, failed */\n status: string;\n /** Human-readable title (e.g., tool name, \"Thinking\", \"Response\") */\n title: string;\n /** Tool name (for tool_started/tool_completed events). */\n tool_name?: string;\n /** Tool call ID (for correlating started → completed). */\n tool_id?: string;\n /** VFS URI to the evidence item (for tool_completed events). */\n evidence_uri?: string;\n /** VFS URI to the produced artifact/file (for tool_completed events). */\n artifact_item_uri?: string;\n /** First ~200 chars of content (thinking text, response text, error message). */\n preview?: string;\n /** Execution duration in milliseconds. */\n duration_ms?: number;\n /** ISO timestamp when the event started. */\n started_at: string;\n /** ISO timestamp when the event completed (null for in-progress). */\n completed_at?: string;\n /** Error classification (for error events). */\n error_type?: string;\n /** Arbitrary metadata (JSON). */\n meta?: Record<string, unknown>;\n}\n\n/**\n * Options for querying timeline history.\n */\nexport interface TimelineHistoryOptions {\n /** Filter to a specific turn/message. When omitted, returns all events in the channel. */\n turnId?: string;\n /** Maximum number of events to return. Defaults to 500. */\n limit?: number;\n /** Offset for pagination. Defaults to 0. */\n offset?: number;\n /** Whether the hook is enabled. Defaults to true. */\n enabled?: boolean;\n /** Debounce interval for realtime invalidation (ms). Defaults to 300. */\n debounceMs?: number;\n}\n\n/**\n * Return type for useTimelineHistory.\n */\nexport interface UseTimelineHistoryReturn {\n /** Sorted timeline events (by seq ascending). */\n events: TimelineHistoryEvent[];\n /** Whether the initial fetch is in progress. */\n isLoading: boolean;\n /** Error from the query, if any. */\n error: Error | null;\n /** Whether a background refetch is happening. */\n isFetching: boolean;\n /** Manually trigger a refetch. */\n refetch: () => void;\n}\n\n// ─── Query Key ──────────────────────────────────────────────────────────────\n\n/**\n * Deterministic query key for timeline history queries.\n * Namespaced under vfsKeys pattern for consistency.\n */\nfunction timelineHistoryKey(\n datasetPath: string,\n turnId?: string,\n limit?: number,\n offset?: number,\n) {\n return [\n 'vfs',\n 'timeline-history',\n datasetPath,\n turnId ?? '__all__',\n limit ?? 500,\n offset ?? 0,\n ] as const;\n}\n\n// ─── Imperative Fetch ───────────────────────────────────────────────────────\n\n/**\n * Fetch timeline history events from the agent-events dataset.\n *\n * Uses the kernel `open` syscall with strategy='rows' to extract dataset rows.\n * The dataset path is derived from the channel path:\n * `{channelPath}/datasets/agent-events`\n *\n * @param channelPath - The VFS path of the channel\n * @param options - Query options (turnId filter, pagination)\n * @returns Sorted array of timeline events\n */\nexport async function fetchTimelineHistory(\n channelPath: string,\n options?: Pick<TimelineHistoryOptions, 'turnId' | 'limit' | 'offset'>,\n): Promise<TimelineHistoryEvent[]> {\n const datasetPath = `${channelPath}/datasets/agent-events`;\n const limit = options?.limit ?? 500;\n const offset = options?.offset ?? 0;\n\n // Build row query arguments\n const args: Record<string, unknown> = {\n limit,\n offset,\n sort: [{ key: 'seq', direction: 'asc' }],\n };\n\n // Filter by turn_id if provided\n if (options?.turnId) {\n args.filters = [\n { key: 'turn_id', operator: 'eq', value: options.turnId },\n ];\n }\n\n try {\n const response = await gatewayCall('open', {\n path: datasetPath,\n mode: 'extract',\n strategy: 'rows',\n arguments: args,\n });\n\n // The kernel returns rows in content.rows or content.items depending on version\n const content = (response as any)?.content;\n if (!content) return [];\n\n const rows: Array<Record<string, unknown>> =\n content.rows ?? content.items ?? content.data ?? [];\n\n return rows.map(normalizeRow).sort((a, b) => a.seq - b.seq);\n } catch (err: any) {\n // Dataset doesn't exist yet (no turns have run) — return empty\n if (err?.status === 404 || err?.message?.includes('not found')) {\n return [];\n }\n throw err;\n }\n}\n\n// ─── React Hook ─────────────────────────────────────────────────────────────\n\n/**\n * React hook for querying persisted timeline history from the agent-events dataset.\n *\n * Automatically invalidates and refetches when new timeline events are written\n * (via vfs_change events on the dataset path).\n *\n * @param channelPath - The VFS path of the channel (e.g., \"/root/channels/my-channel\")\n * @param options - Query and subscription options\n *\n * @example\n * // All events for a specific turn\n * const { events } = useTimelineHistory(channelPath, { turnId: messageId });\n *\n * @example\n * // Recent events across all turns (paginated)\n * const { events } = useTimelineHistory(channelPath, { limit: 100 });\n */\nexport function useTimelineHistory(\n channelPath: string | null | undefined,\n options?: TimelineHistoryOptions,\n): UseTimelineHistoryReturn {\n const {\n turnId,\n limit = 500,\n offset = 0,\n enabled = true,\n debounceMs = 300,\n } = options ?? {};\n\n const datasetPath = channelPath ? `${channelPath}/datasets/agent-events` : null;\n const qc = useQueryClient();\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const queryKey = datasetPath\n ? timelineHistoryKey(datasetPath, turnId, limit, offset)\n : ['vfs', 'timeline-history', '__disabled__'];\n\n const query = useQuery({\n queryKey: queryKey as any,\n queryFn: () => fetchTimelineHistory(channelPath!, { turnId, limit, offset }),\n enabled: !!channelPath && enabled,\n });\n\n // ── Realtime invalidation ─────────────────────────────────────────────\n // Subscribe to vfs_change events. When the dataset item is updated\n // (rows inserted), invalidate this query to trigger a refetch.\n useEffect(() => {\n if (!datasetPath || !enabled) return;\n\n const unsub = subscribeToEvents(\n 'vfs_change',\n () => {\n // Debounce rapid inserts (a single turn writes many rows quickly)\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n qc.invalidateQueries({ queryKey: queryKey as any });\n }, debounceMs);\n },\n // Filter: only react to changes on or under the dataset path\n (data: any) => {\n const eventPath = data?.path as string | undefined;\n if (!eventPath) return false;\n return eventPath === datasetPath || eventPath.startsWith(datasetPath + '/');\n },\n );\n\n return () => {\n unsub();\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [datasetPath, enabled, debounceMs, qc, JSON.stringify(queryKey)]);\n\n return {\n events: query.data ?? [],\n isLoading: query.isLoading,\n error: query.error as Error | null,\n isFetching: query.isFetching,\n refetch: () => { query.refetch(); },\n };\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Normalize a raw dataset row into a typed TimelineHistoryEvent.\n * Handles both camelCase and snake_case field names for robustness.\n */\nfunction normalizeRow(row: Record<string, unknown>): TimelineHistoryEvent {\n return {\n turn_id: String(row.turn_id ?? ''),\n seq: Number(row.seq ?? 0),\n kind: String(row.kind ?? ''),\n status: String(row.status ?? ''),\n title: String(row.title ?? ''),\n tool_name: row.tool_name != null ? String(row.tool_name) : undefined,\n tool_id: row.tool_id != null ? String(row.tool_id) : undefined,\n evidence_uri: row.evidence_uri != null ? String(row.evidence_uri) : undefined,\n artifact_item_uri: row.artifact_item_uri != null ? String(row.artifact_item_uri) : undefined,\n preview: row.preview != null ? String(row.preview) : undefined,\n duration_ms: row.duration_ms != null ? Number(row.duration_ms) : undefined,\n started_at: String(row.started_at ?? ''),\n completed_at: row.completed_at != null ? String(row.completed_at) : undefined,\n error_type: row.error_type != null ? String(row.error_type) : undefined,\n meta: row.meta != null ? (row.meta as Record<string, unknown>) : undefined,\n };\n}\n","import { useCallback, useSyncExternalStore } from 'react';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport type { QueryKey } from '@tanstack/react-query';\nimport { gatewayCall } from './client';\nimport { getAnchorRef, getScope, subscribeScope, getScopeVersion } from './session';\nimport { useArrangement } from './hooks';\nimport { refreshArrangement } from './arrangement-realtime';\n\nexport interface PinTarget {\n id: string;\n path?: string;\n item_type: 'channel' | 'message' | 'folder';\n name?: string;\n parent_id?: string;\n type_data?: Record<string, any>;\n}\nexport interface PinnedItem {\n id: string;\n symlink_path: string;\n symlink_type_data: { target_item_id: string };\n target: PinTarget | null;\n resolve_error?: string;\n}\n\ntype PinChange = { operation: 'pin'; target: PinTarget } | { operation: 'unpin'; entry: PinnedItem } | { operation: 'reorder'; ids: string[] };\ntype CapturedChange = PinChange & { scopePath: string; arrangementId: string; arrangementPath: string; queryKey: QueryKey };\n\n/** Personal pins use existing arrangement, symlink create/delete and order updates.\n * Provisioning and access decisions belong to FSAOS. This hook never creates a\n * missing arrangement and never falls back to another membership's collection.\n */\nexport function usePinnedItems() {\n useSyncExternalStore(subscribeScope, getScopeVersion, getScopeVersion);\n const scopePath = getScope();\n const anchor = getAnchorRef();\n const query = useArrangement(scopePath ? { key: 'pinned', ...(anchor ? { scope_id: anchor.id } : {}) } : null);\n const client = useQueryClient();\n const entries = query.resolvedChildren as PinnedItem[];\n const ready = Boolean(!query.error && query.arrangement?.item_id && query.resolutionLevel === 'member'\n && query.arrangement.write_target_id === query.arrangement.item_id);\n const mutation = useMutation({\n mutationFn: async (change: CapturedChange) => {\n let response: any;\n const context = { _scope_path: change.scopePath };\n if (change.operation === 'pin') {\n response = await gatewayCall('create', { ...context, parent_id: change.arrangementId,\n name: `pin-${change.target.id}`, item_type: 'symlink',\n type_data: { target_item_id: change.target.id, target_type: change.target.item_type } });\n } else if (change.operation === 'unpin') {\n response = await gatewayCall('delete', { ...context, id: change.entry.id });\n } else {\n response = await gatewayCall('update', { ...context, id: change.arrangementId, type_data: { order: change.ids } });\n }\n if (response?.success === false) throw new Error(response.error || 'Pins could not be saved');\n return response;\n },\n onSettled: (_data, _error, change) => refreshArrangement(client, change.queryKey),\n });\n const change = useCallback((value: PinChange) => {\n if (!ready || !scopePath || getScope() !== scopePath) return Promise.reject(new Error('Personal pins are not available in this context'));\n if (value.operation === 'unpin' && !entries.some(entry => entry.id === value.entry.id)) return Promise.reject(new Error('Pin is outside this arrangement'));\n if (value.operation === 'reorder' && (new Set(value.ids).size !== entries.length || value.ids.length !== entries.length\n || entries.some(entry => !value.ids.includes(entry.id)))) return Promise.reject(new Error('Order must include each pin exactly once'));\n if (value.operation === 'pin' && entries.some(entry => entry.symlink_type_data?.target_item_id === value.target.id)) return Promise.resolve(null);\n return mutation.mutateAsync({ ...value, scopePath, arrangementId: query.arrangement.item_id,\n arrangementPath: query.arrangement.item_path, queryKey: query.arrangementQueryKey });\n }, [ready, scopePath, entries, query.arrangement, query.arrangementQueryKey, mutation.mutateAsync]);\n return { entries, isLoading: query.isLoading, error: query.error, refetch: query.refetch, ready,\n isSaving: mutation.isPending, saveError: mutation.error,\n isPinned: (id: string) => entries.some(entry => entry.symlink_type_data?.target_item_id === id),\n pin: (target: PinTarget) => change({ operation: 'pin', target }),\n unpin: (id: string) => {\n const entry = entries.find(item => item.symlink_type_data?.target_item_id === id || item.id === id);\n return entry ? change({ operation: 'unpin', entry }) : Promise.resolve(null);\n },\n reorder: (ids: string[]) => change({ operation: 'reorder', ids }),\n };\n}\n"]}