{"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","../ui/src/applet-host/react-element.ts","../ui/src/applet-host/router.tsx","../ui/src/applet-devtools/overlay.tsx"],"names":["createContext","useContext","jsx","useAppletContext","useMemo","useState","useRef","useCallback","createRoot","useEffect","jsxs"],"mappings":"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","file":"index.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","import { createRoot, type Root } from 'react-dom/client';\n\nexport type RouterMode = 'url' | 'memory'\nexport type ShellMode = 'embedded' | 'standalone'\n\ntype RegistryEntry = {\n  options: DefineReactAppletElementOptions\n  observed: Set<string>\n}\n\nexport interface AppletHostConfig {\n  basePath: string\n  shellMode?: ShellMode\n  routerMode: RouterMode\n  attrs: Record<string, string>\n}\n\nexport interface DefineReactAppletElementOptions {\n  tagName: string\n  styles?: string | (() => string)\n  render: (host: AppletHostConfig) => React.ReactElement\n  observedAttributes?: string[]\n  observeDarkMode?: boolean\n  /**\n   * Use Shadow DOM for CSS isolation (default: true).\n   *\n   * Set to `false` for full-page applets that use libraries requiring\n   * document-level DOM access (e.g. Headless UI Dialog portals).\n   * When false, styles are injected into document.head instead.\n   */\n  shadow?: boolean\n}\n\nexport function defineReactAppletElement(options: DefineReactAppletElementOptions): void {\n  const tagName = options.tagName.toLowerCase();\n\n  const registry = getRegistry();\n  const existing = registry.get(tagName);\n  if (existing) {\n    existing.options = options;\n    for (const a of options.observedAttributes ?? []) {existing.observed.add(a);}\n  } else {\n    const observed = new Set<string>(['base-path', 'shell-mode', 'router-mode']);\n    for (const a of options.observedAttributes ?? []) {observed.add(a);}\n    registry.set(tagName, { options, observed });\n  }\n\n  if (customElements.get(tagName)) {\n    if (typeof window !== 'undefined') {\n      window.dispatchEvent(new CustomEvent('iota:applet-host-update', { detail: { tagName } }));\n    }\n    return;\n  }\n\n  function getEntry(): RegistryEntry {\n    const entry = getRegistry().get(tagName);\n    if (!entry) {throw new Error(`[${tagName}] applet host registry entry missing`);}\n    return entry;\n  }\n\n  class ReactAppletElement extends HTMLElement {\n    private reactRoot: Root | null = null;\n    private container: HTMLDivElement | null = null;\n    private darkModeObserver: MutationObserver | null = null;\n    private styleEl: HTMLStyleElement | null = null;\n    private updateListener: ((e: Event) => void) | null = null;\n\n    static get observedAttributes(): string[] {\n      return Array.from(getEntry().observed);\n    }\n\n    private get useShadow(): boolean {\n      return getEntry().options.shadow !== false;\n    }\n\n    /** The root node that holds the container and styles (shadow root or the element itself). Call ensureMountMode() before reading when using shadow. */\n    private get styleRoot(): ShadowRoot | this {\n      if (!this.useShadow) {\n        return this;\n      }\n      if (!this.shadowRoot) {\n        throw new Error(`[${tagName}] shadowRoot missing; call ensureMountMode() first`);\n      }\n      return this.shadowRoot;\n    }\n\n    /** Ensures shadow root exists when needed and the React container is in the correct root (shadow or light). */\n    private ensureMountMode(): void {\n      const targetRoot = this.useShadow\n        ? (this.shadowRoot ?? this.attachShadow({ mode: 'open' }))\n        : this;\n      if (this.container && this.container.parentNode !== targetRoot) {\n        targetRoot.appendChild(this.container);\n      }\n    }\n\n    connectedCallback(): void {\n      if (!this.container) {\n        this.container = document.createElement('div');\n        this.container.id = 'react-root';\n        this.container.style.display = 'flex';\n        this.container.style.flexDirection = 'column';\n        this.container.style.flex = '1';\n        this.container.style.minHeight = '0';\n        this.container.style.height = '100%';\n        this.container.style.width = '100%';\n      }\n\n      this.ensureMountMode();\n      const root = this.styleRoot;\n\n      const existingContainer = root.querySelector('#react-root');\n      if (!existingContainer) {\n        if (this.useShadow && this.styleEl) {root.appendChild(this.styleEl);}\n        root.appendChild(this.container);\n      } else if (existingContainer !== this.container) {\n        this.container = existingContainer as HTMLDivElement;\n      }\n\n      this.syncFromRegistry();\n\n      this.updateListener ??= (e: Event) => {\n        if (!(e instanceof CustomEvent)) {return;}\n        const detail = (e as CustomEvent<{ tagName?: string }>).detail;\n        if (!detail || detail.tagName !== tagName) {return;}\n        this.syncFromRegistry();\n        this.renderReact();\n      };\n      window.addEventListener('iota:applet-host-update', this.updateListener as EventListener);\n\n      this.renderReact();\n    }\n\n    disconnectedCallback(): void {\n      if (this.updateListener) {\n        window.removeEventListener('iota:applet-host-update', this.updateListener as EventListener);\n      }\n\n      this.darkModeObserver?.disconnect();\n      this.darkModeObserver = null;\n\n      this.reactRoot?.unmount();\n      this.reactRoot = null;\n\n      // Clean up style: release shared light-mode style or remove shadow style\n      if (this.styleEl) {\n        if (this.styleEl.parentNode === document.head) {\n          releaseLightStyle(tagName);\n        } else {\n          this.styleEl.remove();\n        }\n        this.styleEl = null;\n      }\n    }\n\n    attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n      if (oldValue === newValue) {return;}\n      if (this.container) {this.renderReact();}\n    }\n\n    private getHostConfig(): AppletHostConfig {\n      const attrs: Record<string, string> = {};\n      for (const { name, value } of Array.from(this.attributes)) {\n        attrs[name] = value;\n      }\n\n      const basePath = this.getAttribute('base-path') ?? '';\n      const shellMode = (this.getAttribute('shell-mode') as ShellMode | null) ?? undefined;\n      const routerMode = (this.getAttribute('router-mode') as RouterMode | null) ?? 'url';\n\n      return { basePath, shellMode, routerMode, attrs };\n    }\n\n    private renderReact(): void {\n      if (!this.container) {return;}\n\n      if (!this.reactRoot) {\n        this.reactRoot = createRoot(this.container);\n      }\n\n      try {\n        this.reactRoot.render(getEntry().options.render(this.getHostConfig()));\n      } catch (err) {\n        console.error(`[${tagName}] failed to mount React app:`, err);\n      }\n    }\n\n    private syncFromRegistry(): void {\n      this.ensureMountMode();\n      const entry = getEntry();\n\n      const styles = typeof entry.options.styles === 'function' ? entry.options.styles() : entry.options.styles;\n      if (styles) {\n        if (this.useShadow) {\n          // Shadow mode: per-instance <style> in shadow root (release shared if we were in light mode)\n          if (this.styleEl && this.styleEl.parentNode === document.head) {\n            releaseLightStyle(tagName);\n            this.styleEl = null;\n          }\n          this.styleEl ??= document.createElement('style');\n          this.styleEl.textContent = styles;\n          if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {\n            this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild);\n          }\n        } else {\n          // Light mode: shared <style> per tagName in document.head (ref-counted)\n          if (this.styleEl && this.shadowRoot?.contains(this.styleEl)) {\n            this.styleEl.remove();\n            this.styleEl = null;\n          }\n          // Release any stale ref (orphaned or from a previous cycle) before acquiring a new one.\n          if (this.styleEl && this.styleEl.parentNode !== document.head) {\n            releaseLightStyle(tagName);\n            this.styleEl = null;\n          }\n          if (!this.styleEl) {\n            this.styleEl = getOrCreateLightStyle(tagName, styles);\n          } else {\n            this.styleEl.textContent = styles;\n          }\n          if (!document.head.contains(this.styleEl)) {\n            document.head.appendChild(this.styleEl);\n          }\n        }\n      } else if (this.styleEl) {\n        if (this.styleEl.parentNode === document.head) {\n          releaseLightStyle(tagName);\n        } else {\n          this.styleEl.remove();\n        }\n        this.styleEl = null;\n      }\n\n      if (entry.options.observeDarkMode !== false) {\n        this.darkModeObserver ??= this.syncDarkMode();\n      } else if (this.darkModeObserver) {\n        this.darkModeObserver.disconnect();\n        this.darkModeObserver = null;\n      }\n    }\n\n    private syncDarkMode(): MutationObserver {\n      const root = this.container;\n      if (!root) {throw new Error('react root container not found');}\n\n      const apply = () => {\n        if (document.documentElement.classList.contains('dark')) {root.classList.add('dark');}\n        else {root.classList.remove('dark');}\n      };\n\n      apply();\n\n      const observer = new MutationObserver(apply);\n      observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n      return observer;\n    }\n  }\n\n  customElements.define(tagName, ReactAppletElement);\n}\n\nfunction getRegistry(): Map<string, RegistryEntry> {\n  const g = globalThis as Record<string, unknown>;\n  g.__IOTA_REACT_APPLET_HOST_REGISTRY__ ??= new Map<string, RegistryEntry>();\n  return g.__IOTA_REACT_APPLET_HOST_REGISTRY__ as Map<string, RegistryEntry>;\n}\n\n// Light-mode style registry: one shared <style> per tagName, ref-counted\ninterface LightStyleEntry {\n  element: HTMLStyleElement\n  refCount: number\n}\n\nfunction getLightStyleRegistry(): Map<string, LightStyleEntry> {\n  const g = globalThis as Record<string, unknown>;\n  g.__IOTA_REACT_APPLET_LIGHT_STYLES__ ??= new Map<string, LightStyleEntry>();\n  return g.__IOTA_REACT_APPLET_LIGHT_STYLES__ as Map<string, LightStyleEntry>;\n}\n\n/**\n * Returns a shared <style> element for the given tagName (ref-counted).\n * Callers (e.g. syncFromRegistry) are responsible for appending the element\n * to document.head; it is not appended here.\n */\nfunction getOrCreateLightStyle(tagName: string, styles: string): HTMLStyleElement {\n  const registry = getLightStyleRegistry();\n  let entry = registry.get(tagName);\n  if (!entry) {\n    const el = document.createElement('style');\n    el.id = `${tagName}-styles`;\n    entry = { element: el, refCount: 0 };\n    registry.set(tagName, entry);\n  }\n  entry.refCount++;\n  entry.element.textContent = styles;\n  return entry.element;\n}\n\nfunction releaseLightStyle(tagName: string): void {\n  const registry = getLightStyleRegistry();\n  const entry = registry.get(tagName);\n  if (!entry) {return;}\n  entry.refCount--;\n  if (entry.refCount <= 0) {\n    entry.element.remove();\n    registry.delete(tagName);\n  }\n}\n","import type React from 'react';\n\nexport type RouterMode = 'url' | 'memory'\n\nexport interface CreateAppletRouterOptions {\n  mode: RouterMode\n  basePath?: string\n  BrowserRouter: React.ComponentType<Record<string, unknown>>\n  MemoryRouter: React.ComponentType<Record<string, unknown>>\n}\n\nexport function createAppletRouter(options: CreateAppletRouterOptions) {\n  const basePath = options.basePath ?? '';\n\n  const Router: React.FC<React.PropsWithChildren> = ({ children }) => {\n    if (options.mode === 'memory') {\n      const MemoryRouter = options.MemoryRouter;\n      return <MemoryRouter>{children}</MemoryRouter>;\n    }\n\n    const BrowserRouter = options.BrowserRouter;\n    return <BrowserRouter basename={basePath}>{children}</BrowserRouter>;\n  };\n\n  return { Router };\n}\n\n","import { useEffect, useMemo, useState } from 'react';\nimport { useAppletContext } from '../applet-core/context/AppletContext';\nimport { useAppletRuntime } from '../applet-core/hooks/useAppletRuntime';\n\ntype RPCEvent = {\n  id: string\n  method: string\n  status: 'start' | 'success' | 'error'\n  durationMs?: number\n  error?: unknown\n}\n\nexport function AppletDevtoolsOverlay() {\n  const ctx = useAppletContext();\n  const runtime = useAppletRuntime();\n  const [rpcEvents, setRPCEvents] = useState<RPCEvent[]>([]);\n\n  useEffect(() => {\n    const onEvent = (e: Event) => {\n      if (!(e instanceof CustomEvent)) {return;}\n      const detail = (e as CustomEvent<RPCEvent>).detail;\n      if (!detail) {return;}\n      setRPCEvents((prev) => [detail, ...prev].slice(0, 50));\n    };\n    window.addEventListener('iota:applet-rpc', onEvent as EventListener);\n    return () => window.removeEventListener('iota:applet-rpc', onEvent as EventListener);\n  }, []);\n\n  const summary = useMemo(() => {\n    return {\n      basePath: runtime.basePath,\n      assetsBasePath: runtime.assetsBasePath,\n      rpcEndpoint: runtime.rpcEndpoint,\n      shellMode: runtime.shellMode,\n      route: ctx.route,\n      user: { id: ctx.user.id, email: ctx.user.email },\n      tenant: ctx.tenant,\n    };\n  }, [ctx.route, ctx.tenant, ctx.user.email, ctx.user.id, runtime.assetsBasePath, runtime.basePath, runtime.rpcEndpoint, runtime.shellMode]);\n\n  return (\n    <div\n      style={{\n        position: 'fixed',\n        right: 12,\n        bottom: 12,\n        width: 420,\n        maxHeight: '60vh',\n        overflow: 'auto',\n        background: 'rgba(17, 24, 39, 0.92)',\n        color: '#E5E7EB',\n        border: '1px solid rgba(255,255,255,0.12)',\n        borderRadius: 10,\n        padding: 12,\n        fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n        fontSize: 12,\n        zIndex: 2147483647,\n      }}\n    >\n      <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>\n        <div style={{ fontWeight: 700 }}>Applet Devtools</div>\n        <div style={{ opacity: 0.7 }}>{runtime.shellMode ?? 'unknown'}</div>\n      </div>\n\n      <div style={{ marginBottom: 10 }}>\n        <div style={{ opacity: 0.85, marginBottom: 4 }}>Context</div>\n        <pre style={{ margin: 0, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>{JSON.stringify(summary, null, 2)}</pre>\n      </div>\n\n      <div>\n        <div style={{ opacity: 0.85, marginBottom: 4 }}>RPC</div>\n        {rpcEvents.length === 0 ? (\n          <div style={{ opacity: 0.7 }}>No calls yet</div>\n        ) : (\n          <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n            {rpcEvents.map((ev) => (\n              <div key={`${ev.id}:${ev.status}`} style={{ padding: 8, border: '1px solid rgba(255,255,255,0.08)', borderRadius: 8 }}>\n                <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n                  <div>{ev.method}</div>\n                  <div style={{ opacity: 0.8 }}>\n                    {ev.status}\n                    {typeof ev.durationMs === 'number' ? ` (${ev.durationMs}ms)` : ''}\n                  </div>\n                </div>\n                {ev.status === 'error' ? (\n                  <pre style={{ margin: '6px 0 0', opacity: 0.8, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n                    {JSON.stringify(serializeError(ev.error) ?? {}, null, 2)}\n                  </pre>\n                ) : null}\n              </div>\n            ))}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n\nfunction serializeError(err: unknown): unknown {\n  if (err instanceof Error) {\n    const out: Record<string, unknown> = {\n      name: err.name,\n      message: err.message,\n    };\n    if (err.stack) {out.stack = err.stack;}\n    const errRecord = err as unknown as Record<string, unknown>;\n    if ('code' in err && typeof errRecord.code === 'string') {out.code = errRecord.code;}\n    if ('details' in err) {out.details = errRecord.details;}\n    if ('cause' in err) {out.cause = errRecord.cause;}\n    return out;\n  }\n  return err;\n}\n"]}