@howone/sdk 0.1.22 → 0.1.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +12 -8
- package/dist/index.d.ts +12 -8
- package/dist/index.js +31 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +30 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth/index.ts","../src/config.ts","../src/index.ts","../src/components/FloatingButton.tsx","../src/services/unified-oauth.ts","../src/services/ai-workflow.ts","../src/services/request/index.ts","../src/services/ai-workflow-axios.ts","../src/services/artifact-types.ts","../src/services/artifacts-client.ts","../src/services/index.ts","../src/utils/urlSanitizer.ts","../src/components/auth/LoginForm.tsx","../src/components/auth/HowoneProvider.tsx","../src/components/theme/ThemeProvider.tsx","../src/components/ui/Toast/GlobalToastContainer.tsx","../src/components/index.ts","../src/howone/client.ts","../src/components/ui/Loading.tsx","../src/components/ui/ErrorBoundary.tsx","../src/components/theme/ThemeToggle.tsx","../src/components/ui/Toast/ClayxToast.tsx","../src/hooks/use-mobile.ts","../src/hooks/use-debounce.ts","../src/utils/errorHandler.ts"],"sourcesContent":["// Simple auth utilities for howone-client package\n// - parse JWT payload\n// - provide a small React hook for auth state\n\nexport const AUTH_TOKEN_KEY = 'auth_token'\n\nfunction setLocal(name: string, value: string | null) {\n try {\n if (typeof window === 'undefined' || !window?.localStorage) return\n if (value === null) {\n window.localStorage.removeItem(name)\n return\n }\n window.localStorage.setItem(name, value)\n } catch (e) {\n void e\n }\n}\n\nfunction getLocal(name: string): string | null {\n try {\n if (typeof window === 'undefined' || !window?.localStorage) return null\n return window.localStorage.getItem(name)\n } catch (e) {\n return null\n }\n}\n\nexport function setToken(token: string | null) {\n // Use localStorage for client-side token persistence\n try {\n setLocal(AUTH_TOKEN_KEY, token)\n } catch (e) {\n void e\n }\n // Notify subscribers regardless of token presence\n try { notifyAuthStateChanged() } catch { /* ignore */ }\n}\n\nexport function getToken(): string | null {\n try {\n const v = getLocal(AUTH_TOKEN_KEY)\n if (v) return v\n } catch (e) {\n void e\n }\n return null\n}\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> | null {\n try {\n const payload = token.split('.')[1]\n if (!payload) return null\n let base64 = payload.replace(/-/g, '+').replace(/_/g, '/')\n const pad = base64.length % 4\n if (pad === 2) base64 += '=='\n else if (pad === 3) base64 += '='\n else if (pad !== 0) return null\n const json = atob(base64)\n return JSON.parse(json) as Record<string, unknown>\n } catch {\n return null\n }\n}\n\nexport function parseUserFromToken(token: string | null) {\n if (!token) return null\n const payload = decodeJwtPayload(token)\n if (!payload) return null\n return {\n id: (payload.userId as string) || (payload.sub as string) || '',\n email: (payload.email as string) || '',\n name: (payload.name as string) || '',\n avatar: (payload.avatar as string) || (payload.picture as string) || ''\n }\n}\n\nexport function isTokenValid(token: string | null) {\n if (!token) return false\n const payload = decodeJwtPayload(token)\n if (!payload) return false\n const now = Math.floor(Date.now() / 1000)\n const expCandidate = (payload.exp as number | string | undefined) ?? (payload.expires_at as number | string | undefined)\n const exp = Number(expCandidate)\n if (!exp || !Number.isFinite(exp)) return true\n return exp > now\n}\n\n// A tiny hook that exposes auth state (no external deps)\nimport { useEffect, useState } from 'react'\nexport function useAuth() {\n const [token, setTokenState] = useState<string | null>(() => getToken())\n const [user, setUser] = useState(() => parseUserFromToken(getToken()))\n useEffect(() => {\n const onStorage = () => {\n const t = getToken()\n setTokenState(t)\n setUser(parseUserFromToken(t))\n }\n window.addEventListener('storage', onStorage)\n\n // subscribe to programmatic auth state changes\n const unsubscribe = onAuthStateChanged(() => {\n setTokenState(getToken())\n setUser(parseUserFromToken(getToken()))\n })\n\n return () => {\n window.removeEventListener('storage', onStorage)\n unsubscribe()\n }\n }, [])\n\n const logout = () => {\n setToken(null)\n setTokenState(null)\n setUser(null)\n // notify subscribers\n notifyAuthStateChanged()\n }\n\n return {\n token,\n user,\n isAuthenticated: !!token && isTokenValid(token),\n logout\n }\n}\n\n// --- simple pub/sub for auth state ---\ntype AuthState = { user: ReturnType<typeof parseUserFromToken> | null; isLoading: boolean }\nconst authSubscribers = new Set<(state: AuthState) => void>()\n\nexport function onAuthStateChanged(cb: (state: AuthState) => void) {\n // call immediately with current state\n try {\n const current = { user: parseUserFromToken(getToken()), isLoading: false }\n cb(current)\n } catch {\n // ignore\n }\n authSubscribers.add(cb)\n return () => { authSubscribers.delete(cb) }\n}\n\nfunction notifyAuthStateChanged() {\n const state = { user: parseUserFromToken(getToken()), isLoading: false }\n for (const cb of Array.from(authSubscribers)) {\n try { cb(state) } catch { /* ignore subscriber errors */ }\n }\n}\n\n// no internal helper exported — setToken already notifies subscribers\n","// Central auth configuration for howone-client\n// Default AUTH_ROOT can be overridden at runtime by calling setAuthRoot\nlet AUTH_ROOT_VALUE = 'https://howone-dev.fly.dev/'\nlet DEFAULT_PROJECT_ID: string | null = null\n\nexport function setAuthRoot(url: string) {\n AUTH_ROOT_VALUE = url.replace(/\\/+$/g, '')\n}\n\nexport function getAuthRoot() {\n return AUTH_ROOT_VALUE\n}\n\nexport const AUTH_ROOT = getAuthRoot()\n\n// For compatibility consumers: try reading a global injected value if present\ntry {\n const g = (globalThis as any).__HOWONE_AUTH_ROOT__\n if (typeof g === 'string' && g.length > 0) {\n setAuthRoot(g)\n }\n} catch {\n // noop\n}\n\n// default project id helper (optional)\nexport function setDefaultProjectId(id: string | null) {\n DEFAULT_PROJECT_ID = id\n}\n\nexport function getDefaultProjectId() {\n try {\n if (DEFAULT_PROJECT_ID) return DEFAULT_PROJECT_ID\n const g = (globalThis as any).__HOWONE_PROJECT_ID__\n if (typeof g === 'string' && g.length > 0) return String(g)\n return null\n } catch {\n return DEFAULT_PROJECT_ID\n }\n}\n\nexport default {\n getAuthRoot,\n setAuthRoot,\n AUTH_ROOT: () => AUTH_ROOT_VALUE,\n}\n","export { FloatingButton } from './components/FloatingButton'\nexport * from './services'\nexport { createClient } from './services/index'\n// No package-level `howone` export. Call `createClient()` to get an SDK instance.\n\n// Components\nexport * from './components'\n\n// Hooks\nexport * from './hooks'\n\n// Utils\n// export { injectEarlyErrorHandler } from './utils/earlyErrorHandler'\nexport { injectEarlyErrorHandler } from './utils/errorHandler'\nexport { getAuthRoot, setAuthRoot } from './config'\nexport { getDefaultProjectId, setDefaultProjectId } from './config'\n","import { Icon } from '@iconify/react/dist/iconify.js'\nimport React from 'react'\n\ninterface FloatingButtonProps {\n text?: string\n onClick?: () => void\n className?: string\n}\n\nexport const FloatingButton: React.FC<FloatingButtonProps> = ({\n text = 'Made in Howone',\n onClick,\n className = ''\n}) => {\n return (\n <button\n onClick={onClick}\n id='floating-howone-btn'\n className={`fixed flex bg-background gap-2 items-center right-4 z-50 text-black dark:text-white px-3 py-2 rounded-lg shadow-lg transition-colors duration-200 border border-gray-200 dark:border-gray-700 ${className}`}\n style={{\n fontSize: '14px',\n fontWeight: 'bold',\n bottom: '28px',\n }}\n >\n <div className=\"flex items-center gap-2\" style={{ cursor: 'pointer' }}>\n <img width={20} className=\"pointer-events-auto\" src=\"https://sxwxqoixnnklnpeutjrj.supabase.co/storage/v1/object/public/create-x/logo/logo-sm.svg\" alt=\"\" />{text}\n <Icon icon=\"mdi:close\" onClick={(e) => {\n e.stopPropagation()\n const btn = document.getElementById('floating-howone-btn')\n if (btn) btn.style.display = 'none'\n }} className=\"w-5 h-5 font-bold pointer-events-auto text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200\" />\n </div>\n </button>\n )\n}\n","/**\n * 统一认证服务\n *\n * 提供多种认证功能,包括:\n * - Google OAuth 认证\n * - GitHub OAuth 认证\n * - 邮箱验证码认证\n * - Token 验证和管理\n * - 退出登录\n */\n\n/**\n * 发送验证码请求接口\n */\nexport interface SendCodeRequest {\n /** 邮箱地址 */\n email: string;\n /** 来源 URL */\n from_url: string;\n /** 应用 ID(可选) */\n app_id?: string;\n /** 应用名称(可选) */\n app_name?: string;\n}\n\n/**\n * 发送验证码响应接口\n */\nexport interface SendCodeResponse {\n /** 是否成功 */\n success: boolean;\n /** 消息(可选) */\n message?: string;\n /** 过期时间(秒)(可选) */\n expiresIn?: number;\n /** 状态码(可选,用于处理业务逻辑错误) */\n code?: number;\n /** 数据对象(可选,用于处理业务逻辑错误) */\n data?: {\n success: boolean;\n message?: string;\n code?: number;\n };\n /** 追踪 ID(可选) */\n traceId?: number;\n}\n\n/**\n * 邮箱登录请求接口\n */\nexport interface EmailLoginRequest {\n /** 邮箱地址 */\n email: string;\n /** 验证码 */\n code: string;\n /** 来源 URL */\n from_url: string;\n /** 应用 ID(可选) */\n app_id?: string;\n}\n\n/**\n * 邮箱登录响应接口\n */\nexport interface EmailLoginResponse {\n /** 是否成功 */\n success: boolean;\n /** JWT token(可选) */\n token?: string;\n /** 用户信息(可选) */\n user?: {\n email: string;\n name?: string;\n };\n /** 重定向 URL(可选) */\n redirect_url?: string;\n /** 消息(可选) */\n message?: string;\n /** 状态码(可选,用于处理业务逻辑错误) */\n code?: number;\n /** 数据对象(可选,用于处理业务逻辑错误) */\n data?: {\n success: boolean;\n message?: string;\n code?: number;\n };\n /** 追踪 ID(可选) */\n traceId?: number;\n}\n\nclass UnifiedAuthService {\n private readonly API_BASE_URL = \"https://create-x-backend-dev.fly.dev\";\n\n /**\n * 初始化 Google 登录流程\n * @returns 包含 token 和用户信息的 Promise\n */\n async initiateGoogleLogin() {\n const currentUrl = window.location.href;\n\n const state = {\n from_url: currentUrl,\n app_id: this.generateAppId(),\n timestamp: Date.now(),\n };\n\n const stateString = encodeURIComponent(JSON.stringify(state));\n\n try {\n const response = await fetch(`${this.API_BASE_URL}/api/auth/google?state=${stateString}`);\n const data = await response.json();\n\n if (!data.data.success || !data.data.authUrl) {\n throw new Error(\"Failed to get OAuth URL\");\n }\n\n return this.openOAuthPopup(data.data.authUrl);\n } catch (error) {\n // 转发错误\n throw error;\n }\n }\n\n /**\n * 打开 OAuth 认证弹窗\n * @param authUrl 认证 URL\n * @returns 包含 token 和用户信息的 Promise\n */\n private openOAuthPopup(authUrl: string): Promise<{ token: string; user?: any }> {\n return new Promise((resolve, reject) => {\n const width = 500;\n const height = 600;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n\n // 移除 noopener,noreferrer 参数,可能导致问题\n const popup = window.open(\n authUrl,\n \"oauth-popup\",\n `width=${width},height=${height},left=${left},top=${top},scrollbars=yes,resizable=yes`,\n );\n\n if (!popup) {\n reject(new Error(\"Unable to open popup, please check browser popup settings\"));\n return;\n }\n\n let popupClosed = false;\n let popupCheckInterval: number | null = null;\n\n // 使用 try-catch 包装检查逻辑,避免在控制台显示错误\n const checkPopupStatus = () => {\n try {\n // 尝试通过检查窗口是否被定义来判断它是否关闭\n // 这种方法比直接访问 popup.closed 更安全\n if (!popup || popup.closed) {\n if (!popupClosed) {\n popupClosed = true;\n if (popupCheckInterval) {\n clearInterval(popupCheckInterval);\n popupCheckInterval = null;\n }\n window.removeEventListener(\"message\", messageHandler);\n reject(new Error(\"User cancelled login\"));\n }\n }\n } catch (e) {\n // 忽略可能的错误\n // 如果出现错误,很可能是因为弹窗已关闭或跨域限制\n if (!popupClosed) {\n popupClosed = true;\n if (popupCheckInterval) {\n clearInterval(popupCheckInterval);\n popupCheckInterval = null;\n }\n window.removeEventListener(\"message\", messageHandler);\n reject(new Error(\"User cancelled login\"));\n }\n }\n };\n\n // 定期检查弹窗状态\n popupCheckInterval = window.setInterval(checkPopupStatus, 1000) as unknown as number;\n\n const messageHandler = (event: MessageEvent) => {\n const validOrigins = [window.location.origin, \"https://create-x-backend-dev.fly.dev\"];\n\n const isValidOrigin = validOrigins.some(\n (origin) =>\n event.origin === origin ||\n event.origin.includes(\"localhost\") ||\n event.origin.includes(\"127.0.0.1\") ||\n event.origin.includes(\"fly.dev\"),\n );\n\n if (!isValidOrigin) {\n // 忽略来自未知来源的消息\n return;\n }\n\n if (event.data && event.data.type === \"OAUTH_SUCCESS\") {\n popupClosed = true;\n if (popupCheckInterval) {\n clearInterval(popupCheckInterval);\n popupCheckInterval = null;\n }\n window.removeEventListener(\"message\", messageHandler);\n\n // 安全地尝试关闭弹窗\n try {\n if (popup) popup.close();\n } catch (e) {\n // 忽略关闭弹窗的错误\n }\n\n resolve(event.data.payload);\n } else if (event.data && event.data.type === \"OAUTH_ERROR\") {\n popupClosed = true;\n if (popupCheckInterval) {\n clearInterval(popupCheckInterval);\n popupCheckInterval = null;\n }\n window.removeEventListener(\"message\", messageHandler);\n\n // 安全地尝试关闭弹窗\n try {\n if (popup) popup.close();\n } catch (e) {\n // 忽略关闭弹窗的错误\n }\n\n reject(new Error(event.data.error || \"login failed\"));\n }\n };\n\n window.addEventListener(\"message\", messageHandler);\n\n // 设置超时\n setTimeout(() => {\n if (!popupClosed) {\n popupClosed = true;\n if (popupCheckInterval) {\n clearInterval(popupCheckInterval);\n popupCheckInterval = null;\n }\n window.removeEventListener(\"message\", messageHandler);\n\n // 安全地尝试关闭弹窗\n try {\n if (popup) popup.close();\n } catch (e) {\n // 忽略关闭弹窗的错误\n }\n\n reject(new Error(\"login timeout\"));\n }\n }, 5 * 60 * 1000);\n });\n }\n\n /**\n * 初始化 GitHub 登录流程\n * @returns 包含 token 和用户信息的 Promise\n */\n async initiateGitHubLogin() {\n const currentUrl = window.location.href;\n\n const state = {\n from_url: currentUrl,\n app_id: this.generateAppId(),\n timestamp: Date.now(),\n };\n\n const stateString = encodeURIComponent(JSON.stringify(state));\n\n try {\n const response = await fetch(`${this.API_BASE_URL}/api/auth/github?state=${stateString}`);\n const data = await response.json();\n if (!data.data.success || !data.data.authUrl) {\n throw new Error(\"Failed to get GitHub OAuth URL\");\n }\n\n return this.openOAuthPopup(data.data.authUrl);\n } catch (error) {\n // 转发错误\n throw error;\n }\n }\n\n /**\n * 发送邮箱验证码\n * @param email 邮箱地址\n * @param appName 应用名称(可选)\n * @returns 发送结果 Promise\n */\n async sendEmailVerificationCode(email: string, appName?: string): Promise<SendCodeResponse> {\n try {\n const currentUrl = window.location.origin;\n const appId = this.generateAppId(); // 使用域名作为app_id\n\n const response = await fetch(`${this.API_BASE_URL}/api/auth/email/send-code`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n email,\n from_url: currentUrl,\n app_id: appId,\n app_name: appName,\n } as SendCodeRequest),\n });\n\n const data = await response.json();\n\n // 检查 HTTP 状态码\n if (!response.ok) {\n // 直接传递完整的错误响应对象\n throw new Error(JSON.stringify(data));\n }\n\n // 检查业务逻辑状态码\n if (data.code === 0 && data.data && data.data.success === false) {\n // 业务逻辑错误,直接传递完整响应\n throw new Error(JSON.stringify(data));\n }\n\n // 检查频率限制错误\n if (data.code === 429) {\n // 频率限制错误\n throw new Error(JSON.stringify(data));\n }\n\n return data;\n } catch (error) {\n // 如果错误已经是JSON字符串,直接传递\n if (error instanceof Error && error.message.startsWith(\"{\")) {\n throw error;\n }\n // 否则,包装为通用错误\n throw new Error(error instanceof Error ? error.message : \"网络错误,请稍后重试\");\n }\n }\n\n /**\n * 邮箱验证码登录\n * @param email 邮箱地址\n * @param code 验证码\n * @returns 登录结果 Promise\n */\n async loginWithEmailCode(email: string, code: string): Promise<EmailLoginResponse> {\n try {\n const currentUrl = window.location.origin;\n const appId = this.generateAppId(); // 使用域名作为app_id\n\n const response = await fetch(`${this.API_BASE_URL}/api/auth/email/login`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n email,\n code,\n from_url: currentUrl,\n app_id: appId,\n } as EmailLoginRequest),\n });\n\n const data = await response.json();\n\n // 检查 HTTP 状态码\n if (!response.ok) {\n // 直接传递完整的错误响应对象\n throw new Error(JSON.stringify(data));\n }\n\n // 检查业务逻辑状态码\n if (data.code === 0 && data.data && data.data.success === false) {\n // 业务逻辑错误,直接传递完整响应\n throw new Error(JSON.stringify(data));\n }\n\n return data;\n } catch (error) {\n // 如果错误已经是JSON字符串,直接传递\n if (error instanceof Error && error.message.startsWith(\"{\")) {\n throw error;\n }\n // 否则,包装为通用错误\n throw new Error(error instanceof Error ? error.message : \"网络错误,请稍后重试\");\n }\n }\n\n /**\n * 获取验证码状态(调试用)\n * @param email 邮箱地址\n * @returns 验证码状态 Promise\n */\n async getCodeStatus(email: string) {\n try {\n const response = await fetch(\n `${this.API_BASE_URL}/api/auth/email/code-status?email=${encodeURIComponent(email)}`,\n );\n return await response.json();\n } catch (error) {\n // 返回错误信息\n return { success: false, error: error instanceof Error ? error.message : \"网络错误\" };\n }\n }\n\n private generateAppId(): string {\n const urlParams = new URLSearchParams(window.location.search);\n let appId = urlParams.get(\"appId\");\n\n return appId || \"app\";\n }\n\n /**\n * 检查 OAuth 回调\n * 从 URL 参数中获取 token 和错误信息\n * @returns 包含 token、用户信息和错误的对象\n */\n checkOAuthCallback(): { success: boolean; token?: string; error?: string; user?: any } {\n // Support token in query string (access_token or token) and in URL hash\n const urlParams = new URLSearchParams(window.location.search);\n const token = urlParams.get(\"token\");\n const accessTokenQuery = urlParams.get(\"access_token\");\n const error = urlParams.get(\"error\");\n const userParam = urlParams.get(\"user\");\n\n // parse hash fragment like #access_token=...&other=...\n let hashToken: string | null = null;\n try {\n if (window.location.hash && window.location.hash.length > 1) {\n const hash = window.location.hash.slice(1); // remove '#'\n const hashParams = new URLSearchParams(hash);\n hashToken = hashParams.get(\"access_token\") || hashParams.get(\"token\") || null;\n }\n } catch {\n hashToken = null;\n }\n\n // prefer token in query (access_token first), otherwise fallback to token param or hash token\n const finalToken = accessTokenQuery || token || hashToken;\n\n // If we're inside an iframe and didn't find a token on the iframe window,\n // try to read the top-level location href (if same-origin) where the\n // OAuth provider may have redirected. Wrap in try/catch to avoid cross-origin errors.\n if (!finalToken && window.top && window.top !== window) {\n try {\n const topHref = String(window.top.location.href || \"\");\n if (topHref) {\n const up = new URL(topHref);\n const topSearch = new URLSearchParams(up.search);\n const topToken = topSearch.get(\"access_token\") || topSearch.get(\"token\") || null;\n if (topToken) {\n this.saveAuthData(topToken);\n try {\n topSearch.delete(\"token\");\n topSearch.delete(\"access_token\");\n topSearch.delete(\"project_id\");\n up.search = topSearch.toString();\n up.hash = \"\";\n window.top.history.replaceState({}, document.title, up.toString());\n } catch {\n /* ignore */\n }\n return { success: true, token: topToken };\n }\n }\n } catch {\n // cross-origin or other error - ignore\n }\n }\n\n if (finalToken) {\n let user = null;\n if (userParam) {\n try {\n user = JSON.parse(decodeURIComponent(userParam));\n } catch (e) {}\n }\n this.saveAuthData(finalToken);\n\n try {\n const u = new URL(window.location.href);\n u.searchParams.delete(\"access_token\");\n u.searchParams.delete(\"project_id\");\n // remove access_token from hash if present\n u.hash = \"\";\n // replace state without token\n window.history.replaceState({}, document.title, u.toString());\n } catch (e) {\n try {\n window.history.replaceState({}, document.title, window.location.pathname);\n } catch {\n void 0;\n }\n }\n\n return { success: true, token: finalToken, user };\n }\n\n if (error) {\n window.history.replaceState({}, document.title, window.location.pathname);\n return { success: false, error: decodeURIComponent(error) };\n }\n\n const savedAuth = this.getSavedAuthData();\n if (savedAuth && savedAuth.token) {\n return { success: true, ...savedAuth };\n }\n\n return { success: false };\n }\n\n /**\n * 验证 token 是否有效\n * @param token JWT token\n * @returns 包含有效状态和用户信息的 Promise\n */\n async verifyToken(token: string): Promise<{ valid: boolean; user?: any }> {\n try {\n const response = await fetch(`${this.API_BASE_URL}/api/auth/verify`, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success) {\n return { valid: true, user: data.user };\n }\n }\n\n return { valid: false };\n } catch (error) {\n // 验证失败\n return { valid: false };\n }\n }\n\n private getSavedAuthData(): { token?: string } | null {\n try {\n let token: string | null = null;\n try {\n const { getToken } = require(\"../auth\") as typeof import(\"../auth\");\n if (getToken) token = getToken();\n } catch {\n token = null;\n }\n if (!token) return null;\n return { token };\n } catch (e) {\n console.error(\"Failed to get auth data from localStorage:\", e);\n return null;\n }\n }\n\n /**\n * 保存认证数据到本地存储\n */\n private saveAuthData(token: string): void {\n try {\n try {\n const { setToken } = require(\"../auth\") as typeof import(\"../auth\");\n if (setToken) setToken(token);\n } catch {\n // if auth module not available, we intentionally do not persist to localStorage\n }\n\n // do not save user to localStorage; rely on auth utilities\n } catch (e) {\n console.error(\"Failed to save auth data to localStorage:\", e);\n }\n }\n\n /**\n * 退出登录\n * @param token JWT token\n */\n async logout(token: string): Promise<void> {\n try {\n await fetch(`${this.API_BASE_URL}/api/auth/logout`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n } catch (error) {\n // 忽略退出登录失败的错误\n }\n }\n}\n\n// 导出统一认证服务实例\nexport const unifiedAuth = new UnifiedAuthService();\n\n// 为了保持向后兼容,导出原有的服务名称\nexport const unifiedOAuth = unifiedAuth;\n\n// 导出函数\nexport function sendEmailVerificationCode(email: string, appName?: string) {\n return unifiedAuth.sendEmailVerificationCode(email, appName);\n}\n\nexport function loginWithEmailCode(email: string, code: string) {\n return unifiedAuth.loginWithEmailCode(email, code);\n}\n\nexport function getCodeStatus(email: string) {\n return unifiedAuth.getCodeStatus(email);\n}\n","/**\n * AI Workflow 服务(精简版,仅支持按 ID 的 path 风格执行)\n *\n * 说明:模板仅需要一种执行接口,形如 POST {baseUrl}/workflow/{workflowId}/execute\n */\n\nexport interface AIWorkflowResponse {\n success: boolean\n output?: Record<string, unknown>\n error?: string\n metadata?: Record<string, unknown>\n}\nexport interface AIWorkflowClientOptions {\n baseUrl?: string // e.g. https://evoagentx-server\n apiKey?: string\n headers?: Record<string, string>\n fetchImpl?: typeof fetch\n}\n\nclass AIWorkflowClient {\n private readonly baseUrl: string\n private readonly apiKey?: string\n private readonly headers: Record<string, string>\n private readonly fetchImpl: typeof fetch\n\n constructor(options: AIWorkflowClientOptions = {}) {\n this.baseUrl = options.baseUrl?.replace(/\\/+$/, '') || ''\n this.apiKey = options.apiKey\n this.headers = { 'Content-Type': 'application/json', ...(options.headers || {}) }\n this.fetchImpl = options.fetchImpl || fetch.bind(globalThis)\n }\n\n private buildHeaders(extra?: Record<string, string>) {\n const h: Record<string, string> = { ...this.headers, ...(extra || {}) }\n if (this.apiKey && !h['Authorization']) {\n h['Authorization'] = `Bearer ${this.apiKey}`\n }\n return h\n }\n\n private async safeJson(resp: Response): Promise<unknown | null> {\n try {\n return await resp.json()\n } catch (_e) {\n return null\n }\n }\n\n /**\n * 按 ID 执行工作流:POST {baseUrl}/workflow/{workflowId}/execute\n * body: { input, options }\n */\n public async executeWorkflow(\n workflowId: string,\n inputs: Record<string, unknown>,\n options?: Record<string, unknown>\n ): Promise<AIWorkflowResponse> {\n if (!this.baseUrl) {\n throw new Error('AI workflow client requires a baseUrl (e.g. https://evoagentx-server.fly.dev)')\n }\n\n const url = `${this.baseUrl}/workflow/${workflowId}/execute`\n\n try {\n const res = await this.fetchImpl(url, {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify({ inputs, options }),\n } as RequestInit)\n\n const data = await this.safeJson(res)\n if (!res.ok) {\n return { success: false, error: (data as any)?.error || `HTTP ${res.status}` }\n }\n\n return (data as AIWorkflowResponse) || { success: true }\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'Network error' }\n }\n }\n}\n\nexport function createAIWorkflowClient(options: AIWorkflowClientOptions = {}) {\n return new AIWorkflowClient(options)\n}\n\nexport const aiWorkflow = createAIWorkflowClient({ baseUrl: 'https://evoagentx-server' })\n","import axios from \"axios\";\nimport type { AxiosInstance, InternalAxiosRequestConfig } from \"axios\";\nimport type { RequestInterceptors, RequestConfig } from \"./types\";\n\nclass Request {\n instance: AxiosInstance;\n interceptors?: RequestInterceptors;\n abortControllers: Map<string, AbortController> = new Map();\n\n constructor(config: RequestConfig) {\n this.instance = axios.create({\n ...config,\n validateStatus: (status) => {\n return status >= 200 && status < 300;\n },\n });\n\n this.interceptors = config.interceptors;\n this.instance.interceptors.request.use(\n this.interceptors?.requestInterceptor,\n this.interceptors?.requestInterceptorCatch,\n );\n this.instance.interceptors.response.use(\n this.interceptors?.responseInterceptor,\n this.interceptors?.responseInterceptorCatch,\n );\n\n this.instance.interceptors.request.use(\n (config) => {\n return config;\n },\n (err) => {\n return Promise.reject(err);\n },\n );\n\n this.instance.interceptors.response.use(\n (res) => {\n return res.data;\n },\n (err) => {\n if (axios.isCancel(err)) {\n return Promise.reject({\n isCanceled: true,\n message: \"request canceled\",\n originalError: err,\n });\n }\n\n if (err.response?.data?.error) {\n return Promise.reject(err.response.data.error);\n }\n\n return Promise.reject(err);\n },\n );\n }\n\n cancelRequest(url: string) {\n this.abortControllers.forEach((controller, key) => {\n if (key.includes(url)) {\n controller.abort();\n this.abortControllers.delete(key);\n }\n });\n }\n\n cancelAllRequests() {\n this.abortControllers.forEach((controller) => {\n controller.abort();\n });\n this.abortControllers.clear();\n }\n\n request<T = any>(config: RequestConfig<T>): Promise<T> {\n const controller = new AbortController();\n const url = config.url || \"\";\n const method = config.method || \"GET\";\n const key = `${method}:${url}`;\n this.abortControllers.set(key, controller);\n\n config.signal = controller.signal;\n return new Promise((resolve, reject) => {\n if (config.interceptors?.requestInterceptor) {\n config = config.interceptors.requestInterceptor(config as InternalAxiosRequestConfig);\n }\n this.instance\n .request<any, T>(config)\n .then((res) => {\n this.abortControllers.delete(key);\n if (config.interceptors?.responseInterceptor) {\n res = config.interceptors.responseInterceptor(res);\n }\n resolve(res);\n })\n .catch((err) => {\n this.abortControllers.delete(key);\n // Error already handled by interceptors\n reject(err);\n });\n });\n }\n\n get<T = any>(config: RequestConfig<T>): Promise<T> {\n return this.request<T>({ ...config, method: \"GET\" });\n }\n\n post<T = any>(config: RequestConfig<T>): Promise<T> {\n return this.request<T>({ ...config, method: \"POST\" });\n }\n\n delete<T = any>(config: RequestConfig<T>): Promise<T> {\n return this.request<T>({ ...config, method: \"DELETE\" });\n }\n\n put<T = any>(config: RequestConfig<T>): Promise<T> {\n return this.request<T>({ ...config, method: \"PUT\" });\n }\n\n patch<T = any>(config: RequestConfig<T>): Promise<T> {\n return this.request<T>({ ...config, method: \"PATCH\" });\n }\n}\n\nexport default Request;\n","import Request from './request'\nimport type { RequestConfig } from './request/types'\nimport type { AIWorkflowResponse } from './ai-workflow'\n\nexport interface AxiosAIWorkflowOptions {\n baseUrl?: string\n basePath?: string\n apiKey?: string\n timeout?: number\n headers?: Record<string, string>\n requestInstance?: Request\n /** 'body' (default) or 'path' for /workflow/{id}/execute */\n workflowEndpointStyle?: 'body' | 'path'\n}\n\n/**\n * Create an AI workflow client backed by the project's Request (axios) wrapper.\n * If `requestInstance` is provided it will be used directly; otherwise a new Request will be created.\n */\nexport function createAIWorkflowClientAxios(options: AxiosAIWorkflowOptions = {}) {\n const basePath = options.basePath ?? '/api'\n const baseUrl = (options.baseUrl || 'https://evoagentx-server.fly.dev').replace(/\\/+$/, '')\n const baseAPI = `${baseUrl}${basePath.startsWith('/') ? '' : '/'}${basePath}`.replace(/\\/+$/, '')\n\n const client: Request =\n options.requestInstance ||\n new Request({\n baseURL: baseAPI,\n timeout: options.timeout ?? 60000,\n interceptors: {\n requestInterceptor: (config: any) => {\n config.headers = config.headers || {}\n if (options.apiKey && !config.headers['Authorization']) {\n config.headers['Authorization'] = `Bearer ${options.apiKey}`\n }\n if (options.headers) {\n config.headers = { ...(config.headers || {}), ...options.headers }\n }\n return config\n },\n requestInterceptorCatch: (err: any) => Promise.reject(err),\n responseInterceptor: (res: any) => res,\n responseInterceptorCatch: (err: any) => Promise.reject(err),\n },\n })\n\n return {\n async executeWorkflow(\n workflowId: string,\n inputs: Record<string, unknown>,\n opts?: Record<string, unknown>\n ): Promise<AIWorkflowResponse> {\n // Directly post to {baseUrl}/workflow/{id}/execute (raw baseUrl used)\n const url = `${baseUrl}/workflow/${workflowId}/execute`\n\n const data = await client.post({ url, data: { inputs, options: opts } } as RequestConfig)\n return data as unknown as AIWorkflowResponse\n },\n }\n}\n","export type Visibility = 'private' | 'project' | 'public' | 'shared'\n\nexport interface Artifact {\n id: string\n ownerId?: string | null\n projectId?: string | null\n visibility: Visibility\n storageUrl: string\n thumbnailUrl?: string\n input?: any\n output?: any\n model?: string\n metadata?: Record<string, any>\n createdAt?: string\n likes?: number\n stats?: { views?: number }\n sharedWith?: string[]\n}\n\nexport interface ArtifactCreateInput {\n storageUrl: string\n thumbnailUrl?: string\n visibility?: Visibility\n metadata?: Record<string, any>\n model?: string\n ownerId?: string\n projectId?: string\n}\n\nexport interface ArtifactListQuery {\n ownerId?: string\n projectId?: string\n visibility?: Visibility\n limit?: number\n cursor?: string\n}\n\nexport interface AccessContext {\n userId?: string | null\n projectId?: string | null\n tokenScopes?: string[]\n}\n\n/**\n * Basic client-side permission check for an artifact.\n * Note: final authorization must be enforced on the server. This is a convenience helper.\n */\nexport function canAccessArtifact(a: Artifact, ctx: AccessContext = {}): boolean {\n if (!a) return false\n if (a.visibility === 'public') return true\n if (a.visibility === 'project') {\n if (ctx.projectId && a.projectId && ctx.projectId === a.projectId) return true\n if (ctx.tokenScopes && ctx.tokenScopes.includes('project:read')) return true\n return false\n }\n if (a.visibility === 'private') {\n if (ctx.userId && a.ownerId && ctx.userId === a.ownerId) return true\n if (ctx.tokenScopes && (ctx.tokenScopes.includes('artifact:read:all') || ctx.tokenScopes.includes('admin'))) return true\n return false\n }\n if (a.visibility === 'shared') {\n if (ctx.userId && a.sharedWith && a.sharedWith.includes(ctx.userId)) return true\n if (ctx.tokenScopes && (ctx.tokenScopes.includes('artifact:read:all') || ctx.tokenScopes.includes('admin'))) return true\n return false\n }\n return false\n}\n","import Request from './request'\nimport type { Artifact, ArtifactCreateInput, ArtifactListQuery, AccessContext } from './artifact-types'\n\nexport function createArtifactsClient(req: Request) {\n return {\n async create(input: ArtifactCreateInput): Promise<Artifact> {\n return await req.post({ url: '/artifacts', data: input })\n },\n async list(query?: ArtifactListQuery): Promise<Artifact[]> {\n return await req.get({ url: '/artifacts', params: query })\n },\n async get(id: string): Promise<Artifact> {\n return await req.get({ url: `/artifacts/${encodeURIComponent(id)}` })\n },\n async setVisibility(id: string, visibility: string): Promise<void> {\n await req.patch({ url: `/artifacts/${encodeURIComponent(id)}/visibility`, data: { visibility } })\n },\n async delete(id: string): Promise<void> {\n await req.delete({ url: `/artifacts/${encodeURIComponent(id)}` })\n },\n // convenience local check (server is authoritative)\n canAccessLocal(a: Artifact, ctx: AccessContext) {\n // lightweight check mirrored from artifact-types\n if (!a) return false\n if (a.visibility === 'public') return true\n if (a.visibility === 'project') return Boolean(ctx.projectId && a.projectId && ctx.projectId === a.projectId)\n if (a.visibility === 'private') return Boolean(ctx.userId && a.ownerId && ctx.userId === a.ownerId)\n if (a.visibility === 'shared') return Boolean(ctx.userId && a.sharedWith && a.sharedWith.includes(ctx.userId))\n return false\n },\n }\n}\n","export * from \"./unified-oauth\";\nexport * from \"./ai-workflow\";\nexport * from \"./request/index\";\nexport * from \"./ai-workflow-axios\";\nexport { createAIWorkflowClientAxios } from \"./ai-workflow-axios\";\nexport * from \"./artifact-types\";\nexport { createArtifactsClient } from \"./artifacts-client\";\nexport * from \"../auth\";\nexport * from \"../config\";\nimport { getAuthRoot, setDefaultProjectId } from \"../config\";\nimport { getToken as getTokenFrom, parseUserFromToken } from \"../auth\";\n\nimport Request from \"./request\";\nimport { createArtifactsClient } from \"./artifacts-client\";\nimport type { Artifact, ArtifactCreateInput, ArtifactListQuery } from \"./artifact-types\";\nimport type { InternalAxiosRequestConfig, AxiosResponse, AxiosError } from \"axios\";\nimport { removeSensitiveParamsFromUrl, setupClearUrlTokenListener } from \"../utils/urlSanitizer\";\nimport { RequestConfig } from \"./request/types\";\n\n// Helper function to get available token from multiple sources\nfunction getGlobalAvailableToken(): string | null {\n try {\n return getTokenFrom() || null;\n } catch {\n return null;\n }\n}\n\nexport const request = new Request({\n baseURL: \"https://create-x-backend-dev.fly.dev/api\",\n timeout: 60000,\n interceptors: {\n requestInterceptor: (config: InternalAxiosRequestConfig) => {\n config.headers = config.headers || {};\n\n // Dynamically ensure Authorization header exists\n if (!config.headers[\"Authorization\"]) {\n const availableToken = getGlobalAvailableToken();\n if (availableToken) {\n config.headers[\"Authorization\"] = `Bearer ${availableToken}`;\n }\n }\n\n return config;\n },\n requestInterceptorCatch: (err: AxiosError) => {\n return Promise.reject(err);\n },\n responseInterceptor: (res: AxiosResponse) => {\n return res;\n },\n responseInterceptorCatch: (err: AxiosError) => {\n return Promise.reject(err);\n },\n },\n});\n\n// 独立的 AI workflow 请求客户端,指向 evoagentx-server(只用于 workflow 调用)\nexport const aiRequest = new Request({\n baseURL: \"https://evoagentx-server.fly.dev\",\n timeout: 600000,\n interceptors: {\n requestInterceptor: (config: InternalAxiosRequestConfig) => {\n config.headers = config.headers || {};\n\n // Dynamically ensure Authorization header exists\n if (!config.headers[\"Authorization\"]) {\n const availableToken = getGlobalAvailableToken();\n if (availableToken) {\n config.headers[\"Authorization\"] = `Bearer ${availableToken}`;\n }\n }\n\n return config;\n },\n requestInterceptorCatch: (err: AxiosError) => {\n return Promise.reject(err);\n },\n responseInterceptor: (res: AxiosResponse) => {\n return res;\n },\n responseInterceptorCatch: (err: AxiosError) => {\n return Promise.reject(err);\n },\n },\n});\n\n// Official alias for AI workflow request instance. Consumers can use\n// `workflowRequest` when referring to the AI/workflow backend.\nexport const workflowRequest = aiRequest;\n\n// Helper: wrap a Request instance so that outgoing requests with URLs\n// starting with `/data` are automatically prefixed with\n// `/entities/apps/${projectId}`. This keeps the original Request\n// instance unchanged and provides client-level URL normalization.\nfunction wrapRequestWithProjectPrefix(biz: Request, projectId?: string) {\n if (!projectId) return biz;\n const prefix = `/entities/apps/${String(projectId)}`;\n\n function shouldPrefix(url?: string) {\n if (!url) return false;\n const u = String(url);\n if (u.startsWith(prefix)) return false;\n if (/^https?:\\/\\//.test(u) || u.startsWith(\"//\")) return false;\n // Only prefix relative paths that start with /data\n if (u.startsWith(\"/data\")) return true;\n return false;\n }\n\n const wrapped = {\n instance: biz.instance,\n request: (config: RequestConfig) => {\n try {\n if (config && typeof config.url === \"string\" && shouldPrefix(config.url)) {\n config = { ...config, url: `${prefix}${config.url}` };\n }\n } catch (_e) {\n // ignore\n }\n return biz.request(config);\n },\n get: (config: RequestConfig) => wrapped.request({ ...config, method: \"GET\" }),\n post: (config: RequestConfig) => wrapped.request({ ...config, method: \"POST\" }),\n put: (config: RequestConfig) => wrapped.request({ ...config, method: \"PUT\" }),\n patch: (config: RequestConfig) => wrapped.request({ ...config, method: \"PATCH\" }),\n delete: (config: RequestConfig) => wrapped.request({ ...config, method: \"DELETE\" }),\n cancelRequest: (url: string) => biz.cancelRequest(url),\n cancelAllRequests: () => biz.cancelAllRequests(),\n };\n\n return wrapped;\n}\n\n/**\n * 简单工厂:返回一个对外友好的 client,封装业务 request 与 AI workflow request。\n * 默认使用上面导出的 `request` 和 `aiRequest`,也可以通过 options 覆盖。\n */\n\n/**\n * Higher-level factory: createClient\n * - minimal surface compatible with `createClient({ projectId, authRequired })`\n * - returns executeWorkflow, request, aiRequest and a tiny auth helper (set/get token)\n */\nexport function createClient(opts?: {\n projectId?: string;\n authRequired?: boolean;\n baseUrl?: string;\n aiBaseUrl?: string;\n mode?: \"auto\" | \"standalone\" | \"embedded\";\n auth?: {\n mode?: \"none\" | \"managed\" | \"headless\";\n getToken?: () => Promise<string | null>;\n tokenInjection?: {\n allowedOrigins?: string[];\n waitMs?: number;\n clearUrlParamsAfterInjectionMs?: number;\n clearAllUrlParams?: boolean;\n sensitiveParams?: string[];\n };\n };\n requestInstance?: Request;\n aiRequestInstance?: Request;\n}) {\n // Helper: create a Request instance from a base URL if needed\n function makeRequestFromBase(base?: string) {\n if (!base) return undefined;\n return new Request({\n baseURL: base,\n timeout: 60000,\n interceptors: {\n requestInterceptor: (config: InternalAxiosRequestConfig) => {\n config.headers = config.headers || {};\n\n // Dynamically ensure Authorization header exists\n if (!config.headers[\"Authorization\"]) {\n const availableToken = getAvailableToken();\n if (availableToken) {\n config.headers[\"Authorization\"] = `Bearer ${availableToken}`;\n }\n }\n\n return config;\n },\n requestInterceptorCatch: (err: AxiosError) => Promise.reject(err),\n responseInterceptor: (res: AxiosResponse) => res,\n responseInterceptorCatch: (err: AxiosError) => Promise.reject(err),\n },\n });\n }\n\n const biz = opts?.requestInstance || makeRequestFromBase(opts?.baseUrl) || request;\n const ai = opts?.aiRequestInstance || makeRequestFromBase(opts?.aiBaseUrl) || aiRequest;\n\n const bizWrapped = wrapRequestWithProjectPrefix(biz, opts?.projectId);\n\n let token: string | null = null;\n\n // Helper: get available token from multiple sources with priority\n function getAvailableToken(): string | null {\n // Priority: memory token > localStorage token\n return token || getGlobalAvailableToken();\n }\n\n try {\n if (opts?.projectId) {\n setDefaultProjectId(String(opts.projectId));\n }\n } catch {\n // ignore\n }\n\n // Synchronously initialize token from localStorage if available\n try {\n const existingToken = getTokenFrom();\n if (existingToken) {\n token = existingToken;\n applyToken(token);\n }\n } catch {\n // ignore localStorage errors\n }\n\n function applyToken(t: string | null) {\n try {\n // set Authorization header for both axios instances when available\n try {\n if (biz && (biz as any).instance) {\n if (t) (biz as any).instance.defaults.headers.common[\"Authorization\"] = `Bearer ${t}`;\n else delete (biz as any).instance.defaults.headers.common[\"Authorization\"];\n }\n if (ai && (ai as any).instance) {\n if (t) (ai as any).instance.defaults.headers.common[\"Authorization\"] = `Bearer ${t}`;\n else delete (ai as any).instance.defaults.headers.common[\"Authorization\"];\n }\n } catch (_e) {\n // ignore if instances are not axios-backed\n }\n } catch (_e) {\n // ignore if instances are not axios-backed\n }\n }\n\n // determine runtime mode\n const runtimeMode = (() => {\n if (opts?.mode) return opts.mode;\n try {\n if (typeof window !== \"undefined\")\n return window.self !== window.top ? \"embedded\" : \"standalone\";\n } catch (_e) {\n return \"standalone\";\n }\n return \"standalone\";\n })();\n\n async function initToken() {\n // priority: explicit getToken -> postMessage injection (embedded) -> none\n if (opts?.auth?.getToken) {\n try {\n const t = await opts.auth.getToken();\n if (t) {\n token = t;\n applyToken(token);\n return;\n }\n } catch (_e) {\n // ignore\n }\n }\n\n if (runtimeMode === \"embedded\" && opts?.auth?.tokenInjection) {\n const allowed = opts.auth.tokenInjection.allowedOrigins || [];\n const waitMs = opts.auth.tokenInjection.waitMs ?? 3000;\n\n // listen for a single token message\n const tokenFromPostMessage = await new Promise<string | null>((resolve) => {\n let resolved = false;\n function handler(ev: MessageEvent) {\n try {\n if (!ev.data || typeof ev.data !== \"object\") return;\n if (ev.data.type !== \"howone:token\") return;\n // origin check\n if (allowed.length > 0 && !allowed.includes(ev.origin)) return;\n const t = ev.data.token;\n if (t && !resolved) {\n resolved = true;\n window.removeEventListener(\"message\", handler);\n resolve(String(t));\n }\n } catch (_e) {\n // ignore\n }\n }\n\n window.addEventListener(\"message\", handler);\n\n // timeout\n setTimeout(() => {\n if (!resolved) {\n resolved = true;\n window.removeEventListener(\"message\", handler);\n resolve(null);\n }\n }, waitMs);\n });\n\n if (tokenFromPostMessage) {\n token = tokenFromPostMessage;\n applyToken(token);\n // Schedule URL cleanup if configured\n try {\n const cfg = opts?.auth?.tokenInjection;\n if (cfg && typeof window !== \"undefined\") {\n const delay = cfg.clearUrlParamsAfterInjectionMs ?? 50;\n setTimeout(() => {\n removeSensitiveParamsFromUrl({\n clearAll: cfg.clearAllUrlParams,\n sensitiveParams: cfg.sensitiveParams,\n });\n }, delay);\n }\n } catch {\n /* ignore */\n }\n return;\n }\n }\n }\n\n // initialize token (fire and forget)\n try {\n // only run in browser\n if (typeof window !== \"undefined\") {\n void initToken();\n // If embedded & tokenInjection configured, setup CLEAR_URL_TOKEN listener once\n if (runtimeMode === \"embedded\" && opts?.auth?.tokenInjection) {\n setupClearUrlTokenListener({\n allowedOrigins: opts.auth.tokenInjection.allowedOrigins,\n clearAll: opts.auth.tokenInjection.clearAllUrlParams,\n sensitiveParams: opts.auth.tokenInjection.sensitiveParams,\n autoRunMs: undefined,\n });\n }\n }\n } catch (_e) {\n // noop\n }\n\n return {\n // expose projectId so consumers can read it from the client instance\n projectId: opts?.projectId ?? null,\n request: bizWrapped,\n aiRequest: ai,\n workflowRequest: ai,\n // artifact helpers using artifacts-client\n artifacts: createArtifactsClient(biz) as {\n create(input: ArtifactCreateInput): Promise<Artifact>;\n list(query?: ArtifactListQuery): Promise<Artifact[]>;\n get(id: string): Promise<Artifact>;\n setVisibility(id: string, visibility: string): Promise<void>;\n delete(id: string): Promise<void>;\n },\n me: async () => {\n try {\n const t =\n token ?? (opts?.auth?.getToken ? await opts.auth.getToken() : null) ?? getTokenFrom();\n if (!t) return null;\n return parseUserFromToken(t);\n } catch (_e2) {\n return null;\n }\n },\n // auth helpers\n auth: {\n setToken: (t: string | null) => {\n token = t;\n applyToken(t);\n },\n getToken: () => token,\n isAuthenticated: () => Boolean(token),\n // minimal login/logout stubs - consumers can override behavior\n login: (redirect?: string) => {\n // Redirect to external auth server with current URL and project id\n if (typeof window === \"undefined\") return;\n const loc = redirect || window.location.href;\n try {\n const root = getAuthRoot() || \"https://create-x-backend-dev.fly.dev\";\n const authUrl = new URL(\"/auth\", String(root));\n authUrl.searchParams.set(\"redirect_uri\", String(loc));\n if (opts?.projectId) authUrl.searchParams.set(\"project_id\", String(opts.projectId));\n window.location.href = authUrl.toString();\n } catch {\n // fallback to simple href\n const encoded = encodeURIComponent(String(loc));\n const pid = opts?.projectId\n ? `&project_id=${encodeURIComponent(String(opts.projectId))}`\n : \"\";\n const root = \"https://create-x-backend-dev.fly.dev\";\n window.location.href = `${root}/auth?redirect_uri=${encoded}${pid}`;\n }\n },\n logout: () => {\n token = null;\n applyToken(null);\n },\n },\n sanitizeUrl: (o?: { clearAll?: boolean; sensitiveParams?: string[] }) => {\n if (typeof window === \"undefined\") return;\n removeSensitiveParamsFromUrl({\n clearAll: o?.clearAll,\n sensitiveParams: o?.sensitiveParams,\n });\n },\n };\n}\n","/**\n * URL Sanitizer: remove sensitive query/hash parameters from current location\n * without reloading the page. Designed for embedded iframe scenarios where\n * parent injects an auth token, then child scrubs it from the address bar.\n */\n\nexport interface SanitizeOptions {\n /** Remove all query params (keep path + hash) */\n clearAll?: boolean\n /** Parameter names (case-insensitive) to remove. Ignored when clearAll=true */\n sensitiveParams?: string[]\n /** Also scan hash if it looks like query (key=value&...) */\n includeHash?: boolean\n /** Optional callback when URL actually changed */\n onChanged?: (newUrl: string) => void\n}\n\nconst DEFAULT_SENSITIVE = ['token', 'access_token', 'auth', 'auth_token']\n\nexport function removeSensitiveParamsFromUrl(opts?: SanitizeOptions) {\n if (typeof window === 'undefined') return\n try {\n const { clearAll, sensitiveParams, includeHash = true, onChanged } = opts || {}\n const sens = (sensitiveParams && sensitiveParams.length > 0 ? sensitiveParams : DEFAULT_SENSITIVE).map(s => s.toLowerCase())\n const before = window.location.href\n const url = new URL(before)\n\n if (clearAll) {\n url.search = ''\n } else if (url.search) {\n let changed = false\n for (const [k] of url.searchParams) {\n if (sens.includes(k.toLowerCase())) {\n url.searchParams.delete(k)\n changed = true\n }\n }\n if (changed) {\n const qs = url.searchParams.toString()\n url.search = qs ? `?${qs}` : ''\n }\n }\n\n if (includeHash && url.hash) {\n const raw = url.hash.slice(1)\n if (raw.includes('=')) {\n const hp = new URLSearchParams(raw)\n let changed = false\n for (const [k] of hp) {\n if (clearAll || sens.includes(k.toLowerCase())) {\n hp.delete(k)\n changed = true\n }\n }\n if (changed) {\n const hs = hp.toString()\n url.hash = hs ? `#${hs}` : ''\n }\n } else {\n if (!clearAll && sens.some(p => raw.toLowerCase().startsWith(p))) {\n url.hash = ''\n } else if (clearAll) {\n url.hash = ''\n }\n }\n }\n\n const next = url.pathname + url.search + url.hash\n if (next !== window.location.pathname + window.location.search + window.location.hash) {\n window.history.replaceState(window.history.state, document.title, next)\n onChanged && onChanged(next)\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('[howone][urlSanitizer] failed', e)\n }\n}\n\n// One-shot registration guard symbol (on window) to avoid multiple listeners\ndeclare global {\n interface Window { __howone_url_sanitize_registered?: boolean }\n}\n\nexport interface SetupClearUrlListenerOptions {\n /** Allowed parent origins; empty => accept all (NOT recommended) */\n allowedOrigins?: string[]\n /** Remove all params instead of just sensitive ones */\n clearAll?: boolean\n /** Whether to auto run once on setup (after a small delay) */\n autoRunMs?: number\n /** Custom sensitive param names */\n sensitiveParams?: string[]\n}\n\nexport function setupClearUrlTokenListener(opts?: SetupClearUrlListenerOptions) {\n if (typeof window === 'undefined') return\n if (window.__howone_url_sanitize_registered) return\n window.__howone_url_sanitize_registered = true\n\n const allowed = opts?.allowedOrigins || []\n function handler(ev: MessageEvent) {\n try {\n if (!ev.data || typeof ev.data !== 'object') return\n if (ev.data.type !== 'CLEAR_URL_TOKEN') return\n if (allowed.length > 0 && !allowed.includes(ev.origin)) return\n removeSensitiveParamsFromUrl({\n clearAll: opts?.clearAll || !!ev.data.clearAll,\n sensitiveParams: opts?.sensitiveParams,\n })\n // optional ack\n try { (ev.source as Window | null | undefined)?.postMessage({ type: 'CLEAR_URL_TOKEN_ACK' }, ev.origin as any) } catch { /* ignore */ }\n } catch { /* ignore */ }\n }\n window.addEventListener('message', handler)\n\n if (typeof opts?.autoRunMs === 'number') {\n setTimeout(() => removeSensitiveParamsFromUrl({ clearAll: opts.clearAll, sensitiveParams: opts.sensitiveParams }), opts.autoRunMs)\n }\n}\n\nexport default {\n removeSensitiveParamsFromUrl,\n setupClearUrlTokenListener,\n}\n","import React, { useState, useEffect } from 'react'\nimport { Icon } from \"@iconify/react\"\nimport { Loader2 } from \"lucide-react\"\n\ninterface LoginFormProps {\n onLoginSuccess?: () => void\n appName?: string\n className?: string\n}\n\ninterface ApiErrorResponse {\n code: number;\n data?: {\n success: boolean;\n message?: string;\n code?: number;\n };\n msg?: string;\n traceId?: number;\n timestamp?: string;\n}\n\nexport const LoginForm: React.FC<LoginFormProps> = ({\n onLoginSuccess,\n appName = 'AI Application Platform',\n className = ''\n}) => {\n const [email, setEmail] = useState('')\n const [code, setCode] = useState('')\n const [validationErrors, setValidationErrors] = useState<Record<string, string>>({})\n const [isAnyLoading, setIsAnyLoading] = useState(false)\n const [codeSent, setCodeSent] = useState(false)\n const [loginError, setLoginError] = useState<string | null>(null)\n\n // 这里需要从外部注入认证服务,暂时使用占位符\n const googleLogin = async () => {\n // TODO: 实现Google登录\n console.log('Google login clicked')\n }\n\n const githubLogin = async () => {\n // TODO: 实现GitHub登录\n console.log('GitHub login clicked')\n }\n\n const sendEmailCode = async (email: string) => {\n // TODO: 实现发送验证码\n console.log('Send code to:', email, 'for app:', appName)\n setCodeSent(true)\n }\n\n const loginWithEmail = async (email: string, code: string) => {\n // TODO: 实现邮箱登录\n console.log('Login with email:', email, 'code:', code)\n if (onLoginSuccess) onLoginSuccess()\n }\n\n const clearError = () => {\n setLoginError(null)\n setValidationErrors({})\n }\n\n useEffect(() => {\n if (loginError) {\n try {\n const errorObj = JSON.parse(loginError) as ApiErrorResponse;\n const newErrors: Record<string, string> = {};\n if (errorObj.code === 429) {\n newErrors.form = errorObj.msg || '请求过于频繁,请稍后再试';\n } else if (errorObj.data?.code === 401 && errorObj.data?.message) {\n if (codeSent) {\n newErrors.code = errorObj.data.message;\n } else {\n newErrors.form = errorObj.data.message;\n }\n } else if (errorObj.msg) {\n newErrors.form = errorObj.msg;\n } else if (errorObj.data?.message) {\n newErrors.form = errorObj.data.message;\n } else {\n newErrors.form = '发生未知错误,请稍后重试';\n }\n setValidationErrors(newErrors);\n } catch (e) {\n setValidationErrors({ form: loginError });\n }\n const timer = setTimeout(() => {\n clearError()\n }, 8000)\n return () => clearTimeout(timer)\n }\n }, [loginError, codeSent])\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n setValidationErrors({});\n if (!codeSent) {\n const emailValue = formData.get('email') as string\n if (!emailValue) {\n setValidationErrors({ email: 'Please enter your email address' })\n return\n }\n setIsAnyLoading(true)\n try {\n await sendEmailCode(emailValue)\n setEmail(emailValue)\n } catch (error) {\n setLoginError(error instanceof Error ? error.message : 'Failed to send code')\n } finally {\n setIsAnyLoading(false)\n }\n } else {\n const codeValue = code\n if (!codeValue || codeValue.length !== 6) {\n setValidationErrors({ code: 'Please enter the 6-digit verification code' })\n return\n }\n setIsAnyLoading(true)\n try {\n await loginWithEmail(email, codeValue)\n } catch (error) {\n setLoginError(error instanceof Error ? error.message : 'Login failed')\n } finally {\n setIsAnyLoading(false)\n }\n }\n }\n\n return (\n <div className={`w-full space-y-6 ${className}`}>\n <div className=\"space-y-1\">\n <h1 className=\"text-3xl font-bold text-gray-900\">Welcome Back!</h1>\n <p className=\"text-sm text-gray-600\">Please enter log in details below</p>\n </div>\n\n <form className=\"space-y-5\" onSubmit={handleSubmit}>\n <div className=\"space-y-2\">\n <label htmlFor=\"email\" className=\"text-gray-700 font-medium text-sm block\">Email</label>\n <input\n id=\"email\"\n type=\"email\"\n name=\"email\"\n value={email}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setEmail(value)\n if (validationErrors.email) {\n const newErrors = { ...validationErrors }\n delete newErrors.email\n setValidationErrors(newErrors)\n }\n }}\n required\n aria-invalid={!!validationErrors.email}\n className=\"w-full text-sm bg-gray-50 rounded-md h-11 px-3 hover:bg-gray-100 focus:bg-white border border-gray-200 focus:border-gray-400 focus:outline-none\"\n placeholder=\"\"\n />\n {validationErrors.email && (\n <p className=\"text-red-600 text-sm\">{validationErrors.email}</p>\n )}\n </div>\n\n {codeSent && (\n <div className=\"space-y-2\">\n <label className=\"text-gray-700 font-medium text-sm block\">Verification Code</label>\n <input\n type=\"text\"\n maxLength={6}\n value={code}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value.replace(/\\D/g, '') // 只允许数字\n setCode(value)\n if (validationErrors.code) {\n const newErrors = { ...validationErrors }\n delete newErrors.code\n setValidationErrors(newErrors)\n }\n }}\n aria-invalid={!!validationErrors.code}\n className=\"w-full text-center text-sm bg-gray-50 rounded-md h-11 px-3 hover:bg-gray-100 focus:bg-white border border-gray-200 focus:border-gray-400 focus:outline-none tracking-widest\"\n placeholder=\"000000\"\n />\n {validationErrors.code && (\n <p className=\"text-red-600 text-sm\">{validationErrors.code}</p>\n )}\n </div>\n )}\n\n {validationErrors.form && (\n <div className=\"text-red-600 text-sm p-3 bg-red-50 rounded-md border border-red-200\">\n <div className=\"flex items-center\">\n <Icon icon=\"material-symbols:error\" className=\"text-red-600 mr-2\" />\n <span>{validationErrors.form}</span>\n </div>\n </div>\n )}\n\n <button\n type=\"submit\"\n className=\"w-full h-11 bg-black hover:bg-gray-800 text-white font-medium rounded-md text-sm disabled:opacity-70 flex items-center justify-center\"\n disabled={isAnyLoading || !email || (codeSent && code.length !== 6)}\n aria-busy={isAnyLoading}\n >\n {isAnyLoading && (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n )}\n {codeSent ? (isAnyLoading ? 'Signing in...' : 'Sign in') : (isAnyLoading ? 'Sending...' : 'Send Code')}\n </button>\n </form>\n\n <div className=\"space-y-3\">\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-gray-200\"></div>\n </div>\n <div className=\"relative flex justify-center text-xs\">\n <span className=\"px-4 text-gray-500\">or continue</span>\n </div>\n </div>\n\n <button\n className=\"w-full h-11 bg-white hover:bg-gray-50 text-gray-900 hover:text-gray-900 border border-gray-200 hover:border-gray-300 font-medium rounded-md text-sm disabled:opacity-70 flex items-center justify-center\"\n onClick={() => { if (!isAnyLoading) { clearError(); googleLogin() } }}\n disabled={isAnyLoading}\n >\n {isAnyLoading ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Icon icon=\"flat-color-icons:google\" className=\"w-6 h-6 mr-2\" />\n )}\n {isAnyLoading ? 'Connecting...' : 'Log in with Google'}\n </button>\n\n <button\n className=\"w-full h-11 bg-black hover:bg-gray-800 text-white font-medium rounded-md text-sm disabled:opacity-70 flex items-center justify-center\"\n onClick={() => { if (!isAnyLoading) { clearError(); githubLogin() } }}\n disabled={isAnyLoading}\n >\n {isAnyLoading ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:github\" className=\"w-6 h-6 mr-2\" />\n )}\n {isAnyLoading ? 'Connecting...' : 'Log in with GitHub'}\n </button>\n </div>\n </div>\n )\n}\n","import React, { createContext, useContext, useState, useEffect } from 'react'\nimport { getToken, parseUserFromToken, setToken } from '../../auth'\nimport { FloatingButton } from '../FloatingButton'\nimport { ThemeProvider } from '../theme/ThemeProvider'\nimport { GlobalToastContainer } from '../ui/Toast/GlobalToastContainer'\n\ntype Theme = \"dark\" | \"light\" | \"system\"\n\ntype HowoneContextValue = {\n user: ReturnType<typeof parseUserFromToken> | null\n token: string | null\n isAuthenticated: boolean\n logout: () => void\n}\n\nconst HowoneContext = createContext<HowoneContextValue | null>(null)\n\nexport interface HowoneProviderProps {\n children: React.ReactNode\n autoRedirect?: boolean\n showFloatingButton?: boolean\n projectId?: string\n defaultTheme?: Theme\n themeStorageKey?: string\n forceDefaultTheme?: boolean\n}\n\n/**\n * HowoneProvider - All-in-one application provider\n * \n * Includes:\n * - Authentication management\n * - Theme management (dark/light/system)\n * - Toast notifications\n * - Floating button\n * \n * @example\n * ```tsx\n * <HowoneProvider \n * defaultTheme=\"dark\" \n * themeStorageKey=\"my-app-theme\"\n * showFloatingButton={true}\n * >\n * <App />\n * </HowoneProvider>\n * ```\n */\nexport const HowoneProvider: React.FC<HowoneProviderProps> = ({\n children,\n showFloatingButton = true,\n defaultTheme = \"system\",\n themeStorageKey = \"howone-theme\",\n forceDefaultTheme = false,\n}) => {\n const [user, setUser] = useState(() => parseUserFromToken(getToken()))\n const [token, setTokenState] = useState<string | null>(() => getToken())\n\n // Auto-capture token from URL on mount\n useEffect(() => {\n try {\n const params = new URLSearchParams(window.location.search)\n const urlToken = params.get('access_token') || params.get('token')\n\n if (urlToken) {\n // Store the token\n setToken(urlToken)\n setTokenState(urlToken)\n setUser(parseUserFromToken(urlToken))\n\n // Clean up URL (remove token from address bar for security)\n params.delete('access_token')\n params.delete('token')\n const newSearch = params.toString()\n const newUrl = window.location.pathname + (newSearch ? '?' + newSearch : '') + window.location.hash\n window.history.replaceState({}, '', newUrl)\n }\n } catch (e) {\n console.error('[HowoneProvider] Failed to capture token from URL:', e)\n }\n }, [])\n\n const logout = () => {\n try {\n setToken(null)\n } catch { /* ignore */ }\n setTokenState(null)\n setUser(null)\n }\n\n const value: HowoneContextValue = {\n user,\n token,\n isAuthenticated: !!token,\n logout\n }\n\n return (\n <ThemeProvider\n defaultTheme={defaultTheme}\n storageKey={themeStorageKey}\n forceDefault={forceDefaultTheme}\n >\n <HowoneContext.Provider value={value}>\n {children}\n {showFloatingButton && (\n <FloatingButton onClick={() => window.open('https://howone.ai', '_blank')} />\n )}\n </HowoneContext.Provider>\n <GlobalToastContainer />\n </ThemeProvider>\n )\n}\n\nexport function useHowoneContext() {\n const ctx = useContext(HowoneContext)\n if (!ctx) {\n // fallback to parsing token directly when provider not used\n const t = getToken()\n return {\n user: parseUserFromToken(t),\n token: t,\n isAuthenticated: !!t,\n logout: () => { try { setToken(null) } catch { void 0 } }\n }\n }\n return ctx\n}\n\nexport default HowoneProvider\n","import { createContext, useContext, useEffect, useState } from \"react\"\n\ntype Theme = \"dark\" | \"light\" | \"system\"\n\ntype ThemeProviderProps = {\n children: React.ReactNode\n defaultTheme?: Theme\n storageKey?: string\n forceDefault?: boolean\n}\n\ntype ThemeProviderState = {\n theme: Theme\n setTheme: (theme: Theme) => void\n}\n\nconst initialState: ThemeProviderState = {\n theme: \"system\",\n setTheme: () => null,\n}\n\nconst ThemeProviderContext = createContext<ThemeProviderState>(initialState)\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"system\",\n storageKey = \"vite-ui-theme\",\n forceDefault = false,\n ...props\n}: ThemeProviderProps) {\n const [theme, setTheme] = useState<Theme>(() => {\n if (forceDefault) {\n localStorage.setItem(storageKey, defaultTheme)\n return defaultTheme\n }\n\n const stored = localStorage.getItem(storageKey) as Theme | null\n\n const initialTheme = stored || defaultTheme\n\n if (!stored) {\n localStorage.setItem(storageKey, defaultTheme)\n }\n\n return initialTheme\n })\n\n useEffect(() => {\n const root = window.document.documentElement\n\n root.classList.remove(\"light\", \"dark\")\n\n if (theme === \"system\") {\n const systemTheme = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\"\n\n root.classList.add(systemTheme)\n return\n }\n\n root.classList.add(theme)\n }, [theme])\n\n const value = {\n theme,\n setTheme: (theme: Theme) => {\n localStorage.setItem(storageKey, theme)\n setTheme(theme)\n },\n }\n\n return (\n <ThemeProviderContext.Provider {...props} value={value}>\n {children}\n </ThemeProviderContext.Provider>\n )\n}\n\nexport const useTheme = () => {\n const context = useContext(ThemeProviderContext)\n\n if (context === undefined)\n throw new Error(\"useTheme must be used within a ThemeProvider\")\n\n return context\n}\n","\"use client\";\n\nimport { ToastContainer } from \"react-toastify\";\n\nexport function GlobalToastContainer() {\n return (\n <ToastContainer\n newestOnTop={false}\n closeButton={false}\n />\n );\n}\n","// Auth Components\nexport { LoginForm } from './auth/LoginForm'\nexport { HowoneProvider, useHowoneContext } from './auth/HowoneProvider'\nexport type { HowoneProviderProps } from './auth/HowoneProvider'\nexport { useAuth, getToken, setToken, parseUserFromToken } from '../auth'\nexport { default as howone } from '../howone/client'\n\n// UI Components\nexport { Loading, LoadingSpinner } from './ui/Loading'\nexport { ErrorBoundary, DefaultErrorFallback } from './ui/ErrorBoundary'\n\n// Theme Components\nexport { ThemeProvider, ThemeToggle, useTheme } from './theme'\n\n// Toast Components\nexport { GlobalToastContainer } from './ui/Toast/GlobalToastContainer'\nexport { ClayxToast } from './ui/Toast/ClayxToast'\n","import { getToken, setToken, parseUserFromToken } from '../auth'\nimport { getAuthRoot } from '../config'\n\ntype AuthState = {\n user: Record<string, unknown> | null\n isLoading: boolean\n}\n\nclass HowoneAuthClient {\n private listeners = new Set<(state: AuthState) => void>()\n private loading = false\n\n private emit() {\n const state: AuthState = {\n user: parseUserFromToken(getToken()),\n isLoading: this.loading\n }\n for (const l of this.listeners) {\n try { l(state) } catch (e) { void e }\n }\n }\n\n onAuthStateChanged(listener: (state: AuthState) => void) {\n this.listeners.add(listener)\n // emit initial state synchronously\n try { listener({ user: parseUserFromToken(getToken()), isLoading: this.loading }) } catch (e) { void e }\n return () => { this.listeners.delete(listener) }\n }\n\n // Simple redirect-based login trigger (consumer can override)\n login() {\n // consumer may want a full-page redirect to auth server\n const root = getAuthRoot() || 'https://create-x-backend-dev.fly.dev'\n try {\n const loc = window.location.href\n const authUrl = new URL('/auth', String(root))\n authUrl.searchParams.set('redirect_uri', String(loc))\n // If a default project id was set in config, include it\n try {\n const cfg = require('../config')\n const pid = cfg.getDefaultProjectId && cfg.getDefaultProjectId()\n if (pid) authUrl.searchParams.set('project_id', String(pid))\n } catch {\n // ignore\n }\n try {\n if (window.top && window.top !== window) {\n window.top.location.replace(authUrl.toString())\n } else {\n window.location.replace(authUrl.toString())\n }\n } catch {\n try { window.location.replace(String(root)) } catch { void 0 }\n }\n } catch {\n try { window.location.replace(String(root)) } catch { void 0 }\n }\n }\n\n logout() {\n setToken(null)\n this.emit()\n }\n\n getUser() {\n return parseUserFromToken(getToken())\n }\n\n // helper to programmatically set token (e.g., after callback handling)\n setToken(token: string | null) {\n setToken(token)\n this.emit()\n }\n}\n\nconst howone = {\n auth: new HowoneAuthClient()\n}\n\nexport default howone\n","import React from 'react'\n\ninterface LoadingProps {\n size?: 'sm' | 'md' | 'lg'\n text?: string\n className?: string\n fullScreen?: boolean\n}\n\nexport const Loading: React.FC<LoadingProps> = ({\n size = 'md',\n text = 'Loading...',\n className = '',\n fullScreen = false\n}) => {\n const sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-8 w-8',\n lg: 'h-12 w-12'\n }\n\n const containerClasses = fullScreen\n ? 'fixed inset-0 flex items-center justify-center bg-white/80 backdrop-blur-sm z-50'\n : 'flex items-center justify-center p-4'\n\n return (\n <div className={`${containerClasses} ${className}`}>\n <div className=\"text-center\">\n <div\n className={`animate-spin rounded-full border-2 border-gray-300 border-t-blue-600 mx-auto ${sizeClasses[size]}`}\n />\n {text && (\n <p className=\"mt-2 text-sm text-gray-600\">{text}</p>\n )}\n </div>\n </div>\n )\n}\n\ninterface LoadingSpinnerProps {\n size?: 'sm' | 'md' | 'lg'\n className?: string\n}\n\nexport const LoadingSpinner: React.FC<LoadingSpinnerProps> = ({\n size = 'md',\n className = ''\n}) => {\n const sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-8 w-8',\n lg: 'h-12 w-12'\n }\n\n return (\n <div\n className={`animate-spin rounded-full border-2 border-gray-300 border-t-blue-600 ${sizeClasses[size]} ${className}`}\n />\n )\n}\n","import React, { Component, ReactNode } from 'react'\n\ninterface ErrorBoundaryState {\n hasError: boolean\n error?: Error\n errorInfo?: React.ErrorInfo\n}\n\ninterface ErrorBoundaryProps {\n children: ReactNode\n fallback?: React.ComponentType<{ error?: Error; retry?: () => void }>\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props)\n this.state = { hasError: false }\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error }\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n this.setState({\n error,\n errorInfo\n })\n\n this.props.onError?.(error, errorInfo)\n }\n\n handleRetry = () => {\n this.setState({ hasError: false, error: undefined, errorInfo: undefined })\n }\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n const FallbackComponent = this.props.fallback\n return <FallbackComponent error={this.state.error} retry={this.handleRetry} />\n }\n\n return (\n <div className=\"min-h-[400px] flex items-center justify-center p-4\">\n <div className=\"text-center max-w-md\">\n <div className=\"text-red-500 text-6xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">\n Something went wrong\n </h2>\n <p className=\"text-gray-600 mb-4\">\n An unexpected error occurred. Please try refreshing the page.\n </p>\n <button\n onClick={this.handleRetry}\n className=\"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors\"\n >\n Try Again\n </button>\n {process.env.NODE_ENV === 'development' && this.state.error && (\n <details className=\"mt-4 text-left\">\n <summary className=\"cursor-pointer text-sm text-gray-500 hover:text-gray-700\">\n Error Details (Development)\n </summary>\n <pre className=\"mt-2 text-xs bg-gray-100 p-2 rounded overflow-auto\">\n {this.state.error.toString()}\n {this.state.errorInfo?.componentStack}\n </pre>\n </details>\n )}\n </div>\n </div>\n )\n }\n\n return this.props.children\n }\n}\n\n// Hook version for functional components\ninterface ErrorFallbackProps {\n error?: Error\n retry?: () => void\n}\n\nexport const DefaultErrorFallback: React.FC<ErrorFallbackProps> = ({ retry }) => (\n <div className=\"min-h-[200px] flex items-center justify-center p-4\">\n <div className=\"text-center\">\n <div className=\"text-red-500 text-4xl mb-2\">⚠️</div>\n <p className=\"text-gray-600 mb-2\">Something went wrong</p>\n {retry && (\n <button\n onClick={retry}\n className=\"px-3 py-1 bg-blue-600 text-white text-sm rounded hover:bg-blue-700 transition-colors\"\n >\n Retry\n </button>\n )}\n </div>\n </div>\n)\n","\"use client\"\n\nimport * as React from \"react\"\nimport { useTheme } from \"next-themes\"\nimport { Icon } from \"@iconify/react\"\n\ninterface ThemeToggleProps {\n className?: string\n}\n\nexport function ThemeToggle({ className }: ThemeToggleProps) {\n const { setTheme, theme } = useTheme()\n const [mounted, setMounted] = React.useState(false)\n\n React.useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!mounted) {\n return (\n <button\n className={`relative inline-flex h-10 w-12 items-center justify-center rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground ${className || ''}`}\n disabled\n >\n <Icon icon=\"solar:sun-2-linear\" width={20} height={20} />\n <span className=\"sr-only\">Toggle theme</span>\n </button>\n )\n }\n\n return (\n <button\n className={`inline-flex h-10 w-12 items-center justify-center rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground transition-colors ${className || ''}`}\n onClick={() => setTheme(theme === \"light\" ? \"dark\" : \"light\")}\n >\n {theme === \"light\" ? (\n <Icon icon=\"solar:sun-2-linear\" width={20} height={20} />\n ) : (\n <Icon icon=\"solar:moon-linear\" width={20} height={20} />\n )}\n <span className=\"sr-only\">Toggle theme</span>\n </button>\n )\n}","\"use client\";\n\nimport React, { useCallback } from \"react\";\nimport { Bounce, toast, ToastOptions } from \"react-toastify\";\nimport { Icon } from \"@iconify/react\";\n\nexport type ToastType = 'success' | 'error' | 'warning' | 'info' | 'default';\n\ninterface ToastContentProps {\n type: ToastType;\n title?: string;\n message?: string;\n component?: React.ReactNode;\n closeToast?: () => void;\n}\n\nconst TOAST_ICONS = {\n success: {\n icon: \"mdi:success\",\n color: \"text-green-400\",\n className: \"text-green-400\",\n bgGradient: \"bg-[#14181df2]\",\n gradientColor: \"#389726\",\n borderGradient: \"border-[#389726]\",\n borderGradientColor: \"#389726\"\n },\n error: {\n icon: \"ic:outline-close\",\n color: \"text-red-400\",\n className: \"text-red-400\",\n bgGradient: \"bg-[#14181df2]\",\n gradientColor: \"#ef4444\",\n borderGradient: \"border-[#ef4444]\",\n borderGradientColor: \"#ef4444\"\n },\n warning: {\n icon: \"mi:warning\",\n color: \"text-yellow-400\",\n className: \"text-yellow-400\",\n bgGradient: \"bg-[#14181df2]\",\n gradientColor: \"#facc15\",\n borderGradient: \"border-[#facc15]\",\n borderGradientColor: \"#facc15\"\n },\n info: {\n icon: \"ic:outline-info\",\n color: \"text-blue-400\",\n className: \"text-blue-400\",\n bgGradient: \"bg-[#14181df2]\",\n gradientColor: \"#60a5fa\",\n borderGradient: \"border-[#60a5fa]\",\n borderGradientColor: \"#f0f0f0\"\n },\n default: {\n icon: \"ic:round-notifications\",\n color: \"text-gray-400\",\n className: \"text-gray-400\",\n bgGradient: \"bg-[#14181df2]\",\n gradientColor: \"#9ca3af\",\n borderGradient: \"border-[#9ca3af]\",\n borderGradientColor: \"#9ca3af\"\n }\n};\n\nconst CloseButton = React.memo(({ closeToast }: { closeToast?: () => void }) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n closeToast?.();\n }, [closeToast]);\n\n return (\n <Icon\n icon=\"vaadin:close\"\n className=\"flex items-center justify-center rounded-full relative z-10 flex-shrink-0 cursor-pointer \n !text-[#b4b4b4] hover:text-white transition-colors duration-200 drop-shadow-sm\"\n onClick={handleClick}\n width={14}\n height={14}\n />\n );\n});\n\nCloseButton.displayName = 'CloseButton';\n\n// 内容组件\nconst ToastContent: React.FC<ToastContentProps> = ({ type, title, message, component, closeToast }) => {\n const iconConfig = TOAST_ICONS[type];\n\n // 使用 useCallback 确保 closeToast 函数引用稳定\n const handleClose = useCallback(() => {\n closeToast?.();\n }, [closeToast]);\n\n if (component) {\n return (\n <div className={`flex items-start gap-3 min-h-[80px] w-full backdrop-blur-md \n rounded-xl p-4 shadow-2xl relative overflow-hidden ${iconConfig.bgGradient}`}>\n <div className=\"flex-1 relative z-10\">\n {component}\n </div>\n <div className=\"relative z-10\">\n <CloseButton closeToast={handleClose} />\n </div>\n </div>\n );\n }\n\n // 否则渲染默认的 toast 内容\n return (\n <div className={`flex items-start gap-3 min-h-[60px] w-full backdrop-blur-md\n rounded-xl p-4 shadow-2xl relative overflow-hidden ${iconConfig.bgGradient}`}>\n <div\n className=\"absolute left-0 top-0 w-full h-full pointer-events-none rounded-xl\"\n style={{\n background: `linear-gradient(135deg, ${iconConfig.gradientColor}30 0%, ${iconConfig.gradientColor}20 15%, #14181df2 30%)`\n }}\n />\n\n {/* 渐变边框层 */}\n <div\n className=\"absolute left-0 top-0 w-full h-full pointer-events-none rounded-xl\"\n style={{\n border: '2px solid transparent',\n backgroundImage: `linear-gradient(135deg, ${iconConfig.borderGradientColor}60 0%, ${iconConfig.borderGradientColor}40 5%, transparent 22%)`,\n backgroundOrigin: 'border-box',\n backgroundClip: 'border-box',\n WebkitMask: 'linear-gradient(#fff 0 0) padding-box, linear-gradient(#fff 0 0)',\n WebkitMaskComposite: 'xor',\n mask: 'linear-gradient(#fff 0 0) padding-box, linear-gradient(#fff 0 0)',\n maskComposite: 'exclude'\n }}\n />\n\n <div className=\"flex-shrink-0 mt-0.5 relative z-10 \">\n <div className=\"w-7 h-7 bg-white/10 backdrop-blur-sm rounded-full flex items-center justify-center\">\n <Icon\n icon={iconConfig.icon}\n width={16}\n height={16}\n className={iconConfig.color}\n />\n </div>\n </div>\n <div className=\"flex flex-col gap-1 flex-1 relative z-10\">\n {title && (\n <div\n className=\"font-semibold leading-tight text-white/95 drop-shadow-sm\"\n style={{ fontSize: '16px' }}\n >\n {title}\n </div>\n )}\n {message && (\n <div\n className=\"text-white/75 drop-shadow-sm\"\n style={{\n fontSize: '13px',\n }}\n >\n {message}\n </div>\n )}\n </div>\n <div className=\"relative z-10\">\n <CloseButton closeToast={handleClose} />\n </div>\n </div>\n );\n};\n\n// 默认配置\nconst defaultToastOptions: ToastOptions = {\n position: \"bottom-right\",\n autoClose: 300000,\n hideProgressBar: true,\n closeOnClick: false,\n pauseOnHover: true,\n draggable: true,\n pauseOnFocusLoss: false,\n theme: \"dark\",\n transition: Bounce,\n};\n\ninterface ToastParams {\n title?: string;\n message?: string;\n component?: React.ReactNode;\n options?: Partial<ToastOptions>;\n}\n\nconst createToast = (type: ToastType) => {\n return (params: ToastParams) => {\n const { title, message, component, options } = params;\n\n toast(\n ({ closeToast }) => (\n <ToastContent\n type={type}\n title={title}\n message={message || ''}\n component={component}\n closeToast={closeToast}\n />\n ),\n {\n ...defaultToastOptions,\n ...options,\n className: \"!bg-transparent !p-0 !shadow-none\",\n style: { background: 'transparent', padding: 0 }\n }\n );\n };\n};\n\nexport const ClayxToast = {\n success: createToast('success'),\n error: createToast('error'),\n warning: createToast('warning'),\n info: createToast('info'),\n default: createToast('default'),\n};\n","import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n","import { useState, useEffect } from 'react'\n\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value)\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value)\n }, delay)\n\n return () => {\n clearTimeout(handler)\n }\n }, [value, delay])\n\n return debouncedValue\n}\n","// Inline copy of public/error-handler.js wrapped for runtime injection\nconst ERROR_HANDLER_SCRIPT = `(function () {\n // 检查是否在 iframe 中运行\n const isIframe = window.self !== window.top;\n console.log(\"isIframe\", isIframe);\n\n console.log(\"[早期错误处理] 初始化\");\n\n // 直接发送错误到父窗口的函数\n window.__SEND_ERROR_TO_PARENT__ = function (error, details) {\n try {\n const errorPayload = {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n filename: details?.file || details?.filename,\n lineno: details?.line,\n colno: details?.column,\n timestamp: Date.now(),\n type: details?.type || \"compile-error\",\n details: details,\n };\n\n window.parent.postMessage(\n {\n type: \"ERROR_EVENT\",\n payload: errorPayload,\n },\n \"*\"\n );\n\n console.log(\"[早期错误处理] 错误已发送到父窗口:\", errorPayload);\n } catch (e) {\n console.error(\"[早期错误处理] 发送错误到父窗口失败:\", e);\n }\n };\n\n // 设置 MutationObserver 监听 vite-error-overlay\n function setupViteOverlayObserver() {\n if (!window.MutationObserver) return;\n\n console.log(\"[早期错误处理] 设置 Vite 错误 overlay 监听器\");\n\n function processViteErrorOverlay(overlay) {\n try {\n if (overlay.hasAttribute(\"data-error-sent\")) return;\n\n const shadowRoot = overlay.shadowRoot;\n if (!shadowRoot) {\n console.log(\"[早期错误处理] vite-error-overlay 没有 Shadow DOM\");\n return;\n }\n\n const messageElement = shadowRoot.querySelector(\"pre.message\");\n const fileElement = shadowRoot.querySelector(\"pre.file\");\n const frameElements = shadowRoot.querySelectorAll(\"pre.frame\");\n const stackElement = shadowRoot.querySelector(\"pre.stack\");\n\n const message = messageElement ? messageElement.textContent : \"\";\n const file = fileElement ? fileElement.textContent : \"\";\n const frames = Array.from(frameElements)\n .map((el) => el.textContent)\n .join(\"\\\\n\");\n const stack = stackElement ? stackElement.textContent : \"\";\n\n let line, column;\n const fileStr = file || \"\";\n const lineColMatch = fileStr.match(/(?:line|at|:)(?:.*?)(?::| )(\\\\d+)(?::| )(\\\\d+)/i);\n if (lineColMatch) {\n line = parseInt(lineColMatch[1], 10);\n column = parseInt(lineColMatch[2], 10);\n }\n\n const messageStr = message || \"\";\n const isReactError =\n messageStr.includes(\"React\") ||\n messageStr.includes(\"JSX\") ||\n messageStr.includes(\"Unexpected token\") ||\n messageStr.includes(\"vite:react-babel\");\n\n const viteError = new Error(messageStr);\n\n window.__SEND_ERROR_TO_PARENT__(viteError, {\n file,\n line,\n column,\n frames,\n stack,\n isReactError,\n type: isReactError ? \"react-syntax\" : \"vite-error-overlay\",\n });\n\n overlay.setAttribute(\"data-error-sent\", \"true\");\n } catch (e) {\n console.error(\"[早期错误处理] 处理 vite-error-overlay 失败:\", e);\n }\n }\n\n function checkExistingOverlays() {\n const viteErrorOverlays = document.querySelectorAll(\"vite-error-overlay\");\n if (viteErrorOverlays.length > 0) {\n viteErrorOverlays.forEach((overlay) => {\n if (!overlay.hasAttribute(\"data-error-sent\")) {\n processViteErrorOverlay(overlay);\n }\n });\n }\n }\n\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.addedNodes.length > 0) {\n for (const node of Array.from(mutation.addedNodes)) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node;\n\n if (\n element.tagName === \"VITE-ERROR-OVERLAY\" &&\n !element.hasAttribute(\"data-error-sent\")\n ) {\n setTimeout(() => processViteErrorOverlay(element), 100);\n }\n\n const viteErrorOverlays = element.querySelectorAll(\"vite-error-overlay\");\n for (const viteErrorOverlay of Array.from(viteErrorOverlays)) {\n if (!viteErrorOverlay.hasAttribute(\"data-error-sent\")) {\n setTimeout(() => processViteErrorOverlay(viteErrorOverlay), 100);\n }\n }\n }\n }\n }\n }\n });\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n });\n\n setTimeout(checkExistingOverlays, 500);\n setInterval(checkExistingOverlays, 2000);\n }\n\n window.addEventListener(\n \"error\",\n function (event) {\n const target = event && (event.target || event.srcElement);\n const tagName = target && target.tagName;\n if (tagName) {\n const url = (target && (target.src || target.href || target.currentSrc)) ||\n (target && target.getAttribute && (target.getAttribute('src') || target.getAttribute('href')));\n const preview = target && target.outerHTML ? String(target.outerHTML).slice(0, 300) : undefined;\n const resourceError = new Error('Resource load error: ' + tagName + ' ' + (url || 'unknown'));\n window.__SEND_ERROR_TO_PARENT__(resourceError, {\n filename: url,\n tagName: tagName,\n element: preview,\n type: \"resource\"\n });\n return;\n }\n\n var stack = (event && event.error && event.error.stack) || \"\";\n var message = typeof event.message === \"string\" ? event.message : \"\";\n if ((stack && stack.indexOf('error-handler') !== -1) || !message) return;\n\n window.__SEND_ERROR_TO_PARENT__(event.error || new Error(event.message), {\n filename: event.filename,\n line: event.lineno,\n column: event.colno,\n type: \"runtime\",\n });\n },\n true\n );\n\n window.addEventListener(\"unhandledrejection\", function (event) {\n const reason = event.reason;\n window.__SEND_ERROR_TO_PARENT__(\n reason instanceof Error ? reason : new Error(String(reason)),\n { type: \"promise\" }\n );\n });\n\n setupViteOverlayObserver();\n\n if (!window.__FETCH_INTERCEPTED__) {\n window.__FETCH_INTERCEPTED__ = true;\n const originalFetch = window.fetch;\n \n function handleFetchError(error, url, response = null) {\n const errorDetails = {\n type: \"network\",\n method: \"fetch\",\n url: url\n };\n \n if (response && !response.ok) {\n errorDetails.status = response.status;\n errorDetails.statusText = response.statusText;\n errorDetails.networkError = false;\n } else {\n errorDetails.networkError = true;\n }\n window.__SEND_ERROR_TO_PARENT__(error, errorDetails);\n }\n \n window.fetch = function(...args) {\n const url = args[0] instanceof Request ? args[0].url : args[0];\n \n return originalFetch.apply(this, args)\n .then(response => {\n if (!response.ok) {\n const networkError = new Error('HTTP ' + response.status + ': ' + response.statusText);\n handleFetchError(networkError, url, response);\n }\n return response;\n })\n .catch(error => {\n handleFetchError(error, url);\n throw error;\n });\n };\n }\n\n if (!window.__XHR_INTERCEPTED__) {\n window.__XHR_INTERCEPTED__ = true;\n const originalXHROpen = XMLHttpRequest.prototype.open;\n const originalXHRSend = XMLHttpRequest.prototype.send;\n \n function handleXHRError(error, xhr, isNetworkError = false) {\n const errorDetails = {\n type: \"network\",\n method: \"xhr\",\n url: xhr.__intercepted_url__\n };\n \n if (!isNetworkError && xhr.status >= 400) {\n errorDetails.status = xhr.status;\n errorDetails.statusText = xhr.statusText;\n errorDetails.networkError = false;\n } else {\n errorDetails.networkError = true;\n }\n \n window.__SEND_ERROR_TO_PARENT__(error, errorDetails);\n }\n \n XMLHttpRequest.prototype.open = function(method, url, ...args) {\n this.__intercepted_method__ = method;\n this.__intercepted_url__ = url;\n return originalXHROpen.apply(this, [method, url, ...args]);\n };\n \n XMLHttpRequest.prototype.send = function(...args) {\n const xhr = this;\n \n const originalOnReadyStateChange = xhr.onreadystatechange;\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n if (xhr.status >= 400) {\n const networkError = new Error('HTTP ' + xhr.status + ': ' + xhr.statusText);\n handleXHRError(networkError, xhr, false);\n }\n }\n \n if (originalOnReadyStateChange) {\n return originalOnReadyStateChange.apply(this, arguments);\n }\n };\n \n const originalOnError = xhr.onerror;\n xhr.onerror = function() {\n const networkError = new Error('Network error for ' + xhr.__intercepted_method__ + ' ' + xhr.__intercepted_url__);\n handleXHRError(networkError, xhr, true);\n \n if (originalOnError) {\n return originalOnError.apply(this, arguments);\n }\n };\n \n return originalXHRSend.apply(this, args);\n };\n }\n\n if (!window.__CONSOLE_ERROR_INTERCEPTED__) {\n window.__CONSOLE_ERROR_INTERCEPTED__ = true;\n const originalConsoleError = console.error;\n console.error = function () {\n try {\n var args = Array.prototype.slice.call(arguments);\n var first = args[0];\n var firstStr = typeof first === \"string\" ? first : \"\";\n var isReact = firstStr.indexOf(\"React\") !== -1;\n var isVite = firstStr.indexOf(\"[vite]\") !== -1 || firstStr.indexOf(\"Failed to reload\") !== -1;\n if (isReact || isVite) {\n var joined = args\n .map(function (a) {\n if (a instanceof Error) return a.message;\n if (typeof a === \"string\") return a;\n if (a && typeof a.message === \"string\") return a.message;\n try { return JSON.stringify(a); } catch (_) { return String(a); }\n })\n .join(\" \");\n var errorForReport = new Error(joined);\n window.__SEND_ERROR_TO_PARENT__(errorForReport, { type: \"runtime\", viteErrorType: \"console\" });\n }\n } catch (_) {}\n return originalConsoleError.apply(console, arguments);\n };\n }\n\n console.log(\"[早期错误处理] 初始化完成\");\n})();`;\n\n/**\n * 在页面尽早注入错误处理脚本。\n * 调用时机:应在应用入口尽早执行(例如在 root render 之前)。\n */\nexport function injectEarlyErrorHandler(): void {\n if (typeof document === 'undefined') return\n try {\n // 如果已经注入则跳过\n if ((window as any).__EARLY_ERROR_HANDLER_INJECTED__) return\n const script = document.createElement('script')\n script.type = 'text/javascript'\n script.text = ERROR_HANDLER_SCRIPT\n // 插入到 head 最前面,尽早执行\n const head = document.head || document.getElementsByTagName('head')[0]\n if (head && head.firstChild) head.insertBefore(script, head.firstChild)\n else if (head) head.appendChild(script)\n ; (window as any).__EARLY_ERROR_HANDLER_INJECTED__ = true\n } catch (e) {\n // ignore\n }\n}\n\nexport default injectEarlyErrorHandler\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,SAAS,MAAc,OAAsB;AACpD,MAAI;AACF,QAAI,OAAO,WAAW,eAAe,CAAC,QAAQ,aAAc;AAC5D,QAAI,UAAU,MAAM;AAClB,aAAO,aAAa,WAAW,IAAI;AACnC;AAAA,IACF;AACA,WAAO,aAAa,QAAQ,MAAM,KAAK;AAAA,EACzC,SAAS,GAAG;AACV,SAAK;AAAA,EACP;AACF;AAEA,SAAS,SAAS,MAA6B;AAC7C,MAAI;AACF,QAAI,OAAO,WAAW,eAAe,CAAC,QAAQ,aAAc,QAAO;AACnE,WAAO,OAAO,aAAa,QAAQ,IAAI;AAAA,EACzC,SAAS,GAAG;AACV,WAAO;AAAA,EACT;AACF;AAEO,SAAS,SAAS,OAAsB;AAE7C,MAAI;AACF,aAAS,gBAAgB,KAAK;AAAA,EAChC,SAAS,GAAG;AACV,SAAK;AAAA,EACP;AAEA,MAAI;AAAE,2BAAuB;AAAA,EAAE,QAAQ;AAAA,EAAe;AACxD;AAEO,SAAS,WAA0B;AACxC,MAAI;AACF,UAAM,IAAI,SAAS,cAAc;AACjC,QAAI,EAAG,QAAO;AAAA,EAChB,SAAS,GAAG;AACV,SAAK;AAAA,EACP;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAA+C;AACvE,MAAI;AACF,UAAM,UAAU,MAAM,MAAM,GAAG,EAAE,CAAC;AAClC,QAAI,CAAC,QAAS,QAAO;AACrB,QAAI,SAAS,QAAQ,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AACzD,UAAM,MAAM,OAAO,SAAS;AAC5B,QAAI,QAAQ,EAAG,WAAU;AAAA,aAChB,QAAQ,EAAG,WAAU;AAAA,aACrB,QAAQ,EAAG,QAAO;AAC3B,UAAM,OAAO,KAAK,MAAM;AACxB,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB,OAAsB;AACvD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,UAAU,iBAAiB,KAAK;AACtC,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO;AAAA,IACL,IAAK,QAAQ,UAAsB,QAAQ,OAAkB;AAAA,IAC7D,OAAQ,QAAQ,SAAoB;AAAA,IACpC,MAAO,QAAQ,QAAmB;AAAA,IAClC,QAAS,QAAQ,UAAsB,QAAQ,WAAsB;AAAA,EACvE;AACF;AAEO,SAAS,aAAa,OAAsB;AACjD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,UAAU,iBAAiB,KAAK;AACtC,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACxC,QAAM,eAAgB,QAAQ,OAAwC,QAAQ;AAC9E,QAAM,MAAM,OAAO,YAAY;AAC/B,MAAI,CAAC,OAAO,CAAC,OAAO,SAAS,GAAG,EAAG,QAAO;AAC1C,SAAO,MAAM;AACf;AAIO,SAAS,UAAU;AACxB,QAAM,CAAC,OAAO,aAAa,QAAI,uBAAwB,MAAM,SAAS,CAAC;AACvE,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,MAAM,mBAAmB,SAAS,CAAC,CAAC;AACrE,8BAAU,MAAM;AACd,UAAM,YAAY,MAAM;AACtB,YAAM,IAAI,SAAS;AACnB,oBAAc,CAAC;AACf,cAAQ,mBAAmB,CAAC,CAAC;AAAA,IAC/B;AACA,WAAO,iBAAiB,WAAW,SAAS;AAG5C,UAAM,cAAc,mBAAmB,MAAM;AAC3C,oBAAc,SAAS,CAAC;AACxB,cAAQ,mBAAmB,SAAS,CAAC,CAAC;AAAA,IACxC,CAAC;AAED,WAAO,MAAM;AACX,aAAO,oBAAoB,WAAW,SAAS;AAC/C,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,MAAM;AACnB,aAAS,IAAI;AACb,kBAAc,IAAI;AAClB,YAAQ,IAAI;AAEZ,2BAAuB;AAAA,EACzB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,iBAAiB,CAAC,CAAC,SAAS,aAAa,KAAK;AAAA,IAC9C;AAAA,EACF;AACF;AAMO,SAAS,mBAAmB,IAAgC;AAEjE,MAAI;AACF,UAAM,UAAU,EAAE,MAAM,mBAAmB,SAAS,CAAC,GAAG,WAAW,MAAM;AACzE,OAAG,OAAO;AAAA,EACZ,QAAQ;AAAA,EAER;AACA,kBAAgB,IAAI,EAAE;AACtB,SAAO,MAAM;AAAE,oBAAgB,OAAO,EAAE;AAAA,EAAE;AAC5C;AAEA,SAAS,yBAAyB;AAChC,QAAM,QAAQ,EAAE,MAAM,mBAAmB,SAAS,CAAC,GAAG,WAAW,MAAM;AACvE,aAAW,MAAM,MAAM,KAAK,eAAe,GAAG;AAC5C,QAAI;AAAE,SAAG,KAAK;AAAA,IAAE,QAAQ;AAAA,IAAiC;AAAA,EAC3D;AACF;AAtJA,IAyFA,cArFa,gBA+HP;AAnIN;AAAA;AAAA;AAyFA,mBAAoC;AArF7B,IAAM,iBAAiB;AA+H9B,IAAM,kBAAkB,oBAAI,IAAgC;AAAA;AAAA;;;ACnI5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,SAAS,YAAY,KAAa;AACvC,oBAAkB,IAAI,QAAQ,SAAS,EAAE;AAC3C;AAEO,SAAS,cAAc;AAC5B,SAAO;AACT;AAeO,SAAS,oBAAoB,IAAmB;AACrD,uBAAqB;AACvB;AAEO,SAAS,sBAAsB;AACpC,MAAI;AACF,QAAI,mBAAoB,QAAO;AAC/B,UAAM,IAAK,WAAmB;AAC9B,QAAI,OAAO,MAAM,YAAY,EAAE,SAAS,EAAG,QAAO,OAAO,CAAC;AAC1D,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAvCA,IAEI,iBACA,oBAUS,WA4BN;AAzCP;AAAA;AAAA;AAEA,IAAI,kBAAkB;AACtB,IAAI,qBAAoC;AAUjC,IAAM,YAAY,YAAY;AAGrC,QAAI;AACF,YAAM,IAAK,WAAmB;AAC9B,UAAI,OAAO,MAAM,YAAY,EAAE,SAAS,GAAG;AACzC,oBAAY,CAAC;AAAA,MACf;AAAA,IACF,QAAQ;AAAA,IAER;AAkBA,IAAO,iBAAQ;AAAA,MACb;AAAA,MACA;AAAA,MACA,WAAW,MAAM;AAAA,IACnB;AAAA;AAAA;;;AC7CA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,qBAAqB;AAyBf;AAhBC,IAAM,iBAAgD,CAAC;AAAA,EAC5D,OAAO;AAAA,EACP;AAAA,EACA,YAAY;AACd,MAAM;AACJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,IAAG;AAAA,MACH,WAAW,iMAAiM,SAAS;AAAA,MACrN,OAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AAAA,MAEA,uDAAC,SAAI,WAAU,2BAA0B,OAAO,EAAE,QAAQ,UAAU,GAClE;AAAA,oDAAC,SAAI,OAAO,IAAI,WAAU,uBAAsB,KAAI,+FAA8F,KAAI,IAAG;AAAA,QAAG;AAAA,QAC5J,4CAAC,uBAAK,MAAK,aAAY,SAAS,CAAC,MAAM;AACrC,YAAE,gBAAgB;AAClB,gBAAM,MAAM,SAAS,eAAe,qBAAqB;AACzD,cAAI,IAAK,KAAI,MAAM,UAAU;AAAA,QAC/B,GAAG,WAAU,uHAAsH;AAAA,SACrI;AAAA;AAAA,EACF;AAEJ;;;ACuDA,IAAM,qBAAN,MAAyB;AAAA,EAAzB;AACE,SAAiB,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhC,MAAM,sBAAsB;AAC1B,UAAM,aAAa,OAAO,SAAS;AAEnC,UAAM,QAAQ;AAAA,MACZ,UAAU;AAAA,MACV,QAAQ,KAAK,cAAc;AAAA,MAC3B,WAAW,KAAK,IAAI;AAAA,IACtB;AAEA,UAAM,cAAc,mBAAmB,KAAK,UAAU,KAAK,CAAC;AAE5D,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,YAAY,0BAA0B,WAAW,EAAE;AACxF,YAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,UAAI,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,KAAK,SAAS;AAC5C,cAAM,IAAI,MAAM,yBAAyB;AAAA,MAC3C;AAEA,aAAO,KAAK,eAAe,KAAK,KAAK,OAAO;AAAA,IAC9C,SAAS,OAAO;AAEd,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,eAAe,SAAyD;AAC9E,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,QAAQ;AACd,YAAM,SAAS;AACf,YAAM,OAAO,OAAO,OAAO,QAAQ,IAAI,QAAQ;AAC/C,YAAM,MAAM,OAAO,OAAO,SAAS,IAAI,SAAS;AAGhD,YAAM,QAAQ,OAAO;AAAA,QACnB;AAAA,QACA;AAAA,QACA,SAAS,KAAK,WAAW,MAAM,SAAS,IAAI,QAAQ,GAAG;AAAA,MACzD;AAEA,UAAI,CAAC,OAAO;AACV,eAAO,IAAI,MAAM,2DAA2D,CAAC;AAC7E;AAAA,MACF;AAEA,UAAI,cAAc;AAClB,UAAI,qBAAoC;AAGxC,YAAM,mBAAmB,MAAM;AAC7B,YAAI;AAGF,cAAI,CAAC,SAAS,MAAM,QAAQ;AAC1B,gBAAI,CAAC,aAAa;AAChB,4BAAc;AACd,kBAAI,oBAAoB;AACtB,8BAAc,kBAAkB;AAChC,qCAAqB;AAAA,cACvB;AACA,qBAAO,oBAAoB,WAAW,cAAc;AACpD,qBAAO,IAAI,MAAM,sBAAsB,CAAC;AAAA,YAC1C;AAAA,UACF;AAAA,QACF,SAAS,GAAG;AAGV,cAAI,CAAC,aAAa;AAChB,0BAAc;AACd,gBAAI,oBAAoB;AACtB,4BAAc,kBAAkB;AAChC,mCAAqB;AAAA,YACvB;AACA,mBAAO,oBAAoB,WAAW,cAAc;AACpD,mBAAO,IAAI,MAAM,sBAAsB,CAAC;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAGA,2BAAqB,OAAO,YAAY,kBAAkB,GAAI;AAE9D,YAAM,iBAAiB,CAAC,UAAwB;AAC9C,cAAM,eAAe,CAAC,OAAO,SAAS,QAAQ,sCAAsC;AAEpF,cAAM,gBAAgB,aAAa;AAAA,UACjC,CAAC,WACC,MAAM,WAAW,UACjB,MAAM,OAAO,SAAS,WAAW,KACjC,MAAM,OAAO,SAAS,WAAW,KACjC,MAAM,OAAO,SAAS,SAAS;AAAA,QACnC;AAEA,YAAI,CAAC,eAAe;AAElB;AAAA,QACF;AAEA,YAAI,MAAM,QAAQ,MAAM,KAAK,SAAS,iBAAiB;AACrD,wBAAc;AACd,cAAI,oBAAoB;AACtB,0BAAc,kBAAkB;AAChC,iCAAqB;AAAA,UACvB;AACA,iBAAO,oBAAoB,WAAW,cAAc;AAGpD,cAAI;AACF,gBAAI,MAAO,OAAM,MAAM;AAAA,UACzB,SAAS,GAAG;AAAA,UAEZ;AAEA,kBAAQ,MAAM,KAAK,OAAO;AAAA,QAC5B,WAAW,MAAM,QAAQ,MAAM,KAAK,SAAS,eAAe;AAC1D,wBAAc;AACd,cAAI,oBAAoB;AACtB,0BAAc,kBAAkB;AAChC,iCAAqB;AAAA,UACvB;AACA,iBAAO,oBAAoB,WAAW,cAAc;AAGpD,cAAI;AACF,gBAAI,MAAO,OAAM,MAAM;AAAA,UACzB,SAAS,GAAG;AAAA,UAEZ;AAEA,iBAAO,IAAI,MAAM,MAAM,KAAK,SAAS,cAAc,CAAC;AAAA,QACtD;AAAA,MACF;AAEA,aAAO,iBAAiB,WAAW,cAAc;AAGjD,iBAAW,MAAM;AACf,YAAI,CAAC,aAAa;AAChB,wBAAc;AACd,cAAI,oBAAoB;AACtB,0BAAc,kBAAkB;AAChC,iCAAqB;AAAA,UACvB;AACA,iBAAO,oBAAoB,WAAW,cAAc;AAGpD,cAAI;AACF,gBAAI,MAAO,OAAM,MAAM;AAAA,UACzB,SAAS,GAAG;AAAA,UAEZ;AAEA,iBAAO,IAAI,MAAM,eAAe,CAAC;AAAA,QACnC;AAAA,MACF,GAAG,IAAI,KAAK,GAAI;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,sBAAsB;AAC1B,UAAM,aAAa,OAAO,SAAS;AAEnC,UAAM,QAAQ;AAAA,MACZ,UAAU;AAAA,MACV,QAAQ,KAAK,cAAc;AAAA,MAC3B,WAAW,KAAK,IAAI;AAAA,IACtB;AAEA,UAAM,cAAc,mBAAmB,KAAK,UAAU,KAAK,CAAC;AAE5D,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,YAAY,0BAA0B,WAAW,EAAE;AACxF,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAI,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,KAAK,SAAS;AAC5C,cAAM,IAAI,MAAM,gCAAgC;AAAA,MAClD;AAEA,aAAO,KAAK,eAAe,KAAK,KAAK,OAAO;AAAA,IAC9C,SAAS,OAAO;AAEd,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,0BAA0B,OAAe,SAA6C;AAC1F,QAAI;AACF,YAAM,aAAa,OAAO,SAAS;AACnC,YAAM,QAAQ,KAAK,cAAc;AAEjC,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,YAAY,6BAA6B;AAAA,QAC5E,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,UAAU;AAAA,QACZ,CAAoB;AAAA,MACtB,CAAC;AAED,YAAM,OAAO,MAAM,SAAS,KAAK;AAGjC,UAAI,CAAC,SAAS,IAAI;AAEhB,cAAM,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC;AAAA,MACtC;AAGA,UAAI,KAAK,SAAS,KAAK,KAAK,QAAQ,KAAK,KAAK,YAAY,OAAO;AAE/D,cAAM,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC;AAAA,MACtC;AAGA,UAAI,KAAK,SAAS,KAAK;AAErB,cAAM,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC;AAAA,MACtC;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AAEd,UAAI,iBAAiB,SAAS,MAAM,QAAQ,WAAW,GAAG,GAAG;AAC3D,cAAM;AAAA,MACR;AAEA,YAAM,IAAI,MAAM,iBAAiB,QAAQ,MAAM,UAAU,8DAAY;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,mBAAmB,OAAe,MAA2C;AACjF,QAAI;AACF,YAAM,aAAa,OAAO,SAAS;AACnC,YAAM,QAAQ,KAAK,cAAc;AAEjC,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,YAAY,yBAAyB;AAAA,QACxE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,QAAQ;AAAA,QACV,CAAsB;AAAA,MACxB,CAAC;AAED,YAAM,OAAO,MAAM,SAAS,KAAK;AAGjC,UAAI,CAAC,SAAS,IAAI;AAEhB,cAAM,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC;AAAA,MACtC;AAGA,UAAI,KAAK,SAAS,KAAK,KAAK,QAAQ,KAAK,KAAK,YAAY,OAAO;AAE/D,cAAM,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC;AAAA,MACtC;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AAEd,UAAI,iBAAiB,SAAS,MAAM,QAAQ,WAAW,GAAG,GAAG;AAC3D,cAAM;AAAA,MACR;AAEA,YAAM,IAAI,MAAM,iBAAiB,QAAQ,MAAM,UAAU,8DAAY;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,OAAe;AACjC,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,KAAK,YAAY,qCAAqC,mBAAmB,KAAK,CAAC;AAAA,MACpF;AACA,aAAO,MAAM,SAAS,KAAK;AAAA,IAC7B,SAAS,OAAO;AAEd,aAAO,EAAE,SAAS,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,2BAAO;AAAA,IAClF;AAAA,EACF;AAAA,EAEQ,gBAAwB;AAC9B,UAAM,YAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAC5D,QAAI,QAAQ,UAAU,IAAI,OAAO;AAEjC,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,qBAAuF;AAErF,UAAM,YAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAC5D,UAAM,QAAQ,UAAU,IAAI,OAAO;AACnC,UAAM,mBAAmB,UAAU,IAAI,cAAc;AACrD,UAAM,QAAQ,UAAU,IAAI,OAAO;AACnC,UAAM,YAAY,UAAU,IAAI,MAAM;AAGtC,QAAI,YAA2B;AAC/B,QAAI;AACF,UAAI,OAAO,SAAS,QAAQ,OAAO,SAAS,KAAK,SAAS,GAAG;AAC3D,cAAM,OAAO,OAAO,SAAS,KAAK,MAAM,CAAC;AACzC,cAAM,aAAa,IAAI,gBAAgB,IAAI;AAC3C,oBAAY,WAAW,IAAI,cAAc,KAAK,WAAW,IAAI,OAAO,KAAK;AAAA,MAC3E;AAAA,IACF,QAAQ;AACN,kBAAY;AAAA,IACd;AAGA,UAAM,aAAa,oBAAoB,SAAS;AAKhD,QAAI,CAAC,cAAc,OAAO,OAAO,OAAO,QAAQ,QAAQ;AACtD,UAAI;AACF,cAAM,UAAU,OAAO,OAAO,IAAI,SAAS,QAAQ,EAAE;AACrD,YAAI,SAAS;AACX,gBAAM,KAAK,IAAI,IAAI,OAAO;AAC1B,gBAAM,YAAY,IAAI,gBAAgB,GAAG,MAAM;AAC/C,gBAAM,WAAW,UAAU,IAAI,cAAc,KAAK,UAAU,IAAI,OAAO,KAAK;AAC5E,cAAI,UAAU;AACZ,iBAAK,aAAa,QAAQ;AAC1B,gBAAI;AACF,wBAAU,OAAO,OAAO;AACxB,wBAAU,OAAO,cAAc;AAC/B,wBAAU,OAAO,YAAY;AAC7B,iBAAG,SAAS,UAAU,SAAS;AAC/B,iBAAG,OAAO;AACV,qBAAO,IAAI,QAAQ,aAAa,CAAC,GAAG,SAAS,OAAO,GAAG,SAAS,CAAC;AAAA,YACnE,QAAQ;AAAA,YAER;AACA,mBAAO,EAAE,SAAS,MAAM,OAAO,SAAS;AAAA,UAC1C;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,QAAI,YAAY;AACd,UAAI,OAAO;AACX,UAAI,WAAW;AACb,YAAI;AACF,iBAAO,KAAK,MAAM,mBAAmB,SAAS,CAAC;AAAA,QACjD,SAAS,GAAG;AAAA,QAAC;AAAA,MACf;AACA,WAAK,aAAa,UAAU;AAE5B,UAAI;AACF,cAAM,IAAI,IAAI,IAAI,OAAO,SAAS,IAAI;AACtC,UAAE,aAAa,OAAO,cAAc;AACpC,UAAE,aAAa,OAAO,YAAY;AAElC,UAAE,OAAO;AAET,eAAO,QAAQ,aAAa,CAAC,GAAG,SAAS,OAAO,EAAE,SAAS,CAAC;AAAA,MAC9D,SAAS,GAAG;AACV,YAAI;AACF,iBAAO,QAAQ,aAAa,CAAC,GAAG,SAAS,OAAO,OAAO,SAAS,QAAQ;AAAA,QAC1E,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,MAAM,OAAO,YAAY,KAAK;AAAA,IAClD;AAEA,QAAI,OAAO;AACT,aAAO,QAAQ,aAAa,CAAC,GAAG,SAAS,OAAO,OAAO,SAAS,QAAQ;AACxE,aAAO,EAAE,SAAS,OAAO,OAAO,mBAAmB,KAAK,EAAE;AAAA,IAC5D;AAEA,UAAM,YAAY,KAAK,iBAAiB;AACxC,QAAI,aAAa,UAAU,OAAO;AAChC,aAAO,EAAE,SAAS,MAAM,GAAG,UAAU;AAAA,IACvC;AAEA,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,OAAwD;AACxE,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,YAAY,oBAAoB;AAAA,QACnE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe,UAAU,KAAK;AAAA,QAChC;AAAA,MACF,CAAC;AAED,UAAI,SAAS,IAAI;AACf,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAI,KAAK,SAAS;AAChB,iBAAO,EAAE,OAAO,MAAM,MAAM,KAAK,KAAK;AAAA,QACxC;AAAA,MACF;AAEA,aAAO,EAAE,OAAO,MAAM;AAAA,IACxB,SAAS,OAAO;AAEd,aAAO,EAAE,OAAO,MAAM;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,mBAA8C;AACpD,QAAI;AACF,UAAI,QAAuB;AAC3B,UAAI;AACF,cAAM,EAAE,UAAAA,UAAS,IAAI;AACrB,YAAIA,UAAU,SAAQA,UAAS;AAAA,MACjC,QAAQ;AACN,gBAAQ;AAAA,MACV;AACA,UAAI,CAAC,MAAO,QAAO;AACnB,aAAO,EAAE,MAAM;AAAA,IACjB,SAAS,GAAG;AACV,cAAQ,MAAM,8CAA8C,CAAC;AAC7D,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,OAAqB;AACxC,QAAI;AACF,UAAI;AACF,cAAM,EAAE,UAAAC,UAAS,IAAI;AACrB,YAAIA,UAAU,CAAAA,UAAS,KAAK;AAAA,MAC9B,QAAQ;AAAA,MAER;AAAA,IAGF,SAAS,GAAG;AACV,cAAQ,MAAM,6CAA6C,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,OAA8B;AACzC,QAAI;AACF,YAAM,MAAM,GAAG,KAAK,YAAY,oBAAoB;AAAA,QAClD,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe,UAAU,KAAK;AAAA,QAChC;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AAAA,IAEhB;AAAA,EACF;AACF;AAGO,IAAM,cAAc,IAAI,mBAAmB;AAG3C,IAAM,eAAe;AAGrB,SAAS,0BAA0B,OAAe,SAAkB;AACzE,SAAO,YAAY,0BAA0B,OAAO,OAAO;AAC7D;AAEO,SAAS,mBAAmB,OAAe,MAAc;AAC9D,SAAO,YAAY,mBAAmB,OAAO,IAAI;AACnD;AAEO,SAAS,cAAc,OAAe;AAC3C,SAAO,YAAY,cAAc,KAAK;AACxC;;;ACnlBA,IAAM,mBAAN,MAAuB;AAAA,EAMrB,YAAY,UAAmC,CAAC,GAAG;AACjD,SAAK,UAAU,QAAQ,SAAS,QAAQ,QAAQ,EAAE,KAAK;AACvD,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,EAAE,gBAAgB,oBAAoB,GAAI,QAAQ,WAAW,CAAC,EAAG;AAChF,SAAK,YAAY,QAAQ,aAAa,MAAM,KAAK,UAAU;AAAA,EAC7D;AAAA,EAEQ,aAAa,OAAgC;AACnD,UAAM,IAA4B,EAAE,GAAG,KAAK,SAAS,GAAI,SAAS,CAAC,EAAG;AACtE,QAAI,KAAK,UAAU,CAAC,EAAE,eAAe,GAAG;AACtC,QAAE,eAAe,IAAI,UAAU,KAAK,MAAM;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,SAAS,MAAyC;AAC9D,QAAI;AACF,aAAO,MAAM,KAAK,KAAK;AAAA,IACzB,SAAS,IAAI;AACX,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,gBACX,YACA,QACA,SAC6B;AAC7B,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,+EAA+E;AAAA,IACjG;AAEA,UAAM,MAAM,GAAG,KAAK,OAAO,aAAa,UAAU;AAElD,QAAI;AACF,YAAM,MAAM,MAAM,KAAK,UAAU,KAAK;AAAA,QACpC,QAAQ;AAAA,QACR,SAAS,KAAK,aAAa;AAAA,QAC3B,MAAM,KAAK,UAAU,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC1C,CAAgB;AAEhB,YAAM,OAAO,MAAM,KAAK,SAAS,GAAG;AACpC,UAAI,CAAC,IAAI,IAAI;AACX,eAAO,EAAE,SAAS,OAAO,OAAQ,MAAc,SAAS,QAAQ,IAAI,MAAM,GAAG;AAAA,MAC/E;AAEA,aAAQ,QAA+B,EAAE,SAAS,KAAK;AAAA,IACzD,SAAS,OAAO;AACd,aAAO,EAAE,SAAS,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,gBAAgB;AAAA,IAC3F;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,UAAmC,CAAC,GAAG;AAC5E,SAAO,IAAI,iBAAiB,OAAO;AACrC;AAEO,IAAM,aAAa,uBAAuB,EAAE,SAAS,2BAA2B,CAAC;;;ACtFxF,mBAAkB;AAIlB,IAAM,UAAN,MAAc;AAAA,EAKZ,YAAY,QAAuB;AAFnC,4BAAiD,oBAAI,IAAI;AAGvD,SAAK,WAAW,aAAAC,QAAM,OAAO;AAAA,MAC3B,GAAG;AAAA,MACH,gBAAgB,CAAC,WAAW;AAC1B,eAAO,UAAU,OAAO,SAAS;AAAA,MACnC;AAAA,IACF,CAAC;AAED,SAAK,eAAe,OAAO;AAC3B,SAAK,SAAS,aAAa,QAAQ;AAAA,MACjC,KAAK,cAAc;AAAA,MACnB,KAAK,cAAc;AAAA,IACrB;AACA,SAAK,SAAS,aAAa,SAAS;AAAA,MAClC,KAAK,cAAc;AAAA,MACnB,KAAK,cAAc;AAAA,IACrB;AAEA,SAAK,SAAS,aAAa,QAAQ;AAAA,MACjC,CAACC,YAAW;AACV,eAAOA;AAAA,MACT;AAAA,MACA,CAAC,QAAQ;AACP,eAAO,QAAQ,OAAO,GAAG;AAAA,MAC3B;AAAA,IACF;AAEA,SAAK,SAAS,aAAa,SAAS;AAAA,MAClC,CAAC,QAAQ;AACP,eAAO,IAAI;AAAA,MACb;AAAA,MACA,CAAC,QAAQ;AACP,YAAI,aAAAD,QAAM,SAAS,GAAG,GAAG;AACvB,iBAAO,QAAQ,OAAO;AAAA,YACpB,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,eAAe;AAAA,UACjB,CAAC;AAAA,QACH;AAEA,YAAI,IAAI,UAAU,MAAM,OAAO;AAC7B,iBAAO,QAAQ,OAAO,IAAI,SAAS,KAAK,KAAK;AAAA,QAC/C;AAEA,eAAO,QAAQ,OAAO,GAAG;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc,KAAa;AACzB,SAAK,iBAAiB,QAAQ,CAAC,YAAY,QAAQ;AACjD,UAAI,IAAI,SAAS,GAAG,GAAG;AACrB,mBAAW,MAAM;AACjB,aAAK,iBAAiB,OAAO,GAAG;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoB;AAClB,SAAK,iBAAiB,QAAQ,CAAC,eAAe;AAC5C,iBAAW,MAAM;AAAA,IACnB,CAAC;AACD,SAAK,iBAAiB,MAAM;AAAA,EAC9B;AAAA,EAEA,QAAiB,QAAsC;AACrD,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,MAAM,OAAO,OAAO;AAC1B,UAAM,SAAS,OAAO,UAAU;AAChC,UAAM,MAAM,GAAG,MAAM,IAAI,GAAG;AAC5B,SAAK,iBAAiB,IAAI,KAAK,UAAU;AAEzC,WAAO,SAAS,WAAW;AAC3B,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAI,OAAO,cAAc,oBAAoB;AAC3C,iBAAS,OAAO,aAAa,mBAAmB,MAAoC;AAAA,MACtF;AACA,WAAK,SACF,QAAgB,MAAM,EACtB,KAAK,CAAC,QAAQ;AACb,aAAK,iBAAiB,OAAO,GAAG;AAChC,YAAI,OAAO,cAAc,qBAAqB;AAC5C,gBAAM,OAAO,aAAa,oBAAoB,GAAG;AAAA,QACnD;AACA,gBAAQ,GAAG;AAAA,MACb,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,aAAK,iBAAiB,OAAO,GAAG;AAEhC,eAAO,GAAG;AAAA,MACZ,CAAC;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,IAAa,QAAsC;AACjD,WAAO,KAAK,QAAW,EAAE,GAAG,QAAQ,QAAQ,MAAM,CAAC;AAAA,EACrD;AAAA,EAEA,KAAc,QAAsC;AAClD,WAAO,KAAK,QAAW,EAAE,GAAG,QAAQ,QAAQ,OAAO,CAAC;AAAA,EACtD;AAAA,EAEA,OAAgB,QAAsC;AACpD,WAAO,KAAK,QAAW,EAAE,GAAG,QAAQ,QAAQ,SAAS,CAAC;AAAA,EACxD;AAAA,EAEA,IAAa,QAAsC;AACjD,WAAO,KAAK,QAAW,EAAE,GAAG,QAAQ,QAAQ,MAAM,CAAC;AAAA,EACrD;AAAA,EAEA,MAAe,QAAsC;AACnD,WAAO,KAAK,QAAW,EAAE,GAAG,QAAQ,QAAQ,QAAQ,CAAC;AAAA,EACvD;AACF;AAEA,IAAO,kBAAQ;;;ACzGR,SAAS,4BAA4B,UAAkC,CAAC,GAAG;AAChF,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,WAAW,QAAQ,WAAW,oCAAoC,QAAQ,QAAQ,EAAE;AAC1F,QAAM,UAAU,GAAG,OAAO,GAAG,SAAS,WAAW,GAAG,IAAI,KAAK,GAAG,GAAG,QAAQ,GAAG,QAAQ,QAAQ,EAAE;AAEhG,QAAM,SACJ,QAAQ,mBACR,IAAI,gBAAQ;AAAA,IACV,SAAS;AAAA,IACT,SAAS,QAAQ,WAAW;AAAA,IAC5B,cAAc;AAAA,MACZ,oBAAoB,CAAC,WAAgB;AACnC,eAAO,UAAU,OAAO,WAAW,CAAC;AACpC,YAAI,QAAQ,UAAU,CAAC,OAAO,QAAQ,eAAe,GAAG;AACtD,iBAAO,QAAQ,eAAe,IAAI,UAAU,QAAQ,MAAM;AAAA,QAC5D;AACA,YAAI,QAAQ,SAAS;AACnB,iBAAO,UAAU,EAAE,GAAI,OAAO,WAAW,CAAC,GAAI,GAAG,QAAQ,QAAQ;AAAA,QACnE;AACA,eAAO;AAAA,MACT;AAAA,MACA,yBAAyB,CAAC,QAAa,QAAQ,OAAO,GAAG;AAAA,MACzD,qBAAqB,CAAC,QAAa;AAAA,MACnC,0BAA0B,CAAC,QAAa,QAAQ,OAAO,GAAG;AAAA,IAC5D;AAAA,EACF,CAAC;AAEH,SAAO;AAAA,IACL,MAAM,gBACJ,YACA,QACA,MAC6B;AAE7B,YAAM,MAAM,GAAG,OAAO,aAAa,UAAU;AAE7C,YAAM,OAAO,MAAM,OAAO,KAAK,EAAE,KAAK,MAAM,EAAE,QAAQ,SAAS,KAAK,EAAE,CAAkB;AACxF,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACZO,SAAS,kBAAkB,GAAa,MAAqB,CAAC,GAAY;AAC/E,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,EAAE,eAAe,SAAU,QAAO;AACtC,MAAI,EAAE,eAAe,WAAW;AAC9B,QAAI,IAAI,aAAa,EAAE,aAAa,IAAI,cAAc,EAAE,UAAW,QAAO;AAC1E,QAAI,IAAI,eAAe,IAAI,YAAY,SAAS,cAAc,EAAG,QAAO;AACxE,WAAO;AAAA,EACT;AACA,MAAI,EAAE,eAAe,WAAW;AAC9B,QAAI,IAAI,UAAU,EAAE,WAAW,IAAI,WAAW,EAAE,QAAS,QAAO;AAChE,QAAI,IAAI,gBAAgB,IAAI,YAAY,SAAS,mBAAmB,KAAK,IAAI,YAAY,SAAS,OAAO,GAAI,QAAO;AACpH,WAAO;AAAA,EACT;AACA,MAAI,EAAE,eAAe,UAAU;AAC7B,QAAI,IAAI,UAAU,EAAE,cAAc,EAAE,WAAW,SAAS,IAAI,MAAM,EAAG,QAAO;AAC5E,QAAI,IAAI,gBAAgB,IAAI,YAAY,SAAS,mBAAmB,KAAK,IAAI,YAAY,SAAS,OAAO,GAAI,QAAO;AACpH,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC/DO,SAAS,sBAAsB,KAAc;AAClD,SAAO;AAAA,IACL,MAAM,OAAO,OAA+C;AAC1D,aAAO,MAAM,IAAI,KAAK,EAAE,KAAK,cAAc,MAAM,MAAM,CAAC;AAAA,IAC1D;AAAA,IACA,MAAM,KAAK,OAAgD;AACzD,aAAO,MAAM,IAAI,IAAI,EAAE,KAAK,cAAc,QAAQ,MAAM,CAAC;AAAA,IAC3D;AAAA,IACA,MAAM,IAAI,IAA+B;AACvC,aAAO,MAAM,IAAI,IAAI,EAAE,KAAK,cAAc,mBAAmB,EAAE,CAAC,GAAG,CAAC;AAAA,IACtE;AAAA,IACA,MAAM,cAAc,IAAY,YAAmC;AACjE,YAAM,IAAI,MAAM,EAAE,KAAK,cAAc,mBAAmB,EAAE,CAAC,eAAe,MAAM,EAAE,WAAW,EAAE,CAAC;AAAA,IAClG;AAAA,IACA,MAAM,OAAO,IAA2B;AACtC,YAAM,IAAI,OAAO,EAAE,KAAK,cAAc,mBAAmB,EAAE,CAAC,GAAG,CAAC;AAAA,IAClE;AAAA;AAAA,IAEA,eAAe,GAAa,KAAoB;AAE9C,UAAI,CAAC,EAAG,QAAO;AACf,UAAI,EAAE,eAAe,SAAU,QAAO;AACtC,UAAI,EAAE,eAAe,UAAW,QAAO,QAAQ,IAAI,aAAa,EAAE,aAAa,IAAI,cAAc,EAAE,SAAS;AAC5G,UAAI,EAAE,eAAe,UAAW,QAAO,QAAQ,IAAI,UAAU,EAAE,WAAW,IAAI,WAAW,EAAE,OAAO;AAClG,UAAI,EAAE,eAAe,SAAU,QAAO,QAAQ,IAAI,UAAU,EAAE,cAAc,EAAE,WAAW,SAAS,IAAI,MAAM,CAAC;AAC7G,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACxBA;AACA;AACA;AACA;;;ACOA,IAAM,oBAAoB,CAAC,SAAS,gBAAgB,QAAQ,YAAY;AAEjE,SAAS,6BAA6B,MAAwB;AACnE,MAAI,OAAO,WAAW,YAAa;AACnC,MAAI;AACF,UAAM,EAAE,UAAU,iBAAiB,cAAc,MAAM,UAAU,IAAI,QAAQ,CAAC;AAC9E,UAAM,QAAQ,mBAAmB,gBAAgB,SAAS,IAAI,kBAAkB,mBAAmB,IAAI,OAAK,EAAE,YAAY,CAAC;AAC3H,UAAM,SAAS,OAAO,SAAS;AAC/B,UAAM,MAAM,IAAI,IAAI,MAAM;AAE1B,QAAI,UAAU;AACZ,UAAI,SAAS;AAAA,IACf,WAAW,IAAI,QAAQ;AACrB,UAAI,UAAU;AACd,iBAAW,CAAC,CAAC,KAAK,IAAI,cAAc;AAClC,YAAI,KAAK,SAAS,EAAE,YAAY,CAAC,GAAG;AAClC,cAAI,aAAa,OAAO,CAAC;AACzB,oBAAU;AAAA,QACZ;AAAA,MACF;AACA,UAAI,SAAS;AACX,cAAM,KAAK,IAAI,aAAa,SAAS;AACrC,YAAI,SAAS,KAAK,IAAI,EAAE,KAAK;AAAA,MAC/B;AAAA,IACF;AAEA,QAAI,eAAe,IAAI,MAAM;AAC3B,YAAM,MAAM,IAAI,KAAK,MAAM,CAAC;AAC5B,UAAI,IAAI,SAAS,GAAG,GAAG;AACrB,cAAM,KAAK,IAAI,gBAAgB,GAAG;AAClC,YAAI,UAAU;AACd,mBAAW,CAAC,CAAC,KAAK,IAAI;AACpB,cAAI,YAAY,KAAK,SAAS,EAAE,YAAY,CAAC,GAAG;AAC9C,eAAG,OAAO,CAAC;AACX,sBAAU;AAAA,UACZ;AAAA,QACF;AACA,YAAI,SAAS;AACX,gBAAM,KAAK,GAAG,SAAS;AACvB,cAAI,OAAO,KAAK,IAAI,EAAE,KAAK;AAAA,QAC7B;AAAA,MACF,OAAO;AACL,YAAI,CAAC,YAAY,KAAK,KAAK,OAAK,IAAI,YAAY,EAAE,WAAW,CAAC,CAAC,GAAG;AAChE,cAAI,OAAO;AAAA,QACb,WAAW,UAAU;AACnB,cAAI,OAAO;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO,IAAI,WAAW,IAAI,SAAS,IAAI;AAC7C,QAAI,SAAS,OAAO,SAAS,WAAW,OAAO,SAAS,SAAS,OAAO,SAAS,MAAM;AACrF,aAAO,QAAQ,aAAa,OAAO,QAAQ,OAAO,SAAS,OAAO,IAAI;AACtE,mBAAa,UAAU,IAAI;AAAA,IAC7B;AAAA,EACF,SAAS,GAAG;AAEV,YAAQ,KAAK,iCAAiC,CAAC;AAAA,EACjD;AACF;AAkBO,SAAS,2BAA2B,MAAqC;AAC9E,MAAI,OAAO,WAAW,YAAa;AACnC,MAAI,OAAO,iCAAkC;AAC7C,SAAO,mCAAmC;AAE1C,QAAM,UAAU,MAAM,kBAAkB,CAAC;AACzC,WAAS,QAAQ,IAAkB;AACjC,QAAI;AACF,UAAI,CAAC,GAAG,QAAQ,OAAO,GAAG,SAAS,SAAU;AAC7C,UAAI,GAAG,KAAK,SAAS,kBAAmB;AACxC,UAAI,QAAQ,SAAS,KAAK,CAAC,QAAQ,SAAS,GAAG,MAAM,EAAG;AACxD,mCAA6B;AAAA,QAC3B,UAAU,MAAM,YAAY,CAAC,CAAC,GAAG,KAAK;AAAA,QACtC,iBAAiB,MAAM;AAAA,MACzB,CAAC;AAED,UAAI;AAAE,QAAC,GAAG,QAAsC,YAAY,EAAE,MAAM,sBAAsB,GAAG,GAAG,MAAa;AAAA,MAAE,QAAQ;AAAA,MAAe;AAAA,IACxI,QAAQ;AAAA,IAAe;AAAA,EACzB;AACA,SAAO,iBAAiB,WAAW,OAAO;AAE1C,MAAI,OAAO,MAAM,cAAc,UAAU;AACvC,eAAW,MAAM,6BAA6B,EAAE,UAAU,KAAK,UAAU,iBAAiB,KAAK,gBAAgB,CAAC,GAAG,KAAK,SAAS;AAAA,EACnI;AACF;;;ADlGA,SAAS,0BAAyC;AAChD,MAAI;AACF,WAAO,SAAa,KAAK;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,UAAU,IAAI,gBAAQ;AAAA,EACjC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,cAAc;AAAA,IACZ,oBAAoB,CAAC,WAAuC;AAC1D,aAAO,UAAU,OAAO,WAAW,CAAC;AAGpC,UAAI,CAAC,OAAO,QAAQ,eAAe,GAAG;AACpC,cAAM,iBAAiB,wBAAwB;AAC/C,YAAI,gBAAgB;AAClB,iBAAO,QAAQ,eAAe,IAAI,UAAU,cAAc;AAAA,QAC5D;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IACA,yBAAyB,CAAC,QAAoB;AAC5C,aAAO,QAAQ,OAAO,GAAG;AAAA,IAC3B;AAAA,IACA,qBAAqB,CAAC,QAAuB;AAC3C,aAAO;AAAA,IACT;AAAA,IACA,0BAA0B,CAAC,QAAoB;AAC7C,aAAO,QAAQ,OAAO,GAAG;AAAA,IAC3B;AAAA,EACF;AACF,CAAC;AAGM,IAAM,YAAY,IAAI,gBAAQ;AAAA,EACnC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,cAAc;AAAA,IACZ,oBAAoB,CAAC,WAAuC;AAC1D,aAAO,UAAU,OAAO,WAAW,CAAC;AAGpC,UAAI,CAAC,OAAO,QAAQ,eAAe,GAAG;AACpC,cAAM,iBAAiB,wBAAwB;AAC/C,YAAI,gBAAgB;AAClB,iBAAO,QAAQ,eAAe,IAAI,UAAU,cAAc;AAAA,QAC5D;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IACA,yBAAyB,CAAC,QAAoB;AAC5C,aAAO,QAAQ,OAAO,GAAG;AAAA,IAC3B;AAAA,IACA,qBAAqB,CAAC,QAAuB;AAC3C,aAAO;AAAA,IACT;AAAA,IACA,0BAA0B,CAAC,QAAoB;AAC7C,aAAO,QAAQ,OAAO,GAAG;AAAA,IAC3B;AAAA,EACF;AACF,CAAC;AAIM,IAAM,kBAAkB;AAM/B,SAAS,6BAA6B,KAAc,WAAoB;AACtE,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,SAAS,kBAAkB,OAAO,SAAS,CAAC;AAElD,WAAS,aAAa,KAAc;AAClC,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,IAAI,OAAO,GAAG;AACpB,QAAI,EAAE,WAAW,MAAM,EAAG,QAAO;AACjC,QAAI,eAAe,KAAK,CAAC,KAAK,EAAE,WAAW,IAAI,EAAG,QAAO;AAEzD,QAAI,EAAE,WAAW,OAAO,EAAG,QAAO;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU;AAAA,IACd,UAAU,IAAI;AAAA,IACd,SAAS,CAAC,WAA0B;AAClC,UAAI;AACF,YAAI,UAAU,OAAO,OAAO,QAAQ,YAAY,aAAa,OAAO,GAAG,GAAG;AACxE,mBAAS,EAAE,GAAG,QAAQ,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,GAAG;AAAA,QACtD;AAAA,MACF,SAAS,IAAI;AAAA,MAEb;AACA,aAAO,IAAI,QAAQ,MAAM;AAAA,IAC3B;AAAA,IACA,KAAK,CAAC,WAA0B,QAAQ,QAAQ,EAAE,GAAG,QAAQ,QAAQ,MAAM,CAAC;AAAA,IAC5E,MAAM,CAAC,WAA0B,QAAQ,QAAQ,EAAE,GAAG,QAAQ,QAAQ,OAAO,CAAC;AAAA,IAC9E,KAAK,CAAC,WAA0B,QAAQ,QAAQ,EAAE,GAAG,QAAQ,QAAQ,MAAM,CAAC;AAAA,IAC5E,OAAO,CAAC,WAA0B,QAAQ,QAAQ,EAAE,GAAG,QAAQ,QAAQ,QAAQ,CAAC;AAAA,IAChF,QAAQ,CAAC,WAA0B,QAAQ,QAAQ,EAAE,GAAG,QAAQ,QAAQ,SAAS,CAAC;AAAA,IAClF,eAAe,CAAC,QAAgB,IAAI,cAAc,GAAG;AAAA,IACrD,mBAAmB,MAAM,IAAI,kBAAkB;AAAA,EACjD;AAEA,SAAO;AACT;AAYO,SAAS,aAAa,MAmB1B;AAED,WAAS,oBAAoB,MAAe;AAC1C,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,IAAI,gBAAQ;AAAA,MACjB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,cAAc;AAAA,QACZ,oBAAoB,CAAC,WAAuC;AAC1D,iBAAO,UAAU,OAAO,WAAW,CAAC;AAGpC,cAAI,CAAC,OAAO,QAAQ,eAAe,GAAG;AACpC,kBAAM,iBAAiB,kBAAkB;AACzC,gBAAI,gBAAgB;AAClB,qBAAO,QAAQ,eAAe,IAAI,UAAU,cAAc;AAAA,YAC5D;AAAA,UACF;AAEA,iBAAO;AAAA,QACT;AAAA,QACA,yBAAyB,CAAC,QAAoB,QAAQ,OAAO,GAAG;AAAA,QAChE,qBAAqB,CAAC,QAAuB;AAAA,QAC7C,0BAA0B,CAAC,QAAoB,QAAQ,OAAO,GAAG;AAAA,MACnE;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,MAAM,MAAM,mBAAmB,oBAAoB,MAAM,OAAO,KAAK;AAC3E,QAAM,KAAK,MAAM,qBAAqB,oBAAoB,MAAM,SAAS,KAAK;AAE9E,QAAM,aAAa,6BAA6B,KAAK,MAAM,SAAS;AAEpE,MAAI,QAAuB;AAG3B,WAAS,oBAAmC;AAE1C,WAAO,SAAS,wBAAwB;AAAA,EAC1C;AAEA,MAAI;AACF,QAAI,MAAM,WAAW;AACnB,0BAAoB,OAAO,KAAK,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,MAAI;AACF,UAAM,gBAAgB,SAAa;AACnC,QAAI,eAAe;AACjB,cAAQ;AACR,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,WAAS,WAAW,GAAkB;AACpC,QAAI;AAEF,UAAI;AACF,YAAI,OAAQ,IAAY,UAAU;AAChC,cAAI,EAAG,CAAC,IAAY,SAAS,SAAS,QAAQ,OAAO,eAAe,IAAI,UAAU,CAAC;AAAA,cAC9E,QAAQ,IAAY,SAAS,SAAS,QAAQ,OAAO,eAAe;AAAA,QAC3E;AACA,YAAI,MAAO,GAAW,UAAU;AAC9B,cAAI,EAAG,CAAC,GAAW,SAAS,SAAS,QAAQ,OAAO,eAAe,IAAI,UAAU,CAAC;AAAA,cAC7E,QAAQ,GAAW,SAAS,SAAS,QAAQ,OAAO,eAAe;AAAA,QAC1E;AAAA,MACF,SAAS,IAAI;AAAA,MAEb;AAAA,IACF,SAAS,IAAI;AAAA,IAEb;AAAA,EACF;AAGA,QAAM,eAAe,MAAM;AACzB,QAAI,MAAM,KAAM,QAAO,KAAK;AAC5B,QAAI;AACF,UAAI,OAAO,WAAW;AACpB,eAAO,OAAO,SAAS,OAAO,MAAM,aAAa;AAAA,IACrD,SAAS,IAAI;AACX,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,GAAG;AAEH,iBAAe,YAAY;AAEzB,QAAI,MAAM,MAAM,UAAU;AACxB,UAAI;AACF,cAAM,IAAI,MAAM,KAAK,KAAK,SAAS;AACnC,YAAI,GAAG;AACL,kBAAQ;AACR,qBAAW,KAAK;AAChB;AAAA,QACF;AAAA,MACF,SAAS,IAAI;AAAA,MAEb;AAAA,IACF;AAEA,QAAI,gBAAgB,cAAc,MAAM,MAAM,gBAAgB;AAC5D,YAAM,UAAU,KAAK,KAAK,eAAe,kBAAkB,CAAC;AAC5D,YAAM,SAAS,KAAK,KAAK,eAAe,UAAU;AAGlD,YAAM,uBAAuB,MAAM,IAAI,QAAuB,CAAC,YAAY;AACzE,YAAI,WAAW;AACf,iBAAS,QAAQ,IAAkB;AACjC,cAAI;AACF,gBAAI,CAAC,GAAG,QAAQ,OAAO,GAAG,SAAS,SAAU;AAC7C,gBAAI,GAAG,KAAK,SAAS,eAAgB;AAErC,gBAAI,QAAQ,SAAS,KAAK,CAAC,QAAQ,SAAS,GAAG,MAAM,EAAG;AACxD,kBAAM,IAAI,GAAG,KAAK;AAClB,gBAAI,KAAK,CAAC,UAAU;AAClB,yBAAW;AACX,qBAAO,oBAAoB,WAAW,OAAO;AAC7C,sBAAQ,OAAO,CAAC,CAAC;AAAA,YACnB;AAAA,UACF,SAAS,IAAI;AAAA,UAEb;AAAA,QACF;AAEA,eAAO,iBAAiB,WAAW,OAAO;AAG1C,mBAAW,MAAM;AACf,cAAI,CAAC,UAAU;AACb,uBAAW;AACX,mBAAO,oBAAoB,WAAW,OAAO;AAC7C,oBAAQ,IAAI;AAAA,UACd;AAAA,QACF,GAAG,MAAM;AAAA,MACX,CAAC;AAED,UAAI,sBAAsB;AACxB,gBAAQ;AACR,mBAAW,KAAK;AAEhB,YAAI;AACF,gBAAM,MAAM,MAAM,MAAM;AACxB,cAAI,OAAO,OAAO,WAAW,aAAa;AACxC,kBAAM,QAAQ,IAAI,kCAAkC;AACpD,uBAAW,MAAM;AACf,2CAA6B;AAAA,gBAC3B,UAAU,IAAI;AAAA,gBACd,iBAAiB,IAAI;AAAA,cACvB,CAAC;AAAA,YACH,GAAG,KAAK;AAAA,UACV;AAAA,QACF,QAAQ;AAAA,QAER;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AAEF,QAAI,OAAO,WAAW,aAAa;AACjC,WAAK,UAAU;AAEf,UAAI,gBAAgB,cAAc,MAAM,MAAM,gBAAgB;AAC5D,mCAA2B;AAAA,UACzB,gBAAgB,KAAK,KAAK,eAAe;AAAA,UACzC,UAAU,KAAK,KAAK,eAAe;AAAA,UACnC,iBAAiB,KAAK,KAAK,eAAe;AAAA,UAC1C,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,IAAI;AAAA,EAEb;AAEA,SAAO;AAAA;AAAA,IAEL,WAAW,MAAM,aAAa;AAAA,IAC9B,SAAS;AAAA,IACT,WAAW;AAAA,IACX,iBAAiB;AAAA;AAAA,IAEjB,WAAW,sBAAsB,GAAG;AAAA,IAOpC,IAAI,YAAY;AACd,UAAI;AACF,cAAM,IACJ,UAAU,MAAM,MAAM,WAAW,MAAM,KAAK,KAAK,SAAS,IAAI,SAAS,SAAa;AACtF,YAAI,CAAC,EAAG,QAAO;AACf,eAAO,mBAAmB,CAAC;AAAA,MAC7B,SAAS,KAAK;AACZ,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,MAAM;AAAA,MACJ,UAAU,CAAC,MAAqB;AAC9B,gBAAQ;AACR,mBAAW,CAAC;AAAA,MACd;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,iBAAiB,MAAM,QAAQ,KAAK;AAAA;AAAA,MAEpC,OAAO,CAAC,aAAsB;AAE5B,YAAI,OAAO,WAAW,YAAa;AACnC,cAAM,MAAM,YAAY,OAAO,SAAS;AACxC,YAAI;AACF,gBAAM,OAAO,YAAY,KAAK;AAC9B,gBAAM,UAAU,IAAI,IAAI,SAAS,OAAO,IAAI,CAAC;AAC7C,kBAAQ,aAAa,IAAI,gBAAgB,OAAO,GAAG,CAAC;AACpD,cAAI,MAAM,UAAW,SAAQ,aAAa,IAAI,cAAc,OAAO,KAAK,SAAS,CAAC;AAClF,iBAAO,SAAS,OAAO,QAAQ,SAAS;AAAA,QAC1C,QAAQ;AAEN,gBAAM,UAAU,mBAAmB,OAAO,GAAG,CAAC;AAC9C,gBAAM,MAAM,MAAM,YACd,eAAe,mBAAmB,OAAO,KAAK,SAAS,CAAC,CAAC,KACzD;AACJ,gBAAM,OAAO;AACb,iBAAO,SAAS,OAAO,GAAG,IAAI,sBAAsB,OAAO,GAAG,GAAG;AAAA,QACnE;AAAA,MACF;AAAA,MACA,QAAQ,MAAM;AACZ,gBAAQ;AACR,mBAAW,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,IACA,aAAa,CAAC,MAA2D;AACvE,UAAI,OAAO,WAAW,YAAa;AACnC,mCAA6B;AAAA,QAC3B,UAAU,GAAG;AAAA,QACb,iBAAiB,GAAG;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AE7ZA,IAAAE,gBAA2C;AAC3C,IAAAA,gBAAqB;AACrB,0BAAwB;AAiIlB,IAAAC,sBAAA;AA7GC,IAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA,UAAU;AAAA,EACV,YAAY;AACd,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,EAAE;AACnC,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAiC,CAAC,CAAC;AACnF,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AACtD,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,KAAK;AAC9C,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAwB,IAAI;AAGhE,QAAM,cAAc,YAAY;AAE9B,YAAQ,IAAI,sBAAsB;AAAA,EACpC;AAEA,QAAM,cAAc,YAAY;AAE9B,YAAQ,IAAI,sBAAsB;AAAA,EACpC;AAEA,QAAM,gBAAgB,OAAOC,WAAkB;AAE7C,YAAQ,IAAI,iBAAiBA,QAAO,YAAY,OAAO;AACvD,gBAAY,IAAI;AAAA,EAClB;AAEA,QAAM,iBAAiB,OAAOA,QAAeC,UAAiB;AAE5D,YAAQ,IAAI,qBAAqBD,QAAO,SAASC,KAAI;AACrD,QAAI,eAAgB,gBAAe;AAAA,EACrC;AAEA,QAAM,aAAa,MAAM;AACvB,kBAAc,IAAI;AAClB,wBAAoB,CAAC,CAAC;AAAA,EACxB;AAEA,+BAAU,MAAM;AACd,QAAI,YAAY;AACd,UAAI;AACF,cAAM,WAAW,KAAK,MAAM,UAAU;AACtC,cAAM,YAAoC,CAAC;AAC3C,YAAI,SAAS,SAAS,KAAK;AACzB,oBAAU,OAAO,SAAS,OAAO;AAAA,QACnC,WAAW,SAAS,MAAM,SAAS,OAAO,SAAS,MAAM,SAAS;AAChE,cAAI,UAAU;AACZ,sBAAU,OAAO,SAAS,KAAK;AAAA,UACjC,OAAO;AACL,sBAAU,OAAO,SAAS,KAAK;AAAA,UACjC;AAAA,QACF,WAAW,SAAS,KAAK;AACvB,oBAAU,OAAO,SAAS;AAAA,QAC5B,WAAW,SAAS,MAAM,SAAS;AACjC,oBAAU,OAAO,SAAS,KAAK;AAAA,QACjC,OAAO;AACL,oBAAU,OAAO;AAAA,QACnB;AACA,4BAAoB,SAAS;AAAA,MAC/B,SAAS,GAAG;AACV,4BAAoB,EAAE,MAAM,WAAW,CAAC;AAAA,MAC1C;AACA,YAAM,QAAQ,WAAW,MAAM;AAC7B,mBAAW;AAAA,MACb,GAAG,GAAI;AACP,aAAO,MAAM,aAAa,KAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,YAAY,QAAQ,CAAC;AAEzB,QAAM,eAAe,OAAO,MAAwC;AAClE,MAAE,eAAe;AACjB,UAAM,WAAW,IAAI,SAAS,EAAE,aAAa;AAC7C,wBAAoB,CAAC,CAAC;AACtB,QAAI,CAAC,UAAU;AACb,YAAM,aAAa,SAAS,IAAI,OAAO;AACvC,UAAI,CAAC,YAAY;AACf,4BAAoB,EAAE,OAAO,kCAAkC,CAAC;AAChE;AAAA,MACF;AACA,sBAAgB,IAAI;AACpB,UAAI;AACF,cAAM,cAAc,UAAU;AAC9B,iBAAS,UAAU;AAAA,MACrB,SAAS,OAAO;AACd,sBAAc,iBAAiB,QAAQ,MAAM,UAAU,qBAAqB;AAAA,MAC9E,UAAE;AACA,wBAAgB,KAAK;AAAA,MACvB;AAAA,IACF,OAAO;AACL,YAAM,YAAY;AAClB,UAAI,CAAC,aAAa,UAAU,WAAW,GAAG;AACxC,4BAAoB,EAAE,MAAM,6CAA6C,CAAC;AAC1E;AAAA,MACF;AACA,sBAAgB,IAAI;AACpB,UAAI;AACF,cAAM,eAAe,OAAO,SAAS;AAAA,MACvC,SAAS,OAAO;AACd,sBAAc,iBAAiB,QAAQ,MAAM,UAAU,cAAc;AAAA,MACvE,UAAE;AACA,wBAAgB,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,SACE,8CAAC,SAAI,WAAW,oBAAoB,SAAS,IAC3C;AAAA,kDAAC,SAAI,WAAU,aACb;AAAA,mDAAC,QAAG,WAAU,oCAAmC,2BAAa;AAAA,MAC9D,6CAAC,OAAE,WAAU,yBAAwB,+CAAiC;AAAA,OACxE;AAAA,IAEA,8CAAC,UAAK,WAAU,aAAY,UAAU,cACpC;AAAA,oDAAC,SAAI,WAAU,aACb;AAAA,qDAAC,WAAM,SAAQ,SAAQ,WAAU,2CAA0C,mBAAK;AAAA,QAChF;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,CAAC,MAA2C;AACpD,oBAAM,QAAQ,EAAE,OAAO;AACvB,uBAAS,KAAK;AACd,kBAAI,iBAAiB,OAAO;AAC1B,sBAAM,YAAY,EAAE,GAAG,iBAAiB;AACxC,uBAAO,UAAU;AACjB,oCAAoB,SAAS;AAAA,cAC/B;AAAA,YACF;AAAA,YACA,UAAQ;AAAA,YACR,gBAAc,CAAC,CAAC,iBAAiB;AAAA,YACjC,WAAU;AAAA,YACV,aAAY;AAAA;AAAA,QACd;AAAA,QACC,iBAAiB,SAChB,6CAAC,OAAE,WAAU,wBAAwB,2BAAiB,OAAM;AAAA,SAEhE;AAAA,MAEC,YACC,8CAAC,SAAI,WAAU,aACb;AAAA,qDAAC,WAAM,WAAU,2CAA0C,+BAAiB;AAAA,QAC5E;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW;AAAA,YACX,OAAO;AAAA,YACP,UAAU,CAAC,MAA2C;AACpD,oBAAM,QAAQ,EAAE,OAAO,MAAM,QAAQ,OAAO,EAAE;AAC9C,sBAAQ,KAAK;AACb,kBAAI,iBAAiB,MAAM;AACzB,sBAAM,YAAY,EAAE,GAAG,iBAAiB;AACxC,uBAAO,UAAU;AACjB,oCAAoB,SAAS;AAAA,cAC/B;AAAA,YACF;AAAA,YACA,gBAAc,CAAC,CAAC,iBAAiB;AAAA,YACjC,WAAU;AAAA,YACV,aAAY;AAAA;AAAA,QACd;AAAA,QACC,iBAAiB,QAChB,6CAAC,OAAE,WAAU,wBAAwB,2BAAiB,MAAK;AAAA,SAE/D;AAAA,MAGD,iBAAiB,QAChB,6CAAC,SAAI,WAAU,uEACb,wDAAC,SAAI,WAAU,qBACb;AAAA,qDAAC,sBAAK,MAAK,0BAAyB,WAAU,qBAAoB;AAAA,QAClE,6CAAC,UAAM,2BAAiB,MAAK;AAAA,SAC/B,GACF;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU,gBAAgB,CAAC,SAAU,YAAY,KAAK,WAAW;AAAA,UACjE,aAAW;AAAA,UAEV;AAAA,4BACC,6CAAC,+BAAQ,WAAU,6BAA4B;AAAA,YAEhD,WAAY,eAAe,kBAAkB,YAAc,eAAe,eAAe;AAAA;AAAA;AAAA,MAC5F;AAAA,OACF;AAAA,IAEA,8CAAC,SAAI,WAAU,aACb;AAAA,oDAAC,SAAI,WAAU,YACb;AAAA,qDAAC,SAAI,WAAU,sCACb,uDAAC,SAAI,WAAU,mCAAkC,GACnD;AAAA,QACA,6CAAC,SAAI,WAAU,wCACb,uDAAC,UAAK,WAAU,sBAAqB,yBAAW,GAClD;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM;AAAE,gBAAI,CAAC,cAAc;AAAE,yBAAW;AAAG,0BAAY;AAAA,YAAE;AAAA,UAAE;AAAA,UACpE,UAAU;AAAA,UAET;AAAA,2BACC,6CAAC,+BAAQ,WAAU,6BAA4B,IAE/C,6CAAC,sBAAK,MAAK,2BAA0B,WAAU,gBAAe;AAAA,YAE/D,eAAe,kBAAkB;AAAA;AAAA;AAAA,MACpC;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM;AAAE,gBAAI,CAAC,cAAc;AAAE,yBAAW;AAAG,0BAAY;AAAA,YAAE;AAAA,UAAE;AAAA,UACpE,UAAU;AAAA,UAET;AAAA,2BACC,6CAAC,+BAAQ,WAAU,6BAA4B,IAE/C,6CAAC,sBAAK,MAAK,cAAa,WAAU,gBAAe;AAAA,YAElD,eAAe,kBAAkB;AAAA;AAAA;AAAA,MACpC;AAAA,OACF;AAAA,KACF;AAEJ;;;ACzPA,IAAAC,gBAAsE;AACtE;;;ACDA,IAAAC,gBAA+D;AA0E3D,IAAAC,sBAAA;AA1DJ,IAAM,eAAmC;AAAA,EACvC,OAAO;AAAA,EACP,UAAU,MAAM;AAClB;AAEA,IAAM,2BAAuB,6BAAkC,YAAY;AAEpE,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,eAAe;AAAA,EACf,aAAa;AAAA,EACb,eAAe;AAAA,EACf,GAAG;AACL,GAAuB;AACrB,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAgB,MAAM;AAC9C,QAAI,cAAc;AAChB,mBAAa,QAAQ,YAAY,YAAY;AAC7C,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,aAAa,QAAQ,UAAU;AAE9C,UAAM,eAAe,UAAU;AAE/B,QAAI,CAAC,QAAQ;AACX,mBAAa,QAAQ,YAAY,YAAY;AAAA,IAC/C;AAEA,WAAO;AAAA,EACT,CAAC;AAED,+BAAU,MAAM;AACd,UAAM,OAAO,OAAO,SAAS;AAE7B,SAAK,UAAU,OAAO,SAAS,MAAM;AAErC,QAAI,UAAU,UAAU;AACtB,YAAM,cAAc,OAAO,WAAW,8BAA8B,EACjE,UACC,SACA;AAEJ,WAAK,UAAU,IAAI,WAAW;AAC9B;AAAA,IACF;AAEA,SAAK,UAAU,IAAI,KAAK;AAAA,EAC1B,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,UAAU,CAACC,WAAiB;AAC1B,mBAAa,QAAQ,YAAYA,MAAK;AACtC,eAASA,MAAK;AAAA,IAChB;AAAA,EACF;AAEA,SACE,6CAAC,qBAAqB,UAArB,EAA+B,GAAG,OAAO,OACvC,UACH;AAEJ;AAEO,IAAM,WAAW,MAAM;AAC5B,QAAM,cAAU,0BAAW,oBAAoB;AAE/C,MAAI,YAAY;AACd,UAAM,IAAI,MAAM,8CAA8C;AAEhE,SAAO;AACT;;;ACrFA,4BAA+B;AAI3B,IAAAC,sBAAA;AAFG,SAAS,uBAAuB;AACrC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAa;AAAA,MACb,aAAa;AAAA;AAAA,EACf;AAEJ;;;AF2FM,IAAAC,sBAAA;AAvFN,IAAM,oBAAgB,6BAAyC,IAAI;AAgC5D,IAAM,iBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,oBAAoB;AACtB,MAAM;AACJ,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,MAAM,mBAAmB,SAAS,CAAC,CAAC;AACrE,QAAM,CAAC,OAAO,aAAa,QAAI,wBAAwB,MAAM,SAAS,CAAC;AAGvE,+BAAU,MAAM;AACd,QAAI;AACF,YAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACzD,YAAM,WAAW,OAAO,IAAI,cAAc,KAAK,OAAO,IAAI,OAAO;AAEjE,UAAI,UAAU;AAEZ,iBAAS,QAAQ;AACjB,sBAAc,QAAQ;AACtB,gBAAQ,mBAAmB,QAAQ,CAAC;AAGpC,eAAO,OAAO,cAAc;AAC5B,eAAO,OAAO,OAAO;AACrB,cAAM,YAAY,OAAO,SAAS;AAClC,cAAM,SAAS,OAAO,SAAS,YAAY,YAAY,MAAM,YAAY,MAAM,OAAO,SAAS;AAC/F,eAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,MAAM;AAAA,MAC5C;AAAA,IACF,SAAS,GAAG;AACV,cAAQ,MAAM,sDAAsD,CAAC;AAAA,IACvE;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,MAAM;AACnB,QAAI;AACF,eAAS,IAAI;AAAA,IACf,QAAQ;AAAA,IAAe;AACvB,kBAAc,IAAI;AAClB,YAAQ,IAAI;AAAA,EACd;AAEA,QAAM,QAA4B;AAAA,IAChC;AAAA,IACA;AAAA,IACA,iBAAiB,CAAC,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,YAAY;AAAA,MACZ,cAAc;AAAA,MAEd;AAAA,sDAAC,cAAc,UAAd,EAAuB,OACrB;AAAA;AAAA,UACA,sBACC,6CAAC,kBAAe,SAAS,MAAM,OAAO,KAAK,qBAAqB,QAAQ,GAAG;AAAA,WAE/E;AAAA,QACA,6CAAC,wBAAqB;AAAA;AAAA;AAAA,EACxB;AAEJ;AAEO,SAAS,mBAAmB;AACjC,QAAM,UAAM,0BAAW,aAAa;AACpC,MAAI,CAAC,KAAK;AAER,UAAM,IAAI,SAAS;AACnB,WAAO;AAAA,MACL,MAAM,mBAAmB,CAAC;AAAA,MAC1B,OAAO;AAAA,MACP,iBAAiB,CAAC,CAAC;AAAA,MACnB,QAAQ,MAAM;AAAE,YAAI;AAAE,mBAAS,IAAI;AAAA,QAAE,QAAQ;AAAA,QAAS;AAAA,MAAE;AAAA,IAC1D;AAAA,EACF;AACA,SAAO;AACT;;;AG1HA;;;ACJA;AACA;AAOA,IAAM,mBAAN,MAAuB;AAAA,EAAvB;AACE,SAAQ,YAAY,oBAAI,IAAgC;AACxD,SAAQ,UAAU;AAAA;AAAA,EAEV,OAAO;AACb,UAAM,QAAmB;AAAA,MACvB,MAAM,mBAAmB,SAAS,CAAC;AAAA,MACnC,WAAW,KAAK;AAAA,IAClB;AACA,eAAW,KAAK,KAAK,WAAW;AAC9B,UAAI;AAAE,UAAE,KAAK;AAAA,MAAE,SAAS,GAAG;AAAE,aAAK;AAAA,MAAE;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,mBAAmB,UAAsC;AACvD,SAAK,UAAU,IAAI,QAAQ;AAE3B,QAAI;AAAE,eAAS,EAAE,MAAM,mBAAmB,SAAS,CAAC,GAAG,WAAW,KAAK,QAAQ,CAAC;AAAA,IAAE,SAAS,GAAG;AAAE,WAAK;AAAA,IAAE;AACvG,WAAO,MAAM;AAAE,WAAK,UAAU,OAAO,QAAQ;AAAA,IAAE;AAAA,EACjD;AAAA;AAAA,EAGA,QAAQ;AAEN,UAAM,OAAO,YAAY,KAAK;AAC9B,QAAI;AACF,YAAM,MAAM,OAAO,SAAS;AAC5B,YAAM,UAAU,IAAI,IAAI,SAAS,OAAO,IAAI,CAAC;AAC7C,cAAQ,aAAa,IAAI,gBAAgB,OAAO,GAAG,CAAC;AAEpD,UAAI;AACF,cAAM,MAAM;AACZ,cAAM,MAAM,IAAI,uBAAuB,IAAI,oBAAoB;AAC/D,YAAI,IAAK,SAAQ,aAAa,IAAI,cAAc,OAAO,GAAG,CAAC;AAAA,MAC7D,QAAQ;AAAA,MAER;AACA,UAAI;AACF,YAAI,OAAO,OAAO,OAAO,QAAQ,QAAQ;AACvC,iBAAO,IAAI,SAAS,QAAQ,QAAQ,SAAS,CAAC;AAAA,QAChD,OAAO;AACL,iBAAO,SAAS,QAAQ,QAAQ,SAAS,CAAC;AAAA,QAC5C;AAAA,MACF,QAAQ;AACN,YAAI;AAAE,iBAAO,SAAS,QAAQ,OAAO,IAAI,CAAC;AAAA,QAAE,QAAQ;AAAA,QAAS;AAAA,MAC/D;AAAA,IACF,QAAQ;AACN,UAAI;AAAE,eAAO,SAAS,QAAQ,OAAO,IAAI,CAAC;AAAA,MAAE,QAAQ;AAAA,MAAS;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,SAAS;AACP,aAAS,IAAI;AACb,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,UAAU;AACR,WAAO,mBAAmB,SAAS,CAAC;AAAA,EACtC;AAAA;AAAA,EAGA,SAAS,OAAsB;AAC7B,aAAS,KAAK;AACd,SAAK,KAAK;AAAA,EACZ;AACF;AAEA,IAAM,SAAS;AAAA,EACb,MAAM,IAAI,iBAAiB;AAC7B;AAEA,IAAO,iBAAQ;;;ACpDT,IAAAC,sBAAA;AAlBC,IAAM,UAAkC,CAAC;AAAA,EAC9C,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,aAAa;AACf,MAAM;AACJ,QAAM,cAAc;AAAA,IAClB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAEA,QAAM,mBAAmB,aACrB,qFACA;AAEJ,SACE,6CAAC,SAAI,WAAW,GAAG,gBAAgB,IAAI,SAAS,IAC9C,wDAAC,SAAI,WAAU,eACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,gFAAgF,YAAY,IAAI,CAAC;AAAA;AAAA,IAC9G;AAAA,IACC,QACC,6CAAC,OAAE,WAAU,8BAA8B,gBAAK;AAAA,KAEpD,GACF;AAEJ;AAOO,IAAM,iBAAgD,CAAC;AAAA,EAC5D,OAAO;AAAA,EACP,YAAY;AACd,MAAM;AACJ,QAAM,cAAc;AAAA,IAClB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,wEAAwE,YAAY,IAAI,CAAC,IAAI,SAAS;AAAA;AAAA,EACnH;AAEJ;;;AC3DA,IAAAC,gBAA4C;AAyC7B,IAAAC,sBAAA;AA3BR,IAAM,gBAAN,cAA4B,wBAAkD;AAAA,EACnF,YAAY,OAA2B;AACrC,UAAM,KAAK;AAiBb,uBAAc,MAAM;AAClB,WAAK,SAAS,EAAE,UAAU,OAAO,OAAO,QAAW,WAAW,OAAU,CAAC;AAAA,IAC3E;AAlBE,SAAK,QAAQ,EAAE,UAAU,MAAM;AAAA,EACjC;AAAA,EAEA,OAAO,yBAAyB,OAAkC;AAChE,WAAO,EAAE,UAAU,MAAM,MAAM;AAAA,EACjC;AAAA,EAEA,kBAAkB,OAAc,WAA4B;AAC1D,SAAK,SAAS;AAAA,MACZ;AAAA,MACA;AAAA,IACF,CAAC;AAED,SAAK,MAAM,UAAU,OAAO,SAAS;AAAA,EACvC;AAAA,EAMA,SAAS;AACP,QAAI,KAAK,MAAM,UAAU;AACvB,UAAI,KAAK,MAAM,UAAU;AACvB,cAAM,oBAAoB,KAAK,MAAM;AACrC,eAAO,6CAAC,qBAAkB,OAAO,KAAK,MAAM,OAAO,OAAO,KAAK,aAAa;AAAA,MAC9E;AAEA,aACE,6CAAC,SAAI,WAAU,sDACb,wDAAC,SAAI,WAAU,wBACb;AAAA,qDAAC,SAAI,WAAU,8BAA6B,0BAAE;AAAA,QAC9C,6CAAC,QAAG,WAAU,4CAA2C,kCAEzD;AAAA,QACA,6CAAC,OAAE,WAAU,sBAAqB,2EAElC;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,KAAK;AAAA,YACd,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACC;AAAA,SAWH,GACF;AAAA,IAEJ;AAEA,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;AAQO,IAAM,uBAAqD,CAAC,EAAE,MAAM,MACzE,6CAAC,SAAI,WAAU,sDACb,wDAAC,SAAI,WAAU,eACb;AAAA,+CAAC,SAAI,WAAU,8BAA6B,0BAAE;AAAA,EAC9C,6CAAC,OAAE,WAAU,sBAAqB,kCAAoB;AAAA,EACrD,SACC;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,WAAU;AAAA,MACX;AAAA;AAAA,EAED;AAAA,GAEJ,GACF;;;AClGF,IAAAC,SAAuB;AACvB,yBAAyB;AACzB,IAAAC,gBAAqB;AAgBf,IAAAC,sBAAA;AAVC,SAAS,YAAY,EAAE,UAAU,GAAqB;AAC3D,QAAM,EAAE,UAAU,MAAM,QAAI,6BAAS;AACrC,QAAM,CAAC,SAAS,UAAU,IAAU,gBAAS,KAAK;AAElD,EAAM,iBAAU,MAAM;AACpB,eAAW,IAAI;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC,SAAS;AACZ,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,wJAAwJ,aAAa,EAAE;AAAA,QAClL,UAAQ;AAAA,QAER;AAAA,uDAAC,sBAAK,MAAK,sBAAqB,OAAO,IAAI,QAAQ,IAAI;AAAA,UACvD,6CAAC,UAAK,WAAU,WAAU,0BAAY;AAAA;AAAA;AAAA,IACxC;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,iKAAiK,aAAa,EAAE;AAAA,MAC3L,SAAS,MAAM,SAAS,UAAU,UAAU,SAAS,OAAO;AAAA,MAE3D;AAAA,kBAAU,UACT,6CAAC,sBAAK,MAAK,sBAAqB,OAAO,IAAI,QAAQ,IAAI,IAEvD,6CAAC,sBAAK,MAAK,qBAAoB,OAAO,IAAI,QAAQ,IAAI;AAAA,QAExD,6CAAC,UAAK,WAAU,WAAU,0BAAY;AAAA;AAAA;AAAA,EACxC;AAEJ;;;ACzCA,IAAAC,gBAAmC;AACnC,IAAAC,yBAA4C;AAC5C,IAAAD,gBAAqB;AAoEjB,IAAAE,sBAAA;AAxDJ,IAAM,cAAc;AAAA,EAClB,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,EACvB;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,EACvB;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,EACvB;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,EACvB;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,EACvB;AACF;AAEA,IAAM,cAAc,cAAAC,QAAM,KAAK,CAAC,EAAE,WAAW,MAAmC;AAC9E,QAAM,kBAAc,2BAAY,CAAC,MAAwB;AACvD,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,iBAAa;AAAA,EACf,GAAG,CAAC,UAAU,CAAC;AAEf,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MAEV,SAAS;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA;AAAA,EACV;AAEJ,CAAC;AAED,YAAY,cAAc;AAG1B,IAAM,eAA4C,CAAC,EAAE,MAAM,OAAO,SAAS,WAAW,WAAW,MAAM;AACrG,QAAM,aAAa,YAAY,IAAI;AAGnC,QAAM,kBAAc,2BAAY,MAAM;AACpC,iBAAa;AAAA,EACf,GAAG,CAAC,UAAU,CAAC;AAEf,MAAI,WAAW;AACb,WACE,8CAAC,SAAI,WAAW;AAAA,6EACuD,WAAW,UAAU,IAC1F;AAAA,mDAAC,SAAI,WAAU,wBACZ,qBACH;AAAA,MACA,6CAAC,SAAI,WAAU,iBACb,uDAAC,eAAY,YAAY,aAAa,GACxC;AAAA,OACF;AAAA,EAEJ;AAGA,SACE,8CAAC,SAAI,WAAW;AAAA,2EACuD,WAAW,UAAU,IAC1F;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,YAAY,2BAA2B,WAAW,aAAa,UAAU,WAAW,aAAa;AAAA,QACnG;AAAA;AAAA,IACF;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,iBAAiB,2BAA2B,WAAW,mBAAmB,UAAU,WAAW,mBAAmB;AAAA,UAClH,kBAAkB;AAAA,UAClB,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,qBAAqB;AAAA,UACrB,MAAM;AAAA,UACN,eAAe;AAAA,QACjB;AAAA;AAAA,IACF;AAAA,IAEA,6CAAC,SAAI,WAAU,uCACb,uDAAC,SAAI,WAAU,sFACb;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,WAAW;AAAA,QACjB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW,WAAW;AAAA;AAAA,IACxB,GACF,GACF;AAAA,IACA,8CAAC,SAAI,WAAU,4CACZ;AAAA,eACC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,UAAU,OAAO;AAAA,UAEzB;AAAA;AAAA,MACH;AAAA,MAED,WACC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,UAAU;AAAA,UACZ;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,OAEJ;AAAA,IACA,6CAAC,SAAI,WAAU,iBACb,uDAAC,eAAY,YAAY,aAAa,GACxC;AAAA,KACF;AAEJ;AAGA,IAAM,sBAAoC;AAAA,EACxC,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,OAAO;AAAA,EACP,YAAY;AACd;AASA,IAAM,cAAc,CAAC,SAAoB;AACvC,SAAO,CAAC,WAAwB;AAC9B,UAAM,EAAE,OAAO,SAAS,WAAW,QAAQ,IAAI;AAE/C;AAAA,MACE,CAAC,EAAE,WAAW,MACZ;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,SAAS,WAAW;AAAA,UACpB;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MAEF;AAAA,QACE,GAAG;AAAA,QACH,GAAG;AAAA,QACH,WAAW;AAAA,QACX,OAAO,EAAE,YAAY,eAAe,SAAS,EAAE;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,aAAa;AAAA,EACxB,SAAS,YAAY,SAAS;AAAA,EAC9B,OAAO,YAAY,OAAO;AAAA,EAC1B,SAAS,YAAY,SAAS;AAAA,EAC9B,MAAM,YAAY,MAAM;AAAA,EACxB,SAAS,YAAY,SAAS;AAChC;;;AC7NA,IAAAC,SAAuB;AAEvB,IAAM,oBAAoB;AAEnB,SAAS,cAAc;AAC5B,QAAM,CAAC,UAAU,WAAW,IAAU,gBAA8B,MAAS;AAE7E,EAAM,iBAAU,MAAM;AACpB,UAAM,MAAM,OAAO,WAAW,eAAe,oBAAoB,CAAC,KAAK;AACvE,UAAM,WAAW,MAAM;AACrB,kBAAY,OAAO,aAAa,iBAAiB;AAAA,IACnD;AACA,QAAI,iBAAiB,UAAU,QAAQ;AACvC,gBAAY,OAAO,aAAa,iBAAiB;AACjD,WAAO,MAAM,IAAI,oBAAoB,UAAU,QAAQ;AAAA,EACzD,GAAG,CAAC,CAAC;AAEL,SAAO,CAAC,CAAC;AACX;;;AClBA,IAAAC,iBAAoC;AAE7B,SAAS,YAAe,OAAU,OAAkB;AACzD,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAY,KAAK;AAE7D,gCAAU,MAAM;AACd,UAAM,UAAU,WAAW,MAAM;AAC/B,wBAAkB,KAAK;AAAA,IACzB,GAAG,KAAK;AAER,WAAO,MAAM;AACX,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,OAAO,KAAK,CAAC;AAEjB,SAAO;AACT;;;ACfA,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgUtB,SAAS,0BAAgC;AAC9C,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI;AAEF,QAAK,OAAe,iCAAkC;AACtD,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,OAAO;AACd,WAAO,OAAO;AAEd,UAAM,OAAO,SAAS,QAAQ,SAAS,qBAAqB,MAAM,EAAE,CAAC;AACrE,QAAI,QAAQ,KAAK,WAAY,MAAK,aAAa,QAAQ,KAAK,UAAU;AAAA,aAC7D,KAAM,MAAK,YAAY,MAAM;AAClC,IAAC,OAAe,mCAAmC;AAAA,EACzD,SAAS,GAAG;AAAA,EAEZ;AACF;;;AtBnUA;AACA;","names":["getToken","setToken","axios","config","import_react","import_jsx_runtime","email","code","import_react","import_react","import_jsx_runtime","theme","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","import_react","import_react_toastify","import_jsx_runtime","React","React","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../src/auth/index.ts","../src/config.ts","../src/index.ts","../src/components/FloatingButton.tsx","../src/services/unified-oauth.ts","../src/services/ai-workflow.ts","../src/services/request/index.ts","../src/services/ai-workflow-axios.ts","../src/services/artifact-types.ts","../src/services/artifacts-client.ts","../src/services/index.ts","../src/utils/urlSanitizer.ts","../src/components/auth/LoginForm.tsx","../src/components/auth/HowoneProvider.tsx","../src/components/theme/ThemeProvider.tsx","../src/components/ui/Toast/GlobalToastContainer.tsx","../src/components/index.ts","../src/howone/client.ts","../src/components/ui/Loading.tsx","../src/components/ui/ErrorBoundary.tsx","../src/components/theme/ThemeToggle.tsx","../src/components/ui/Toast/ClayxToast.tsx","../src/hooks/use-mobile.ts","../src/hooks/use-debounce.ts","../src/utils/errorHandler.ts"],"sourcesContent":["// Simple auth utilities for howone-client package\n// - parse JWT payload\n// - provide a small React hook for auth state\n\nexport const AUTH_TOKEN_KEY = 'auth_token'\n\nfunction setLocal(name: string, value: string | null) {\n try {\n if (typeof window === 'undefined' || !window?.localStorage) return\n if (value === null) {\n window.localStorage.removeItem(name)\n return\n }\n window.localStorage.setItem(name, value)\n } catch (e) {\n void e\n }\n}\n\nfunction getLocal(name: string): string | null {\n try {\n if (typeof window === 'undefined' || !window?.localStorage) return null\n return window.localStorage.getItem(name)\n } catch (e) {\n return null\n }\n}\n\nexport function setToken(token: string | null) {\n // Use localStorage for client-side token persistence\n try {\n setLocal(AUTH_TOKEN_KEY, token)\n } catch (e) {\n void e\n }\n // Notify subscribers regardless of token presence\n try { notifyAuthStateChanged() } catch { /* ignore */ }\n}\n\nexport function getToken(): string | null {\n try {\n const v = getLocal(AUTH_TOKEN_KEY)\n if (v) return v\n } catch (e) {\n void e\n }\n return null\n}\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> | null {\n try {\n const payload = token.split('.')[1]\n if (!payload) return null\n let base64 = payload.replace(/-/g, '+').replace(/_/g, '/')\n const pad = base64.length % 4\n if (pad === 2) base64 += '=='\n else if (pad === 3) base64 += '='\n else if (pad !== 0) return null\n const json = atob(base64)\n return JSON.parse(json) as Record<string, unknown>\n } catch {\n return null\n }\n}\n\nexport function parseUserFromToken(token: string | null) {\n if (!token) return null\n const payload = decodeJwtPayload(token)\n if (!payload) return null\n return {\n id: (payload.userId as string) || (payload.sub as string) || '',\n email: (payload.email as string) || '',\n name: (payload.name as string) || '',\n avatar: (payload.avatar as string) || (payload.picture as string) || ''\n }\n}\n\nexport function isTokenValid(token: string | null) {\n if (!token) return false\n const payload = decodeJwtPayload(token)\n if (!payload) return false\n const now = Math.floor(Date.now() / 1000)\n const expCandidate = (payload.exp as number | string | undefined) ?? (payload.expires_at as number | string | undefined)\n const exp = Number(expCandidate)\n if (!exp || !Number.isFinite(exp)) return true\n return exp > now\n}\n\n// A tiny hook that exposes auth state (no external deps)\nimport { useEffect, useState } from 'react'\nexport function useAuth() {\n const [token, setTokenState] = useState<string | null>(() => getToken())\n const [user, setUser] = useState(() => parseUserFromToken(getToken()))\n useEffect(() => {\n const onStorage = () => {\n const t = getToken()\n setTokenState(t)\n setUser(parseUserFromToken(t))\n }\n window.addEventListener('storage', onStorage)\n\n // subscribe to programmatic auth state changes\n const unsubscribe = onAuthStateChanged(() => {\n setTokenState(getToken())\n setUser(parseUserFromToken(getToken()))\n })\n\n return () => {\n window.removeEventListener('storage', onStorage)\n unsubscribe()\n }\n }, [])\n\n const logout = () => {\n setToken(null)\n setTokenState(null)\n setUser(null)\n // notify subscribers\n notifyAuthStateChanged()\n }\n\n return {\n token,\n user,\n isAuthenticated: !!token && isTokenValid(token),\n logout\n }\n}\n\n// --- simple pub/sub for auth state ---\ntype AuthState = { user: ReturnType<typeof parseUserFromToken> | null; isLoading: boolean }\nconst authSubscribers = new Set<(state: AuthState) => void>()\n\nexport function onAuthStateChanged(cb: (state: AuthState) => void) {\n // call immediately with current state\n try {\n const current = { user: parseUserFromToken(getToken()), isLoading: false }\n cb(current)\n } catch {\n // ignore\n }\n authSubscribers.add(cb)\n return () => { authSubscribers.delete(cb) }\n}\n\nfunction notifyAuthStateChanged() {\n const state = { user: parseUserFromToken(getToken()), isLoading: false }\n for (const cb of Array.from(authSubscribers)) {\n try { cb(state) } catch { /* ignore subscriber errors */ }\n }\n}\n\n// no internal helper exported — setToken already notifies subscribers\n","// Central auth configuration for howone-client\n// Default AUTH_ROOT can be overridden at runtime by calling setAuthRoot\nlet AUTH_ROOT_VALUE = 'https://howone.dev'\nlet DEFAULT_PROJECT_ID: string | null = null\n\nexport function setAuthRoot(url: string) {\n AUTH_ROOT_VALUE = url.replace(/\\/+$/g, '')\n}\n\nexport function getAuthRoot() {\n return AUTH_ROOT_VALUE\n}\n\nexport const AUTH_ROOT = getAuthRoot()\n\n// For compatibility consumers: try reading a global injected value if present\ntry {\n const g = (globalThis as any).__HOWONE_AUTH_ROOT__\n if (typeof g === 'string' && g.length > 0) {\n setAuthRoot(g)\n }\n} catch {\n // noop\n}\n\n// default project id helper (optional)\nexport function setDefaultProjectId(id: string | null) {\n DEFAULT_PROJECT_ID = id\n}\n\nexport function getDefaultProjectId() {\n try {\n if (DEFAULT_PROJECT_ID) return DEFAULT_PROJECT_ID\n const g = (globalThis as any).__HOWONE_PROJECT_ID__\n if (typeof g === 'string' && g.length > 0) return String(g)\n return null\n } catch {\n return DEFAULT_PROJECT_ID\n }\n}\n\nexport default {\n getAuthRoot,\n setAuthRoot,\n AUTH_ROOT: () => AUTH_ROOT_VALUE,\n}\n","export { FloatingButton } from './components/FloatingButton'\nexport * from './services'\nexport { createClient } from './services/index'\n// No package-level `howone` export. Call `createClient()` to get an SDK instance.\n\n// Components\nexport * from './components'\n\n// Hooks\nexport * from './hooks'\n\n// Utils\n// export { injectEarlyErrorHandler } from './utils/earlyErrorHandler'\nexport { injectEarlyErrorHandler } from './utils/errorHandler'\nexport { getAuthRoot, setAuthRoot } from './config'\nexport { getDefaultProjectId, setDefaultProjectId } from './config'\n","import { Icon } from '@iconify/react/dist/iconify.js'\nimport React from 'react'\n\ninterface FloatingButtonProps {\n text?: string\n onClick?: () => void\n className?: string\n}\n\nexport const FloatingButton: React.FC<FloatingButtonProps> = ({\n text = 'Made in Howone',\n onClick,\n className = ''\n}) => {\n return (\n <button\n onClick={onClick}\n id='floating-howone-btn'\n className={`fixed flex bg-background gap-2 items-center right-4 z-50 text-black dark:text-white px-3 py-2 rounded-lg shadow-lg transition-colors duration-200 border border-gray-200 dark:border-gray-700 ${className}`}\n style={{\n fontSize: '14px',\n fontWeight: 'bold',\n bottom: '28px',\n }}\n >\n <div className=\"flex items-center gap-2\" style={{ cursor: 'pointer' }}>\n <img width={20} className=\"pointer-events-auto\" src=\"https://sxwxqoixnnklnpeutjrj.supabase.co/storage/v1/object/public/create-x/logo/logo-sm.svg\" alt=\"\" />{text}\n <Icon icon=\"mdi:close\" onClick={(e) => {\n e.stopPropagation()\n const btn = document.getElementById('floating-howone-btn')\n if (btn) btn.style.display = 'none'\n }} className=\"w-5 h-5 font-bold pointer-events-auto text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200\" />\n </div>\n </button>\n )\n}\n","/**\n * 统一认证服务\n *\n * 提供多种认证功能,包括:\n * - Google OAuth 认证\n * - GitHub OAuth 认证\n * - 邮箱验证码认证\n * - Token 验证和管理\n * - 退出登录\n */\n\n/**\n * 发送验证码请求接口\n */\nexport interface SendCodeRequest {\n /** 邮箱地址 */\n email: string;\n /** 来源 URL */\n from_url: string;\n /** 应用 ID(可选) */\n app_id?: string;\n /** 应用名称(可选) */\n app_name?: string;\n}\n\n/**\n * 发送验证码响应接口\n */\nexport interface SendCodeResponse {\n /** 是否成功 */\n success: boolean;\n /** 消息(可选) */\n message?: string;\n /** 过期时间(秒)(可选) */\n expiresIn?: number;\n /** 状态码(可选,用于处理业务逻辑错误) */\n code?: number;\n /** 数据对象(可选,用于处理业务逻辑错误) */\n data?: {\n success: boolean;\n message?: string;\n code?: number;\n };\n /** 追踪 ID(可选) */\n traceId?: number;\n}\n\n/**\n * 邮箱登录请求接口\n */\nexport interface EmailLoginRequest {\n /** 邮箱地址 */\n email: string;\n /** 验证码 */\n code: string;\n /** 来源 URL */\n from_url: string;\n /** 应用 ID(可选) */\n app_id?: string;\n}\n\n/**\n * 邮箱登录响应接口\n */\nexport interface EmailLoginResponse {\n /** 是否成功 */\n success: boolean;\n /** JWT token(可选) */\n token?: string;\n /** 用户信息(可选) */\n user?: {\n email: string;\n name?: string;\n };\n /** 重定向 URL(可选) */\n redirect_url?: string;\n /** 消息(可选) */\n message?: string;\n /** 状态码(可选,用于处理业务逻辑错误) */\n code?: number;\n /** 数据对象(可选,用于处理业务逻辑错误) */\n data?: {\n success: boolean;\n message?: string;\n code?: number;\n };\n /** 追踪 ID(可选) */\n traceId?: number;\n}\n\nclass UnifiedAuthService {\n private readonly API_BASE_URL = \"https://create-x-backend-dev.fly.dev\";\n\n /**\n * 初始化 Google 登录流程\n * @returns 包含 token 和用户信息的 Promise\n */\n async initiateGoogleLogin() {\n const currentUrl = window.location.href;\n\n const state = {\n from_url: currentUrl,\n app_id: this.generateAppId(),\n timestamp: Date.now(),\n };\n\n const stateString = encodeURIComponent(JSON.stringify(state));\n\n try {\n const response = await fetch(`${this.API_BASE_URL}/api/auth/google?state=${stateString}`);\n const data = await response.json();\n\n if (!data.data.success || !data.data.authUrl) {\n throw new Error(\"Failed to get OAuth URL\");\n }\n\n return this.openOAuthPopup(data.data.authUrl);\n } catch (error) {\n // 转发错误\n throw error;\n }\n }\n\n /**\n * 打开 OAuth 认证弹窗\n * @param authUrl 认证 URL\n * @returns 包含 token 和用户信息的 Promise\n */\n private openOAuthPopup(authUrl: string): Promise<{ token: string; user?: any }> {\n return new Promise((resolve, reject) => {\n const width = 500;\n const height = 600;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n\n // 移除 noopener,noreferrer 参数,可能导致问题\n const popup = window.open(\n authUrl,\n \"oauth-popup\",\n `width=${width},height=${height},left=${left},top=${top},scrollbars=yes,resizable=yes`,\n );\n\n if (!popup) {\n reject(new Error(\"Unable to open popup, please check browser popup settings\"));\n return;\n }\n\n let popupClosed = false;\n let popupCheckInterval: number | null = null;\n\n // 使用 try-catch 包装检查逻辑,避免在控制台显示错误\n const checkPopupStatus = () => {\n try {\n // 尝试通过检查窗口是否被定义来判断它是否关闭\n // 这种方法比直接访问 popup.closed 更安全\n if (!popup || popup.closed) {\n if (!popupClosed) {\n popupClosed = true;\n if (popupCheckInterval) {\n clearInterval(popupCheckInterval);\n popupCheckInterval = null;\n }\n window.removeEventListener(\"message\", messageHandler);\n reject(new Error(\"User cancelled login\"));\n }\n }\n } catch (e) {\n // 忽略可能的错误\n // 如果出现错误,很可能是因为弹窗已关闭或跨域限制\n if (!popupClosed) {\n popupClosed = true;\n if (popupCheckInterval) {\n clearInterval(popupCheckInterval);\n popupCheckInterval = null;\n }\n window.removeEventListener(\"message\", messageHandler);\n reject(new Error(\"User cancelled login\"));\n }\n }\n };\n\n // 定期检查弹窗状态\n popupCheckInterval = window.setInterval(checkPopupStatus, 1000) as unknown as number;\n\n const messageHandler = (event: MessageEvent) => {\n const validOrigins = [window.location.origin, \"https://create-x-backend-dev.fly.dev\"];\n\n const isValidOrigin = validOrigins.some(\n (origin) =>\n event.origin === origin ||\n event.origin.includes(\"localhost\") ||\n event.origin.includes(\"127.0.0.1\") ||\n event.origin.includes(\"fly.dev\"),\n );\n\n if (!isValidOrigin) {\n // 忽略来自未知来源的消息\n return;\n }\n\n if (event.data && event.data.type === \"OAUTH_SUCCESS\") {\n popupClosed = true;\n if (popupCheckInterval) {\n clearInterval(popupCheckInterval);\n popupCheckInterval = null;\n }\n window.removeEventListener(\"message\", messageHandler);\n\n // 安全地尝试关闭弹窗\n try {\n if (popup) popup.close();\n } catch (e) {\n // 忽略关闭弹窗的错误\n }\n\n resolve(event.data.payload);\n } else if (event.data && event.data.type === \"OAUTH_ERROR\") {\n popupClosed = true;\n if (popupCheckInterval) {\n clearInterval(popupCheckInterval);\n popupCheckInterval = null;\n }\n window.removeEventListener(\"message\", messageHandler);\n\n // 安全地尝试关闭弹窗\n try {\n if (popup) popup.close();\n } catch (e) {\n // 忽略关闭弹窗的错误\n }\n\n reject(new Error(event.data.error || \"login failed\"));\n }\n };\n\n window.addEventListener(\"message\", messageHandler);\n\n // 设置超时\n setTimeout(() => {\n if (!popupClosed) {\n popupClosed = true;\n if (popupCheckInterval) {\n clearInterval(popupCheckInterval);\n popupCheckInterval = null;\n }\n window.removeEventListener(\"message\", messageHandler);\n\n // 安全地尝试关闭弹窗\n try {\n if (popup) popup.close();\n } catch (e) {\n // 忽略关闭弹窗的错误\n }\n\n reject(new Error(\"login timeout\"));\n }\n }, 5 * 60 * 1000);\n });\n }\n\n /**\n * 初始化 GitHub 登录流程\n * @returns 包含 token 和用户信息的 Promise\n */\n async initiateGitHubLogin() {\n const currentUrl = window.location.href;\n\n const state = {\n from_url: currentUrl,\n app_id: this.generateAppId(),\n timestamp: Date.now(),\n };\n\n const stateString = encodeURIComponent(JSON.stringify(state));\n\n try {\n const response = await fetch(`${this.API_BASE_URL}/api/auth/github?state=${stateString}`);\n const data = await response.json();\n if (!data.data.success || !data.data.authUrl) {\n throw new Error(\"Failed to get GitHub OAuth URL\");\n }\n\n return this.openOAuthPopup(data.data.authUrl);\n } catch (error) {\n // 转发错误\n throw error;\n }\n }\n\n /**\n * 发送邮箱验证码\n * @param email 邮箱地址\n * @param appName 应用名称(可选)\n * @returns 发送结果 Promise\n */\n async sendEmailVerificationCode(email: string, appName?: string): Promise<SendCodeResponse> {\n try {\n const currentUrl = window.location.origin;\n const appId = this.generateAppId(); // 使用域名作为app_id\n\n const response = await fetch(`${this.API_BASE_URL}/api/auth/email/send-code`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n email,\n from_url: currentUrl,\n app_id: appId,\n app_name: appName,\n } as SendCodeRequest),\n });\n\n const data = await response.json();\n\n // 检查 HTTP 状态码\n if (!response.ok) {\n // 直接传递完整的错误响应对象\n throw new Error(JSON.stringify(data));\n }\n\n // 检查业务逻辑状态码\n if (data.code === 0 && data.data && data.data.success === false) {\n // 业务逻辑错误,直接传递完整响应\n throw new Error(JSON.stringify(data));\n }\n\n // 检查频率限制错误\n if (data.code === 429) {\n // 频率限制错误\n throw new Error(JSON.stringify(data));\n }\n\n return data;\n } catch (error) {\n // 如果错误已经是JSON字符串,直接传递\n if (error instanceof Error && error.message.startsWith(\"{\")) {\n throw error;\n }\n // 否则,包装为通用错误\n throw new Error(error instanceof Error ? error.message : \"网络错误,请稍后重试\");\n }\n }\n\n /**\n * 邮箱验证码登录\n * @param email 邮箱地址\n * @param code 验证码\n * @returns 登录结果 Promise\n */\n async loginWithEmailCode(email: string, code: string): Promise<EmailLoginResponse> {\n try {\n const currentUrl = window.location.origin;\n const appId = this.generateAppId(); // 使用域名作为app_id\n\n const response = await fetch(`${this.API_BASE_URL}/api/auth/email/login`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n email,\n code,\n from_url: currentUrl,\n app_id: appId,\n } as EmailLoginRequest),\n });\n\n const data = await response.json();\n\n // 检查 HTTP 状态码\n if (!response.ok) {\n // 直接传递完整的错误响应对象\n throw new Error(JSON.stringify(data));\n }\n\n // 检查业务逻辑状态码\n if (data.code === 0 && data.data && data.data.success === false) {\n // 业务逻辑错误,直接传递完整响应\n throw new Error(JSON.stringify(data));\n }\n\n return data;\n } catch (error) {\n // 如果错误已经是JSON字符串,直接传递\n if (error instanceof Error && error.message.startsWith(\"{\")) {\n throw error;\n }\n // 否则,包装为通用错误\n throw new Error(error instanceof Error ? error.message : \"网络错误,请稍后重试\");\n }\n }\n\n /**\n * 获取验证码状态(调试用)\n * @param email 邮箱地址\n * @returns 验证码状态 Promise\n */\n async getCodeStatus(email: string) {\n try {\n const response = await fetch(\n `${this.API_BASE_URL}/api/auth/email/code-status?email=${encodeURIComponent(email)}`,\n );\n return await response.json();\n } catch (error) {\n // 返回错误信息\n return { success: false, error: error instanceof Error ? error.message : \"网络错误\" };\n }\n }\n\n private generateAppId(): string {\n const urlParams = new URLSearchParams(window.location.search);\n let appId = urlParams.get(\"appId\");\n\n return appId || \"app\";\n }\n\n /**\n * 检查 OAuth 回调\n * 从 URL 参数中获取 token 和错误信息\n * @returns 包含 token、用户信息和错误的对象\n */\n checkOAuthCallback(): { success: boolean; token?: string; error?: string; user?: any } {\n // Support token in query string (access_token or token) and in URL hash\n const urlParams = new URLSearchParams(window.location.search);\n const token = urlParams.get(\"token\");\n const accessTokenQuery = urlParams.get(\"access_token\");\n const error = urlParams.get(\"error\");\n const userParam = urlParams.get(\"user\");\n\n // parse hash fragment like #access_token=...&other=...\n let hashToken: string | null = null;\n try {\n if (window.location.hash && window.location.hash.length > 1) {\n const hash = window.location.hash.slice(1); // remove '#'\n const hashParams = new URLSearchParams(hash);\n hashToken = hashParams.get(\"access_token\") || hashParams.get(\"token\") || null;\n }\n } catch {\n hashToken = null;\n }\n\n // prefer token in query (access_token first), otherwise fallback to token param or hash token\n const finalToken = accessTokenQuery || token || hashToken;\n\n // If we're inside an iframe and didn't find a token on the iframe window,\n // try to read the top-level location href (if same-origin) where the\n // OAuth provider may have redirected. Wrap in try/catch to avoid cross-origin errors.\n if (!finalToken && window.top && window.top !== window) {\n try {\n const topHref = String(window.top.location.href || \"\");\n if (topHref) {\n const up = new URL(topHref);\n const topSearch = new URLSearchParams(up.search);\n const topToken = topSearch.get(\"access_token\") || topSearch.get(\"token\") || null;\n if (topToken) {\n this.saveAuthData(topToken);\n try {\n topSearch.delete(\"token\");\n topSearch.delete(\"access_token\");\n topSearch.delete(\"project_id\");\n up.search = topSearch.toString();\n up.hash = \"\";\n window.top.history.replaceState({}, document.title, up.toString());\n } catch {\n /* ignore */\n }\n return { success: true, token: topToken };\n }\n }\n } catch {\n // cross-origin or other error - ignore\n }\n }\n\n if (finalToken) {\n let user = null;\n if (userParam) {\n try {\n user = JSON.parse(decodeURIComponent(userParam));\n } catch (e) {}\n }\n this.saveAuthData(finalToken);\n\n try {\n const u = new URL(window.location.href);\n u.searchParams.delete(\"access_token\");\n u.searchParams.delete(\"project_id\");\n // remove access_token from hash if present\n u.hash = \"\";\n // replace state without token\n window.history.replaceState({}, document.title, u.toString());\n } catch (e) {\n try {\n window.history.replaceState({}, document.title, window.location.pathname);\n } catch {\n void 0;\n }\n }\n\n return { success: true, token: finalToken, user };\n }\n\n if (error) {\n window.history.replaceState({}, document.title, window.location.pathname);\n return { success: false, error: decodeURIComponent(error) };\n }\n\n const savedAuth = this.getSavedAuthData();\n if (savedAuth && savedAuth.token) {\n return { success: true, ...savedAuth };\n }\n\n return { success: false };\n }\n\n /**\n * 验证 token 是否有效\n * @param token JWT token\n * @returns 包含有效状态和用户信息的 Promise\n */\n async verifyToken(token: string): Promise<{ valid: boolean; user?: any }> {\n try {\n const response = await fetch(`${this.API_BASE_URL}/api/auth/verify`, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success) {\n return { valid: true, user: data.user };\n }\n }\n\n return { valid: false };\n } catch (error) {\n // 验证失败\n return { valid: false };\n }\n }\n\n private getSavedAuthData(): { token?: string } | null {\n try {\n let token: string | null = null;\n try {\n const { getToken } = require(\"../auth\") as typeof import(\"../auth\");\n if (getToken) token = getToken();\n } catch {\n token = null;\n }\n if (!token) return null;\n return { token };\n } catch (e) {\n console.error(\"Failed to get auth data from localStorage:\", e);\n return null;\n }\n }\n\n /**\n * 保存认证数据到本地存储\n */\n private saveAuthData(token: string): void {\n try {\n try {\n const { setToken } = require(\"../auth\") as typeof import(\"../auth\");\n if (setToken) setToken(token);\n } catch {\n // if auth module not available, we intentionally do not persist to localStorage\n }\n\n // do not save user to localStorage; rely on auth utilities\n } catch (e) {\n console.error(\"Failed to save auth data to localStorage:\", e);\n }\n }\n\n /**\n * 退出登录\n * @param token JWT token\n */\n async logout(token: string): Promise<void> {\n try {\n await fetch(`${this.API_BASE_URL}/api/auth/logout`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n } catch (error) {\n // 忽略退出登录失败的错误\n }\n }\n}\n\n// 导出统一认证服务实例\nexport const unifiedAuth = new UnifiedAuthService();\n\n// 为了保持向后兼容,导出原有的服务名称\nexport const unifiedOAuth = unifiedAuth;\n\n// 导出函数\nexport function sendEmailVerificationCode(email: string, appName?: string) {\n return unifiedAuth.sendEmailVerificationCode(email, appName);\n}\n\nexport function loginWithEmailCode(email: string, code: string) {\n return unifiedAuth.loginWithEmailCode(email, code);\n}\n\nexport function getCodeStatus(email: string) {\n return unifiedAuth.getCodeStatus(email);\n}\n","/**\n * AI Workflow 服务(精简版,仅支持按 ID 的 path 风格执行)\n *\n * 说明:模板仅需要一种执行接口,形如 POST {baseUrl}/workflow/{workflowId}/execute\n */\n\nexport interface AIWorkflowResponse {\n success: boolean\n output?: Record<string, unknown>\n error?: string\n metadata?: Record<string, unknown>\n}\nexport interface AIWorkflowClientOptions {\n baseUrl?: string // e.g. https://evoagentx-server\n apiKey?: string\n headers?: Record<string, string>\n fetchImpl?: typeof fetch\n}\n\nclass AIWorkflowClient {\n private readonly baseUrl: string\n private readonly apiKey?: string\n private readonly headers: Record<string, string>\n private readonly fetchImpl: typeof fetch\n\n constructor(options: AIWorkflowClientOptions = {}) {\n this.baseUrl = options.baseUrl?.replace(/\\/+$/, '') || ''\n this.apiKey = options.apiKey\n this.headers = { 'Content-Type': 'application/json', ...(options.headers || {}) }\n this.fetchImpl = options.fetchImpl || fetch.bind(globalThis)\n }\n\n private buildHeaders(extra?: Record<string, string>) {\n const h: Record<string, string> = { ...this.headers, ...(extra || {}) }\n if (this.apiKey && !h['Authorization']) {\n h['Authorization'] = `Bearer ${this.apiKey}`\n }\n return h\n }\n\n private async safeJson(resp: Response): Promise<unknown | null> {\n try {\n return await resp.json()\n } catch (_e) {\n return null\n }\n }\n\n /**\n * 按 ID 执行工作流:POST {baseUrl}/workflow/{workflowId}/execute\n * body: { input, options }\n */\n public async executeWorkflow(\n workflowId: string,\n inputs: Record<string, unknown>,\n options?: Record<string, unknown>\n ): Promise<AIWorkflowResponse> {\n if (!this.baseUrl) {\n throw new Error('AI workflow client requires a baseUrl (e.g. https://evoagentx-server.fly.dev)')\n }\n\n const url = `${this.baseUrl}/workflow/${workflowId}/execute`\n\n try {\n const res = await this.fetchImpl(url, {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify({ inputs, options }),\n } as RequestInit)\n\n const data = await this.safeJson(res)\n if (!res.ok) {\n return { success: false, error: (data as any)?.error || `HTTP ${res.status}` }\n }\n\n return (data as AIWorkflowResponse) || { success: true }\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'Network error' }\n }\n }\n}\n\nexport function createAIWorkflowClient(options: AIWorkflowClientOptions = {}) {\n return new AIWorkflowClient(options)\n}\n\nexport const aiWorkflow = createAIWorkflowClient({ baseUrl: 'https://evoagentx-server' })\n","import axios from \"axios\";\nimport type { AxiosInstance, InternalAxiosRequestConfig } from \"axios\";\nimport type { RequestInterceptors, RequestConfig } from \"./types\";\n\nclass Request {\n instance: AxiosInstance;\n interceptors?: RequestInterceptors;\n abortControllers: Map<string, AbortController> = new Map();\n\n constructor(config: RequestConfig) {\n this.instance = axios.create({\n ...config,\n validateStatus: (status) => {\n return status >= 200 && status < 300;\n },\n });\n\n this.interceptors = config.interceptors;\n this.instance.interceptors.request.use(\n this.interceptors?.requestInterceptor,\n this.interceptors?.requestInterceptorCatch,\n );\n this.instance.interceptors.response.use(\n this.interceptors?.responseInterceptor,\n this.interceptors?.responseInterceptorCatch,\n );\n\n this.instance.interceptors.request.use(\n (config) => {\n return config;\n },\n (err) => {\n return Promise.reject(err);\n },\n );\n\n this.instance.interceptors.response.use(\n (res) => {\n return res.data;\n },\n (err) => {\n if (axios.isCancel(err)) {\n return Promise.reject({\n isCanceled: true,\n message: \"request canceled\",\n originalError: err,\n });\n }\n\n if (err.response?.data?.error) {\n return Promise.reject(err.response.data.error);\n }\n\n return Promise.reject(err);\n },\n );\n }\n\n cancelRequest(url: string) {\n this.abortControllers.forEach((controller, key) => {\n if (key.includes(url)) {\n controller.abort();\n this.abortControllers.delete(key);\n }\n });\n }\n\n cancelAllRequests() {\n this.abortControllers.forEach((controller) => {\n controller.abort();\n });\n this.abortControllers.clear();\n }\n\n request<T = any>(config: RequestConfig<T>): Promise<T> {\n const controller = new AbortController();\n const url = config.url || \"\";\n const method = config.method || \"GET\";\n const key = `${method}:${url}`;\n this.abortControllers.set(key, controller);\n\n config.signal = controller.signal;\n return new Promise((resolve, reject) => {\n if (config.interceptors?.requestInterceptor) {\n config = config.interceptors.requestInterceptor(config as InternalAxiosRequestConfig);\n }\n this.instance\n .request<any, T>(config)\n .then((res) => {\n this.abortControllers.delete(key);\n if (config.interceptors?.responseInterceptor) {\n res = config.interceptors.responseInterceptor(res);\n }\n resolve(res);\n })\n .catch((err) => {\n this.abortControllers.delete(key);\n // Error already handled by interceptors\n reject(err);\n });\n });\n }\n\n get<T = any>(config: RequestConfig<T>): Promise<T> {\n return this.request<T>({ ...config, method: \"GET\" });\n }\n\n post<T = any>(config: RequestConfig<T>): Promise<T> {\n return this.request<T>({ ...config, method: \"POST\" });\n }\n\n delete<T = any>(config: RequestConfig<T>): Promise<T> {\n return this.request<T>({ ...config, method: \"DELETE\" });\n }\n\n put<T = any>(config: RequestConfig<T>): Promise<T> {\n return this.request<T>({ ...config, method: \"PUT\" });\n }\n\n patch<T = any>(config: RequestConfig<T>): Promise<T> {\n return this.request<T>({ ...config, method: \"PATCH\" });\n }\n}\n\nexport default Request;\n","import Request from './request'\nimport type { RequestConfig } from './request/types'\nimport type { AIWorkflowResponse } from './ai-workflow'\n\nexport interface AxiosAIWorkflowOptions {\n baseUrl?: string\n basePath?: string\n apiKey?: string\n timeout?: number\n headers?: Record<string, string>\n requestInstance?: Request\n /** 'body' (default) or 'path' for /workflow/{id}/execute */\n workflowEndpointStyle?: 'body' | 'path'\n}\n\n/**\n * Create an AI workflow client backed by the project's Request (axios) wrapper.\n * If `requestInstance` is provided it will be used directly; otherwise a new Request will be created.\n */\nexport function createAIWorkflowClientAxios(options: AxiosAIWorkflowOptions = {}) {\n const basePath = options.basePath ?? '/api'\n const baseUrl = (options.baseUrl || 'https://evoagentx-server.fly.dev').replace(/\\/+$/, '')\n const baseAPI = `${baseUrl}${basePath.startsWith('/') ? '' : '/'}${basePath}`.replace(/\\/+$/, '')\n\n const client: Request =\n options.requestInstance ||\n new Request({\n baseURL: baseAPI,\n timeout: options.timeout ?? 60000,\n interceptors: {\n requestInterceptor: (config: any) => {\n config.headers = config.headers || {}\n if (options.apiKey && !config.headers['Authorization']) {\n config.headers['Authorization'] = `Bearer ${options.apiKey}`\n }\n if (options.headers) {\n config.headers = { ...(config.headers || {}), ...options.headers }\n }\n return config\n },\n requestInterceptorCatch: (err: any) => Promise.reject(err),\n responseInterceptor: (res: any) => res,\n responseInterceptorCatch: (err: any) => Promise.reject(err),\n },\n })\n\n return {\n async executeWorkflow(\n workflowId: string,\n inputs: Record<string, unknown>,\n opts?: Record<string, unknown>\n ): Promise<AIWorkflowResponse> {\n // Directly post to {baseUrl}/workflow/{id}/execute (raw baseUrl used)\n const url = `${baseUrl}/workflow/${workflowId}/execute`\n\n const data = await client.post({ url, data: { inputs, options: opts } } as RequestConfig)\n return data as unknown as AIWorkflowResponse\n },\n }\n}\n","export type Visibility = 'private' | 'project' | 'public' | 'shared'\n\nexport interface Artifact {\n id: string\n ownerId?: string | null\n projectId?: string | null\n visibility: Visibility\n storageUrl: string\n thumbnailUrl?: string\n input?: any\n output?: any\n model?: string\n metadata?: Record<string, any>\n createdAt?: string\n likes?: number\n stats?: { views?: number }\n sharedWith?: string[]\n}\n\nexport interface ArtifactCreateInput {\n storageUrl: string\n thumbnailUrl?: string\n visibility?: Visibility\n metadata?: Record<string, any>\n model?: string\n ownerId?: string\n projectId?: string\n}\n\nexport interface ArtifactListQuery {\n ownerId?: string\n projectId?: string\n visibility?: Visibility\n limit?: number\n cursor?: string\n}\n\nexport interface AccessContext {\n userId?: string | null\n projectId?: string | null\n tokenScopes?: string[]\n}\n\n/**\n * Basic client-side permission check for an artifact.\n * Note: final authorization must be enforced on the server. This is a convenience helper.\n */\nexport function canAccessArtifact(a: Artifact, ctx: AccessContext = {}): boolean {\n if (!a) return false\n if (a.visibility === 'public') return true\n if (a.visibility === 'project') {\n if (ctx.projectId && a.projectId && ctx.projectId === a.projectId) return true\n if (ctx.tokenScopes && ctx.tokenScopes.includes('project:read')) return true\n return false\n }\n if (a.visibility === 'private') {\n if (ctx.userId && a.ownerId && ctx.userId === a.ownerId) return true\n if (ctx.tokenScopes && (ctx.tokenScopes.includes('artifact:read:all') || ctx.tokenScopes.includes('admin'))) return true\n return false\n }\n if (a.visibility === 'shared') {\n if (ctx.userId && a.sharedWith && a.sharedWith.includes(ctx.userId)) return true\n if (ctx.tokenScopes && (ctx.tokenScopes.includes('artifact:read:all') || ctx.tokenScopes.includes('admin'))) return true\n return false\n }\n return false\n}\n","import Request from './request'\nimport type { Artifact, ArtifactCreateInput, ArtifactListQuery, AccessContext } from './artifact-types'\n\nexport function createArtifactsClient(req: Request) {\n return {\n async create(input: ArtifactCreateInput): Promise<Artifact> {\n return await req.post({ url: '/artifacts', data: input })\n },\n async list(query?: ArtifactListQuery): Promise<Artifact[]> {\n return await req.get({ url: '/artifacts', params: query })\n },\n async get(id: string): Promise<Artifact> {\n return await req.get({ url: `/artifacts/${encodeURIComponent(id)}` })\n },\n async setVisibility(id: string, visibility: string): Promise<void> {\n await req.patch({ url: `/artifacts/${encodeURIComponent(id)}/visibility`, data: { visibility } })\n },\n async delete(id: string): Promise<void> {\n await req.delete({ url: `/artifacts/${encodeURIComponent(id)}` })\n },\n // convenience local check (server is authoritative)\n canAccessLocal(a: Artifact, ctx: AccessContext) {\n // lightweight check mirrored from artifact-types\n if (!a) return false\n if (a.visibility === 'public') return true\n if (a.visibility === 'project') return Boolean(ctx.projectId && a.projectId && ctx.projectId === a.projectId)\n if (a.visibility === 'private') return Boolean(ctx.userId && a.ownerId && ctx.userId === a.ownerId)\n if (a.visibility === 'shared') return Boolean(ctx.userId && a.sharedWith && a.sharedWith.includes(ctx.userId))\n return false\n },\n }\n}\n","export * from \"./unified-oauth\";\nexport * from \"./ai-workflow\";\nexport * from \"./request/index\";\nexport * from \"./ai-workflow-axios\";\nexport { createAIWorkflowClientAxios } from \"./ai-workflow-axios\";\nexport * from \"./artifact-types\";\nexport { createArtifactsClient } from \"./artifacts-client\";\nexport * from \"../auth\";\nexport * from \"../config\";\nimport { getAuthRoot, setDefaultProjectId } from \"../config\";\nimport { getToken as getTokenFrom, parseUserFromToken } from \"../auth\";\n\nimport Request from \"./request\";\nimport { createArtifactsClient } from \"./artifacts-client\";\nimport type { Artifact, ArtifactCreateInput, ArtifactListQuery } from \"./artifact-types\";\nimport type { InternalAxiosRequestConfig, AxiosResponse, AxiosError } from \"axios\";\nimport { removeSensitiveParamsFromUrl, setupClearUrlTokenListener } from \"../utils/urlSanitizer\";\nimport { RequestConfig } from \"./request/types\";\n\n// Helper function to get available token from multiple sources\nfunction getGlobalAvailableToken(): string | null {\n try {\n return getTokenFrom() || null;\n } catch {\n return null;\n }\n}\n\nexport const request = new Request({\n baseURL: \"https://create-x-backend-dev.fly.dev/api\",\n timeout: 60000,\n interceptors: {\n requestInterceptor: (config: InternalAxiosRequestConfig) => {\n config.headers = config.headers || {};\n\n // Dynamically ensure Authorization header exists\n if (!config.headers[\"Authorization\"]) {\n const availableToken = getGlobalAvailableToken();\n if (availableToken) {\n config.headers[\"Authorization\"] = `Bearer ${availableToken}`;\n }\n }\n\n return config;\n },\n requestInterceptorCatch: (err: AxiosError) => {\n return Promise.reject(err);\n },\n responseInterceptor: (res: AxiosResponse) => {\n return res;\n },\n responseInterceptorCatch: (err: AxiosError) => {\n return Promise.reject(err);\n },\n },\n});\n\n// 独立的 AI workflow 请求客户端,指向 evoagentx-server(只用于 workflow 调用)\nexport const aiRequest = new Request({\n baseURL: \"https://evoagentx-server.fly.dev\",\n timeout: 600000,\n interceptors: {\n requestInterceptor: (config: InternalAxiosRequestConfig) => {\n config.headers = config.headers || {};\n\n // Dynamically ensure Authorization header exists\n if (!config.headers[\"Authorization\"]) {\n const availableToken = getGlobalAvailableToken();\n if (availableToken) {\n config.headers[\"Authorization\"] = `Bearer ${availableToken}`;\n }\n }\n\n return config;\n },\n requestInterceptorCatch: (err: AxiosError) => {\n return Promise.reject(err);\n },\n responseInterceptor: (res: AxiosResponse) => {\n return res;\n },\n responseInterceptorCatch: (err: AxiosError) => {\n return Promise.reject(err);\n },\n },\n});\n\n// Official alias for AI workflow request instance. Consumers can use\n// `workflowRequest` when referring to the AI/workflow backend.\nexport const workflowRequest = aiRequest;\n\n// Helper: wrap a Request instance so that outgoing requests with URLs\n// starting with `/data` are automatically prefixed with\n// `/entities/apps/${projectId}`. This keeps the original Request\n// instance unchanged and provides client-level URL normalization.\nfunction wrapRequestWithProjectPrefix(biz: Request, projectId?: string) {\n if (!projectId) return biz;\n const prefix = `/entities/apps/${String(projectId)}`;\n\n function shouldPrefix(url?: string) {\n if (!url) return false;\n const u = String(url);\n if (u.startsWith(prefix)) return false;\n if (/^https?:\\/\\//.test(u) || u.startsWith(\"//\")) return false;\n // Only prefix relative paths that start with /data\n if (u.startsWith(\"/data\")) return true;\n return false;\n }\n\n const wrapped = {\n instance: biz.instance,\n request: (config: RequestConfig) => {\n try {\n if (config && typeof config.url === \"string\" && shouldPrefix(config.url)) {\n config = { ...config, url: `${prefix}${config.url}` };\n }\n } catch (_e) {\n // ignore\n }\n return biz.request(config);\n },\n get: (config: RequestConfig) => wrapped.request({ ...config, method: \"GET\" }),\n post: (config: RequestConfig) => wrapped.request({ ...config, method: \"POST\" }),\n put: (config: RequestConfig) => wrapped.request({ ...config, method: \"PUT\" }),\n patch: (config: RequestConfig) => wrapped.request({ ...config, method: \"PATCH\" }),\n delete: (config: RequestConfig) => wrapped.request({ ...config, method: \"DELETE\" }),\n cancelRequest: (url: string) => biz.cancelRequest(url),\n cancelAllRequests: () => biz.cancelAllRequests(),\n };\n\n return wrapped;\n}\n\n/**\n * 简单工厂:返回一个对外友好的 client,封装业务 request 与 AI workflow request。\n * 默认使用上面导出的 `request` 和 `aiRequest`,也可以通过 options 覆盖。\n */\n\n/**\n * Higher-level factory: createClient\n * - minimal surface compatible with `createClient({ projectId, authRequired })`\n * - returns executeWorkflow, request, aiRequest and a tiny auth helper (set/get token)\n */\nexport function createClient(opts?: {\n projectId?: string;\n authRequired?: boolean;\n baseUrl?: string;\n aiBaseUrl?: string;\n mode?: \"auto\" | \"standalone\" | \"embedded\";\n auth?: {\n mode?: \"none\" | \"managed\" | \"headless\";\n getToken?: () => Promise<string | null>;\n tokenInjection?: {\n allowedOrigins?: string[];\n waitMs?: number;\n clearUrlParamsAfterInjectionMs?: number;\n clearAllUrlParams?: boolean;\n sensitiveParams?: string[];\n };\n };\n requestInstance?: Request;\n aiRequestInstance?: Request;\n}) {\n // Helper: create a Request instance from a base URL if needed\n function makeRequestFromBase(base?: string) {\n if (!base) return undefined;\n return new Request({\n baseURL: base,\n timeout: 60000,\n interceptors: {\n requestInterceptor: (config: InternalAxiosRequestConfig) => {\n config.headers = config.headers || {};\n\n // Dynamically ensure Authorization header exists\n if (!config.headers[\"Authorization\"]) {\n const availableToken = getAvailableToken();\n if (availableToken) {\n config.headers[\"Authorization\"] = `Bearer ${availableToken}`;\n }\n }\n\n return config;\n },\n requestInterceptorCatch: (err: AxiosError) => Promise.reject(err),\n responseInterceptor: (res: AxiosResponse) => res,\n responseInterceptorCatch: (err: AxiosError) => Promise.reject(err),\n },\n });\n }\n\n const biz = opts?.requestInstance || makeRequestFromBase(opts?.baseUrl) || request;\n const ai = opts?.aiRequestInstance || makeRequestFromBase(opts?.aiBaseUrl) || aiRequest;\n\n const bizWrapped = wrapRequestWithProjectPrefix(biz, opts?.projectId);\n\n let token: string | null = null;\n\n // Helper: get available token from multiple sources with priority\n function getAvailableToken(): string | null {\n // Priority: memory token > localStorage token\n return token || getGlobalAvailableToken();\n }\n\n try {\n if (opts?.projectId) {\n setDefaultProjectId(String(opts.projectId));\n }\n } catch {\n // ignore\n }\n\n // Synchronously initialize token from localStorage if available\n try {\n const existingToken = getTokenFrom();\n if (existingToken) {\n token = existingToken;\n applyToken(token);\n }\n } catch {\n // ignore localStorage errors\n }\n\n function applyToken(t: string | null) {\n try {\n // set Authorization header for both axios instances when available\n try {\n if (biz && (biz as any).instance) {\n if (t) (biz as any).instance.defaults.headers.common[\"Authorization\"] = `Bearer ${t}`;\n else delete (biz as any).instance.defaults.headers.common[\"Authorization\"];\n }\n if (ai && (ai as any).instance) {\n if (t) (ai as any).instance.defaults.headers.common[\"Authorization\"] = `Bearer ${t}`;\n else delete (ai as any).instance.defaults.headers.common[\"Authorization\"];\n }\n } catch (_e) {\n // ignore if instances are not axios-backed\n }\n } catch (_e) {\n // ignore if instances are not axios-backed\n }\n }\n\n // determine runtime mode\n const runtimeMode = (() => {\n if (opts?.mode) return opts.mode;\n try {\n if (typeof window !== \"undefined\")\n return window.self !== window.top ? \"embedded\" : \"standalone\";\n } catch (_e) {\n return \"standalone\";\n }\n return \"standalone\";\n })();\n\n async function initToken() {\n // priority: explicit getToken -> postMessage injection (embedded) -> none\n if (opts?.auth?.getToken) {\n try {\n const t = await opts.auth.getToken();\n if (t) {\n token = t;\n applyToken(token);\n return;\n }\n } catch (_e) {\n // ignore\n }\n }\n\n if (runtimeMode === \"embedded\" && opts?.auth?.tokenInjection) {\n const allowed = opts.auth.tokenInjection.allowedOrigins || [];\n const waitMs = opts.auth.tokenInjection.waitMs ?? 3000;\n\n // listen for a single token message\n const tokenFromPostMessage = await new Promise<string | null>((resolve) => {\n let resolved = false;\n function handler(ev: MessageEvent) {\n try {\n if (!ev.data || typeof ev.data !== \"object\") return;\n if (ev.data.type !== \"howone:token\") return;\n // origin check\n if (allowed.length > 0 && !allowed.includes(ev.origin)) return;\n const t = ev.data.token;\n if (t && !resolved) {\n resolved = true;\n window.removeEventListener(\"message\", handler);\n resolve(String(t));\n }\n } catch (_e) {\n // ignore\n }\n }\n\n window.addEventListener(\"message\", handler);\n\n // timeout\n setTimeout(() => {\n if (!resolved) {\n resolved = true;\n window.removeEventListener(\"message\", handler);\n resolve(null);\n }\n }, waitMs);\n });\n\n if (tokenFromPostMessage) {\n token = tokenFromPostMessage;\n applyToken(token);\n // Schedule URL cleanup if configured\n try {\n const cfg = opts?.auth?.tokenInjection;\n if (cfg && typeof window !== \"undefined\") {\n const delay = cfg.clearUrlParamsAfterInjectionMs ?? 50;\n setTimeout(() => {\n removeSensitiveParamsFromUrl({\n clearAll: cfg.clearAllUrlParams,\n sensitiveParams: cfg.sensitiveParams,\n });\n }, delay);\n }\n } catch {\n /* ignore */\n }\n return;\n }\n }\n }\n\n // initialize token (fire and forget)\n try {\n // only run in browser\n if (typeof window !== \"undefined\") {\n void initToken();\n // If embedded & tokenInjection configured, setup CLEAR_URL_TOKEN listener once\n if (runtimeMode === \"embedded\" && opts?.auth?.tokenInjection) {\n setupClearUrlTokenListener({\n allowedOrigins: opts.auth.tokenInjection.allowedOrigins,\n clearAll: opts.auth.tokenInjection.clearAllUrlParams,\n sensitiveParams: opts.auth.tokenInjection.sensitiveParams,\n autoRunMs: undefined,\n });\n }\n }\n } catch (_e) {\n // noop\n }\n\n return {\n // expose projectId so consumers can read it from the client instance\n projectId: opts?.projectId ?? null,\n request: bizWrapped,\n aiRequest: ai,\n workflowRequest: ai,\n // artifact helpers using artifacts-client\n artifacts: createArtifactsClient(biz) as {\n create(input: ArtifactCreateInput): Promise<Artifact>;\n list(query?: ArtifactListQuery): Promise<Artifact[]>;\n get(id: string): Promise<Artifact>;\n setVisibility(id: string, visibility: string): Promise<void>;\n delete(id: string): Promise<void>;\n },\n me: async () => {\n try {\n const t =\n token ?? (opts?.auth?.getToken ? await opts.auth.getToken() : null) ?? getTokenFrom();\n if (!t) return null;\n return parseUserFromToken(t);\n } catch (_e2) {\n return null;\n }\n },\n // auth helpers\n auth: {\n setToken: (t: string | null) => {\n token = t;\n applyToken(t);\n },\n getToken: () => token,\n isAuthenticated: () => Boolean(token),\n // minimal login/logout stubs - consumers can override behavior\n login: (redirect?: string) => {\n // Redirect to external auth server with current URL and project id\n if (typeof window === \"undefined\") return;\n const loc = redirect || window.location.href;\n try {\n const root = getAuthRoot() || \"https://create-x-backend-dev.fly.dev\";\n const authUrl = new URL(\"/auth\", String(root));\n authUrl.searchParams.set(\"redirect_uri\", String(loc));\n if (opts?.projectId) authUrl.searchParams.set(\"project_id\", String(opts.projectId));\n window.location.href = authUrl.toString();\n } catch {\n // fallback to simple href\n const encoded = encodeURIComponent(String(loc));\n const pid = opts?.projectId\n ? `&project_id=${encodeURIComponent(String(opts.projectId))}`\n : \"\";\n const root = \"https://create-x-backend-dev.fly.dev\";\n window.location.href = `${root}/auth?redirect_uri=${encoded}${pid}`;\n }\n },\n logout: () => {\n token = null;\n applyToken(null);\n },\n },\n sanitizeUrl: (o?: { clearAll?: boolean; sensitiveParams?: string[] }) => {\n if (typeof window === \"undefined\") return;\n removeSensitiveParamsFromUrl({\n clearAll: o?.clearAll,\n sensitiveParams: o?.sensitiveParams,\n });\n },\n };\n}\n","/**\n * URL Sanitizer: remove sensitive query/hash parameters from current location\n * without reloading the page. Designed for embedded iframe scenarios where\n * parent injects an auth token, then child scrubs it from the address bar.\n */\n\nexport interface SanitizeOptions {\n /** Remove all query params (keep path + hash) */\n clearAll?: boolean\n /** Parameter names (case-insensitive) to remove. Ignored when clearAll=true */\n sensitiveParams?: string[]\n /** Also scan hash if it looks like query (key=value&...) */\n includeHash?: boolean\n /** Optional callback when URL actually changed */\n onChanged?: (newUrl: string) => void\n}\n\nconst DEFAULT_SENSITIVE = ['token', 'access_token', 'auth', 'auth_token']\n\nexport function removeSensitiveParamsFromUrl(opts?: SanitizeOptions) {\n if (typeof window === 'undefined') return\n try {\n const { clearAll, sensitiveParams, includeHash = true, onChanged } = opts || {}\n const sens = (sensitiveParams && sensitiveParams.length > 0 ? sensitiveParams : DEFAULT_SENSITIVE).map(s => s.toLowerCase())\n const before = window.location.href\n const url = new URL(before)\n\n if (clearAll) {\n url.search = ''\n } else if (url.search) {\n let changed = false\n for (const [k] of url.searchParams) {\n if (sens.includes(k.toLowerCase())) {\n url.searchParams.delete(k)\n changed = true\n }\n }\n if (changed) {\n const qs = url.searchParams.toString()\n url.search = qs ? `?${qs}` : ''\n }\n }\n\n if (includeHash && url.hash) {\n const raw = url.hash.slice(1)\n if (raw.includes('=')) {\n const hp = new URLSearchParams(raw)\n let changed = false\n for (const [k] of hp) {\n if (clearAll || sens.includes(k.toLowerCase())) {\n hp.delete(k)\n changed = true\n }\n }\n if (changed) {\n const hs = hp.toString()\n url.hash = hs ? `#${hs}` : ''\n }\n } else {\n if (!clearAll && sens.some(p => raw.toLowerCase().startsWith(p))) {\n url.hash = ''\n } else if (clearAll) {\n url.hash = ''\n }\n }\n }\n\n const next = url.pathname + url.search + url.hash\n if (next !== window.location.pathname + window.location.search + window.location.hash) {\n window.history.replaceState(window.history.state, document.title, next)\n onChanged && onChanged(next)\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('[howone][urlSanitizer] failed', e)\n }\n}\n\n// One-shot registration guard symbol (on window) to avoid multiple listeners\ndeclare global {\n interface Window { __howone_url_sanitize_registered?: boolean }\n}\n\nexport interface SetupClearUrlListenerOptions {\n /** Allowed parent origins; empty => accept all (NOT recommended) */\n allowedOrigins?: string[]\n /** Remove all params instead of just sensitive ones */\n clearAll?: boolean\n /** Whether to auto run once on setup (after a small delay) */\n autoRunMs?: number\n /** Custom sensitive param names */\n sensitiveParams?: string[]\n}\n\nexport function setupClearUrlTokenListener(opts?: SetupClearUrlListenerOptions) {\n if (typeof window === 'undefined') return\n if (window.__howone_url_sanitize_registered) return\n window.__howone_url_sanitize_registered = true\n\n const allowed = opts?.allowedOrigins || []\n function handler(ev: MessageEvent) {\n try {\n if (!ev.data || typeof ev.data !== 'object') return\n if (ev.data.type !== 'CLEAR_URL_TOKEN') return\n if (allowed.length > 0 && !allowed.includes(ev.origin)) return\n removeSensitiveParamsFromUrl({\n clearAll: opts?.clearAll || !!ev.data.clearAll,\n sensitiveParams: opts?.sensitiveParams,\n })\n // optional ack\n try { (ev.source as Window | null | undefined)?.postMessage({ type: 'CLEAR_URL_TOKEN_ACK' }, ev.origin as any) } catch { /* ignore */ }\n } catch { /* ignore */ }\n }\n window.addEventListener('message', handler)\n\n if (typeof opts?.autoRunMs === 'number') {\n setTimeout(() => removeSensitiveParamsFromUrl({ clearAll: opts.clearAll, sensitiveParams: opts.sensitiveParams }), opts.autoRunMs)\n }\n}\n\nexport default {\n removeSensitiveParamsFromUrl,\n setupClearUrlTokenListener,\n}\n","import React, { useState, useEffect } from 'react'\nimport { Icon } from \"@iconify/react\"\nimport { Loader2 } from \"lucide-react\"\n\ninterface LoginFormProps {\n onLoginSuccess?: () => void\n appName?: string\n className?: string\n}\n\ninterface ApiErrorResponse {\n code: number;\n data?: {\n success: boolean;\n message?: string;\n code?: number;\n };\n msg?: string;\n traceId?: number;\n timestamp?: string;\n}\n\nexport const LoginForm: React.FC<LoginFormProps> = ({\n onLoginSuccess,\n appName = 'AI Application Platform',\n className = ''\n}) => {\n const [email, setEmail] = useState('')\n const [code, setCode] = useState('')\n const [validationErrors, setValidationErrors] = useState<Record<string, string>>({})\n const [isAnyLoading, setIsAnyLoading] = useState(false)\n const [codeSent, setCodeSent] = useState(false)\n const [loginError, setLoginError] = useState<string | null>(null)\n\n // 这里需要从外部注入认证服务,暂时使用占位符\n const googleLogin = async () => {\n // TODO: 实现Google登录\n console.log('Google login clicked')\n }\n\n const githubLogin = async () => {\n // TODO: 实现GitHub登录\n console.log('GitHub login clicked')\n }\n\n const sendEmailCode = async (email: string) => {\n // TODO: 实现发送验证码\n console.log('Send code to:', email, 'for app:', appName)\n setCodeSent(true)\n }\n\n const loginWithEmail = async (email: string, code: string) => {\n // TODO: 实现邮箱登录\n console.log('Login with email:', email, 'code:', code)\n if (onLoginSuccess) onLoginSuccess()\n }\n\n const clearError = () => {\n setLoginError(null)\n setValidationErrors({})\n }\n\n useEffect(() => {\n if (loginError) {\n try {\n const errorObj = JSON.parse(loginError) as ApiErrorResponse;\n const newErrors: Record<string, string> = {};\n if (errorObj.code === 429) {\n newErrors.form = errorObj.msg || '请求过于频繁,请稍后再试';\n } else if (errorObj.data?.code === 401 && errorObj.data?.message) {\n if (codeSent) {\n newErrors.code = errorObj.data.message;\n } else {\n newErrors.form = errorObj.data.message;\n }\n } else if (errorObj.msg) {\n newErrors.form = errorObj.msg;\n } else if (errorObj.data?.message) {\n newErrors.form = errorObj.data.message;\n } else {\n newErrors.form = '发生未知错误,请稍后重试';\n }\n setValidationErrors(newErrors);\n } catch (e) {\n setValidationErrors({ form: loginError });\n }\n const timer = setTimeout(() => {\n clearError()\n }, 8000)\n return () => clearTimeout(timer)\n }\n }, [loginError, codeSent])\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n setValidationErrors({});\n if (!codeSent) {\n const emailValue = formData.get('email') as string\n if (!emailValue) {\n setValidationErrors({ email: 'Please enter your email address' })\n return\n }\n setIsAnyLoading(true)\n try {\n await sendEmailCode(emailValue)\n setEmail(emailValue)\n } catch (error) {\n setLoginError(error instanceof Error ? error.message : 'Failed to send code')\n } finally {\n setIsAnyLoading(false)\n }\n } else {\n const codeValue = code\n if (!codeValue || codeValue.length !== 6) {\n setValidationErrors({ code: 'Please enter the 6-digit verification code' })\n return\n }\n setIsAnyLoading(true)\n try {\n await loginWithEmail(email, codeValue)\n } catch (error) {\n setLoginError(error instanceof Error ? error.message : 'Login failed')\n } finally {\n setIsAnyLoading(false)\n }\n }\n }\n\n return (\n <div className={`w-full space-y-6 ${className}`}>\n <div className=\"space-y-1\">\n <h1 className=\"text-3xl font-bold text-gray-900\">Welcome Back!</h1>\n <p className=\"text-sm text-gray-600\">Please enter log in details below</p>\n </div>\n\n <form className=\"space-y-5\" onSubmit={handleSubmit}>\n <div className=\"space-y-2\">\n <label htmlFor=\"email\" className=\"text-gray-700 font-medium text-sm block\">Email</label>\n <input\n id=\"email\"\n type=\"email\"\n name=\"email\"\n value={email}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setEmail(value)\n if (validationErrors.email) {\n const newErrors = { ...validationErrors }\n delete newErrors.email\n setValidationErrors(newErrors)\n }\n }}\n required\n aria-invalid={!!validationErrors.email}\n className=\"w-full text-sm bg-gray-50 rounded-md h-11 px-3 hover:bg-gray-100 focus:bg-white border border-gray-200 focus:border-gray-400 focus:outline-none\"\n placeholder=\"\"\n />\n {validationErrors.email && (\n <p className=\"text-red-600 text-sm\">{validationErrors.email}</p>\n )}\n </div>\n\n {codeSent && (\n <div className=\"space-y-2\">\n <label className=\"text-gray-700 font-medium text-sm block\">Verification Code</label>\n <input\n type=\"text\"\n maxLength={6}\n value={code}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value.replace(/\\D/g, '') // 只允许数字\n setCode(value)\n if (validationErrors.code) {\n const newErrors = { ...validationErrors }\n delete newErrors.code\n setValidationErrors(newErrors)\n }\n }}\n aria-invalid={!!validationErrors.code}\n className=\"w-full text-center text-sm bg-gray-50 rounded-md h-11 px-3 hover:bg-gray-100 focus:bg-white border border-gray-200 focus:border-gray-400 focus:outline-none tracking-widest\"\n placeholder=\"000000\"\n />\n {validationErrors.code && (\n <p className=\"text-red-600 text-sm\">{validationErrors.code}</p>\n )}\n </div>\n )}\n\n {validationErrors.form && (\n <div className=\"text-red-600 text-sm p-3 bg-red-50 rounded-md border border-red-200\">\n <div className=\"flex items-center\">\n <Icon icon=\"material-symbols:error\" className=\"text-red-600 mr-2\" />\n <span>{validationErrors.form}</span>\n </div>\n </div>\n )}\n\n <button\n type=\"submit\"\n className=\"w-full h-11 bg-black hover:bg-gray-800 text-white font-medium rounded-md text-sm disabled:opacity-70 flex items-center justify-center\"\n disabled={isAnyLoading || !email || (codeSent && code.length !== 6)}\n aria-busy={isAnyLoading}\n >\n {isAnyLoading && (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n )}\n {codeSent ? (isAnyLoading ? 'Signing in...' : 'Sign in') : (isAnyLoading ? 'Sending...' : 'Send Code')}\n </button>\n </form>\n\n <div className=\"space-y-3\">\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-gray-200\"></div>\n </div>\n <div className=\"relative flex justify-center text-xs\">\n <span className=\"px-4 text-gray-500\">or continue</span>\n </div>\n </div>\n\n <button\n className=\"w-full h-11 bg-white hover:bg-gray-50 text-gray-900 hover:text-gray-900 border border-gray-200 hover:border-gray-300 font-medium rounded-md text-sm disabled:opacity-70 flex items-center justify-center\"\n onClick={() => { if (!isAnyLoading) { clearError(); googleLogin() } }}\n disabled={isAnyLoading}\n >\n {isAnyLoading ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Icon icon=\"flat-color-icons:google\" className=\"w-6 h-6 mr-2\" />\n )}\n {isAnyLoading ? 'Connecting...' : 'Log in with Google'}\n </button>\n\n <button\n className=\"w-full h-11 bg-black hover:bg-gray-800 text-white font-medium rounded-md text-sm disabled:opacity-70 flex items-center justify-center\"\n onClick={() => { if (!isAnyLoading) { clearError(); githubLogin() } }}\n disabled={isAnyLoading}\n >\n {isAnyLoading ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:github\" className=\"w-6 h-6 mr-2\" />\n )}\n {isAnyLoading ? 'Connecting...' : 'Log in with GitHub'}\n </button>\n </div>\n </div>\n )\n}\n","import React, { createContext, useContext, useState, useEffect } from 'react'\nimport { getToken, parseUserFromToken, setToken } from '../../auth'\nimport { FloatingButton } from '../FloatingButton'\nimport { ThemeProvider } from '../theme/ThemeProvider'\nimport { GlobalToastContainer } from '../ui/Toast/GlobalToastContainer'\n\ntype Theme = \"dark\" | \"light\" | \"system\"\n\ntype HowoneContextValue = {\n user: ReturnType<typeof parseUserFromToken> | null\n token: string | null\n isAuthenticated: boolean\n logout: () => void\n}\n\nconst HowoneContext = createContext<HowoneContextValue | null>(null)\n\nexport interface HowOneProviderProps {\n children: React.ReactNode\n autoRedirect?: boolean\n showFloatingButton?: boolean\n projectId?: string\n defaultTheme?: Theme\n themeStorageKey?: string\n forceDefaultTheme?: boolean\n authUrl?: string\n redirectOnUnauthenticated?: boolean\n}\n\n/**\n * HowOneProvider - All-in-one application provider\n *\n * Includes:\n * - Authentication management with auto-redirect to auth page\n * - Theme management (dark/light/system)\n * - Toast notifications\n * - Floating button (shows \"Login\" when unauthenticated)\n *\n * @example\n * ```tsx\n * <HowOneProvider\n * defaultTheme=\"dark\"\n * themeStorageKey=\"my-app-theme\"\n * showFloatingButton={true}\n * authUrl=\"https://howone.dev/auth\"\n * redirectOnUnauthenticated={true}\n * >\n * <App />\n * </HowOneProvider>\n * ```\n */\nexport const HowOneProvider: React.FC<HowOneProviderProps> = ({\n children,\n showFloatingButton = true,\n projectId,\n defaultTheme = \"system\",\n themeStorageKey = \"howone-theme\",\n forceDefaultTheme = false,\n authUrl = \"https://howone.dev/auth\",\n redirectOnUnauthenticated = true,\n}) => {\n const [user, setUser] = useState(() => parseUserFromToken(getToken()))\n const [token, setTokenState] = useState<string | null>(() => getToken())\n\n // Auto-capture token from URL on mount\n useEffect(() => {\n try {\n const params = new URLSearchParams(window.location.search)\n const urlToken = params.get('access_token') || params.get('token')\n\n if (urlToken) {\n // Store the token\n setToken(urlToken)\n setTokenState(urlToken)\n setUser(parseUserFromToken(urlToken))\n\n // Clean up URL (remove token from address bar for security)\n params.delete('access_token')\n params.delete('token')\n const newSearch = params.toString()\n const newUrl = window.location.pathname + (newSearch ? '?' + newSearch : '') + window.location.hash\n window.history.replaceState({}, '', newUrl)\n }\n } catch (e) {\n console.error('[HowOneProvider] Failed to capture token from URL:', e)\n }\n }, [])\n\n // Auto-redirect to auth page when unauthenticated\n useEffect(() => {\n if (redirectOnUnauthenticated && !token && !user) {\n // Check if we're not already on the auth page to avoid infinite redirects\n const currentUrl = new URL(window.location.href)\n if (!currentUrl.pathname.includes('/auth')) {\n console.log('[HowOneProvider] No token found, redirecting to auth page...')\n\n // Build auth URL with redirect_uri and project_id parameters\n try {\n const authUrlObj = new URL(authUrl)\n const redirectUri = window.location.href\n authUrlObj.searchParams.set('redirect_uri', redirectUri)\n\n // Add project_id if provided\n if (projectId) {\n authUrlObj.searchParams.set('project_id', projectId)\n }\n\n console.log('[HowOneProvider] Redirecting to:', authUrlObj.toString())\n window.location.href = authUrlObj.toString()\n } catch (error) {\n // Fallback to simple redirect if URL construction fails\n console.error('[HowOneProvider] Failed to build auth URL:', error)\n window.location.href = authUrl\n }\n }\n }\n }, [token, user, redirectOnUnauthenticated, authUrl, projectId])\n\n const logout = () => {\n try {\n setToken(null)\n } catch { /* ignore */ }\n setTokenState(null)\n setUser(null)\n }\n\n const value: HowoneContextValue = {\n user,\n token,\n isAuthenticated: !!token,\n logout\n }\n\n return (\n <ThemeProvider\n defaultTheme={defaultTheme}\n storageKey={themeStorageKey}\n forceDefault={forceDefaultTheme}\n >\n <HowoneContext.Provider value={value}>\n {children}\n {showFloatingButton && (\n <FloatingButton onClick={() => window.open('https://howone.ai', '_blank')} />\n )}\n </HowoneContext.Provider>\n <GlobalToastContainer />\n </ThemeProvider>\n )\n}\n\nexport function useHowoneContext() {\n const ctx = useContext(HowoneContext)\n if (!ctx) {\n // fallback to parsing token directly when provider not used\n const t = getToken()\n return {\n user: parseUserFromToken(t),\n token: t,\n isAuthenticated: !!t,\n logout: () => { try { setToken(null) } catch { void 0 } }\n }\n }\n return ctx\n}\n\nexport default HowOneProvider\n","import { createContext, useContext, useEffect, useState } from \"react\"\n\ntype Theme = \"dark\" | \"light\" | \"system\"\n\ntype ThemeProviderProps = {\n children: React.ReactNode\n defaultTheme?: Theme\n storageKey?: string\n forceDefault?: boolean\n}\n\ntype ThemeProviderState = {\n theme: Theme\n setTheme: (theme: Theme) => void\n}\n\nconst initialState: ThemeProviderState = {\n theme: \"system\",\n setTheme: () => null,\n}\n\nconst ThemeProviderContext = createContext<ThemeProviderState>(initialState)\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"system\",\n storageKey = \"vite-ui-theme\",\n forceDefault = false,\n ...props\n}: ThemeProviderProps) {\n const [theme, setTheme] = useState<Theme>(() => {\n if (forceDefault) {\n localStorage.setItem(storageKey, defaultTheme)\n return defaultTheme\n }\n\n const stored = localStorage.getItem(storageKey) as Theme | null\n\n const initialTheme = stored || defaultTheme\n\n if (!stored) {\n localStorage.setItem(storageKey, defaultTheme)\n }\n\n return initialTheme\n })\n\n useEffect(() => {\n const root = window.document.documentElement\n\n root.classList.remove(\"light\", \"dark\")\n\n if (theme === \"system\") {\n const systemTheme = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\"\n\n root.classList.add(systemTheme)\n return\n }\n\n root.classList.add(theme)\n }, [theme])\n\n const value = {\n theme,\n setTheme: (theme: Theme) => {\n localStorage.setItem(storageKey, theme)\n setTheme(theme)\n },\n }\n\n return (\n <ThemeProviderContext.Provider {...props} value={value}>\n {children}\n </ThemeProviderContext.Provider>\n )\n}\n\nexport const useTheme = () => {\n const context = useContext(ThemeProviderContext)\n\n if (context === undefined)\n throw new Error(\"useTheme must be used within a ThemeProvider\")\n\n return context\n}\n","\"use client\";\n\nimport { ToastContainer } from \"react-toastify\";\n\nexport function GlobalToastContainer() {\n return (\n <ToastContainer\n newestOnTop={false}\n closeButton={false}\n />\n );\n}\n","// Auth Components\nexport { LoginForm } from './auth/LoginForm'\nexport { HowOneProvider, useHowoneContext } from './auth/HowoneProvider'\nexport type { HowOneProviderProps } from './auth/HowoneProvider'\nexport { useAuth, getToken, setToken, parseUserFromToken } from '../auth'\nexport { default as howone } from '../howone/client'\n\n// UI Components\nexport { Loading, LoadingSpinner } from './ui/Loading'\nexport { ErrorBoundary, DefaultErrorFallback } from './ui/ErrorBoundary'\n\n// Theme Components\nexport { ThemeProvider, ThemeToggle, useTheme } from './theme'\n\n// Toast Components\nexport { GlobalToastContainer } from './ui/Toast/GlobalToastContainer'\nexport { ClayxToast } from './ui/Toast/ClayxToast'\n","import { getToken, setToken, parseUserFromToken } from '../auth'\nimport { getAuthRoot } from '../config'\n\ntype AuthState = {\n user: Record<string, unknown> | null\n isLoading: boolean\n}\n\nclass HowoneAuthClient {\n private listeners = new Set<(state: AuthState) => void>()\n private loading = false\n\n private emit() {\n const state: AuthState = {\n user: parseUserFromToken(getToken()),\n isLoading: this.loading\n }\n for (const l of this.listeners) {\n try { l(state) } catch (e) { void e }\n }\n }\n\n onAuthStateChanged(listener: (state: AuthState) => void) {\n this.listeners.add(listener)\n // emit initial state synchronously\n try { listener({ user: parseUserFromToken(getToken()), isLoading: this.loading }) } catch (e) { void e }\n return () => { this.listeners.delete(listener) }\n }\n\n // Simple redirect-based login trigger (consumer can override)\n login() {\n // consumer may want a full-page redirect to auth server\n const root = getAuthRoot() || 'https://create-x-backend-dev.fly.dev'\n try {\n const loc = window.location.href\n const authUrl = new URL('/auth', String(root))\n authUrl.searchParams.set('redirect_uri', String(loc))\n // If a default project id was set in config, include it\n try {\n const cfg = require('../config')\n const pid = cfg.getDefaultProjectId && cfg.getDefaultProjectId()\n if (pid) authUrl.searchParams.set('project_id', String(pid))\n } catch {\n // ignore\n }\n try {\n if (window.top && window.top !== window) {\n window.top.location.replace(authUrl.toString())\n } else {\n window.location.replace(authUrl.toString())\n }\n } catch {\n try { window.location.replace(String(root)) } catch { void 0 }\n }\n } catch {\n try { window.location.replace(String(root)) } catch { void 0 }\n }\n }\n\n logout() {\n setToken(null)\n this.emit()\n }\n\n getUser() {\n return parseUserFromToken(getToken())\n }\n\n // helper to programmatically set token (e.g., after callback handling)\n setToken(token: string | null) {\n setToken(token)\n this.emit()\n }\n}\n\nconst howone = {\n auth: new HowoneAuthClient()\n}\n\nexport default howone\n","import React from 'react'\n\ninterface LoadingProps {\n size?: 'sm' | 'md' | 'lg'\n text?: string\n className?: string\n fullScreen?: boolean\n}\n\nexport const Loading: React.FC<LoadingProps> = ({\n size = 'md',\n text = 'Loading...',\n className = '',\n fullScreen = false\n}) => {\n const sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-8 w-8',\n lg: 'h-12 w-12'\n }\n\n const containerClasses = fullScreen\n ? 'fixed inset-0 flex items-center justify-center bg-white/80 backdrop-blur-sm z-50'\n : 'flex items-center justify-center p-4'\n\n return (\n <div className={`${containerClasses} ${className}`}>\n <div className=\"text-center\">\n <div\n className={`animate-spin rounded-full border-2 border-gray-300 border-t-blue-600 mx-auto ${sizeClasses[size]}`}\n />\n {text && (\n <p className=\"mt-2 text-sm text-gray-600\">{text}</p>\n )}\n </div>\n </div>\n )\n}\n\ninterface LoadingSpinnerProps {\n size?: 'sm' | 'md' | 'lg'\n className?: string\n}\n\nexport const LoadingSpinner: React.FC<LoadingSpinnerProps> = ({\n size = 'md',\n className = ''\n}) => {\n const sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-8 w-8',\n lg: 'h-12 w-12'\n }\n\n return (\n <div\n className={`animate-spin rounded-full border-2 border-gray-300 border-t-blue-600 ${sizeClasses[size]} ${className}`}\n />\n )\n}\n","import React, { Component, ReactNode } from 'react'\n\ninterface ErrorBoundaryState {\n hasError: boolean\n error?: Error\n errorInfo?: React.ErrorInfo\n}\n\ninterface ErrorBoundaryProps {\n children: ReactNode\n fallback?: React.ComponentType<{ error?: Error; retry?: () => void }>\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props)\n this.state = { hasError: false }\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error }\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n this.setState({\n error,\n errorInfo\n })\n\n this.props.onError?.(error, errorInfo)\n }\n\n handleRetry = () => {\n this.setState({ hasError: false, error: undefined, errorInfo: undefined })\n }\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n const FallbackComponent = this.props.fallback\n return <FallbackComponent error={this.state.error} retry={this.handleRetry} />\n }\n\n return (\n <div className=\"min-h-[400px] flex items-center justify-center p-4\">\n <div className=\"text-center max-w-md\">\n <div className=\"text-red-500 text-6xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">\n Something went wrong\n </h2>\n <p className=\"text-gray-600 mb-4\">\n An unexpected error occurred. Please try refreshing the page.\n </p>\n <button\n onClick={this.handleRetry}\n className=\"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors\"\n >\n Try Again\n </button>\n {process.env.NODE_ENV === 'development' && this.state.error && (\n <details className=\"mt-4 text-left\">\n <summary className=\"cursor-pointer text-sm text-gray-500 hover:text-gray-700\">\n Error Details (Development)\n </summary>\n <pre className=\"mt-2 text-xs bg-gray-100 p-2 rounded overflow-auto\">\n {this.state.error.toString()}\n {this.state.errorInfo?.componentStack}\n </pre>\n </details>\n )}\n </div>\n </div>\n )\n }\n\n return this.props.children\n }\n}\n\n// Hook version for functional components\ninterface ErrorFallbackProps {\n error?: Error\n retry?: () => void\n}\n\nexport const DefaultErrorFallback: React.FC<ErrorFallbackProps> = ({ retry }) => (\n <div className=\"min-h-[200px] flex items-center justify-center p-4\">\n <div className=\"text-center\">\n <div className=\"text-red-500 text-4xl mb-2\">⚠️</div>\n <p className=\"text-gray-600 mb-2\">Something went wrong</p>\n {retry && (\n <button\n onClick={retry}\n className=\"px-3 py-1 bg-blue-600 text-white text-sm rounded hover:bg-blue-700 transition-colors\"\n >\n Retry\n </button>\n )}\n </div>\n </div>\n)\n","\"use client\"\n\nimport * as React from \"react\"\nimport { useTheme } from \"next-themes\"\nimport { Icon } from \"@iconify/react\"\n\ninterface ThemeToggleProps {\n className?: string\n}\n\nexport function ThemeToggle({ className }: ThemeToggleProps) {\n const { setTheme, theme } = useTheme()\n const [mounted, setMounted] = React.useState(false)\n\n React.useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!mounted) {\n return (\n <button\n className={`relative inline-flex h-10 w-12 items-center justify-center rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground ${className || ''}`}\n disabled\n >\n <Icon icon=\"solar:sun-2-linear\" width={20} height={20} />\n <span className=\"sr-only\">Toggle theme</span>\n </button>\n )\n }\n\n return (\n <button\n className={`inline-flex h-10 w-12 items-center justify-center rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground transition-colors ${className || ''}`}\n onClick={() => setTheme(theme === \"light\" ? \"dark\" : \"light\")}\n >\n {theme === \"light\" ? (\n <Icon icon=\"solar:sun-2-linear\" width={20} height={20} />\n ) : (\n <Icon icon=\"solar:moon-linear\" width={20} height={20} />\n )}\n <span className=\"sr-only\">Toggle theme</span>\n </button>\n )\n}","\"use client\";\n\nimport React, { useCallback } from \"react\";\nimport { Bounce, toast, ToastOptions } from \"react-toastify\";\nimport { Icon } from \"@iconify/react\";\n\nexport type ToastType = 'success' | 'error' | 'warning' | 'info' | 'default';\n\ninterface ToastContentProps {\n type: ToastType;\n title?: string;\n message?: string;\n component?: React.ReactNode;\n closeToast?: () => void;\n}\n\nconst TOAST_ICONS = {\n success: {\n icon: \"mdi:success\",\n color: \"text-green-400\",\n className: \"text-green-400\",\n bgGradient: \"bg-[#14181df2]\",\n gradientColor: \"#389726\",\n borderGradient: \"border-[#389726]\",\n borderGradientColor: \"#389726\"\n },\n error: {\n icon: \"ic:outline-close\",\n color: \"text-red-400\",\n className: \"text-red-400\",\n bgGradient: \"bg-[#14181df2]\",\n gradientColor: \"#ef4444\",\n borderGradient: \"border-[#ef4444]\",\n borderGradientColor: \"#ef4444\"\n },\n warning: {\n icon: \"mi:warning\",\n color: \"text-yellow-400\",\n className: \"text-yellow-400\",\n bgGradient: \"bg-[#14181df2]\",\n gradientColor: \"#facc15\",\n borderGradient: \"border-[#facc15]\",\n borderGradientColor: \"#facc15\"\n },\n info: {\n icon: \"ic:outline-info\",\n color: \"text-blue-400\",\n className: \"text-blue-400\",\n bgGradient: \"bg-[#14181df2]\",\n gradientColor: \"#60a5fa\",\n borderGradient: \"border-[#60a5fa]\",\n borderGradientColor: \"#f0f0f0\"\n },\n default: {\n icon: \"ic:round-notifications\",\n color: \"text-gray-400\",\n className: \"text-gray-400\",\n bgGradient: \"bg-[#14181df2]\",\n gradientColor: \"#9ca3af\",\n borderGradient: \"border-[#9ca3af]\",\n borderGradientColor: \"#9ca3af\"\n }\n};\n\nconst CloseButton = React.memo(({ closeToast }: { closeToast?: () => void }) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n closeToast?.();\n }, [closeToast]);\n\n return (\n <Icon\n icon=\"vaadin:close\"\n className=\"flex items-center justify-center rounded-full relative z-10 flex-shrink-0 cursor-pointer \n !text-[#b4b4b4] hover:text-white transition-colors duration-200 drop-shadow-sm\"\n onClick={handleClick}\n width={14}\n height={14}\n />\n );\n});\n\nCloseButton.displayName = 'CloseButton';\n\n// 内容组件\nconst ToastContent: React.FC<ToastContentProps> = ({ type, title, message, component, closeToast }) => {\n const iconConfig = TOAST_ICONS[type];\n\n // 使用 useCallback 确保 closeToast 函数引用稳定\n const handleClose = useCallback(() => {\n closeToast?.();\n }, [closeToast]);\n\n if (component) {\n return (\n <div className={`flex items-start gap-3 min-h-[80px] w-full backdrop-blur-md \n rounded-xl p-4 shadow-2xl relative overflow-hidden ${iconConfig.bgGradient}`}>\n <div className=\"flex-1 relative z-10\">\n {component}\n </div>\n <div className=\"relative z-10\">\n <CloseButton closeToast={handleClose} />\n </div>\n </div>\n );\n }\n\n // 否则渲染默认的 toast 内容\n return (\n <div className={`flex items-start gap-3 min-h-[60px] w-full backdrop-blur-md\n rounded-xl p-4 shadow-2xl relative overflow-hidden ${iconConfig.bgGradient}`}>\n <div\n className=\"absolute left-0 top-0 w-full h-full pointer-events-none rounded-xl\"\n style={{\n background: `linear-gradient(135deg, ${iconConfig.gradientColor}30 0%, ${iconConfig.gradientColor}20 15%, #14181df2 30%)`\n }}\n />\n\n {/* 渐变边框层 */}\n <div\n className=\"absolute left-0 top-0 w-full h-full pointer-events-none rounded-xl\"\n style={{\n border: '2px solid transparent',\n backgroundImage: `linear-gradient(135deg, ${iconConfig.borderGradientColor}60 0%, ${iconConfig.borderGradientColor}40 5%, transparent 22%)`,\n backgroundOrigin: 'border-box',\n backgroundClip: 'border-box',\n WebkitMask: 'linear-gradient(#fff 0 0) padding-box, linear-gradient(#fff 0 0)',\n WebkitMaskComposite: 'xor',\n mask: 'linear-gradient(#fff 0 0) padding-box, linear-gradient(#fff 0 0)',\n maskComposite: 'exclude'\n }}\n />\n\n <div className=\"flex-shrink-0 mt-0.5 relative z-10 \">\n <div className=\"w-7 h-7 bg-white/10 backdrop-blur-sm rounded-full flex items-center justify-center\">\n <Icon\n icon={iconConfig.icon}\n width={16}\n height={16}\n className={iconConfig.color}\n />\n </div>\n </div>\n <div className=\"flex flex-col gap-1 flex-1 relative z-10\">\n {title && (\n <div\n className=\"font-semibold leading-tight text-white/95 drop-shadow-sm\"\n style={{ fontSize: '16px' }}\n >\n {title}\n </div>\n )}\n {message && (\n <div\n className=\"text-white/75 drop-shadow-sm\"\n style={{\n fontSize: '13px',\n }}\n >\n {message}\n </div>\n )}\n </div>\n <div className=\"relative z-10\">\n <CloseButton closeToast={handleClose} />\n </div>\n </div>\n );\n};\n\n// 默认配置\nconst defaultToastOptions: ToastOptions = {\n position: \"bottom-right\",\n autoClose: 3000,\n hideProgressBar: true,\n closeOnClick: false,\n pauseOnHover: true,\n draggable: true,\n pauseOnFocusLoss: false,\n theme: \"dark\",\n transition: Bounce,\n};\n\ninterface ToastParams {\n title?: string;\n message?: string;\n component?: React.ReactNode;\n options?: Partial<ToastOptions>;\n}\n\nconst createToast = (type: ToastType) => {\n return (params: ToastParams) => {\n const { title, message, component, options } = params;\n\n toast(\n ({ closeToast }) => (\n <ToastContent\n type={type}\n title={title}\n message={message || ''}\n component={component}\n closeToast={closeToast}\n />\n ),\n {\n ...defaultToastOptions,\n ...options,\n className: \"!bg-transparent !p-0 !shadow-none\",\n style: { background: 'transparent', padding: 0 }\n }\n );\n };\n};\n\nexport const ClayxToast = {\n success: createToast('success'),\n error: createToast('error'),\n warning: createToast('warning'),\n info: createToast('info'),\n default: createToast('default'),\n};\n","import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n","import { useState, useEffect } from 'react'\n\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value)\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value)\n }, delay)\n\n return () => {\n clearTimeout(handler)\n }\n }, [value, delay])\n\n return debouncedValue\n}\n","// Inline copy of public/error-handler.js wrapped for runtime injection\nconst ERROR_HANDLER_SCRIPT = `(function () {\n // 检查是否在 iframe 中运行\n const isIframe = window.self !== window.top;\n console.log(\"isIframe\", isIframe);\n\n console.log(\"[早期错误处理] 初始化\");\n\n // 直接发送错误到父窗口的函数\n window.__SEND_ERROR_TO_PARENT__ = function (error, details) {\n try {\n const errorPayload = {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n filename: details?.file || details?.filename,\n lineno: details?.line,\n colno: details?.column,\n timestamp: Date.now(),\n type: details?.type || \"compile-error\",\n details: details,\n };\n\n window.parent.postMessage(\n {\n type: \"ERROR_EVENT\",\n payload: errorPayload,\n },\n \"*\"\n );\n\n console.log(\"[早期错误处理] 错误已发送到父窗口:\", errorPayload);\n } catch (e) {\n console.error(\"[早期错误处理] 发送错误到父窗口失败:\", e);\n }\n };\n\n // 设置 MutationObserver 监听 vite-error-overlay\n function setupViteOverlayObserver() {\n if (!window.MutationObserver) return;\n\n console.log(\"[早期错误处理] 设置 Vite 错误 overlay 监听器\");\n\n function processViteErrorOverlay(overlay) {\n try {\n if (overlay.hasAttribute(\"data-error-sent\")) return;\n\n const shadowRoot = overlay.shadowRoot;\n if (!shadowRoot) {\n console.log(\"[早期错误处理] vite-error-overlay 没有 Shadow DOM\");\n return;\n }\n\n const messageElement = shadowRoot.querySelector(\"pre.message\");\n const fileElement = shadowRoot.querySelector(\"pre.file\");\n const frameElements = shadowRoot.querySelectorAll(\"pre.frame\");\n const stackElement = shadowRoot.querySelector(\"pre.stack\");\n\n const message = messageElement ? messageElement.textContent : \"\";\n const file = fileElement ? fileElement.textContent : \"\";\n const frames = Array.from(frameElements)\n .map((el) => el.textContent)\n .join(\"\\\\n\");\n const stack = stackElement ? stackElement.textContent : \"\";\n\n let line, column;\n const fileStr = file || \"\";\n const lineColMatch = fileStr.match(/(?:line|at|:)(?:.*?)(?::| )(\\\\d+)(?::| )(\\\\d+)/i);\n if (lineColMatch) {\n line = parseInt(lineColMatch[1], 10);\n column = parseInt(lineColMatch[2], 10);\n }\n\n const messageStr = message || \"\";\n const isReactError =\n messageStr.includes(\"React\") ||\n messageStr.includes(\"JSX\") ||\n messageStr.includes(\"Unexpected token\") ||\n messageStr.includes(\"vite:react-babel\");\n\n const viteError = new Error(messageStr);\n\n window.__SEND_ERROR_TO_PARENT__(viteError, {\n file,\n line,\n column,\n frames,\n stack,\n isReactError,\n type: isReactError ? \"react-syntax\" : \"vite-error-overlay\",\n });\n\n overlay.setAttribute(\"data-error-sent\", \"true\");\n } catch (e) {\n console.error(\"[早期错误处理] 处理 vite-error-overlay 失败:\", e);\n }\n }\n\n function checkExistingOverlays() {\n const viteErrorOverlays = document.querySelectorAll(\"vite-error-overlay\");\n if (viteErrorOverlays.length > 0) {\n viteErrorOverlays.forEach((overlay) => {\n if (!overlay.hasAttribute(\"data-error-sent\")) {\n processViteErrorOverlay(overlay);\n }\n });\n }\n }\n\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.addedNodes.length > 0) {\n for (const node of Array.from(mutation.addedNodes)) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node;\n\n if (\n element.tagName === \"VITE-ERROR-OVERLAY\" &&\n !element.hasAttribute(\"data-error-sent\")\n ) {\n setTimeout(() => processViteErrorOverlay(element), 100);\n }\n\n const viteErrorOverlays = element.querySelectorAll(\"vite-error-overlay\");\n for (const viteErrorOverlay of Array.from(viteErrorOverlays)) {\n if (!viteErrorOverlay.hasAttribute(\"data-error-sent\")) {\n setTimeout(() => processViteErrorOverlay(viteErrorOverlay), 100);\n }\n }\n }\n }\n }\n }\n });\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n });\n\n setTimeout(checkExistingOverlays, 500);\n setInterval(checkExistingOverlays, 2000);\n }\n\n window.addEventListener(\n \"error\",\n function (event) {\n const target = event && (event.target || event.srcElement);\n const tagName = target && target.tagName;\n if (tagName) {\n const url = (target && (target.src || target.href || target.currentSrc)) ||\n (target && target.getAttribute && (target.getAttribute('src') || target.getAttribute('href')));\n const preview = target && target.outerHTML ? String(target.outerHTML).slice(0, 300) : undefined;\n const resourceError = new Error('Resource load error: ' + tagName + ' ' + (url || 'unknown'));\n window.__SEND_ERROR_TO_PARENT__(resourceError, {\n filename: url,\n tagName: tagName,\n element: preview,\n type: \"resource\"\n });\n return;\n }\n\n var stack = (event && event.error && event.error.stack) || \"\";\n var message = typeof event.message === \"string\" ? event.message : \"\";\n if ((stack && stack.indexOf('error-handler') !== -1) || !message) return;\n\n window.__SEND_ERROR_TO_PARENT__(event.error || new Error(event.message), {\n filename: event.filename,\n line: event.lineno,\n column: event.colno,\n type: \"runtime\",\n });\n },\n true\n );\n\n window.addEventListener(\"unhandledrejection\", function (event) {\n const reason = event.reason;\n window.__SEND_ERROR_TO_PARENT__(\n reason instanceof Error ? reason : new Error(String(reason)),\n { type: \"promise\" }\n );\n });\n\n setupViteOverlayObserver();\n\n if (!window.__FETCH_INTERCEPTED__) {\n window.__FETCH_INTERCEPTED__ = true;\n const originalFetch = window.fetch;\n \n function handleFetchError(error, url, response = null) {\n const errorDetails = {\n type: \"network\",\n method: \"fetch\",\n url: url\n };\n \n if (response && !response.ok) {\n errorDetails.status = response.status;\n errorDetails.statusText = response.statusText;\n errorDetails.networkError = false;\n } else {\n errorDetails.networkError = true;\n }\n window.__SEND_ERROR_TO_PARENT__(error, errorDetails);\n }\n \n window.fetch = function(...args) {\n const url = args[0] instanceof Request ? args[0].url : args[0];\n \n return originalFetch.apply(this, args)\n .then(response => {\n if (!response.ok) {\n const networkError = new Error('HTTP ' + response.status + ': ' + response.statusText);\n handleFetchError(networkError, url, response);\n }\n return response;\n })\n .catch(error => {\n handleFetchError(error, url);\n throw error;\n });\n };\n }\n\n if (!window.__XHR_INTERCEPTED__) {\n window.__XHR_INTERCEPTED__ = true;\n const originalXHROpen = XMLHttpRequest.prototype.open;\n const originalXHRSend = XMLHttpRequest.prototype.send;\n \n function handleXHRError(error, xhr, isNetworkError = false) {\n const errorDetails = {\n type: \"network\",\n method: \"xhr\",\n url: xhr.__intercepted_url__\n };\n \n if (!isNetworkError && xhr.status >= 400) {\n errorDetails.status = xhr.status;\n errorDetails.statusText = xhr.statusText;\n errorDetails.networkError = false;\n } else {\n errorDetails.networkError = true;\n }\n \n window.__SEND_ERROR_TO_PARENT__(error, errorDetails);\n }\n \n XMLHttpRequest.prototype.open = function(method, url, ...args) {\n this.__intercepted_method__ = method;\n this.__intercepted_url__ = url;\n return originalXHROpen.apply(this, [method, url, ...args]);\n };\n \n XMLHttpRequest.prototype.send = function(...args) {\n const xhr = this;\n \n const originalOnReadyStateChange = xhr.onreadystatechange;\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n if (xhr.status >= 400) {\n const networkError = new Error('HTTP ' + xhr.status + ': ' + xhr.statusText);\n handleXHRError(networkError, xhr, false);\n }\n }\n \n if (originalOnReadyStateChange) {\n return originalOnReadyStateChange.apply(this, arguments);\n }\n };\n \n const originalOnError = xhr.onerror;\n xhr.onerror = function() {\n const networkError = new Error('Network error for ' + xhr.__intercepted_method__ + ' ' + xhr.__intercepted_url__);\n handleXHRError(networkError, xhr, true);\n \n if (originalOnError) {\n return originalOnError.apply(this, arguments);\n }\n };\n \n return originalXHRSend.apply(this, args);\n };\n }\n\n if (!window.__CONSOLE_ERROR_INTERCEPTED__) {\n window.__CONSOLE_ERROR_INTERCEPTED__ = true;\n const originalConsoleError = console.error;\n console.error = function () {\n try {\n var args = Array.prototype.slice.call(arguments);\n var first = args[0];\n var firstStr = typeof first === \"string\" ? first : \"\";\n var isReact = firstStr.indexOf(\"React\") !== -1;\n var isVite = firstStr.indexOf(\"[vite]\") !== -1 || firstStr.indexOf(\"Failed to reload\") !== -1;\n if (isReact || isVite) {\n var joined = args\n .map(function (a) {\n if (a instanceof Error) return a.message;\n if (typeof a === \"string\") return a;\n if (a && typeof a.message === \"string\") return a.message;\n try { return JSON.stringify(a); } catch (_) { return String(a); }\n })\n .join(\" \");\n var errorForReport = new Error(joined);\n window.__SEND_ERROR_TO_PARENT__(errorForReport, { type: \"runtime\", viteErrorType: \"console\" });\n }\n } catch (_) {}\n return originalConsoleError.apply(console, arguments);\n };\n }\n\n console.log(\"[早期错误处理] 初始化完成\");\n})();`;\n\n/**\n * 在页面尽早注入错误处理脚本。\n * 调用时机:应在应用入口尽早执行(例如在 root render 之前)。\n */\nexport function injectEarlyErrorHandler(): void {\n if (typeof document === 'undefined') return\n try {\n // 如果已经注入则跳过\n if ((window as any).__EARLY_ERROR_HANDLER_INJECTED__) return\n const script = document.createElement('script')\n script.type = 'text/javascript'\n script.text = ERROR_HANDLER_SCRIPT\n // 插入到 head 最前面,尽早执行\n const head = document.head || document.getElementsByTagName('head')[0]\n if (head && head.firstChild) head.insertBefore(script, head.firstChild)\n else if (head) head.appendChild(script)\n ; (window as any).__EARLY_ERROR_HANDLER_INJECTED__ = true\n } catch (e) {\n // ignore\n }\n}\n\nexport default injectEarlyErrorHandler\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgUtB,SAAS,0BAAgC;AAC9C,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI;AAEF,QAAK,OAAe,iCAAkC;AACtD,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,OAAO;AACd,WAAO,OAAO;AAEd,UAAM,OAAO,SAAS,QAAQ,SAAS,qBAAqB,MAAM,EAAE,CAAC;AACrE,QAAI,QAAQ,KAAK,WAAY,MAAK,aAAa,QAAQ,KAAK,UAAU;AAAA,aAC7D,KAAM,MAAK,YAAY,MAAM;AAClC,IAAC,OAAe,mCAAmC;AAAA,EACzD,SAAS,GAAG;AAAA,EAEZ;AACF;;;AtBnUA;AACA;","names":["getToken","setToken","axios","config","import_react","import_jsx_runtime","email","code","import_react","import_react","import_jsx_runtime","theme","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","import_react","import_react_toastify","import_jsx_runtime","React","React","import_react"]}
|