{"version":3,"sources":["../../ui/src/applet-core/context/AppletContext.tsx","../../ui/src/applet-core/context/ConfigProvider.tsx","../../ui/src/applet-core/hooks/useAppletContext.ts","../../ui/src/applet-core/hooks/useAppletExtensions.ts","../../ui/src/applet-devtools/enabled.ts","../../ui/src/applet-host/rpc.ts","../../ui/src/applet-core/hooks/useAppletRPCClient.ts","../../ui/src/applet-core/hooks/useConfig.ts","../../ui/src/applet-core/hooks/useUser.ts","../../ui/src/applet-core/hooks/usePermissions.ts","../../ui/src/applet-core/hooks/useTranslation.ts","../../ui/src/applet-core/hooks/useSession.ts","../../ui/src/applet-core/hooks/useRoute.ts","../../ui/src/applet-core/hooks/useStreaming.ts","../../ui/src/applet-core/hooks/useAppletRuntime.ts"],"names":["createContext","useContext","jsx","useAppletContext","useMemo","useState","useRef","useCallback"],"mappings":"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","file":"core.cjs","sourcesContent":["import { createContext, useContext, ReactNode } from 'react';\nimport type { InitialContext } from '../types';\n\n/**\n * AppletContext provides access to the global context injected by the backend.\n * The context is read from window.__*_CONTEXT__ (configured via windowKey).\n */\nconst AppletContext = createContext<InitialContext | null>(null);\n\nconst REQUIRED_KEYS: Array<keyof InitialContext> = ['user', 'tenant', 'locale', 'config', 'route', 'session'];\n\nfunction validateInitialContext(value: unknown, windowKey: string): InitialContext {\n  if (!value || typeof value !== 'object') {\n    throw new Error(`${windowKey}: expected an object, got ${typeof value}`);\n  }\n  const obj = value as Record<string, unknown>;\n  const missing = REQUIRED_KEYS.filter((k) => !(k in obj));\n  if (missing.length > 0) {\n    throw new Error(`${windowKey}: missing required keys: ${missing.join(', ')}`);\n  }\n\n  // Deep validation for nested required fields\n  const user = obj.user as Record<string, unknown> | undefined;\n  if (!user || typeof user !== 'object') {\n    throw new Error(`${windowKey}.user: expected an object, got ${typeof user}`);\n  }\n  if (typeof user.id !== 'number') {\n    throw new Error(`${windowKey}.user.id: expected number, got ${typeof user.id}`);\n  }\n  if (!Array.isArray(user.permissions)) {\n    throw new Error(`${windowKey}.user.permissions: expected array, got ${typeof user.permissions}`);\n  }\n\n  const tenant = obj.tenant as Record<string, unknown> | undefined;\n  if (!tenant || typeof tenant !== 'object') {\n    throw new Error(`${windowKey}.tenant: expected an object, got ${typeof tenant}`);\n  }\n  if (typeof tenant.id !== 'string') {\n    throw new Error(`${windowKey}.tenant.id: expected string, got ${typeof tenant.id}`);\n  }\n\n  const session = obj.session as Record<string, unknown> | undefined;\n  if (!session || typeof session !== 'object') {\n    throw new Error(`${windowKey}.session: expected an object, got ${typeof session}`);\n  }\n  if (typeof session.csrfToken !== 'string') {\n    throw new Error(`${windowKey}.session.csrfToken: expected string, got ${typeof session.csrfToken}`);\n  }\n  if (typeof session.expiresAt !== 'number') {\n    throw new Error(`${windowKey}.session.expiresAt: expected number, got ${typeof session.expiresAt}`);\n  }\n  if (typeof session.refreshURL !== 'string') {\n    throw new Error(`${windowKey}.session.refreshURL: expected string, got ${typeof session.refreshURL}`);\n  }\n\n  const config = obj.config;\n  if (!config || typeof config !== 'object') {\n    throw new Error(`${windowKey}.config: expected object, got ${typeof config}`);\n  }\n\n  return value as InitialContext;\n}\n\nexport interface AppletProviderProps {\n  children: ReactNode\n  windowKey: string\n  context?: InitialContext\n}\n\n/**\n * AppletProvider reads context from window global and provides it to hooks.\n *\n * Usage:\n * <AppletProvider windowKey=\"__APPLET_CONTEXT__\">\n *   <App />\n * </AppletProvider>\n */\nexport function AppletProvider({ children, windowKey, context }: AppletProviderProps) {\n  // Use provided context or read from window global\n  const raw = context ?? (window as unknown as Record<string, unknown>)[windowKey];\n\n  if (!raw) {\n    throw new Error(`${windowKey} not found on window. Ensure backend context injection is working.`);\n  }\n\n  const initialContext = validateInitialContext(raw, windowKey);\n\n  return (\n    <AppletContext.Provider value={initialContext}>\n      {children}\n    </AppletContext.Provider>\n  );\n}\n\n/**\n * useAppletContext provides access to the full applet context.\n * Use specialized hooks (useUser, useConfig, etc.) for specific context parts.\n */\nexport function useAppletContext<T = InitialContext>(): T {\n  const context = useContext(AppletContext);\n  if (!context) {\n    throw new Error('useAppletContext must be used within AppletProvider');\n  }\n  return context as T;\n}\n","import { createContext, useContext, ReactNode } from 'react';\nimport type { InitialContext } from '../types';\n\n/**\n * ConfigProvider is an alternative to AppletProvider that accepts context via props\n * instead of reading from window global. Useful for testing and server-side rendering.\n */\n\nconst ConfigContext = createContext<InitialContext | null>(null);\n\nexport interface ConfigProviderProps {\n  children: ReactNode\n  config: InitialContext\n}\n\n/**\n * ConfigProvider accepts context configuration via props.\n *\n * Usage:\n * <ConfigProvider config={initialContext}>\n *   <App />\n * </ConfigProvider>\n */\nexport function ConfigProvider({ children, config }: ConfigProviderProps) {\n  return (\n    <ConfigContext.Provider value={config}>\n      {children}\n    </ConfigContext.Provider>\n  );\n}\n\n/**\n * useConfigContext provides access to the applet context when using ConfigProvider.\n */\nexport function useConfigContext<T = InitialContext>(): T {\n  const context = useContext(ConfigContext);\n  if (!context) {\n    throw new Error('useConfigContext must be used within ConfigProvider');\n  }\n  return context as T;\n}\n","import type { InitialContext } from '../types';\n\n/**\n * useAppletContext provides direct access to the window global context.\n * This is a standalone version that doesn't require AppletProvider.\n *\n * Usage:\n * const context = useAppletContext('__APPLET_CONTEXT__')\n *\n * Note: Prefer using AppletProvider + context hooks for better type safety\n * and testability. Use this hook only when provider setup is not possible.\n */\nexport function useAppletContext<T = InitialContext>(windowKey: string): T {\n  const context = (window as unknown as Record<string, unknown>)[windowKey];\n\n  if (!context) {\n    throw new Error(`${windowKey} not found on window. Ensure backend context injection is working.`);\n  }\n\n  return context as T;\n}\n","import { useMemo } from 'react';\nimport { useAppletContext } from '../context/AppletContext';\n\nexport function useAppletExtensions<\n  TExtensions extends Record<string, unknown> = Record<string, unknown>,\n>(): TExtensions {\n  const { extensions } = useAppletContext();\n\n  return useMemo(\n    () => ((extensions ?? {}) as TExtensions),\n    [extensions],\n  );\n}\n","export function shouldEnableAppletDevtools(): boolean {\n  if (typeof window === 'undefined') {return false;}\n\n  const url = new URL(window.location.href);\n  if (url.searchParams.get('appletDebug') === '1') {return true;}\n\n  try {\n    return window.localStorage.getItem('iotaAppletDevtools') === '1';\n  } catch {\n    return false;\n  }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled';\n\nexport interface AppletRPCError {\n  code: string\n  message: string\n  details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n  code: string;\n  details?: unknown;\n  cause?: unknown;\n\n  constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n    super(args.message);\n    this.name = 'AppletRPCException';\n    this.code = args.code;\n    this.details = args.details;\n    this.cause = args.cause;\n  }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n  id: string\n  method: string\n  params: unknown\n}\n\ninterface RPCResponse<TResult> {\n  id: string\n  result?: TResult\n  error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n  endpoint: string\n  fetcher?: typeof fetch\n  timeoutMs?: number\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n  const fetcher = options.fetcher ?? fetch;\n  const timeoutMs = typeof options.timeoutMs === 'number' && options.timeoutMs > 0 ? options.timeoutMs : 0;\n\n  async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n    const req: RPCRequest = { id: crypto.randomUUID(), method, params };\n    const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now();\n    const abortController = timeoutMs > 0 ? new AbortController() : undefined;\n    let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n    let timedOut = false;\n    maybeDispatchRPCEvent({\n      id: req.id,\n      method: req.method,\n      status: 'start',\n    });\n\n    try {\n      if (abortController) {\n        timeoutHandle = setTimeout(() => {\n          timedOut = true;\n          abortController.abort();\n        }, timeoutMs);\n      }\n\n      const resp = await fetcher(options.endpoint, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(req),\n        signal: abortController?.signal,\n      });\n\n      if (!resp.ok) {\n        throw new AppletRPCException({\n          code: 'http_error',\n          message: `HTTP ${resp.status}`,\n          details: { status: resp.status },\n        });\n      }\n\n      const json = (await resp.json()) as RPCResponse<TResult>;\n      if (json.error) {\n        throw new AppletRPCException({\n          code: json.error.code,\n          message: json.error.message,\n          details: json.error.details,\n        });\n      }\n\n      if (json.result === undefined) {\n        throw new AppletRPCException({\n          code: 'invalid_response',\n          message: 'Missing result in successful response',\n        });\n      }\n\n      maybeDispatchRPCEvent({\n        id: req.id,\n        method: req.method,\n        status: 'success',\n        durationMs: elapsedMs(startedAt),\n      });\n\n      return json.result as TResult;\n    } catch (err) {\n      let rpcErr: unknown = err;\n      if (err instanceof Error && err.name === 'AbortError') {\n        rpcErr = new AppletRPCException({\n          code: timedOut ? 'timeout' : 'aborted',\n          message: timedOut ? `RPC request timed out after ${timeoutMs}ms` : 'RPC request was aborted',\n          cause: err,\n        });\n      }\n      maybeDispatchRPCEvent({\n        id: req.id,\n        method: req.method,\n        status: 'error',\n        durationMs: elapsedMs(startedAt),\n        error: rpcErr,\n      });\n      throw rpcErr;\n    } finally {\n      if (timeoutHandle !== undefined) {\n        clearTimeout(timeoutHandle);\n      }\n    }\n  }\n\n  async function callTyped<\n    TRouter extends AppletRPCSchema,\n    TMethod extends keyof TRouter & string,\n  >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n    return call(method, params) as Promise<TRouter[TMethod]['result']>;\n  }\n\n  return { call, callTyped };\n}\n\ntype RPCDevEvent = {\n  id: string\n  method: string\n  status: 'start' | 'success' | 'error'\n  durationMs?: number\n  error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n  if (typeof window === 'undefined') {return;}\n\n  if (!shouldEnableAppletDevtools()) {return;}\n\n  window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }));\n}\n\nfunction elapsedMs(startedAt: number): number {\n  const now = typeof performance !== 'undefined' ? performance.now() : Date.now();\n  return Math.max(0, Math.round(now - startedAt));\n}\n","import { useMemo } from 'react';\nimport { createAppletRPCClient, type AppletRPCSchema } from '../../applet-host/rpc';\nimport { useAppletContext } from '../context/AppletContext';\n\nexport interface UseAppletRPCClientOptions {\n  endpoint?: string\n  timeoutMs?: number\n  fetcher?: typeof fetch\n}\n\nexport function useAppletRPCClient<\n  TRouter extends AppletRPCSchema = AppletRPCSchema,\n>(options: UseAppletRPCClientOptions = {}) {\n  const { config, session } = useAppletContext();\n  const endpoint = options.endpoint ?? config.rpcUIEndpoint ?? '/rpc';\n  const baseFetcher = options.fetcher ?? fetch;\n  const csrfToken = session.csrfToken;\n\n  return useMemo(() => {\n    const fetcher: typeof fetch = async (input, init) => {\n      const headers = new Headers(init?.headers ?? undefined);\n      if (csrfToken !== '' && !headers.has('X-CSRF-Token')) {\n        headers.set('X-CSRF-Token', csrfToken);\n      }\n\n      return baseFetcher(input, {\n        ...init,\n        headers,\n      });\n    };\n\n    return createAppletRPCClient({\n      endpoint,\n      timeoutMs: options.timeoutMs,\n      fetcher,\n    }) as ReturnType<typeof createAppletRPCClient> & {\n      callTyped<TMethod extends keyof TRouter & string>(\n        method: TMethod,\n        params: TRouter[TMethod]['params']\n      ): Promise<TRouter[TMethod]['result']>\n    };\n  }, [baseFetcher, csrfToken, endpoint, options.timeoutMs]);\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { AppConfig } from '../types';\n\n/**\n * useConfig provides access to applet configuration (endpoints, etc.)\n *\n * Usage:\n * const { graphQLEndpoint, streamEndpoint } = useConfig()\n */\nexport function useConfig(): AppConfig {\n  const { config } = useAppletContext();\n  return config;\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { UserContext } from '../types';\n\n/**\n * useUser provides access to current user information.\n *\n * Usage:\n * const { id, email, firstName, lastName, permissions } = useUser()\n */\nexport function useUser(): UserContext {\n  const { user } = useAppletContext();\n  return user;\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { PermissionsHook } from '../types';\n\n/**\n * usePermissions provides permission checking utilities.\n * All user permissions are automatically passed from backend.\n *\n * Usage:\n * const { hasPermission, hasAnyPermission } = usePermissions()\n *\n * if (hasPermission('BiChat.Access')) {\n *   // User has bichat access\n * }\n *\n * if (hasAnyPermission('finance.view', 'finance.edit')) {\n *   // User has at least one of these permissions\n * }\n */\nexport function usePermissions(): PermissionsHook {\n  const { user } = useAppletContext();\n\n  const hasPermission = (permission: string): boolean => {\n    return user.permissions.includes(permission);\n  };\n\n  const hasAnyPermission = (...permissions: string[]): boolean => {\n    return permissions.some(p => user.permissions.includes(p));\n  };\n\n  return {\n    hasPermission,\n    hasAnyPermission,\n    permissions: user.permissions\n  };\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { TranslationHook } from '../types';\n\n/**\n * useTranslation provides i18n translation utilities.\n * All translations are automatically passed from backend locale bundle.\n *\n * Usage:\n * const { t, language } = useTranslation()\n *\n * // Simple translation\n * t('BiChat.Title') // Returns translated text\n *\n * // Translation with interpolation\n * t('Common.WelcomeMessage', { name: 'John' })\n * // If translation is \"Welcome {name}!\" -> Returns \"Welcome John!\"\n *\n * React uses same keys as Go backend:\n * Go:    pageCtx.T(\"BiChat.Title\")\n * React: t(\"BiChat.Title\")\n */\nexport function useTranslation(): TranslationHook {\n  const { locale } = useAppletContext();\n\n  const t = (key: string, params?: Record<string, unknown>): string => {\n    let text = locale.translations[key] || key;\n\n    // Simple interpolation: \"Hello {name}\" with {name: \"World\"}\n    if (params) {\n      Object.entries(params).forEach(([k, v]) => {\n        text = text.replace(new RegExp(`\\\\{${k}\\\\}`, 'g'), String(v));\n      });\n    }\n\n    return text;\n  };\n\n  return {\n    t,\n    language: locale.language\n  };\n}\n","import { useMemo } from 'react';\nimport { useAppletContext } from '../context/AppletContext';\nimport type { SessionHook } from '../types';\n\nexport interface UseSessionOptions {\n  loginPath?: string\n}\n\n/**\n * useSession provides session and authentication handling utilities.\n *\n * Usage:\n * const { isExpiringSoon, refreshSession, csrfToken } = useSession()\n *\n * // Check if session is expiring soon (5 min buffer)\n * if (isExpiringSoon) {\n *   await refreshSession()\n * }\n *\n * // Include CSRF token in requests\n * fetch('/api/endpoint', {\n *   headers: { 'X-CSRF-Token': csrfToken }\n * })\n */\nexport function useSession(options?: UseSessionOptions): SessionHook {\n  const { session } = useAppletContext();\n  const loginPath = options?.loginPath ?? '/login';\n\n  // Check if session is expiring soon (5 minute buffer)\n  const isExpiringSoon = useMemo(() => {\n    const bufferMs = 5 * 60 * 1000; // 5 minutes\n    return session.expiresAt - Date.now() < bufferMs;\n  }, [session.expiresAt]);\n\n  const refreshSession = async (): Promise<void> => {\n    const response = await fetch(session.refreshURL, {\n      method: 'POST',\n      headers: {\n        'X-CSRF-Token': session.csrfToken\n      }\n    });\n\n    if (!response.ok) {\n      // Session refresh failed - redirect to login with return URL\n      const returnUrl = encodeURIComponent(window.location.pathname);\n      window.location.href = `${loginPath}?redirect=${returnUrl}`;\n      return;\n    }\n\n    // Dispatch event for CSRF token update\n    const newToken = response.headers.get('X-CSRF-Token');\n    if (newToken) {\n      window.dispatchEvent(\n        new CustomEvent('iota:csrf-refresh', {\n          detail: { token: newToken }\n        })\n      );\n    }\n  };\n\n  return {\n    isExpiringSoon,\n    refreshSession,\n    csrfToken: session.csrfToken,\n    expiresAt: session.expiresAt\n  };\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { RouteContext } from '../types';\n\n/**\n * useRoute provides access to the current route context.\n * Route context is initialized from the backend and includes path, params, and query.\n *\n * Usage:\n * const { path, params, query } = useRoute()\n *\n * // Example values:\n * // path: \"/sessions/123\"\n * // params: { id: \"123\" }\n * // query: { tab: \"history\" }\n */\nexport function useRoute(): RouteContext {\n  const { route } = useAppletContext();\n  return route;\n}\n","import { useState, useRef, useCallback } from 'react';\nimport type { StreamingHook } from '../types';\n\n/**\n * useStreaming provides SSE (Server-Sent Events) streaming utilities with cancellation support.\n *\n * Usage:\n * const { isStreaming, processStream, cancel, reset } = useStreaming()\n *\n * // Process async generator stream\n * await processStream(messageStream, (chunk) => {\n *   console.log('Received:', chunk)\n * })\n *\n * // Cancel ongoing stream\n * cancel()\n *\n * // Reset state after stream completion\n * reset()\n */\nexport function useStreaming(): StreamingHook {\n  const [isStreaming, setIsStreaming] = useState(false);\n  const abortControllerRef = useRef<AbortController | null>(null);\n\n  const processStream = useCallback(\n    async <T,>(\n      generator: AsyncGenerator<T>,\n      onChunk: (chunk: T) => void,\n      signal?: AbortSignal\n    ): Promise<void> => {\n      setIsStreaming(true);\n\n      // Create abort controller if not provided\n      const controller = new AbortController();\n      abortControllerRef.current = controller;\n\n      // Listen to external signal if provided\n      const onExternalAbort = signal ? () => { controller.abort(); } : undefined;\n      if (signal && onExternalAbort) {\n        signal.addEventListener('abort', onExternalAbort);\n      }\n\n      try {\n        for await (const chunk of generator) {\n          // Check if stream was cancelled\n          if (controller.signal.aborted) {\n            break;\n          }\n\n          onChunk(chunk);\n        }\n      } catch (error) {\n        // Stream was cancelled or errored\n        if (controller.signal.aborted) {\n          // Cancellation is expected, don't throw\n          return;\n        }\n        throw error;\n      } finally {\n        if (signal && onExternalAbort) {\n          signal.removeEventListener('abort', onExternalAbort);\n        }\n        setIsStreaming(false);\n        abortControllerRef.current = null;\n      }\n    },\n    []\n  );\n\n  const cancel = useCallback(() => {\n    if (abortControllerRef.current) {\n      abortControllerRef.current.abort();\n    }\n    setIsStreaming(false);\n  }, []);\n\n  const reset = useCallback(() => {\n    abortControllerRef.current = null;\n    setIsStreaming(false);\n  }, []);\n\n  return {\n    isStreaming,\n    processStream,\n    cancel,\n    reset\n  };\n}\n","import { useConfig } from './useConfig';\n\nexport type ShellMode = 'embedded' | 'standalone'\n\nexport interface AppletRuntime {\n  basePath: string\n  assetsBasePath: string\n  rpcEndpoint?: string\n  shellMode?: ShellMode\n}\n\nexport function useAppletRuntime(): AppletRuntime {\n  const config = useConfig();\n\n  const basePath = config.basePath ?? '';\n  const normalizedBasePath = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n  const assetsBasePath = config.assetsBasePath ?? `${normalizedBasePath || ''}/assets`;\n  const rpcEndpoint = config.rpcUIEndpoint;\n  const shellMode = config.shellMode;\n\n  return { basePath: normalizedBasePath, assetsBasePath, rpcEndpoint, shellMode };\n}\n"]}