@howone/sdk 0.1.26 → 0.1.27
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 +290 -4
- package/dist/index.d.ts +290 -4
- package/dist/index.js +4775 -344
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4770 -343
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth/index.ts","../src/config.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","../src/index.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","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 // Wrap workflowRequest to automatically inject projectId into workflow URLs\n const workflowRequestWrapped = ai ? {\n get: ai.get.bind(ai),\n post: (config: RequestConfig) => {\n // Create a new config object to avoid mutating the original\n const modifiedConfig = { ...config }\n\n // Auto-inject projectId into workflow URLs\n if (opts?.projectId && modifiedConfig.url) {\n // Match patterns like /workflow/{id}/execute or /{id}/execute\n const workflowPattern = /^\\/?(?:workflow\\/)?([^\\/]+)\\/execute/\n const match = modifiedConfig.url.match(workflowPattern)\n if (match) {\n const workflowId = match[1]\n // Rebuild URL as /workflow/{projectId}/{workflowId}/execute\n modifiedConfig.url = `/workflow/${opts.projectId}/${workflowId}/execute`\n }\n }\n return ai.post(modifiedConfig)\n },\n put: ai.put.bind(ai),\n delete: ai.delete.bind(ai),\n request: ai.request.bind(ai),\n cancelRequest: ai.cancelRequest?.bind(ai),\n cancelAllRequests: ai.cancelAllRequests?.bind(ai),\n } : ai\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: workflowRequestWrapped,\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 const [hasCheckedUrlToken, setHasCheckedUrlToken] = useState(false)\n\n // Auto-capture token from URL on mount\n useEffect(() => {\n try {\n // Check query string for token\n const params = new URLSearchParams(window.location.search)\n let urlToken = params.get('access_token') || params.get('token')\n\n // Also check hash fragment (used by OAuth redirects)\n if (!urlToken && window.location.hash) {\n const hashParams = new URLSearchParams(window.location.hash.slice(1))\n urlToken = hashParams.get('access_token') || hashParams.get('token')\n }\n\n if (urlToken) {\n console.log('[HowOneProvider] Token captured from URL, storing to localStorage...')\n\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 params.delete('project_id')\n const newSearch = params.toString()\n const newUrl = window.location.pathname + (newSearch ? '?' + newSearch : '')\n window.history.replaceState({}, '', newUrl)\n\n console.log('[HowOneProvider] Token stored successfully, URL cleaned')\n }\n } catch (e) {\n console.error('[HowOneProvider] Failed to capture token from URL:', e)\n } finally {\n // Mark that we've checked for URL token\n setHasCheckedUrlToken(true)\n }\n }, [])\n\n // Auto-redirect to auth page when unauthenticated\n // Only check AFTER we've checked for URL token to avoid race condition\n useEffect(() => {\n // Wait until we've checked the URL for token first\n if (!hasCheckedUrlToken) {\n return\n }\n\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, hasCheckedUrlToken])\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","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"],"mappings":"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","names":["getToken","setToken","config","useState","useEffect","Icon","jsx","jsxs","email","code","createContext","useContext","useState","useEffect","useEffect","useState","jsx","theme","jsx","jsx","jsxs","createContext","useState","useEffect","useContext","jsx","jsxs","jsx","jsxs","React","useTheme","Icon","jsx","jsxs","React","Icon","jsx","jsxs","React","useState","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../src/auth/index.ts","../src/config.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/unified-error-handler/types.ts","../src/utils/unified-error-handler/utils/DeepSerializer.ts","../src/utils/unified-error-handler/utils/ViteHMRDetector.ts","../src/utils/unified-error-handler/utils/HardRefreshManager.ts","../src/utils/unified-error-handler/utils/ViewDetector.ts","../src/utils/unified-error-handler/utils/ComponentTreeGenerator.ts","../src/utils/unified-error-handler/utils/MessageSender.ts","../src/utils/unified-error-handler/features/ErrorTracking.ts","../src/utils/unified-error-handler/features/InteractionTracking.ts","../src/utils/unified-error-handler/features/ElementSelector.ts","../src/utils/unified-error-handler/features/MessageBridge.ts","../src/utils/unified-error-handler/core/ErrorHandler.ts","../src/utils/unified-error-handler/simple.ts","../src/index.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","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 // Wrap workflowRequest to automatically inject projectId into workflow URLs\n const workflowRequestWrapped = ai ? {\n get: ai.get.bind(ai),\n post: (config: RequestConfig) => {\n // Create a new config object to avoid mutating the original\n const modifiedConfig = { ...config }\n\n // Auto-inject projectId into workflow URLs\n if (opts?.projectId && modifiedConfig.url) {\n // Match patterns like /workflow/{id}/execute or /{id}/execute\n const workflowPattern = /^\\/?(?:workflow\\/)?([^\\/]+)\\/execute/\n const match = modifiedConfig.url.match(workflowPattern)\n if (match) {\n const workflowId = match[1]\n // Rebuild URL as /workflow/{projectId}/{workflowId}/execute\n modifiedConfig.url = `/workflow/${opts.projectId}/${workflowId}/execute`\n }\n }\n return ai.post(modifiedConfig)\n },\n put: ai.put.bind(ai),\n delete: ai.delete.bind(ai),\n request: ai.request.bind(ai),\n cancelRequest: ai.cancelRequest?.bind(ai),\n cancelAllRequests: ai.cancelAllRequests?.bind(ai),\n } : ai\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: workflowRequestWrapped,\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 const [hasCheckedUrlToken, setHasCheckedUrlToken] = useState(false)\n\n // Auto-capture token from URL on mount\n useEffect(() => {\n try {\n // Check query string for token\n const params = new URLSearchParams(window.location.search)\n let urlToken = params.get('access_token') || params.get('token')\n\n // Also check hash fragment (used by OAuth redirects)\n if (!urlToken && window.location.hash) {\n const hashParams = new URLSearchParams(window.location.hash.slice(1))\n urlToken = hashParams.get('access_token') || hashParams.get('token')\n }\n\n if (urlToken) {\n console.log('[HowOneProvider] Token captured from URL, storing to localStorage...')\n\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 params.delete('project_id')\n const newSearch = params.toString()\n const newUrl = window.location.pathname + (newSearch ? '?' + newSearch : '')\n window.history.replaceState({}, '', newUrl)\n\n console.log('[HowOneProvider] Token stored successfully, URL cleaned')\n }\n } catch (e) {\n console.error('[HowOneProvider] Failed to capture token from URL:', e)\n } finally {\n // Mark that we've checked for URL token\n setHasCheckedUrlToken(true)\n }\n }, [])\n\n // Auto-redirect to auth page when unauthenticated\n // Only check AFTER we've checked for URL token to avoid race condition\n useEffect(() => {\n // Wait until we've checked the URL for token first\n if (!hasCheckedUrlToken) {\n return\n }\n\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, hasCheckedUrlToken])\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 \"./ThemeProvider\" // 使用项目内部的主题系统\nimport { Icon } from \"@iconify/react\"\n\ninterface ThemeToggleProps {\n className?: string\n}\n\n/**\n * 主题切换按钮组件\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 // 主题切换处理函数\n const handleToggle = () => {\n if (theme === 'dark') {\n setTheme('light')\n } else {\n setTheme('dark')\n }\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-bold\" width={20} height={20} />\n <span className=\"sr-only\">切换主题</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={handleToggle}\n >\n {theme === \"light\" ? (\n <Icon icon=\"solar:sun-bold\" width={20} height={20} />\n ) : (\n <Icon icon=\"solar:moon-linear\" width={20} height={20} />\n )}\n <span className=\"sr-only\">切换主题</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\";\nimport { useTheme } from \"../../theme\";\n\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\n/**\n * Toast 图标配置\n * 包含不同类型 Toast 的图标、颜色和样式配置\n */\nconst TOAST_ICONS = {\n success: {\n icon: \"mdi:success\",\n color: \"text-green-400\",\n className: \"text-green-400\",\n // 深色主题配置\n dark: {\n bgGradient: \"bg-[#14181d]\", // 移除透明度 f2\n gradientColor: \"#389726\",\n borderGradient: \"border-[#389726]\",\n borderGradientColor: \"#389726\"\n },\n // 浅色主题配置\n light: {\n bgGradient: \"bg-[#fafafa]\", // 移除透明度 ff\n gradientColor: \"#22c55e\",\n borderGradient: \"border-[#22c55e]\",\n borderGradientColor: \"#22c55e\"\n }\n },\n error: {\n icon: \"ic:outline-close\",\n color: \"text-red-400\",\n className: \"text-red-400\",\n dark: {\n bgGradient: \"bg-[#14181d]\", // 移除透明度 f2\n gradientColor: \"#ef4444\",\n borderGradient: \"border-[#ef4444]\",\n borderGradientColor: \"#ef4444\"\n },\n light: {\n bgGradient: \"bg-[#fafafa]\", // 移除透明度 ff\n gradientColor: \"#f87171\",\n borderGradient: \"border-[#f87171]\",\n borderGradientColor: \"#f87171\"\n }\n },\n warning: {\n icon: \"mi:warning\",\n color: \"text-yellow-400\",\n className: \"text-yellow-400\",\n dark: {\n bgGradient: \"bg-[#14181d]\", // 移除透明度 f2\n gradientColor: \"#facc15\",\n borderGradient: \"border-[#facc15]\",\n borderGradientColor: \"#facc15\"\n },\n light: {\n bgGradient: \"bg-[#fafafa]\", // 移除透明度 ff\n gradientColor: \"#f59e0b\",\n borderGradient: \"border-[#f59e0b]\",\n borderGradientColor: \"#f59e0b\"\n }\n },\n info: {\n icon: \"ic:outline-info\",\n color: \"text-blue-400\",\n className: \"text-blue-400\",\n dark: {\n bgGradient: \"bg-[#14181d]\", // 移除透明度 f2\n gradientColor: \"#60a5fa\",\n borderGradient: \"border-[#60a5fa]\",\n borderGradientColor: \"#f0f0f0\"\n },\n light: {\n bgGradient: \"bg-[#fafafa]\", // 移除透明度 ff\n gradientColor: \"#3b82f6\",\n borderGradient: \"border-[#3b82f6]\",\n borderGradientColor: \"#3b82f6\"\n }\n },\n default: {\n icon: \"ic:round-notifications\",\n color: \"text-gray-400\",\n className: \"text-gray-400\",\n dark: {\n bgGradient: \"bg-[#14181d]\", // 移除透明度 f2\n gradientColor: \"#9ca3af\",\n borderGradient: \"border-[#9ca3af]\",\n borderGradientColor: \"#9ca3af\"\n },\n light: {\n bgGradient: \"bg-[#fafafa]\", // 移除透明度 ff\n gradientColor: \"#6b7280\",\n borderGradient: \"border-[#6b7280]\",\n borderGradientColor: \"#6b7280\"\n }\n }\n};\n\n/**\n * 关闭按钮组件\n * 根据主题动态调整颜色\n */\nconst CloseButton = React.memo(({ closeToast }: { closeToast?: () => void }) => {\n const { theme } = useTheme();\n \n const handleClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n closeToast?.();\n }, [closeToast]);\n\n // 根据主题获取关闭按钮颜色\n const getCloseButtonColor = () => {\n const actualTheme = theme === \"system\" \n ? (window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\")\n : theme;\n \n return actualTheme === \"dark\" ? \"#b4b4b4\" : \"#6b7280\";\n };\n\n const getCloseButtonHoverColor = () => {\n const actualTheme = theme === \"system\" \n ? (window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\")\n : theme;\n \n return actualTheme === \"dark\" ? \"white\" : \"#374151\";\n };\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 transition-colors duration-200 drop-shadow-sm\"\n onClick={handleClick}\n width={14}\n height={14}\n style={{\n color: getCloseButtonColor(),\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = getCloseButtonHoverColor();\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = getCloseButtonColor();\n }}\n />\n );\n});\n\nCloseButton.displayName = 'CloseButton';\n\n/**\n * Toast 内容组件\n * 根据主题动态渲染不同样式的 Toast\n */\nconst ToastContent: React.FC<ToastContentProps> = ({ type, title, message, component, closeToast }) => {\n const iconConfig = TOAST_ICONS[type];\n const { theme } = useTheme();\n\n // 使用 useCallback 确保 closeToast 函数引用稳定\n const handleClose = useCallback(() => {\n closeToast?.();\n }, [closeToast]);\n\n // 根据主题获取文字颜色\n const getTextColor = () => {\n const actualTheme = theme === \"system\" \n ? (window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\")\n : theme;\n \n return actualTheme === \"dark\" ? \"white\" : \"#1f2937\";\n };\n\n // 根据主题获取配置\n const getThemeConfig = () => {\n const actualTheme = theme === \"system\" \n ? (window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\")\n : theme;\n \n return actualTheme === \"dark\" ? iconConfig.dark : iconConfig.light;\n };\n\n const themeConfig = getThemeConfig();\n\n if (component) {\n return (\n <div className={`flex items-start gap-3 !min-h-[90px] w-full backdrop-blur-md p-4 shadow-2xl relative overflow-hidden ${themeConfig.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-[90px] w-full backdrop-blur-md p-4 shadow-2xl relative overflow-hidden ${themeConfig.bgGradient}`}>\n <div \n className=\"absolute left-0 top-0 w-full h-full rounded-xl\" \n style={{ \n background: theme === \"dark\" || (theme === \"system\" && window.matchMedia(\"(prefers-color-scheme: dark)\").matches)\n ? '#0f1419'\n : '#ffffff', \n zIndex: -2 \n }} \n />\n {/* 主渐变背景层 */}\n <div\n className=\"absolute left-0 top-0 w-full h-full pointer-events-none rounded-xl\"\n style={{\n background: theme === \"dark\" || (theme === \"system\" && window.matchMedia(\"(prefers-color-scheme: dark)\").matches)\n ? `linear-gradient(135deg, ${themeConfig.gradientColor}30 0%, ${themeConfig.gradientColor}20 15%, #14181df2 30%)`\n : `linear-gradient(135deg, ${themeConfig.gradientColor}15 0%, ${themeConfig.gradientColor}08 15%, #fafafaff 30%)`,\n zIndex: -1\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: theme === \"dark\" || (theme === \"system\" && window.matchMedia(\"(prefers-color-scheme: dark)\").matches)\n ? `linear-gradient(135deg, ${themeConfig.borderGradientColor}60 0%, ${themeConfig.borderGradientColor}40 5%, transparent 22%)`\n : `linear-gradient(135deg, ${themeConfig.borderGradientColor}40 0%, ${themeConfig.borderGradientColor}25 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 {/* 图标区域 */}\n <div className=\"flex-shrink-0 mt-0.5 relative z-10\">\n <div className={`w-7 h-7 backdrop-blur-sm rounded-full flex items-center justify-center ${\n theme === \"dark\" || (theme === \"system\" && window.matchMedia(\"(prefers-color-scheme: dark)\").matches)\n ? \"bg-white/10\"\n : \"bg-black/5\"\n }`}>\n <Icon\n icon={iconConfig.icon}\n width={16}\n height={16}\n className={iconConfig.color}\n style={{\n color: themeConfig.gradientColor,\n }}\n />\n </div>\n </div>\n\n {/* 文字内容区域 */}\n <div className=\"flex flex-col gap-1 flex-1 relative z-10\">\n {title && (\n <div className=\"text-[16px] font-semibold leading-tight drop-shadow-sm\"\n style={{\n color: getTextColor(),\n backgroundClip: 'text',\n }}\n >\n {title}\n </div>\n )}\n {message && (\n <div className=\"text-[13px] font-normal leading-relaxed drop-shadow-sm\"\n style={{\n color: getTextColor(),\n backgroundClip: 'text',\n }}\n >\n {message}\n </div>\n )}\n </div>\n\n {/* 关闭按钮 */}\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\n/**\n * 创建指定类型的 Toast 函数\n * 移除透明背景设置,让 ToastContent 组件的背景生效\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 // 确保圆角样式不被覆盖,添加 rounded-xl 类\n className: \"!p-0 !shadow-none !rounded-xl\",\n style: { padding: 0, borderRadius: '0.75rem' }\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","/**\n * 错误处理模块 - 核心类型定义\n * \n */\n\n// 扩展Window接口\ndeclare global {\n interface Window {\n __AUTO_ENGINEER_INTERACTION_TRAIL__?: UserInteraction[];\n __AUTO_ENGINEER_ERRORS__?: any[];\n __SEND_ERROR_TO_PARENT__?: (error: Error | string, details?: any) => void;\n __FETCH_INTERCEPTED__?: boolean;\n __XHR_INTERCEPTED__?: boolean;\n __CONSOLE_INTERCEPTED__?: boolean;\n __VITE_HMR__?: any;\n __vite_plugin_react_preamble_installed__?: boolean;\n __REACT_DEVTOOLS_GLOBAL_HOOK__?: any;\n React?: any;\n ReactDOM?: any;\n Vue?: any;\n Angular?: any;\n jQuery?: any;\n $?: any;\n }\n}\n\n// 错误严重性级别\nexport type ErrorSeverity = 'critical' | 'high' | 'medium' | 'low';\n\n// 错误类型\nexport type ErrorType = 'runtime' | 'promise' | 'network' | 'resource' | 'console' | 'vite' | 'react' | 'module' | 'unknown';\n\n// 用户交互类型\nexport interface UserInteraction {\n type: 'click' | 'input' | 'scroll' | 'navigation' | 'mousemove' | 'focus' | 'blur' | 'resize' | 'submit' | 'visibility' | 'keydown' | 'change' | 'keyup';\n element?: string;\n timestamp: number;\n details?: any;\n}\n\n// 组件树节点类型\nexport interface ComponentTreeNode {\n type: 'node' | 'text';\n tagName?: string;\n textContent?: string;\n attrs?: Record<string, string>;\n data?: ElementData;\n children?: ComponentTreeNode[];\n}\n\n// 元素数据接口\nexport interface ElementData {\n id?: string;\n filePath?: string;\n fileName?: string;\n lineNumber?: number;\n col?: number;\n elementType?: string;\n content?: string;\n children?: ElementData[];\n className?: string;\n textContent?: string;\n attrs?: {\n src?: string;\n [key: string]: any;\n };\n}\n\n// 元素位置信息\nexport interface ElementLocation {\n filePath: string;\n lineNumber: number;\n col: number;\n}\n\n// 视图信息接口\nexport interface ViewInfo {\n title: string;\n url: string;\n timestamp: number;\n viewport?: { width: number; height: number };\n}\n\n// 错误载荷接口\nexport interface ErrorPayload {\n message: string;\n stack?: string;\n filename?: string;\n lineno?: number;\n colno?: number;\n timestamp: number;\n type: ErrorType | string;\n severity: ErrorSeverity;\n category?: string;\n userAgent?: string;\n url?: string;\n view?: string;\n userInteractions?: UserInteraction[];\n networkInfo?: any;\n details?: any;\n context?: {\n source?: string;\n [key: string]: any;\n };\n}\n\n// 错误处理器配置\nexport interface SimpleErrorConfig {\n maxErrors: number;\n dedupWindow: number;\n debounceTime: number;\n reportToParent: boolean; // 是否向父窗口报告\n reportToConsole: boolean; // 是否输出到控制台\n}\n\n// 增强错误处理器配置\nexport interface EnhancedErrorConfig {\n MAX_ERRORS: number; // 最大错误存储数量\n MAX_INTERACTIONS: number; // 最大用户交互存储数量\n DEDUP_WINDOW: number; // 去重时间窗口\n DEBOUNCE_TIME: number; // 防抖时间\n CACHE_DURATION: number; // 缓存持续时间\n // 错误严重程度关键词\n SEVERITY_KEYWORDS: {\n CRITICAL: string[];\n HIGH: string[];\n MEDIUM: string[];\n LOW: string[];\n };\n // 错误分类关键词\n CATEGORY_KEYWORDS: {\n SYNTAX: string[];\n NETWORK: string[];\n RUNTIME: string[];\n SECURITY: string[];\n PERFORMANCE: string[];\n DEVELOPMENT: string[];\n REACT: string[];\n VITE: string[];\n };\n}\n\n// 全局状态管理配置\nexport interface GlobalStateConfig {\n ALLOWED_ORIGINS: string[];\n DEBOUNCE_DELAY: number;\n OVERRIDE_STYLESHEET_ID: string;\n}\n\n// 选择器配置接口\nexport interface SelectorConfig {\n HIGHLIGHT_COLOR: string;\n HIGHLIGHT_BORDER_WIDTH: string;\n HIGHLIGHT_BORDER_STYLE: string;\n SELECTED_COLOR: string;\n SELECTED_BORDER_WIDTH: string;\n TOOLTIP_BACKGROUND: string;\n TOOLTIP_COLOR: string;\n TOOLTIP_PADDING: string;\n TOOLTIP_BORDER_RADIUS: string;\n TOOLTIP_FONT_SIZE: string;\n TOOLTIP_Z_INDEX: string;\n FULL_WIDTH_TOOLTIP_OFFSET: number;\n highlightClass: string;\n selectedClass: string;\n cursor: string;\n}\n\n// 选择器状态接口\nexport interface SelectorState {\n isActive: boolean;\n highlightedElement: any;\n selectedElements: any[];\n config: SelectorConfig;\n}\n\n/**\n * 统一消息类型定义\n */\nexport type MessageType = \n | 'ERROR_EVENT' // 真正的错误事件(运行时错误、Promise拒绝等)\n | 'NETWORK_EVENT' // 网络请求事件(成功和失败的请求)\n | 'CONSOLE_EVENT' // 控制台输出事件(log、warn、error等)\n | 'SYSTEM_EVENT' // 系统状态事件(刷新、状态报告等)\n | 'ELEMENT_EVENT' // 所有元素操作相关事件\n | 'SELECTOR_EVENT' // 所有选择器相关事件\n | 'COMPONENT_EVENT' // 组件树相关事件\n | 'STYLE_EVENT' // 样式相关事件\n | 'INTERACTION_EVENT' // 用户交互相关事件\n | 'STATE_EVENT'; // 状态更新事件\n\n/**\n * 错误事件子类型 - 仅包含真正的错误\n */\nexport type ErrorEventType = \n | 'runtime' // JavaScript运行时错误\n | 'promise' // 未处理的Promise拒绝\n | 'initialization' // 初始化错误\n | 'message_handling'; // 消息处理错误\n\n/**\n * 网络事件子类型\n */\nexport type NetworkEventType = \n | 'request_success' // 成功的网络请求 (2xx状态码)\n | 'request_error' // 失败的网络请求 (4xx, 5xx状态码)\n | 'request_timeout' // 请求超时\n | 'connection_error'; // 连接错误\n\n/**\n * 控制台事件子类型\n */\nexport type ConsoleEventType = \n | 'info' // console.log输出\n | 'warning' // console.warn输出\n | 'error'; // console.error输出\n\n/**\n * 系统事件子类型\n */\nexport type SystemEventType = \n | 'hard_refresh' // 硬刷新事件\n | 'status_report' // 状态报告\n | 'vite_hmr' // Vite热更新事件\n | 'page_load' // 页面加载事件\n | 'navigation'; // 导航事件\n\n/**\n * 元素事件子类型\n */\nexport type ElementEventType = \n | 'clicked'\n | 'double_clicked'\n | 'content_updated'\n | 'attrs_updated'\n | 'duplicated'\n | 'text_updated'\n | 'edit_completed'\n | 'selected_elements_updated'\n | 'at_point_response'\n | 'elements_by_location_response'\n | 'attributes_set_response'\n | 'text_editing_enabled_response'\n | 'hovered_by_selector_response'\n | 'unhovered_response'\n | 'parent_element_response';\n\n/**\n * 选择器事件子类型\n */\nexport type SelectorEventType = \n | 'enabled'\n | 'disabled'\n | 'state_response';\n\n/**\n * 组件事件子类型\n */\nexport type ComponentEventType = \n | 'tree_response'\n | 'tree_error';\n\n/**\n * 样式事件子类型\n */\nexport type StyleEventType = \n | 'stylesheet_updated';\n\n/**\n * 交互事件子类型\n */\nexport type InteractionEventType = \n | 'summary';\n\n/**\n * 状态事件子类型\n */\nexport type StateEventType = \n | 'update';\n\n// 统一消息接口\nexport interface Message {\n type: MessageType;\n payload: {\n type: string; // 子类型,对应各种 EventType\n [key: string]: any;\n };\n timestamp?: number;\n}\n\n// 具体消息类型接口\nexport interface ErrorMessage extends Message {\n type: 'ERROR_EVENT';\n payload: {\n type: ErrorEventType;\n [key: string]: any;\n };\n}\n\nexport interface ElementMessage extends Message {\n type: 'ELEMENT_EVENT';\n payload: {\n type: ElementEventType;\n [key: string]: any;\n };\n}\n\nexport interface SelectorMessage extends Message {\n type: 'SELECTOR_EVENT';\n payload: {\n type: SelectorEventType;\n [key: string]: any;\n };\n}\n\nexport interface ComponentMessage extends Message {\n type: 'COMPONENT_EVENT';\n payload: {\n type: ComponentEventType;\n [key: string]: any;\n };\n}\n\nexport interface StyleMessage extends Message {\n type: 'STYLE_EVENT';\n payload: {\n type: StyleEventType;\n [key: string]: any;\n };\n}\n\nexport interface InteractionMessage extends Message {\n type: 'INTERACTION_EVENT';\n payload: {\n type: InteractionEventType;\n [key: string]: any;\n };\n}\n\nexport interface StateMessage extends Message {\n type: 'STATE_EVENT';\n payload: {\n type: StateEventType;\n [key: string]: any;\n };\n}\n\nexport interface NetworkMessage extends Message {\n type: 'NETWORK_EVENT';\n payload: {\n type: NetworkEventType;\n url?: string;\n method?: string;\n status?: number;\n statusText?: string;\n duration?: number;\n requestBody?: string;\n responseBody?: string;\n headers?: Record<string, string>;\n error?: {\n message: string;\n stack?: string;\n };\n [key: string]: any;\n };\n}\n\nexport interface ConsoleMessage extends Message {\n type: 'CONSOLE_EVENT';\n payload: {\n type: ConsoleEventType;\n level: ConsoleLevel;\n message: string;\n args?: any[];\n [key: string]: any;\n };\n}\n\nexport interface SystemMessage extends Message {\n type: 'SYSTEM_EVENT';\n payload: {\n type: SystemEventType;\n reason?: string;\n details?: any;\n [key: string]: any;\n };\n}\n\n// 控制台级别映射类型\nexport type ConsoleLevel = 'info' | 'warning' | 'error' | 'debug';\n\n// 控制台级别映射\nexport const CONSOLE_LEVEL_MAP = {\n log: \"info\" as ConsoleLevel,\n warn: \"warning\" as ConsoleLevel,\n error: \"error\" as ConsoleLevel,\n info: \"info\" as ConsoleLevel,\n debug: \"debug\" as ConsoleLevel\n} as const;\n\n// 错误统计接口\nexport interface ErrorStats {\n totalErrors: number;\n sentToParent?: number;\n errorsByCategory?: Record<string, number>;\n errorsBySeverity?: Record<ErrorSeverity, number>;\n recentErrors?: ErrorPayload[];\n jsErrors?: number;\n networkErrors?: number;\n consoleErrors?: number;\n lastErrorTime?: number;\n}\n\n// 默认配置\nexport const DEFAULT_ERROR_CONFIG: SimpleErrorConfig = {\n maxErrors: 50,\n dedupWindow: 1000,\n debounceTime: 100,\n reportToParent: true,\n reportToConsole: true\n};\n\n// 增强错误处理器默认配置\nexport const ERROR_CONFIG: EnhancedErrorConfig = {\n MAX_ERRORS: 100,\n MAX_INTERACTIONS: 50,\n DEDUP_WINDOW: 1000,\n DEBOUNCE_TIME: 100,\n CACHE_DURATION: 300000,\n SEVERITY_KEYWORDS: {\n CRITICAL: ['fatal', 'critical', 'security', 'crash', 'corruption'],\n HIGH: ['error', 'exception', 'failed', 'timeout', 'network error'],\n MEDIUM: ['warning', 'deprecated', 'slow', 'performance'],\n LOW: ['info', 'debug', 'trace', 'notice']\n },\n CATEGORY_KEYWORDS: {\n SYNTAX: ['syntaxerror', 'unexpected token', 'parse error', 'invalid syntax'],\n NETWORK: ['fetch', 'xhr', 'network', 'cors', 'timeout', 'connection'],\n RUNTIME: ['referenceerror', 'typeerror', 'rangeerror', 'undefined'],\n SECURITY: ['csp', 'xss', 'csrf', 'security', 'unauthorized'],\n PERFORMANCE: ['slow', 'memory', 'leak', 'performance', 'timeout'],\n DEVELOPMENT: ['vite', 'hmr', 'hot reload', 'dev server', 'webpack'],\n REACT: ['react', 'jsx', 'component', 'hook', 'render'],\n VITE: ['vite', '[vite]', 'vite:react', 'transform failed']\n }\n};\n\n// 全局配置\nexport const GLOBAL_CONFIG: GlobalStateConfig = {\n ALLOWED_ORIGINS: [\n \"https://howone.ai\",\n \"https://howone.dev\", \n \"http://localhost:3000\",\n \"http://localhost:5173\",\n ],\n DEBOUNCE_DELAY: 10,\n OVERRIDE_STYLESHEET_ID: 'howone-override-styles'\n};\n\n// 默认选择器配置\nexport const DEFAULT_SELECTOR_CONFIG: SelectorConfig = {\n HIGHLIGHT_COLOR: '#ff6b6b',\n HIGHLIGHT_BORDER_WIDTH: '2px',\n HIGHLIGHT_BORDER_STYLE: 'solid',\n SELECTED_COLOR: '#4ecdc4',\n SELECTED_BORDER_WIDTH: '3px',\n TOOLTIP_BACKGROUND: '#333',\n TOOLTIP_COLOR: '#fff',\n TOOLTIP_PADDING: '8px 12px',\n TOOLTIP_BORDER_RADIUS: '4px',\n TOOLTIP_FONT_SIZE: '12px',\n TOOLTIP_Z_INDEX: '10000',\n FULL_WIDTH_TOOLTIP_OFFSET: 10,\n highlightClass: 'howone-highlight',\n selectedClass: 'howone-selected',\n cursor: 'crosshair'\n};","/**\n * DeepSerializer 深度序列化模块\n * 负责复杂对象的序列化,支持循环引用检测和各种数据类型\n */\n\nexport interface SerializationOptions {\n maxDepth: number;\n indent: number;\n includeSymbols: boolean;\n preserveTypes: boolean;\n maxStringLength: number;\n maxArrayLength: number;\n maxObjectKeys: number;\n}\n\nexport class CircularReference {\n public readonly message: string;\n \n constructor(path: string) {\n this.message = `[Circular Reference to ${path}]`;\n }\n}\n\nexport class TypeWrapper {\n public readonly _type: string;\n public readonly value: any;\n \n constructor(type: string, value: any) {\n this._type = type;\n this.value = value;\n }\n}\n\nexport class DeepSerializer {\n private static readonly DEFAULT_OPTIONS: SerializationOptions = {\n maxDepth: 10,\n indent: 2,\n includeSymbols: true,\n preserveTypes: true,\n maxStringLength: 10000,\n maxArrayLength: 100,\n maxObjectKeys: 100,\n };\n\n /**\n * 深度序列化对象\n */\n public static serialize(\n obj: any,\n options: Partial<SerializationOptions> = {},\n visitedObjects = new WeakMap<object, string>(),\n path = \"root\"\n ): any {\n const opts = { ...this.DEFAULT_OPTIONS, ...options };\n\n // 检查深度限制\n if (path.split(\".\").length > opts.maxDepth) {\n return new TypeWrapper(\n \"MaxDepthReached\",\n `[Max depth of ${opts.maxDepth} reached]`\n );\n }\n\n // 处理基本类型\n if (obj === undefined) {\n return new TypeWrapper(\"undefined\", \"undefined\");\n }\n\n if (obj === null) {\n return null;\n }\n\n if (typeof obj === \"string\") {\n return obj.length > opts.maxStringLength\n ? new TypeWrapper(\n \"String\",\n `${obj.slice(0, opts.maxStringLength)}... [${\n obj.length - opts.maxStringLength\n } more characters]`\n )\n : obj;\n }\n\n if (typeof obj === \"number\") {\n return Number.isNaN(obj)\n ? new TypeWrapper(\"Number\", \"NaN\")\n : Number.isFinite(obj)\n ? obj\n : new TypeWrapper(\"Number\", obj > 0 ? \"Infinity\" : \"-Infinity\");\n }\n\n if (typeof obj === \"boolean\") {\n return obj;\n }\n\n if (typeof obj === \"bigint\") {\n return new TypeWrapper(\"BigInt\", obj.toString());\n }\n\n if (typeof obj === \"symbol\") {\n return new TypeWrapper(\"Symbol\", obj.toString());\n }\n\n if (typeof obj === \"function\") {\n return new TypeWrapper(\"Function\", {\n name: obj.name || \"anonymous\",\n stringValue: obj.toString().slice(0, opts.maxStringLength),\n length: obj.length,\n });\n }\n\n // 处理对象类型 - 检查循环引用\n if (obj && typeof obj === \"object\") {\n if (visitedObjects.has(obj)) {\n return new CircularReference(visitedObjects.get(obj)!);\n }\n visitedObjects.set(obj, path);\n }\n\n // 处理特殊对象类型\n if (obj instanceof Error) {\n return this.serializeError(obj, opts, visitedObjects, path);\n }\n\n if (obj instanceof Date) {\n return new TypeWrapper(\"Date\", {\n iso: obj.toISOString(),\n value: obj.valueOf(),\n local: obj.toString(),\n });\n }\n\n if (obj instanceof RegExp) {\n return new TypeWrapper(\"RegExp\", {\n source: obj.source,\n flags: obj.flags,\n string: obj.toString(),\n });\n }\n\n if (obj instanceof Promise) {\n return new TypeWrapper(\"Promise\", \"[Promise]\");\n }\n\n if (obj instanceof WeakMap || obj instanceof WeakSet) {\n return new TypeWrapper(\n obj.constructor.name,\n \"[\" + obj.constructor.name + \"]\"\n );\n }\n\n if (obj instanceof Set) {\n return this.serializeSet(obj, opts, visitedObjects, path);\n }\n\n if (obj instanceof Map) {\n return this.serializeMap(obj, opts, visitedObjects, path);\n }\n\n // 处理 TypedArray\n if (ArrayBuffer.isView(obj)) {\n return this.serializeTypedArray(obj);\n }\n\n // 处理数组\n if (Array.isArray(obj)) {\n return this.serializeArray(obj, opts, visitedObjects, path);\n }\n\n // 处理普通对象\n return this.serializeObject(obj, opts, visitedObjects, path);\n }\n\n /**\n * 序列化错误对象\n */\n private static serializeError(\n error: Error,\n opts: SerializationOptions,\n visitedObjects: WeakMap<object, string>,\n path: string\n ): TypeWrapper {\n const errorObj: any = {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n\n // 添加其他属性\n for (const key of Object.getOwnPropertyNames(error)) {\n if (!errorObj[key]) {\n try {\n errorObj[key] = this.serialize(\n (error as any)[key],\n opts,\n visitedObjects,\n `${path}.${key}`\n );\n } catch (e) {\n errorObj[key] = new TypeWrapper(\"Error\", `[Unable to serialize: ${e}]`);\n }\n }\n }\n\n return new TypeWrapper(\"Error\", errorObj);\n }\n\n /**\n * 序列化 Set\n */\n private static serializeSet(\n set: Set<any>,\n opts: SerializationOptions,\n visitedObjects: WeakMap<object, string>,\n path: string\n ): TypeWrapper {\n const values = Array.from(set);\n \n if (values.length > opts.maxArrayLength) {\n return new TypeWrapper(\"Set\", {\n values: values\n .slice(0, opts.maxArrayLength)\n .map((item, index) =>\n this.serialize(item, opts, visitedObjects, `${path}.Set[${index}]`)\n ),\n truncated: values.length - opts.maxArrayLength,\n });\n }\n\n return new TypeWrapper(\"Set\", {\n values: values.map((item, index) =>\n this.serialize(item, opts, visitedObjects, `${path}.Set[${index}]`)\n ),\n });\n }\n\n /**\n * 序列化 Map\n */\n private static serializeMap(\n map: Map<any, any>,\n opts: SerializationOptions,\n visitedObjects: WeakMap<object, string>,\n path: string\n ): TypeWrapper {\n const entries: Record<string, any> = {};\n let truncatedCount = 0;\n let addedCount = 0;\n\n for (const [key, value] of map.entries()) {\n if (addedCount >= opts.maxObjectKeys) {\n truncatedCount++;\n continue;\n }\n\n const keyString =\n typeof key === \"object\"\n ? JSON.stringify(\n this.serialize(key, opts, visitedObjects, `${path}.MapKey`)\n )\n : String(key);\n\n entries[keyString] = this.serialize(\n value,\n opts,\n visitedObjects,\n `${path}.Map[${keyString}]`\n );\n addedCount++;\n }\n\n return new TypeWrapper(\"Map\", {\n entries: entries,\n truncated: truncatedCount || undefined,\n });\n }\n\n /**\n * 序列化 TypedArray\n */\n private static serializeTypedArray(typedArray: ArrayBufferView): TypeWrapper {\n const array = typedArray as any;\n return new TypeWrapper(array.constructor.name, {\n length: array.length,\n byteLength: array.byteLength,\n sample: Array.from(array.slice(0, 10)),\n });\n }\n\n /**\n * 序列化数组\n */\n private static serializeArray(\n array: any[],\n opts: SerializationOptions,\n visitedObjects: WeakMap<object, string>,\n path: string\n ): any[] {\n if (array.length > opts.maxArrayLength) {\n return array\n .slice(0, opts.maxArrayLength)\n .map((item, index) =>\n this.serialize(item, opts, visitedObjects, `${path}[${index}]`)\n )\n .concat([`... ${array.length - opts.maxArrayLength} more items`]);\n }\n\n return array.map((item, index) =>\n this.serialize(item, opts, visitedObjects, `${path}[${index}]`)\n );\n }\n\n /**\n * 序列化普通对象\n */\n private static serializeObject(\n obj: object,\n opts: SerializationOptions,\n visitedObjects: WeakMap<object, string>,\n path: string\n ): Record<string, any> {\n const result: Record<string, any> = {};\n let keys = [...Object.getOwnPropertyNames(obj)];\n\n // 包含 Symbol 属性\n if (opts.includeSymbols) {\n keys.push(\n ...Object.getOwnPropertySymbols(obj).map((sym) => sym.toString())\n );\n }\n\n let truncatedCount = 0;\n\n keys.slice(0, opts.maxObjectKeys).forEach((key) => {\n try {\n const value = (obj as any)[key];\n result[key] = this.serialize(\n value,\n opts,\n visitedObjects,\n `${path}.${key}`\n );\n } catch (error) {\n result[key] = new TypeWrapper(\n \"Error\",\n `[Unable to serialize: ${error}]`\n );\n }\n });\n\n if (keys.length > opts.maxObjectKeys) {\n truncatedCount = keys.length - opts.maxObjectKeys;\n result[\"...\"] = `${truncatedCount} more properties`;\n }\n\n return result;\n }\n\n /**\n * 快速序列化(用于控制台输出)\n */\n public static quickSerialize(obj: any): any {\n return this.serialize(obj, {\n maxDepth: 5,\n maxStringLength: 500,\n maxArrayLength: 20,\n maxObjectKeys: 20,\n });\n }\n}","/**\n * ViteHMRDetector Vite HMR 错误检测模块\n * 负责检测和处理 Vite 开发环境中的错误覆盖层\n */\nimport type { ErrorPayload } from '../types';\nimport { DeepSerializer } from './DeepSerializer';\n\nexport interface ViteErrorInfo {\n plugin?: string;\n messageBody?: string;\n fileText?: string;\n frame?: string;\n stack?: string;\n locationInfo?: {\n filename: string;\n line: number;\n column: number;\n };\n}\n\nexport class ViteHMRDetector {\n private sendMessage: (message: any) => void;\n private observer: MutationObserver | null = null;\n private isInitialized = false;\n\n constructor(sendMessage: (message: any) => void) {\n this.sendMessage = sendMessage;\n }\n\n /**\n * 初始化 Vite HMR 错误检测\n */\n public initialize(): void {\n if (this.isInitialized) return;\n\n this.setupViteErrorDetection();\n this.isInitialized = true;\n console.log('[ViteHMRDetector] Vite HMR 错误检测器初始化完成');\n }\n\n /**\n * 销毁检测器\n */\n public destroy(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n this.isInitialized = false;\n }\n\n /**\n * 设置 Vite 错误检测\n */\n private setupViteErrorDetection(): void {\n // 1. 监听 DOM 变化,检测错误覆盖层的添加\n this.observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.addedNodes.length) {\n const hasErrorOverlay = Array.from(mutation.addedNodes).some(\n (node) => node.nodeName?.toLowerCase() === \"vite-error-overlay\"\n );\n if (hasErrorOverlay) {\n requestAnimationFrame(() => this.checkForViteErrorOverlay());\n }\n }\n }\n });\n\n // 开始监听\n this.observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n // 2. 监听 Vite HMR 事件\n this.setupHMREventListeners();\n\n // 3. 检查现有的错误覆盖层\n if (document.querySelector(\"vite-error-overlay\")) {\n requestAnimationFrame(() => this.checkForViteErrorOverlay());\n }\n }\n\n /**\n * 设置 HMR 事件监听器\n */\n private setupHMREventListeners(): void {\n // 检查是否存在 Vite HMR\n if (typeof window !== 'undefined' && (window as any).import?.meta?.hot) {\n const hot = (window as any).import.meta.hot;\n \n // 监听 Vite 错误事件\n hot.on(\"vite:error\", () => {\n requestAnimationFrame(() => this.checkForViteErrorOverlay());\n });\n\n // 监听其他 HMR 事件\n hot.on(\"vite:beforeUpdate\", () => {\n console.log('[ViteHMRDetector] HMR 更新开始');\n });\n\n hot.on(\"vite:afterUpdate\", () => {\n console.log('[ViteHMRDetector] HMR 更新完成');\n });\n }\n\n // 全局错误事件监听\n window.addEventListener('error', (event) => {\n // 检查是否是 Vite 相关错误\n if (this.isViteRelatedError(event)) {\n setTimeout(() => this.checkForViteErrorOverlay(), 100);\n }\n });\n }\n\n /**\n * 检查是否是 Vite 相关错误\n */\n private isViteRelatedError(event: ErrorEvent): boolean {\n const message = event.message?.toLowerCase() || '';\n const filename = event.filename?.toLowerCase() || '';\n \n return (\n message.includes('vite') ||\n message.includes('hmr') ||\n filename.includes('vite') ||\n filename.includes('@vite') ||\n filename.includes('node_modules/vite')\n );\n }\n\n /**\n * 检查并处理 Vite 错误覆盖层\n */\n private checkForViteErrorOverlay(): void {\n const errorOverlay = document.querySelector(\"vite-error-overlay\");\n if (!errorOverlay) return;\n\n // 如果 shadow root 还没准备好,等待下一帧\n if (!errorOverlay.shadowRoot) {\n requestAnimationFrame(() => this.checkForViteErrorOverlay());\n return;\n }\n\n try {\n const errorInfo = this.extractErrorInfo(errorOverlay.shadowRoot);\n const errorPayload = this.createErrorPayload(errorInfo);\n \n // 存储到全局错误数组\n if (window.__AUTO_ENGINEER_ERRORS__) {\n window.__AUTO_ENGINEER_ERRORS__.push(errorPayload);\n }\n\n // 发送到父窗口\n this.sendMessage({\n type: \"SYSTEM_EVENT\",\n payload: errorPayload,\n timestamp: Date.now()\n });\n\n console.log('[ViteHMRDetector] Vite 错误已检测并报告:', errorPayload);\n } catch (err) {\n // 降级处理\n this.handleFallbackError(errorOverlay, err);\n }\n }\n\n /**\n * 从 Shadow DOM 中提取错误信息\n */\n private extractErrorInfo(shadowRoot: ShadowRoot): ViteErrorInfo {\n const errorInfo: ViteErrorInfo = {};\n\n // 方法 1: 尝试特定选择器\n errorInfo.plugin = shadowRoot.querySelector(\"span.plugin\")?.textContent?.trim() || \"\";\n errorInfo.messageBody = shadowRoot.querySelector(\".message-body\")?.textContent?.trim() || \"\";\n errorInfo.fileText = shadowRoot.querySelector(\".file\")?.textContent?.trim() || \"\";\n errorInfo.frame = shadowRoot.querySelector(\".frame\")?.textContent?.trim() || \"\";\n errorInfo.stack = shadowRoot.querySelector(\".stack\")?.textContent?.trim() || \"\";\n\n // 方法 2: 如果特定选择器失败,尝试通用容器\n if (!errorInfo.messageBody) {\n const messageElem = shadowRoot.querySelector(\".message\");\n errorInfo.messageBody = messageElem?.textContent?.trim() || \"\";\n }\n\n // 方法 3: 最后尝试获取窗口元素的所有文本\n if (!errorInfo.messageBody) {\n const windowElem = shadowRoot.querySelector(\".window\");\n errorInfo.messageBody = windowElem?.textContent?.trim() || \"\";\n }\n\n // 提取位置信息\n errorInfo.locationInfo = this.extractLocationInfo(errorInfo);\n\n return errorInfo;\n }\n\n /**\n * 提取文件位置信息\n */\n private extractLocationInfo(errorInfo: ViteErrorInfo): { filename: string; line: number; column: number } | undefined {\n const locationPatterns = [\n // 从 file 元素提取\n errorInfo.fileText?.match(/(.*?):(\\d+):(\\d+)/),\n // 从 frame 文本提取\n errorInfo.frame?.match(/(\\S+\\.[tj]sx?):(\\d+):(\\d+)/),\n // 从消息文本提取\n errorInfo.messageBody?.match(/([^:\\s]+\\.[tj]sx?):(\\d+):(\\d+)/),\n ].filter(Boolean);\n\n // 使用第一个有效的匹配\n for (const match of locationPatterns) {\n if (match && match.length >= 4) {\n return {\n filename: match[1],\n line: parseInt(match[2], 10),\n column: parseInt(match[3], 10),\n };\n }\n }\n\n return undefined;\n }\n\n /**\n * 创建错误载荷\n */\n private createErrorPayload(errorInfo: ViteErrorInfo): ErrorPayload {\n // 构建完整的错误消息\n let fullErrorMessage = \"\";\n\n if (errorInfo.plugin) {\n fullErrorMessage += `[${errorInfo.plugin}] `;\n }\n\n fullErrorMessage += errorInfo.messageBody || \"Unknown Vite error\";\n\n if (errorInfo.frame && !fullErrorMessage.includes(errorInfo.frame)) {\n fullErrorMessage += `\\n\\n${errorInfo.frame}`;\n }\n\n if (errorInfo.fileText && !fullErrorMessage.includes(errorInfo.fileText)) {\n fullErrorMessage += `\\n\\nFile: ${errorInfo.fileText}`;\n }\n\n const errorId = `hmr-error-${Date.now()}`;\n\n return {\n message: fullErrorMessage,\n stack: errorInfo.stack || \"\",\n filename: errorInfo.locationInfo?.filename,\n lineno: errorInfo.locationInfo?.line,\n colno: errorInfo.locationInfo?.column,\n timestamp: Date.now(),\n type: \"vite_hmr\",\n severity: \"high\",\n category: \"development\",\n userAgent: navigator.userAgent,\n url: window.location.href,\n userInteractions: [...(window.__AUTO_ENGINEER_INTERACTION_TRAIL__ || [])],\n details: {\n source: \"hmr\",\n errorId,\n viteErrorInfo: DeepSerializer.quickSerialize(errorInfo),\n pageUrl: window.location.href,\n pagePath: window.location.pathname + window.location.search + window.location.hash,\n }\n };\n }\n\n /**\n * 降级错误处理\n */\n private handleFallbackError(errorOverlay: Element, originalError: any): void {\n try {\n const anyText = errorOverlay.shadowRoot?.textContent?.trim() || \"Unknown Vite error\";\n const errorPayload: ErrorPayload = {\n message: `Vite error: ${anyText.substring(0, 500)}`,\n stack: \"\",\n timestamp: Date.now(),\n type: \"vite_hmr\",\n severity: \"medium\",\n category: \"development\",\n userAgent: navigator.userAgent,\n url: window.location.href,\n userInteractions: [...(window.__AUTO_ENGINEER_INTERACTION_TRAIL__ || [])],\n details: {\n source: \"hmr-fallback\",\n errorId: `hmr-error-fallback-${Date.now()}`,\n originalError: originalError?.message,\n pageUrl: window.location.href,\n pagePath: window.location.pathname + window.location.search + window.location.hash,\n }\n };\n\n // 存储错误\n if (window.__AUTO_ENGINEER_ERRORS__) {\n window.__AUTO_ENGINEER_ERRORS__.push(errorPayload);\n }\n\n // 发送到父窗口\n this.sendMessage({\n type: \"SYSTEM_EVENT\",\n payload: errorPayload,\n timestamp: Date.now()\n });\n\n // 避免递归调用,使用原始控制台\n const originalConsole = (window as any).__originalConsole;\n if (originalConsole?.warn) {\n originalConsole.warn('[ViteHMRDetector] 使用降级方式处理 Vite 错误:', errorPayload);\n }\n } catch (finalErr) {\n // 避免递归调用,使用原始控制台\n const originalConsole = (window as any).__originalConsole;\n if (originalConsole?.error) {\n originalConsole.error('[ViteHMRDetector] 无法处理 Vite 错误:', finalErr);\n }\n }\n }\n\n /**\n * 检查当前环境是否支持 Vite HMR\n */\n public static isViteEnvironment(): boolean {\n return !!(\n typeof window !== 'undefined' &&\n (\n (window as any).import?.meta?.hot ||\n (window as any).__vite_plugin_react_preamble_installed__ ||\n document.querySelector('script[type=\"module\"][src*=\"vite\"]') ||\n document.querySelector('script[src*=\"@vite\"]')\n )\n );\n }\n}","/**\n * HardRefreshManager 硬刷新管理模块\n * 负责缓存清理、Service Worker 注销和强制重载功能\n */\n\nexport interface HardRefreshOptions {\n clearCaches?: boolean;\n unregisterServiceWorkers?: boolean;\n clearSessionStorage?: boolean;\n clearLocalStorage?: boolean;\n cacheBusting?: boolean;\n token?: string | number;\n}\n\nexport interface RefreshResult {\n success: boolean;\n clearedCaches?: string[];\n unregisteredWorkers?: number;\n clearedStorage?: string[];\n error?: string;\n}\n\nexport class HardRefreshManager {\n private allowedOrigins: string[];\n\n constructor(allowedOrigins: string[] = ['https://howone.ai', 'http://localhost:3000']) {\n this.allowedOrigins = allowedOrigins;\n this.setupMessageListener();\n }\n\n /**\n * 设置消息监听器\n */\n private setupMessageListener(): void {\n window.addEventListener('message', async (event) => {\n // 验证来源安全性\n if (!this.isOriginAllowed(event.origin)) {\n return;\n }\n\n if (event.data?.type === 'HARD_REFRESH') {\n await this.performHardRefresh(event.data.payload || {});\n }\n });\n }\n\n /**\n * 检查来源是否被允许\n */\n private isOriginAllowed(origin: string): boolean {\n return this.allowedOrigins.some(allowedOrigin => \n origin.includes(allowedOrigin.replace('https://', '').replace('http://', ''))\n );\n }\n\n /**\n * 执行硬刷新\n */\n public async performHardRefresh(options: HardRefreshOptions = {}): Promise<RefreshResult> {\n const defaultOptions: HardRefreshOptions = {\n clearCaches: true,\n unregisterServiceWorkers: true,\n clearSessionStorage: true,\n clearLocalStorage: false, // 默认不清除 localStorage,可能包含重要应用数据\n cacheBusting: true,\n ...options\n };\n\n const result: RefreshResult = {\n success: false,\n clearedCaches: [],\n unregisteredWorkers: 0,\n clearedStorage: []\n };\n\n try {\n console.log('[HardRefreshManager] 开始执行硬刷新...');\n\n // 1. 清除缓存\n if (defaultOptions.clearCaches) {\n const clearedCaches = await this.clearAllCaches();\n result.clearedCaches = clearedCaches;\n console.log(`[HardRefreshManager] 已清除 ${clearedCaches.length} 个缓存`);\n }\n\n // 2. 注销 Service Workers\n if (defaultOptions.unregisterServiceWorkers) {\n const unregisteredCount = await this.unregisterServiceWorkers();\n result.unregisteredWorkers = unregisteredCount;\n console.log(`[HardRefreshManager] 已注销 ${unregisteredCount} 个 Service Worker`);\n }\n\n // 3. 清除存储\n const clearedStorage = await this.clearStorage(defaultOptions);\n result.clearedStorage = clearedStorage;\n console.log(`[HardRefreshManager] 已清除存储: ${clearedStorage.join(', ')}`);\n\n // 4. 执行强制重载\n await this.forceReload(defaultOptions);\n\n result.success = true;\n return result;\n\n } catch (error) {\n console.error('[HardRefreshManager] 硬刷新失败:', error);\n result.error = error instanceof Error ? error.message : String(error);\n \n // 降级到普通重载\n await this.fallbackReload(defaultOptions);\n return result;\n }\n }\n\n /**\n * 清除所有缓存\n */\n private async clearAllCaches(): Promise<string[]> {\n const clearedCaches: string[] = [];\n\n if ('caches' in window) {\n try {\n const cacheNames = await caches.keys();\n \n await Promise.all(\n cacheNames.map(async (cacheName) => {\n try {\n await caches.delete(cacheName);\n clearedCaches.push(cacheName);\n } catch (error) {\n console.warn(`[HardRefreshManager] 无法删除缓存 ${cacheName}:`, error);\n }\n })\n );\n } catch (error) {\n console.warn('[HardRefreshManager] 缓存清理失败:', error);\n }\n }\n\n return clearedCaches;\n }\n\n /**\n * 注销所有 Service Workers\n */\n private async unregisterServiceWorkers(): Promise<number> {\n let unregisteredCount = 0;\n\n if ('serviceWorker' in navigator) {\n try {\n const registrations = await navigator.serviceWorker.getRegistrations();\n \n await Promise.all(\n registrations.map(async (registration) => {\n try {\n await registration.unregister();\n unregisteredCount++;\n } catch (error) {\n console.warn('[HardRefreshManager] 无法注销 Service Worker:', error);\n }\n })\n );\n } catch (error) {\n console.warn('[HardRefreshManager] Service Worker 注销失败:', error);\n }\n }\n\n return unregisteredCount;\n }\n\n /**\n * 清除存储\n */\n private async clearStorage(options: HardRefreshOptions): Promise<string[]> {\n const clearedStorage: string[] = [];\n\n // 清除 sessionStorage\n if (options.clearSessionStorage) {\n try {\n sessionStorage.clear();\n clearedStorage.push('sessionStorage');\n } catch (error) {\n console.warn('[HardRefreshManager] 无法清除 sessionStorage:', error);\n }\n }\n\n // 清除 localStorage(谨慎操作)\n if (options.clearLocalStorage) {\n try {\n localStorage.clear();\n clearedStorage.push('localStorage');\n } catch (error) {\n console.warn('[HardRefreshManager] 无法清除 localStorage:', error);\n }\n }\n\n // 清除 IndexedDB(可选)\n try {\n await this.clearIndexedDB();\n clearedStorage.push('indexedDB');\n } catch (error) {\n console.warn('[HardRefreshManager] IndexedDB 清理失败:', error);\n }\n\n return clearedStorage;\n }\n\n /**\n * 清除 IndexedDB\n */\n private async clearIndexedDB(): Promise<void> {\n if ('indexedDB' in window) {\n try {\n // 获取所有数据库(这个 API 可能不被所有浏览器支持)\n if ('databases' in indexedDB) {\n const databases = await (indexedDB as any).databases();\n \n await Promise.all(\n databases.map(async (db: any) => {\n return new Promise<void>((resolve, reject) => {\n const deleteReq = indexedDB.deleteDatabase(db.name);\n deleteReq.onsuccess = () => resolve();\n deleteReq.onerror = () => reject(deleteReq.error);\n });\n })\n );\n }\n } catch (error) {\n // 静默失败,因为这个功能不是所有浏览器都支持\n console.debug('[HardRefreshManager] IndexedDB 清理跳过:', error);\n }\n }\n }\n\n /**\n * 强制重载页面\n */\n private async forceReload(options: HardRefreshOptions): Promise<void> {\n const url = new URL(window.location.href);\n \n // 添加缓存破坏参数\n if (options.cacheBusting) {\n const token = options.token || Date.now();\n url.searchParams.set('hard', String(token));\n url.searchParams.set('_t', String(Date.now()));\n }\n\n // 使用 location.replace 避免在历史记录中留下条目\n window.location.replace(url.toString());\n }\n\n /**\n * 降级重载(当硬刷新失败时)\n */\n private async fallbackReload(options: HardRefreshOptions): Promise<void> {\n try {\n // 尝试带缓存破坏的重载\n if (options.cacheBusting) {\n const url = new URL(window.location.href);\n url.searchParams.set('fallback', String(Date.now()));\n window.location.replace(url.toString());\n } else {\n // 最后的降级选项\n window.location.reload();\n }\n } catch (error) {\n console.error('[HardRefreshManager] 降级重载也失败了:', error);\n // 最后的最后,尝试简单重载\n window.location.href = window.location.href;\n }\n }\n\n /**\n * 检查是否需要硬刷新\n */\n public static shouldPerformHardRefresh(): boolean {\n const url = new URL(window.location.href);\n return url.searchParams.has('hard') || url.searchParams.has('force-refresh');\n }\n\n /**\n * 清理 URL 中的硬刷新参数\n */\n public static cleanupRefreshParams(): void {\n const url = new URL(window.location.href);\n const paramsToRemove = ['hard', 'force-refresh', '_t', 'fallback'];\n \n let hasChanges = false;\n paramsToRemove.forEach(param => {\n if (url.searchParams.has(param)) {\n url.searchParams.delete(param);\n hasChanges = true;\n }\n });\n\n if (hasChanges) {\n // 使用 replaceState 更新 URL 而不重载页面\n window.history.replaceState({}, document.title, url.toString());\n }\n }\n\n /**\n * 获取刷新统计信息\n */\n public static getRefreshStats(): { isHardRefresh: boolean; refreshToken?: string; timestamp?: number } {\n const url = new URL(window.location.href);\n const hardParam = url.searchParams.get('hard');\n const timestampParam = url.searchParams.get('_t');\n\n return {\n isHardRefresh: !!hardParam,\n refreshToken: hardParam || undefined,\n timestamp: timestampParam ? parseInt(timestampParam, 10) : undefined\n };\n }\n}","/**\n * ViewDetector 视图检测模块\n * 负责智能检测当前 SPA 页面/视图,支持多种检测策略和缓存机制\n */\nimport type { ViewInfo } from '../types';\n\nexport interface ViewDetectionConfig {\n cacheTimeout: number;\n semanticKeywords: string[];\n genericTitles: string[];\n explicitMarkers: Array<{ selector: string; attr: string }>;\n classPatterns: RegExp[];\n}\n\nexport interface ViewDetectionResult {\n title: string;\n confidence: number;\n strategy: string;\n timestamp: number;\n url: string;\n viewport?: { width: number; height: number };\n}\n\nexport class ViewDetector {\n private cache: { value: ViewDetectionResult | null; timestamp: number } = {\n value: null,\n timestamp: 0\n };\n\n private config: ViewDetectionConfig = {\n cacheTimeout: 100, // 100ms 缓存\n semanticKeywords: [\n \"dashboard\", \"profile\", \"settings\", \"admin\", \"login\", \"signup\", \"home\",\n \"about\", \"contact\", \"help\", \"account\", \"billing\", \"reports\", \"analytics\",\n \"users\", \"projects\", \"tasks\", \"invoice\", \"orders\", \"products\", \"customers\",\n \"payments\", \"notifications\", \"workspace\", \"editor\", \"preview\", \"gallery\",\n \"search\", \"results\", \"details\", \"form\", \"wizard\", \"checkout\", \"cart\"\n ],\n genericTitles: [\"loading\", \"my app\", \"localhost\", \"app\", \"untitled\", \"new tab\"],\n explicitMarkers: [\n { selector: \"[data-page]\", attr: \"data-page\" },\n { selector: \"[data-view]\", attr: \"data-view\" },\n { selector: \"[data-route]\", attr: \"data-route\" },\n { selector: '[data-testid*=\"page\"]', attr: \"data-testid\" },\n { selector: '[data-testid*=\"view\"]', attr: \"data-testid\" },\n { selector: '[data-testid*=\"screen\"]', attr: \"data-testid\" },\n ],\n classPatterns: [\n /(?:page|view|screen)-([a-zA-Z]+)/i,\n /([a-zA-Z]+)(?:Page|View|Screen)$/i,\n /route-([a-zA-Z]+)/i,\n /([a-zA-Z]+)-route/i,\n ]\n };\n\n constructor(config?: Partial<ViewDetectionConfig>) {\n if (config) {\n this.config = { ...this.config, ...config };\n }\n }\n\n /**\n * 检测当前视图\n */\n public detectCurrentView(): ViewDetectionResult {\n const now = Date.now();\n \n // 检查缓存\n if (\n this.cache.value &&\n now - this.cache.timestamp < this.config.cacheTimeout\n ) {\n return this.cache.value;\n }\n\n const result = this.performDetection();\n \n // 更新缓存\n this.cache = { value: result, timestamp: now };\n \n return result;\n }\n\n /**\n * 执行检测\n */\n private performDetection(): ViewDetectionResult {\n const strategies = [\n () => this.detectByTitle(),\n () => this.detectByMainHeading(),\n () => this.detectByActiveNavigation(),\n () => this.detectByExplicitMarkers(),\n () => this.detectByMainContent(),\n () => this.detectByURL(),\n () => this.detectByMetaTags(),\n () => this.detectByBreadcrumbs(),\n ];\n\n for (const strategy of strategies) {\n const result = strategy();\n if (result && result.confidence > 0.5) {\n return this.enrichResult(result);\n }\n }\n\n // 最终降级\n return this.enrichResult({\n title: \"Unknown View\",\n confidence: 0.1,\n strategy: \"fallback\",\n timestamp: Date.now(),\n url: window.location.href\n });\n }\n\n /**\n * 通过文档标题检测\n */\n private detectByTitle(): ViewDetectionResult | null {\n const title = document.title?.trim();\n if (!title || this.isGenericTitle(title)) {\n return null;\n }\n\n return {\n title: this.cleanTitle(title),\n confidence: 0.8,\n strategy: \"document-title\",\n timestamp: Date.now(),\n url: window.location.href\n };\n }\n\n /**\n * 通过主标题检测\n */\n private detectByMainHeading(): ViewDetectionResult | null {\n const headings = document.querySelectorAll(\n 'h1:not([style*=\"display: none\"]):not([hidden]), h2:not([style*=\"display: none\"]):not([hidden])'\n );\n\n for (const heading of headings) {\n if (this.isElementVisible(heading) && heading.textContent?.trim()) {\n const text = heading.textContent.trim();\n if (text.length > 2 && text.length < 100) {\n return {\n title: text,\n confidence: 0.7,\n strategy: \"main-heading\",\n timestamp: Date.now(),\n url: window.location.href\n };\n }\n }\n }\n\n return null;\n }\n\n /**\n * 通过活动导航检测\n */\n private detectByActiveNavigation(): ViewDetectionResult | null {\n const activeNavSelectors = [\n '[aria-current=\"page\"]',\n \".active:not(.disabled)\",\n \".current\",\n '[data-current=\"true\"]',\n \".router-link-active\",\n \".router-link-exact-active\",\n \".nav-link.active\",\n \".navbar-nav .active\",\n \".breadcrumb .active\",\n ];\n\n for (const selector of activeNavSelectors) {\n const activeNav = document.querySelector(selector);\n if (activeNav && activeNav.textContent?.trim()) {\n const text = activeNav.textContent.trim();\n if (text.length > 1 && text.length < 50) {\n return {\n title: text,\n confidence: 0.75,\n strategy: \"active-navigation\",\n timestamp: Date.now(),\n url: window.location.href\n };\n }\n }\n }\n\n return null;\n }\n\n /**\n * 通过显式标记检测\n */\n private detectByExplicitMarkers(): ViewDetectionResult | null {\n for (const marker of this.config.explicitMarkers) {\n const element = document.querySelector(marker.selector);\n if (element) {\n const value = element.getAttribute(marker.attr);\n if (value && value.length > 0) {\n return {\n title: this.formatMarkerValue(value),\n confidence: 0.9,\n strategy: \"explicit-markers\",\n timestamp: Date.now(),\n url: window.location.href\n };\n }\n }\n }\n\n // 检查类名模式\n for (const pattern of this.config.classPatterns) {\n const elements = document.querySelectorAll(\n '[class*=\"page-\"], [class*=\"view-\"], [class*=\"Page\"], [class*=\"View\"], [class*=\"Screen\"], [class*=\"route\"]'\n );\n \n for (const element of elements) {\n const match = element.className.match(pattern);\n if (match && match[1]) {\n return {\n title: this.formatMarkerValue(match[1]),\n confidence: 0.8,\n strategy: \"class-patterns\",\n timestamp: Date.now(),\n url: window.location.href\n };\n }\n }\n }\n\n return null;\n }\n\n /**\n * 通过主内容分析检测\n */\n private detectByMainContent(): ViewDetectionResult | null {\n const mainContainers = document.querySelectorAll(\n 'main, [role=\"main\"], .main-content, #main, .app-content, .page-content, .content'\n );\n\n for (const main of mainContainers) {\n // 查找语义指示器\n for (const keyword of this.config.semanticKeywords) {\n const indicator = main.querySelector(`[class*=\"${keyword}\"], [id*=\"${keyword}\"]`);\n if (indicator) {\n return {\n title: this.capitalizeFirst(keyword),\n confidence: 0.6,\n strategy: \"main-content-semantic\",\n timestamp: Date.now(),\n url: window.location.href\n };\n }\n }\n\n // 查找标题元素\n const titleElement = main.querySelector('h1, h2, .title, .page-title, .view-title');\n if (titleElement && titleElement.textContent?.trim()) {\n const text = titleElement.textContent.trim();\n if (text.length > 2 && text.length < 100) {\n return {\n title: text,\n confidence: 0.65,\n strategy: \"main-content-title\",\n timestamp: Date.now(),\n url: window.location.href\n };\n }\n }\n }\n\n return null;\n }\n\n /**\n * 通过 URL 检测\n */\n private detectByURL(): ViewDetectionResult | null {\n const pathname = window.location.pathname;\n if (!pathname || pathname === \"/\" || pathname === \"/index.html\") {\n return null;\n }\n\n const segments = pathname.split(\"/\").filter(Boolean);\n if (segments.length === 0) {\n return null;\n }\n\n const lastSegment = segments[segments.length - 1];\n const cleanSegment = lastSegment\n .replace(/\\.(html|php|jsp|asp)$/, \"\")\n .replace(/-/g, \" \")\n .replace(/_/g, \" \");\n\n if (cleanSegment.length > 1) {\n return {\n title: this.capitalizeWords(cleanSegment),\n confidence: 0.5,\n strategy: \"url-pathname\",\n timestamp: Date.now(),\n url: window.location.href\n };\n }\n\n return null;\n }\n\n /**\n * 通过 Meta 标签检测\n */\n private detectByMetaTags(): ViewDetectionResult | null {\n const metaSelectors = [\n 'meta[property=\"og:title\"]',\n 'meta[name=\"twitter:title\"]',\n 'meta[name=\"title\"]',\n 'meta[property=\"og:description\"]'\n ];\n\n for (const selector of metaSelectors) {\n const meta = document.querySelector(selector) as HTMLMetaElement;\n if (meta && meta.content?.trim()) {\n const content = meta.content.trim();\n if (!this.isGenericTitle(content) && content.length > 2 && content.length < 100) {\n return {\n title: content,\n confidence: 0.6,\n strategy: \"meta-tags\",\n timestamp: Date.now(),\n url: window.location.href\n };\n }\n }\n }\n\n return null;\n }\n\n /**\n * 通过面包屑检测\n */\n private detectByBreadcrumbs(): ViewDetectionResult | null {\n const breadcrumbSelectors = [\n '.breadcrumb',\n '.breadcrumbs',\n '[aria-label=\"breadcrumb\"]',\n '.nav-breadcrumb'\n ];\n\n for (const selector of breadcrumbSelectors) {\n const breadcrumb = document.querySelector(selector);\n if (breadcrumb) {\n const items = breadcrumb.querySelectorAll('li, a, span');\n const lastItem = items[items.length - 1];\n \n if (lastItem && lastItem.textContent?.trim()) {\n const text = lastItem.textContent.trim();\n if (text.length > 1 && text.length < 50) {\n return {\n title: text,\n confidence: 0.7,\n strategy: \"breadcrumbs\",\n timestamp: Date.now(),\n url: window.location.href\n };\n }\n }\n }\n }\n\n return null;\n }\n\n /**\n * 丰富检测结果\n */\n private enrichResult(result: ViewDetectionResult): ViewDetectionResult {\n return {\n ...result,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight\n }\n };\n }\n\n /**\n * 检查是否为通用标题\n */\n private isGenericTitle(title: string): boolean {\n const lowerTitle = title.toLowerCase();\n return this.config.genericTitles.some(generic => \n lowerTitle.includes(generic) || lowerTitle === generic\n ) || title === document.location.hostname;\n }\n\n /**\n * 检查元素是否可见\n */\n private isElementVisible(element: Element): boolean {\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n }\n\n /**\n * 清理标题\n */\n private cleanTitle(title: string): string {\n return title\n .replace(/\\s*[-|–—]\\s*.*$/, \"\") // 移除分隔符后的内容\n .replace(/\\s*\\|\\s*.*$/, \"\")\n .trim();\n }\n\n /**\n * 格式化标记值\n */\n private formatMarkerValue(value: string): string {\n return value\n .replace(/[-_]/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // camelCase 转换\n .trim();\n }\n\n /**\n * 首字母大写\n */\n private capitalizeFirst(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n /**\n * 单词首字母大写\n */\n private capitalizeWords(str: string): string {\n return str.replace(/\\b\\w/g, char => char.toUpperCase());\n }\n\n /**\n * 获取当前视图信息\n */\n public getCurrentViewInfo(): ViewInfo {\n const detection = this.detectCurrentView();\n return {\n title: detection.title,\n url: detection.url,\n timestamp: detection.timestamp,\n viewport: detection.viewport\n };\n }\n\n /**\n * 清除缓存\n */\n public clearCache(): void {\n this.cache = { value: null, timestamp: 0 };\n }\n}","/**\n * ComponentTreeGenerator 组件树生成模块\n * 负责生成和分析 DOM 组件树结构\n */\n\nexport interface ComponentNode {\n id: string;\n tagName: string;\n className?: string;\n elementId?: string;\n textContent?: string;\n attributes: Record<string, string>;\n children: ComponentNode[];\n depth: number;\n isVisible: boolean;\n isInteractive: boolean;\n boundingRect: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n reactInfo?: {\n componentName?: string;\n props?: Record<string, any>;\n state?: Record<string, any>;\n hooks?: any[];\n };\n}\n\nexport interface ComponentTree {\n root: ComponentNode;\n totalNodes: number;\n maxDepth: number;\n interactiveNodes: number;\n visibleNodes: number;\n generatedAt: number;\n metadata: {\n url: string;\n title: string;\n viewport: {\n width: number;\n height: number;\n };\n framework?: string;\n };\n}\n\nexport class ComponentTreeGenerator {\n private config = {\n maxDepth: 20,\n includeHiddenElements: false,\n includeTextNodes: true,\n includeReactInfo: true,\n minTextLength: 3,\n excludeTagNames: ['script', 'style', 'meta', 'link', 'title', 'head'],\n includeAttributes: ['id', 'class', 'data-testid', 'data-component-path', 'aria-label', 'title', 'placeholder', 'type', 'name', 'href', 'src'],\n maxTextLength: 100,\n maxChildren: 50\n };\n\n constructor() {\n console.log('[ComponentTreeGenerator] 组件树生成器初始化完成');\n }\n\n /** ----------------- 主要生成方法 ----------------- */\n\n /**\n * 生成完整的组件树\n */\n public generateComponentTree(rootElement?: Element): ComponentTree {\n const startTime = Date.now();\n const root = rootElement || document.body;\n \n console.log('[ComponentTreeGenerator] 开始生成组件树...');\n\n const rootNode = this.generateNodeTree(root, 0);\n const stats = this.calculateTreeStats(rootNode);\n\n const componentTree: ComponentTree = {\n root: rootNode,\n totalNodes: stats.totalNodes,\n maxDepth: stats.maxDepth,\n interactiveNodes: stats.interactiveNodes,\n visibleNodes: stats.visibleNodes,\n generatedAt: Date.now(),\n metadata: {\n url: window.location.href,\n title: document.title,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight\n },\n framework: this.detectFramework()\n }\n };\n\n const generationTime = Date.now() - startTime;\n console.log(`[ComponentTreeGenerator] 组件树生成完成,耗时 ${generationTime}ms,节点数: ${stats.totalNodes}`);\n\n return componentTree;\n }\n\n /**\n * 生成节点树\n */\n private generateNodeTree(element: Element, depth: number): ComponentNode {\n if (depth > this.config.maxDepth) {\n return this.createLeafNode(element, depth);\n }\n\n const node: ComponentNode = {\n id: this.generateNodeId(element, depth),\n tagName: element.tagName.toLowerCase(),\n className: element.className || undefined,\n elementId: element.id || undefined,\n textContent: this.getElementTextContent(element),\n attributes: this.getElementAttributes(element),\n children: [],\n depth,\n isVisible: this.isElementVisible(element),\n isInteractive: this.isElementInteractive(element),\n boundingRect: this.getElementBoundingRect(element),\n reactInfo: this.config.includeReactInfo ? this.getReactInfo(element) : undefined\n };\n\n // 处理子元素\n const children = Array.from(element.children);\n const validChildren = children.filter(child => this.shouldIncludeElement(child));\n \n // 限制子元素数量\n const childrenToProcess = validChildren.slice(0, this.config.maxChildren);\n \n node.children = childrenToProcess.map(child => \n this.generateNodeTree(child, depth + 1)\n );\n\n // 如果有更多子元素,添加一个占位符节点\n if (validChildren.length > this.config.maxChildren) {\n node.children.push(this.createPlaceholderNode(\n validChildren.length - this.config.maxChildren,\n depth + 1\n ));\n }\n\n return node;\n }\n\n /** ----------------- 节点创建辅助方法 ----------------- */\n\n /**\n * 创建叶子节点(达到最大深度时)\n */\n private createLeafNode(element: Element, depth: number): ComponentNode {\n return {\n id: this.generateNodeId(element, depth),\n tagName: element.tagName.toLowerCase(),\n className: element.className || undefined,\n elementId: element.id || undefined,\n textContent: '[Max depth reached]',\n attributes: this.getElementAttributes(element),\n children: [],\n depth,\n isVisible: this.isElementVisible(element),\n isInteractive: this.isElementInteractive(element),\n boundingRect: this.getElementBoundingRect(element)\n };\n }\n\n /**\n * 创建占位符节点(子元素过多时)\n */\n private createPlaceholderNode(remainingCount: number, depth: number): ComponentNode {\n return {\n id: `placeholder-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n tagName: 'placeholder',\n textContent: `... and ${remainingCount} more children`,\n attributes: {},\n children: [],\n depth,\n isVisible: false,\n isInteractive: false,\n boundingRect: { x: 0, y: 0, width: 0, height: 0 }\n };\n }\n\n /** ----------------- 元素信息提取方法 ----------------- */\n\n /**\n * 生成节点 ID\n */\n private generateNodeId(element: Element, depth: number): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substr(2, 9);\n const tagName = element.tagName.toLowerCase();\n const elementId = element.id ? `-${element.id}` : '';\n \n return `${tagName}${elementId}-${depth}-${timestamp}-${random}`;\n }\n\n /**\n * 获取元素文本内容\n */\n private getElementTextContent(element: Element): string | undefined {\n if (!this.config.includeTextNodes) return undefined;\n\n // 获取直接文本内容(不包括子元素的文本)\n const textNodes = Array.from(element.childNodes)\n .filter(node => node.nodeType === Node.TEXT_NODE)\n .map(node => node.textContent?.trim())\n .filter(text => text && text.length >= this.config.minTextLength);\n\n if (textNodes.length === 0) return undefined;\n\n const fullText = textNodes.join(' ').trim();\n return fullText.length > this.config.maxTextLength \n ? fullText.substring(0, this.config.maxTextLength) + '...'\n : fullText;\n }\n\n /**\n * 获取元素属性\n */\n private getElementAttributes(element: Element): Record<string, string> {\n const attributes: Record<string, string> = {};\n \n this.config.includeAttributes.forEach(attrName => {\n const value = element.getAttribute(attrName);\n if (value) {\n attributes[attrName] = value.length > 100 ? value.substring(0, 100) + '...' : value;\n }\n });\n\n // 添加一些特殊属性\n if (element instanceof HTMLInputElement) {\n if (element.type) attributes.inputType = element.type;\n if (element.placeholder) attributes.placeholder = element.placeholder;\n }\n\n if (element instanceof HTMLAnchorElement) {\n if (element.href) attributes.href = element.href;\n }\n\n if (element instanceof HTMLImageElement) {\n if (element.src) attributes.src = element.src;\n if (element.alt) attributes.alt = element.alt;\n }\n\n return attributes;\n }\n\n /**\n * 获取元素边界矩形\n */\n private getElementBoundingRect(element: Element): ComponentNode['boundingRect'] {\n try {\n const rect = element.getBoundingClientRect();\n return {\n x: Math.round(rect.left),\n y: Math.round(rect.top),\n width: Math.round(rect.width),\n height: Math.round(rect.height)\n };\n } catch (error) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n }\n\n /** ----------------- 元素状态检测方法 ----------------- */\n\n /**\n * 检查元素是否可见\n */\n private isElementVisible(element: Element): boolean {\n if (!this.config.includeHiddenElements) {\n try {\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || \n style.visibility === 'hidden' || \n style.opacity === '0') {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n } catch (error) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * 检查元素是否可交互\n */\n private isElementInteractive(element: Element): boolean {\n const interactiveTags = ['button', 'input', 'select', 'textarea', 'a', 'label'];\n const tagName = element.tagName.toLowerCase();\n \n if (interactiveTags.includes(tagName)) {\n return true;\n }\n\n // 检查是否有点击事件监听器\n if ((element as any).onclick || \n element.getAttribute('onclick') ||\n element.hasAttribute('data-testid') ||\n element.getAttribute('role') === 'button') {\n return true;\n }\n\n // 检查是否有 tabindex\n if (element.hasAttribute('tabindex')) {\n return true;\n }\n\n return false;\n }\n\n /**\n * 检查是否应该包含该元素\n */\n private shouldIncludeElement(element: Element): boolean {\n const tagName = element.tagName.toLowerCase();\n \n // 排除特定标签\n if (this.config.excludeTagNames.includes(tagName)) {\n return false;\n }\n\n // 如果不包含隐藏元素,检查可见性\n if (!this.config.includeHiddenElements && !this.isElementVisible(element)) {\n return false;\n }\n\n return true;\n }\n\n /** ----------------- React 信息提取方法 ----------------- */\n\n /**\n * 获取 React 组件信息\n */\n private getReactInfo(element: Element): ComponentNode['reactInfo'] | undefined {\n try {\n // 尝试从 React Fiber 获取信息\n const fiberKey = Object.keys(element).find(key => \n key.startsWith('__reactInternalInstance') || \n key.startsWith('__reactFiber')\n );\n\n if (fiberKey) {\n const fiber = (element as any)[fiberKey];\n return this.extractReactFiberInfo(fiber);\n }\n\n // 尝试从 React DevTools 获取信息\n if ((window as any).__REACT_DEVTOOLS_GLOBAL_HOOK__) {\n return this.extractReactDevToolsInfo(element);\n }\n\n return undefined;\n } catch (error) {\n console.warn('[ComponentTreeGenerator] 获取 React 信息失败:', error instanceof Error ? error.message : String(error));\n return undefined;\n }\n }\n\n /**\n * 从 React Fiber 提取信息\n */\n private extractReactFiberInfo(fiber: any): ComponentNode['reactInfo'] | undefined {\n if (!fiber) return undefined;\n\n try {\n const componentName = fiber.type?.name || \n fiber.type?.displayName || \n fiber.elementType?.name ||\n 'Unknown';\n\n const props = fiber.memoizedProps ? \n this.sanitizeReactData(fiber.memoizedProps) : undefined;\n\n const state = fiber.memoizedState ? \n this.sanitizeReactData(fiber.memoizedState) : undefined;\n\n return {\n componentName,\n props,\n state\n };\n } catch (error) {\n return undefined;\n }\n }\n\n /**\n * 从 React DevTools 提取信息\n */\n private extractReactDevToolsInfo(_element: Element): ComponentNode['reactInfo'] | undefined {\n // 这里可以实现从 React DevTools 获取信息的逻辑\n // 由于 DevTools API 比较复杂,这里只是一个占位符\n return undefined;\n }\n\n /**\n * 清理 React 数据(移除敏感信息)\n */\n private sanitizeReactData(data: any): any {\n if (!data || typeof data !== 'object') {\n return data;\n }\n\n const sanitized: any = {};\n const maxKeys = 10; // 限制属性数量\n let keyCount = 0;\n\n for (const [key, value] of Object.entries(data)) {\n if (keyCount >= maxKeys) break;\n\n // 跳过敏感或复杂的属性\n if (key.startsWith('_') || \n key === 'children' ||\n typeof value === 'function') {\n continue;\n }\n\n if (typeof value === 'object' && value !== null) {\n // 递归处理对象,但限制深度\n sanitized[key] = '[Object]';\n } else {\n sanitized[key] = String(value).substring(0, 50);\n }\n\n keyCount++;\n }\n\n return sanitized;\n }\n\n /** ----------------- 框架检测方法 ----------------- */\n\n /**\n * 检测前端框架\n */\n private detectFramework(): string | undefined {\n // React\n if ((window as any).React || \n document.querySelector('[data-reactroot]') ||\n document.querySelector('#root')) {\n return 'React';\n }\n\n // Vue\n if ((window as any).Vue || \n document.querySelector('[data-v-]') ||\n document.querySelector('#app')) {\n return 'Vue';\n }\n\n // Angular\n if ((window as any).ng || \n document.querySelector('[ng-app]') ||\n document.querySelector('app-root')) {\n return 'Angular';\n }\n\n // Svelte\n if (document.querySelector('[data-svelte]')) {\n return 'Svelte';\n }\n\n return undefined;\n }\n\n /** ----------------- 统计计算方法 ----------------- */\n\n /**\n * 计算树统计信息\n */\n private calculateTreeStats(rootNode: ComponentNode): {\n totalNodes: number;\n maxDepth: number;\n interactiveNodes: number;\n visibleNodes: number;\n } {\n let totalNodes = 0;\n let maxDepth = 0;\n let interactiveNodes = 0;\n let visibleNodes = 0;\n\n const traverse = (node: ComponentNode) => {\n totalNodes++;\n maxDepth = Math.max(maxDepth, node.depth);\n \n if (node.isInteractive) interactiveNodes++;\n if (node.isVisible) visibleNodes++;\n\n node.children.forEach(child => traverse(child));\n };\n\n traverse(rootNode);\n\n return {\n totalNodes,\n maxDepth,\n interactiveNodes,\n visibleNodes\n };\n }\n\n /** ----------------- 公共接口方法 ----------------- */\n\n /**\n * 生成指定元素的组件树\n */\n public generateElementTree(elementId: string): ComponentTree | null {\n const element = document.getElementById(elementId);\n if (!element) {\n console.warn(`[ComponentTreeGenerator] 未找到元素: ${elementId}`);\n return null;\n }\n\n return this.generateComponentTree(element);\n }\n\n /**\n * 生成可见元素的组件树\n */\n public generateVisibleTree(): ComponentTree {\n const originalConfig = { ...this.config };\n this.config.includeHiddenElements = false;\n \n const tree = this.generateComponentTree();\n \n this.config = originalConfig;\n return tree;\n }\n\n /**\n * 查找组件节点\n */\n public findNodeById(tree: ComponentTree, nodeId: string): ComponentNode | null {\n const search = (node: ComponentNode): ComponentNode | null => {\n if (node.id === nodeId) return node;\n \n for (const child of node.children) {\n const found = search(child);\n if (found) return found;\n }\n \n return null;\n };\n\n return search(tree.root);\n }\n\n /**\n * 查找交互元素\n */\n public findInteractiveNodes(tree: ComponentTree): ComponentNode[] {\n const interactiveNodes: ComponentNode[] = [];\n\n const traverse = (node: ComponentNode) => {\n if (node.isInteractive) {\n interactiveNodes.push(node);\n }\n node.children.forEach(child => traverse(child));\n };\n\n traverse(tree.root);\n return interactiveNodes;\n }\n\n /**\n * 更新配置\n */\n public updateConfig(newConfig: Partial<typeof this.config>): void {\n this.config = { ...this.config, ...newConfig };\n console.log('[ComponentTreeGenerator] 配置已更新:', this.config);\n }\n\n /**\n * 获取当前配置\n */\n public getConfig(): typeof this.config {\n return { ...this.config };\n }\n\n /**\n * 导出组件树为 JSON\n */\n public exportTreeAsJSON(tree: ComponentTree): string {\n try {\n return JSON.stringify(tree, null, 2);\n } catch (error) {\n console.error('[ComponentTreeGenerator] 导出 JSON 失败:', error instanceof Error ? error.message : String(error));\n return '{}';\n }\n }\n\n /**\n * 销毁生成器\n */\n public destroy(): void {\n console.log('[ComponentTreeGenerator] 组件树生成器已销毁');\n }\n}","/**\n * MessageSender 统一消息发送工具类\n * 负责处理所有向父窗口发送消息的逻辑,统一处理 origin、错误处理和消息格式\n */\nimport { GLOBAL_CONFIG } from '../types';\n\n// 获取原始控制台方法的引用\nconst getOriginalConsole = () => (window as any).__originalConsole || {\n log: console.log.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n info: console.info.bind(console),\n debug: console.debug.bind(console)\n};\n\nexport interface MessageSenderOptions {\n /** 是否添加时间戳 */\n addTimestamp?: boolean;\n /** 是否启用调试日志 */\n enableDebugLog?: boolean;\n /** 自定义允许的源列表 */\n allowedOrigins?: string[];\n}\n\nexport class MessageSender {\n private options: Required<MessageSenderOptions>;\n\n constructor(options: MessageSenderOptions = {}) {\n this.options = {\n addTimestamp: true,\n enableDebugLog: false,\n allowedOrigins: GLOBAL_CONFIG.ALLOWED_ORIGINS,\n ...options\n };\n }\n\n /**\n * 发送消息到父窗口\n */\n public send(message: any): boolean {\n try {\n // 检查是否在 iframe 中\n if (!this.isInIframe()) {\n if (this.options.enableDebugLog) {\n const originalConsole = getOriginalConsole();\n originalConsole.debug('[MessageSender] 不在 iframe 中,跳过发送');\n }\n return false;\n }\n\n // 准备消息\n const finalMessage = this.prepareMessage(message);\n\n // 发送消息\n const success = this.sendToParent(finalMessage);\n\n // 调试日志\n if (this.options.enableDebugLog) {\n const originalConsole = getOriginalConsole();\n originalConsole.debug('[MessageSender] 发送消息:', finalMessage, '成功:', success);\n }\n\n return success;\n } catch (error) {\n this.handleError('发送消息失败', error);\n return false;\n }\n }\n\n /**\n * 创建发送函数(用于注入到其他模块)\n */\n public createSendFunction(): (message: any) => void {\n return (message: any) => {\n this.send(message);\n };\n }\n\n /**\n * 检查是否在 iframe 中\n */\n private isInIframe(): boolean {\n return window.parent && window.parent !== window;\n }\n\n /**\n * 准备消息(添加时间戳等)\n */\n private prepareMessage(message: any): any {\n if (!this.options.addTimestamp) {\n return message;\n }\n\n return {\n ...message,\n timestamp: Date.now()\n };\n }\n\n /**\n * 发送消息到父窗口\n */\n private sendToParent(message: any): boolean {\n try {\n // 检测环境\n const isLocalhost = this.isLocalhostEnvironment();\n \n if (isLocalhost) {\n // 测试环境:直接使用通配符\n window.parent.postMessage(message, '*');\n return true;\n } else {\n // 生产环境:尝试所有配置的源\n return this.tryMultipleOrigins(message);\n }\n } catch (error) {\n this.handleError('postMessage 调用失败', error);\n return false;\n }\n }\n\n /**\n * 检测是否为本地环境\n */\n private isLocalhostEnvironment(): boolean {\n const origin = window.location.origin;\n return origin.includes('localhost') || \n origin.includes('127.0.0.1') || \n origin.includes('0.0.0.0');\n }\n\n /**\n * 尝试多个源发送消息\n */\n private tryMultipleOrigins(message: any): boolean {\n let messageSent = false;\n\n // 尝试所有配置的源\n for (const origin of this.options.allowedOrigins) {\n try {\n window.parent.postMessage(message, origin);\n messageSent = true;\n break; // 成功发送后退出循环\n } catch (error) {\n // 继续尝试下一个源\n continue;\n }\n }\n\n // 如果所有源都失败,使用通配符作为后备\n if (!messageSent) {\n try {\n window.parent.postMessage(message, '*');\n messageSent = true;\n } catch (error) {\n this.handleError('通配符发送也失败', error);\n }\n }\n\n return messageSent;\n }\n\n /**\n * 处理错误\n */\n private handleError(context: string, error: any): void {\n const originalConsole = getOriginalConsole();\n originalConsole.debug(`[MessageSender] ${context}:`, error);\n }\n\n /**\n * 更新配置\n */\n public updateOptions(newOptions: Partial<MessageSenderOptions>): void {\n this.options = {\n ...this.options,\n ...newOptions\n };\n }\n\n /**\n * 获取当前配置\n */\n public getOptions(): Required<MessageSenderOptions> {\n return { ...this.options };\n }\n}\n\n/**\n * 创建默认的消息发送器实例\n */\nexport const createDefaultMessageSender = (options?: MessageSenderOptions): MessageSender => {\n return new MessageSender({\n addTimestamp: true,\n enableDebugLog: false,\n ...options\n });\n};\n\n/**\n * 创建简单的发送函数(向后兼容)\n */\nexport const createSimpleSendFunction = (options?: MessageSenderOptions): (message: any) => void => {\n const sender = createDefaultMessageSender(options);\n return sender.createSendFunction();\n};","/**\n * ErrorTracking 错误追踪功能模块\n * 负责错误捕获、分类、去重和上报\n */\nimport type { \n ErrorPayload, \n ErrorSeverity, \n ErrorStats,\n UserInteraction \n} from '../types';\nimport { ERROR_CONFIG } from '../types';\nimport { DeepSerializer } from '../utils/DeepSerializer';\nimport type { ViewDetector } from '../utils/ViewDetector';\nimport type { InteractionTracking } from './InteractionTracking';\n\n// 在模块加载时立即保存原始控制台方法,避免递归调用\nconst ORIGINAL_CONSOLE = {\n log: console.log.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n info: console.info.bind(console),\n debug: console.debug.bind(console)\n};\n\n// 保存到全局变量\n(window as any).__originalConsole = ORIGINAL_CONSOLE;\n\n// 防止递归调用\nlet isProcessingConsole = false;\n// 防止拦截内部日志的标志\nlet isInternalLogging = false;\n\nexport class ErrorTracking {\n private initialized = false;\n private fullyInitialized = false; // 完全初始化完成标志\n private errorCache = new Set<string>();\n private errorHistory: ErrorPayload[] = [];\n private sendMessage: (message: any) => void;\n public originalConsole: any = ORIGINAL_CONSOLE;\n \n // 依赖注入\n private viewDetector: ViewDetector | null = null;\n private interactionTracking: InteractionTracking | null = null;\n\n /**\n * 内部日志方法,避免被控制台拦截器捕获\n */\n private internalLog(level: 'log' | 'warn' | 'error', ...args: any[]): void {\n isInternalLogging = true;\n try {\n ORIGINAL_CONSOLE[level](...args);\n } finally {\n isInternalLogging = false;\n }\n }\n\n constructor(sendMessage: (message: any) => void) {\n this.sendMessage = sendMessage;\n this.internalLog('log', '[ErrorTracking] 错误追踪模块初始化完成');\n }\n\n /** ----------------- 依赖注入方法 ----------------- */\n\n /**\n * 设置视图检测器\n */\n public setViewDetector(viewDetector: ViewDetector): void {\n this.viewDetector = viewDetector;\n }\n\n /**\n * 设置交互追踪器\n */\n public setInteractionTracking(interactionTracking: InteractionTracking): void {\n this.interactionTracking = interactionTracking;\n }\n\n /** ----------------- 初始化方法 ----------------- */\n\n /**\n * 初始化错误追踪\n */\n public initialize(): void {\n if (this.initialized) return;\n\n this.setupGlobalErrorListeners(); // 全局错误监听器\n this.setupConsoleInterception(); // 控制台拦截\n this.setupNetworkMonitoring(); // 网络监控\n \n this.initialized = true;\n this.internalLog('log', '[ErrorTracking] 错误追踪功能已启用');\n // 延迟设置完全初始化标志,避免初始化期间的日志被拦截\n setTimeout(() => {\n this.fullyInitialized = true;\n this.internalLog('log', '[ErrorTracking] 初始化完成,控制台拦截已默认启用');\n }, 1000);\n }\n\n /**\n * 设置全局错误监听器\n */\n private setupGlobalErrorListeners(): void {\n // 运行时错误\n window.addEventListener('error', (event) => {\n // 阻止浏览器默认的错误输出行为,避免重复\n event.preventDefault();\n this.handleError(event.error || new Error(event.message), {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n type: 'runtime',\n source: 'window.error'\n });\n });\n\n // Promise 拒绝\n window.addEventListener('unhandledrejection', (event) => {\n // 阻止浏览器默认的 Promise 拒绝输出行为\n event.preventDefault();\n \n const error = event.reason instanceof Error \n ? event.reason \n : new Error(String(event.reason));\n \n this.handleError(error, {\n type: 'promise',\n source: 'unhandledrejection'\n });\n });\n\n this.internalLog('log', '[ErrorTracking] 全局错误监听器已设置');\n }\n\n /**\n * 设置控制台拦截\n */\n private setupConsoleInterception(): void {\n const consoleMethods = ['log', 'warn', 'error', 'info', 'debug'] as const;\n \n consoleMethods.forEach(method => {\n console[method] = (...args: any[]) => {\n // 防止递归调用和跳过内部日志\n if (isProcessingConsole || isInternalLogging) {\n ORIGINAL_CONSOLE[method]?.apply(console, args);\n return;\n }\n \n isProcessingConsole = true;\n \n try {\n // 首先调用原始方法,确保控制台正常输出\n ORIGINAL_CONSOLE[method]?.apply(console, args);\n \n // 安全地分析和转发\n this.safeForwardConsoleToParent(method, args);\n \n } catch (error) {\n // 使用原始控制台避免递归\n this.internalLog('error', '[ErrorTracking] 控制台处理失败:', error);\n } finally {\n isProcessingConsole = false;\n }\n };\n });\n\n this.internalLog('log', '[ErrorTracking] 控制台拦截已设置');\n }\n\n /**\n * 安全地将控制台输出转发到父窗口\n */\n private safeForwardConsoleToParent(method: string, args: any[]): void {\n if (window.parent === window) return;\n \n // 只在完全初始化后才转发控制台消息\n if (!this.fullyInitialized) return;\n\n try {\n let stack = null;\n if (method === \"warn\" || method === \"error\") {\n const error = new Error();\n if (error.stack) {\n stack = error.stack.split(\"\\n\").slice(2).join(\"\\n\");\n }\n }\n\n // 获取调用栈信息来确定控制台调用的文件、行号和列号\n const fullStack = new Error().stack;\n const fileInfo = this.extractFileInfoFromStack(fullStack);\n\n // 使用深度序列化替代简单序列化\n const serializedArgs = args.map(arg => DeepSerializer.quickSerialize(arg));\n\n const message = serializedArgs\n .map((arg) => typeof arg === \"string\" ? arg : JSON.stringify(arg, null, 2))\n .join(\" \") + (stack ? \"\\n\" + stack : \"\");\n\n if (method === \"error\") {\n const globalError = {\n id: `console-error-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n message: message,\n stack: stack || '',\n source: 'console',\n location: {\n filename: fileInfo.filename,\n line: fileInfo.lineno,\n column: fileInfo.colno\n },\n timestamp: Date.now(),\n pageUrl: window.location.href,\n pagePath: window.location.pathname + window.location.search + window.location.hash,\n interactionTrail: [...(window.__AUTO_ENGINEER_INTERACTION_TRAIL__ || [])]\n };\n\n window.__AUTO_ENGINEER_ERRORS__ = window.__AUTO_ENGINEER_ERRORS__ || [];\n window.__AUTO_ENGINEER_ERRORS__.push(globalError);\n this.manageArrayLength(window.__AUTO_ENGINEER_ERRORS__, ERROR_CONFIG.MAX_ERRORS);\n }\n\n // 发送控制台输出消息(不是错误事件)\n const consoleLevelMap: Record<string, string> = {\n log: 'info',\n warn: 'warning', \n error: 'error',\n info: 'info',\n debug: 'debug'\n };\n\n this.sendMessage({\n type: \"CONSOLE_EVENT\",\n payload: {\n type: consoleLevelMap[method] === 'info' ? 'info' : \n consoleLevelMap[method] === 'warning' ? 'warning' : 'error',\n message: message,\n logged_at: new Date().toISOString(),\n filename: fileInfo.filename,\n lineno: fileInfo.lineno,\n colno: fileInfo.colno,\n raw: serializedArgs,\n pageUrl: window.location.href,\n pagePath: window.location.pathname + window.location.search + window.location.hash,\n interactionTrail: this.getRecentInteractions(),\n },\n timestamp: Date.now()\n });\n } catch (error) {\n // 使用原始的 console.error 避免递归调用\n this.internalLog('error', '[ErrorTracking] 控制台转发失败:', error);\n }\n }\n\n /**\n * 设置网络监控\n */\n private setupNetworkMonitoring(): void {\n // 拦截 fetch\n const originalFetch = window.fetch;\n window.fetch = async (...args) => {\n const startTime = Date.now();\n try {\n const response = await originalFetch(...args);\n this.logNetworkRequest(args, response, Date.now() - startTime);\n return response;\n } catch (error) {\n this.logNetworkError(args, error, Date.now() - startTime);\n throw error;\n }\n };\n\n this.internalLog('log', '[ErrorTracking] 网络监控已设置');\n }\n\n /**\n * 记录网络请求\n */\n private logNetworkRequest(args: any[], response: Response, duration: number): void {\n // 获取调用栈信息来确定发起请求的文件、行号和列号\n const stack = new Error().stack;\n const fileInfo = this.extractFileInfoFromStack(stack);\n\n this.sendMessage({\n type: \"NETWORK_EVENT\",\n payload: {\n type: response.status >= 200 && response.status < 300 ? \"request_success\" : \"request_error\",\n url: args[0],\n method: args[1]?.method || \"GET\",\n status: response.status,\n statusText: response.statusText,\n filename: fileInfo.filename,\n lineno: fileInfo.lineno,\n colno: fileInfo.colno,\n duration: duration,\n timestamp: new Date().toISOString(),\n pageUrl: window.location.href,\n interactionTrail: this.getRecentInteractions(),\n },\n timestamp: Date.now()\n });\n }\n\n /**\n * 记录网络错误\n */\n private logNetworkError(args: any[], error: any, duration: number): void {\n // 获取调用栈信息来确定发起请求的文件、行号和列号\n const stack = new Error().stack;\n const fileInfo = this.extractFileInfoFromStack(stack);\n\n this.sendMessage({\n type: \"NETWORK_EVENT\",\n payload: {\n type: \"connection_error\",\n url: args[0],\n method: args[1]?.method || \"GET\",\n filename: fileInfo.filename,\n lineno: fileInfo.lineno,\n colno: fileInfo.colno,\n duration: duration, // 网络请求耗时(毫秒)\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n },\n timestamp: new Date().toISOString(),\n pageUrl: window.location.href,\n interactionTrail: this.getRecentInteractions(),\n },\n timestamp: Date.now()\n });\n }\n\n /** ----------------- 错误处理核心方法 ----------------- */\n\n /**\n * 处理错误 - 统一使用控制台拦截格式\n */\n public handleError(error: Error, details: any = {}): void {\n if (!this.isDuplicateError(error, details)) {\n this.sendUnifiedError(error, details);\n }\n }\n\n /**\n * 生成错误键用于去重\n */\n private generateErrorKey(error: Error, details: any): string {\n const message = error.message || '';\n const filename = details.filename || '';\n const lineno = details.lineno || 0;\n const colno = details.colno || 0;\n return `${message}|${filename}|${lineno}|${colno}`;\n }\n\n /**\n * 检查是否为重复错误\n */\n private isDuplicateError(error: Error, details: any): boolean {\n const errorKey = this.generateErrorKey(error, details);\n \n if (this.errorCache.has(errorKey)) {\n return true;\n }\n \n // 添加到缓存并设置5秒后自动清除\n this.errorCache.add(errorKey);\n setTimeout(() => {\n this.errorCache.delete(errorKey);\n }, 5000);\n \n return false;\n }\n\n /**\n * 发送统一格式的错误\n */\n private sendUnifiedError(error: Error, details: any = {}): void {\n if (window.parent === window) return;\n \n // 只在完全初始化后才发送错误\n if (!this.fullyInitialized) return;\n\n try {\n // 使用视图检测器获取当前视图\n const currentViewInfo = this.viewDetector?.getCurrentViewInfo();\n \n // 构建统一的错误负载,与控制台拦截格式保持一致\n const payload = {\n message: error.message,\n stack: error.stack,\n filename: details.filename,\n lineno: details.lineno,\n colno: details.colno,\n timestamp: Date.now(),\n type: details.type || 'unknown',\n severity: this.assessErrorSeverity(error.message, details.category),\n category: details.category || this.categorizeError(error.message),\n userAgent: navigator.userAgent,\n url: window.location.href,\n view: currentViewInfo?.title,\n userInteractions: this.getRecentInteractions(),\n // 页面信息\n pagePath: window.location.pathname + window.location.search + window.location.hash,\n // 错误存储\n raw: window.__AUTO_ENGINEER_ERRORS__,\n // 详细信息\n details: {\n ...DeepSerializer.quickSerialize(details),\n serializedError: DeepSerializer.quickSerialize(error),\n }\n };\n\n this.addToHistory(payload);\n\n // 发送统一格式的错误事件\n this.sendMessage({\n type: 'ERROR_EVENT',\n payload: payload,\n timestamp: Date.now()\n });\n\n if (payload.severity === 'critical' || payload.severity === 'high') {\n this.internalLog('error', '[ErrorTracking] 严重错误:', payload);\n }\n } catch (sendError) {\n // 使用原始的 console.error 避免递归调用\n this.internalLog('error', '[ErrorTracking] 错误发送失败:', sendError);\n }\n }\n\n\n\n /**\n * 添加错误到历史记录\n */\n private addToHistory(payload: ErrorPayload): void {\n this.errorHistory.push(payload);\n this.manageArrayLength(this.errorHistory, ERROR_CONFIG.MAX_ERRORS);\n\n // 同步到全局变量\n const globalError = {\n id: `error-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n message: payload.message,\n stack: payload.stack || '',\n source: payload.type,\n location: {\n filename: payload.filename || '',\n line: payload.lineno || 0,\n column: payload.colno || 0\n },\n timestamp: payload.timestamp,\n pageUrl: window.location.href,\n pagePath: window.location.pathname + window.location.search + window.location.hash,\n interactionTrail: [...(window.__AUTO_ENGINEER_INTERACTION_TRAIL__ || [])]\n };\n\n window.__AUTO_ENGINEER_ERRORS__ = window.__AUTO_ENGINEER_ERRORS__ || [];\n window.__AUTO_ENGINEER_ERRORS__.push(globalError);\n this.manageArrayLength(window.__AUTO_ENGINEER_ERRORS__, ERROR_CONFIG.MAX_ERRORS);\n }\n\n /**\n * 管理数组长度\n */\n private manageArrayLength<T>(array: T[], maxLength: number): void {\n if (array.length > maxLength) {\n array.shift();\n }\n }\n\n /**\n * 分类错误类型\n */\n private categorizeError(message: string): string {\n const lowerMessage = message.toLowerCase();\n \n if (ERROR_CONFIG.CATEGORY_KEYWORDS.SYNTAX.some(keyword => lowerMessage.includes(keyword))) {\n return 'SYNTAX';\n }\n if (ERROR_CONFIG.CATEGORY_KEYWORDS.NETWORK.some(keyword => lowerMessage.includes(keyword))) {\n return 'NETWORK';\n }\n if (ERROR_CONFIG.CATEGORY_KEYWORDS.RUNTIME.some(keyword => lowerMessage.includes(keyword))) {\n return 'RUNTIME';\n }\n if (ERROR_CONFIG.CATEGORY_KEYWORDS.SECURITY.some(keyword => lowerMessage.includes(keyword))) {\n return 'SECURITY';\n }\n if (ERROR_CONFIG.CATEGORY_KEYWORDS.PERFORMANCE.some(keyword => lowerMessage.includes(keyword))) {\n return 'PERFORMANCE';\n }\n if (ERROR_CONFIG.CATEGORY_KEYWORDS.DEVELOPMENT.some(keyword => lowerMessage.includes(keyword))) {\n return 'DEVELOPMENT';\n }\n if (ERROR_CONFIG.CATEGORY_KEYWORDS.REACT.some(keyword => lowerMessage.includes(keyword))) {\n return 'REACT';\n }\n if (ERROR_CONFIG.CATEGORY_KEYWORDS.VITE.some(keyword => lowerMessage.includes(keyword))) {\n return 'VITE';\n }\n \n return 'UNKNOWN';\n }\n\n /**\n * 评估错误严重性\n */\n private assessErrorSeverity(message: string, category?: string): ErrorSeverity {\n const lowerMessage = message.toLowerCase();\n \n if (ERROR_CONFIG.SEVERITY_KEYWORDS.CRITICAL.some(keyword => lowerMessage.includes(keyword))) {\n return 'critical';\n }\n if (ERROR_CONFIG.SEVERITY_KEYWORDS.HIGH.some(keyword => lowerMessage.includes(keyword))) {\n return 'high';\n }\n if (ERROR_CONFIG.SEVERITY_KEYWORDS.MEDIUM.some(keyword => lowerMessage.includes(keyword))) {\n return 'medium';\n }\n if (ERROR_CONFIG.SEVERITY_KEYWORDS.LOW.some(keyword => lowerMessage.includes(keyword))) {\n return 'low';\n }\n \n // 基于分类的默认严重性\n switch (category) {\n case 'SECURITY': return 'critical';\n case 'SYNTAX': return 'high';\n case 'RUNTIME': return 'high';\n case 'NETWORK': return 'medium';\n case 'DEVELOPMENT': return 'low';\n default: return 'medium';\n }\n }\n\n /**\n * 获取最近的交互记录\n */\n private getRecentInteractions(): UserInteraction[] {\n return this.interactionTracking?.getRecentInteractions() || [];\n }\n\n /** ----------------- 公共接口方法 ----------------- */\n\n /**\n * 获取错误统计\n */\n public getErrorStats(): ErrorStats {\n return {\n totalErrors: this.errorHistory.length,\n jsErrors: this.errorHistory.filter(e => e.severity === 'high').length,\n networkErrors: this.errorHistory.filter(e => e.message.includes('network')).length,\n consoleErrors: this.errorHistory.filter(e => e.details?.source === 'console').length,\n lastErrorTime: this.errorHistory.length > 0 ? \n this.errorHistory[this.errorHistory.length - 1].timestamp : 0\n };\n }\n\n /**\n * 获取错误历史\n */\n public getErrorHistory(): ErrorPayload[] {\n return [...this.errorHistory];\n }\n\n /**\n * 清除错误历史\n */\n public clearErrorHistory(): void {\n this.errorHistory = [];\n this.errorCache.clear();\n }\n\n /**\n * 从调用栈中提取文件信息(文件名、行号、列号)\n */\n private extractFileInfoFromStack(stack?: string): { filename: string; lineno: number; colno: number } {\n const defaultResult = { filename: '', lineno: 0, colno: 0 };\n \n if (!stack) return defaultResult;\n \n try {\n const lines = stack.split('\\n');\n // 跳过前几行(Error构造函数和当前方法),找到实际调用者\n for (let i = 3; i < lines.length; i++) {\n const line = lines[i];\n // 匹配文件路径模式,包含行号和列号\n const match = line.match(/(?:at\\s+.*?\\s+\\()?([^()]+):(\\d+):(\\d+)\\)?$/);\n if (match) {\n const fullPath = match[1];\n const lineno = parseInt(match[2], 10) || 0;\n const colno = parseInt(match[3], 10) || 0;\n \n // 提取文件名(去掉路径)\n const filename = fullPath.split('/').pop() || fullPath.split('\\\\').pop() || fullPath;\n \n // 过滤掉内部文件\n if (!filename.includes('ErrorTracking') && \n !filename.includes('unified-error-handler') &&\n filename !== 'anonymous') {\n return { filename, lineno, colno };\n }\n }\n }\n } catch (error) {\n this.internalLog('warn', '[ErrorTracking] 解析调用栈失败:', error);\n }\n \n return defaultResult;\n }\n\n /**\n * 从调用栈中提取文件名(保持向后兼容)\n */\n // private extractFilenameFromStack(stack?: string): string {\n // return this.extractFileInfoFromStack(stack).filename;\n // }\n\n /**\n * 手动启用控制台拦截\n */\n public enableConsoleInterception(): void {\n this.fullyInitialized = true;\n this.internalLog('log', '[ErrorTracking] 手动启用控制台拦截');\n }\n\n /**\n * 手动禁用控制台拦截\n */\n public disableConsoleInterception(): void {\n this.fullyInitialized = false;\n this.internalLog('log', '[ErrorTracking] 手动禁用控制台拦截');\n }\n\n /**\n * 销毁错误追踪\n */\n public destroy(): void {\n // 恢复原始控制台方法\n Object.keys(this.originalConsole).forEach(method => {\n if (this.originalConsole[method]) {\n (console as any)[method] = this.originalConsole[method];\n }\n });\n\n this.initialized = false;\n this.internalLog('log', '[ErrorTracking] 错误追踪模块已销毁');\n }\n}\n","/**\n * InteractionTracking 用户交互追踪功能模块\n * 负责追踪和记录用户交互行为\n */\nimport type { UserInteraction } from '../types';\nimport { ERROR_CONFIG } from '../types';\n\nexport class InteractionTracking {\n private interactions: UserInteraction[] = [];\n private isTracking = false;\n private sendMessage: (message: any) => void;\n private trackingConfig = {\n maxInteractions: ERROR_CONFIG.MAX_INTERACTIONS,\n trackClicks: true,\n trackInputs: true,\n trackScrolls: true,\n trackKeyboard: true,\n trackMouse: false, // 默认关闭鼠标移动追踪,避免过多数据\n trackFocus: true,\n trackResize: true,\n trackNavigation: true,\n sensitiveInputFilter: true,\n debounceTime: 100\n };\n\n // 防抖定时器\n private debounceTimers = new Map<string, NodeJS.Timeout>();\n private eventListeners: Array<{ element: any; event: string; handler: any; options?: any }> = [];\n\n constructor(sendMessage: (message: any) => void) {\n this.sendMessage = sendMessage;\n console.log('[InteractionTracking] 交互追踪模块初始化完成');\n }\n\n /** ----------------- 主要控制方法 ----------------- */\n\n /**\n * 开始追踪\n */\n public startTracking(): void {\n if (this.isTracking) return;\n\n this.setupEventListeners();\n this.isTracking = true;\n \n // 记录页面加载作为初始交互\n this.trackInteraction('navigation', undefined, {\n type: 'page_load',\n url: window.location.href,\n title: document.title,\n timestamp: Date.now()\n });\n\n console.log('[InteractionTracking] 交互追踪已开始');\n }\n\n /**\n * 停止追踪\n */\n public stopTracking(): void {\n if (!this.isTracking) return;\n\n this.removeEventListeners();\n this.isTracking = false;\n \n console.log('[InteractionTracking] 交互追踪已停止');\n }\n\n /** ----------------- 事件监听器设置 ----------------- */\n\n /**\n * 设置事件监听器\n */\n private setupEventListeners(): void {\n // 点击事件\n if (this.trackingConfig.trackClicks) {\n this.addEventListenerWithCleanup(document, 'click', this.handleClick.bind(this), { \n passive: true, \n capture: true \n });\n }\n\n // 输入事件\n if (this.trackingConfig.trackInputs) {\n this.addEventListenerWithCleanup(document, 'input', this.handleInput.bind(this), { \n passive: true \n });\n this.addEventListenerWithCleanup(document, 'change', this.handleChange.bind(this), { \n passive: true \n });\n }\n\n // 滚动事件\n if (this.trackingConfig.trackScrolls) {\n this.addEventListenerWithCleanup(document, 'scroll', this.handleScroll.bind(this), { \n passive: true \n });\n }\n\n // 键盘事件\n if (this.trackingConfig.trackKeyboard) {\n this.addEventListenerWithCleanup(document, 'keydown', this.handleKeyDown.bind(this), { \n passive: true \n });\n this.addEventListenerWithCleanup(document, 'keyup', this.handleKeyUp.bind(this), { \n passive: true \n });\n }\n\n // 鼠标移动事件(可选)\n if (this.trackingConfig.trackMouse) {\n this.addEventListenerWithCleanup(document, 'mousemove', this.handleMouseMove.bind(this), { \n passive: true \n });\n }\n\n // 焦点事件\n if (this.trackingConfig.trackFocus) {\n this.addEventListenerWithCleanup(document, 'focus', this.handleFocus.bind(this), { \n passive: true, \n capture: true \n });\n this.addEventListenerWithCleanup(document, 'blur', this.handleBlur.bind(this), { \n passive: true, \n capture: true \n });\n }\n\n // 窗口大小变化\n if (this.trackingConfig.trackResize) {\n this.addEventListenerWithCleanup(window, 'resize', this.handleResize.bind(this), { \n passive: true \n });\n }\n\n // 导航事件\n if (this.trackingConfig.trackNavigation) {\n this.setupNavigationTracking();\n }\n\n // 表单提交事件\n this.addEventListenerWithCleanup(document, 'submit', this.handleSubmit.bind(this), { \n passive: true \n });\n\n // 页面可见性变化\n this.addEventListenerWithCleanup(document, 'visibilitychange', this.handleVisibilityChange.bind(this), { \n passive: true \n });\n }\n\n /**\n * 添加事件监听器并记录以便清理\n */\n private addEventListenerWithCleanup(\n element: any, \n event: string, \n handler: any, \n options?: any\n ): void {\n element.addEventListener(event, handler, options);\n this.eventListeners.push({ element, event, handler, options });\n }\n\n /**\n * 移除所有事件监听器\n */\n private removeEventListeners(): void {\n this.eventListeners.forEach(({ element, event, handler }) => {\n element.removeEventListener(event, handler);\n });\n this.eventListeners = [];\n \n // 清理防抖定时器\n this.debounceTimers.forEach(timer => clearTimeout(timer));\n this.debounceTimers.clear();\n }\n\n /**\n * 设置导航追踪\n */\n private setupNavigationTracking(): void {\n // 监听 popstate 事件\n this.addEventListenerWithCleanup(window, 'popstate', this.handlePopState.bind(this), { \n passive: true \n });\n\n // 拦截 pushState 和 replaceState\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = (...args) => {\n this.trackInteraction('navigation', undefined, {\n type: 'pushState',\n url: args[2] || window.location.href,\n state: args[0]\n });\n return originalPushState.apply(history, args);\n };\n\n history.replaceState = (...args) => {\n this.trackInteraction('navigation', undefined, {\n type: 'replaceState',\n url: args[2] || window.location.href,\n state: args[0]\n });\n return originalReplaceState.apply(history, args);\n };\n }\n\n /** ----------------- 事件处理方法 ----------------- */\n\n /**\n * 处理点击事件\n */\n private handleClick(event: MouseEvent): void {\n if (!this.isTracking) return;\n\n const target = event.target as Element;\n this.trackInteraction('click', target, {\n x: event.clientX,\n y: event.clientY,\n button: event.button,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n altKey: event.altKey,\n metaKey: event.metaKey\n });\n }\n\n /**\n * 处理输入事件\n */\n private handleInput(event: Event): void {\n if (!this.isTracking) return;\n\n const target = event.target as HTMLInputElement;\n if (this.isSensitiveInput(target)) return;\n\n this.debounceTrack('input', () => {\n this.trackInteraction('input', target, {\n value: target.value?.substring(0, 50), // 限制长度\n inputType: target.type,\n name: target.name\n });\n });\n }\n\n /**\n * 处理变化事件\n */\n private handleChange(event: Event): void {\n if (!this.isTracking) return;\n\n const target = event.target as HTMLInputElement;\n if (this.isSensitiveInput(target)) return;\n\n this.trackInteraction('change', target, {\n value: target.value?.substring(0, 50),\n inputType: target.type,\n name: target.name\n });\n }\n\n /**\n * 处理滚动事件\n */\n private handleScroll(): void {\n if (!this.isTracking) return;\n\n this.debounceTrack('scroll', () => {\n this.trackInteraction('scroll', undefined, {\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n scrollTop: document.documentElement.scrollTop\n });\n });\n }\n\n /**\n * 处理键盘按下事件\n */\n private handleKeyDown(event: Event): void {\n if (!this.isTracking) return;\n\n const keyboardEvent = event as KeyboardEvent;\n // 只记录特殊键和组合键\n if (keyboardEvent.ctrlKey || keyboardEvent.metaKey || keyboardEvent.altKey || keyboardEvent.shiftKey || \n ['Enter', 'Escape', 'Tab', 'Backspace', 'Delete'].includes(keyboardEvent.key)) {\n this.trackInteraction('keydown', keyboardEvent.target as Element, {\n key: keyboardEvent.key,\n code: keyboardEvent.code,\n ctrlKey: keyboardEvent.ctrlKey,\n metaKey: keyboardEvent.metaKey,\n altKey: keyboardEvent.altKey,\n shiftKey: keyboardEvent.shiftKey\n });\n }\n }\n\n /**\n * 处理键盘释放事件\n */\n private handleKeyUp(event: Event): void {\n if (!this.isTracking) return;\n\n const keyboardEvent = event as KeyboardEvent;\n // 只记录特殊键\n if (['Enter', 'Escape', 'Tab'].includes(keyboardEvent.key)) {\n this.trackInteraction('keyup', keyboardEvent.target as Element, {\n key: keyboardEvent.key,\n code: keyboardEvent.code\n });\n }\n }\n\n /**\n * 处理鼠标移动事件\n */\n private handleMouseMove(event: MouseEvent): void {\n if (!this.isTracking) return;\n\n this.debounceTrack('mousemove', () => {\n this.trackInteraction('mousemove', undefined, {\n x: event.clientX,\n y: event.clientY\n });\n }, 200); // 更长的防抖时间\n }\n\n /**\n * 处理焦点事件\n */\n private handleFocus(event: FocusEvent): void {\n if (!this.isTracking) return;\n\n const target = event.target as Element;\n this.trackInteraction('focus', target, {\n tagName: target.tagName.toLowerCase(),\n type: (target as HTMLInputElement).type || '',\n name: (target as HTMLInputElement).name || ''\n });\n }\n\n /**\n * 处理失焦事件\n */\n private handleBlur(event: FocusEvent): void {\n if (!this.isTracking) return;\n\n const target = event.target as Element;\n this.trackInteraction('blur', target, {\n tagName: target.tagName.toLowerCase()\n });\n }\n\n /**\n * 处理窗口大小变化\n */\n private handleResize(): void {\n if (!this.isTracking) return;\n\n this.debounceTrack('resize', () => {\n this.trackInteraction('resize', undefined, {\n width: window.innerWidth,\n height: window.innerHeight\n });\n });\n }\n\n /**\n * 处理表单提交\n */\n private handleSubmit(event: Event): void {\n if (!this.isTracking) return;\n\n const target = event.target as HTMLFormElement;\n this.trackInteraction('submit', target, {\n action: target.action,\n method: target.method,\n fieldCount: target.elements.length\n });\n }\n\n /**\n * 处理页面可见性变化\n */\n private handleVisibilityChange(): void {\n if (!this.isTracking) return;\n\n this.trackInteraction('visibility', undefined, {\n hidden: document.hidden,\n visibilityState: document.visibilityState\n });\n }\n\n /**\n * 处理 popstate 事件\n */\n private handlePopState(): void {\n if (!this.isTracking) return;\n\n this.trackInteraction('navigation', undefined, {\n type: 'popstate',\n url: window.location.href\n });\n }\n\n /** ----------------- 辅助方法 ----------------- */\n\n /**\n * 防抖追踪\n */\n private debounceTrack(key: string, callback: () => void, delay?: number): void {\n const debounceTime = delay || this.trackingConfig.debounceTime;\n \n if (this.debounceTimers.has(key)) {\n clearTimeout(this.debounceTimers.get(key)!);\n }\n\n const timer = setTimeout(callback, debounceTime);\n this.debounceTimers.set(key, timer);\n }\n\n /**\n * 追踪交互\n */\n private trackInteraction(type: UserInteraction['type'], element?: Element, details?: any): void {\n const interaction: UserInteraction = {\n type,\n element: element ? this.getElementSelector(element) : undefined,\n timestamp: Date.now(),\n details\n };\n\n this.interactions.push(interaction);\n this.manageArrayLength(this.interactions, this.trackingConfig.maxInteractions);\n\n // 同步到全局变量\n const globalInteraction = {\n ...interaction,\n pageUrl: window.location.href,\n pagePath: window.location.pathname + window.location.search + window.location.hash\n };\n\n window.__AUTO_ENGINEER_INTERACTION_TRAIL__ = window.__AUTO_ENGINEER_INTERACTION_TRAIL__ || [];\n window.__AUTO_ENGINEER_INTERACTION_TRAIL__.push(globalInteraction);\n this.manageArrayLength(window.__AUTO_ENGINEER_INTERACTION_TRAIL__, 8);\n\n // 只收集交互数据,不立即发送到父窗口\n // 交互数据会在错误发生时一起发送\n }\n\n /**\n * 获取元素选择器\n */\n private getElementSelector(element: Element): string {\n if (element.id) return `#${element.id}`;\n if (element.className) {\n const classes = element.className.split(' ').filter(c => c.trim());\n if (classes.length > 0) {\n return `.${classes[0]}`;\n }\n }\n \n // 尝试获取 data 属性\n const dataTestId = element.getAttribute('data-testid');\n if (dataTestId) return `[data-testid=\"${dataTestId}\"]`;\n \n const dataId = element.getAttribute('data-id');\n if (dataId) return `[data-id=\"${dataId}\"]`;\n \n return element.tagName.toLowerCase();\n }\n\n /**\n * 检查是否为敏感输入\n */\n private isSensitiveInput(element: HTMLInputElement): boolean {\n if (!this.trackingConfig.sensitiveInputFilter) return false;\n\n const sensitiveTypes = ['password', 'email', 'tel', 'ssn', 'credit-card'];\n const sensitiveNames = ['password', 'email', 'phone', 'ssn', 'credit', 'card', 'cvv', 'pin'];\n \n return sensitiveTypes.includes(element.type) ||\n sensitiveNames.some(name => \n element.name?.toLowerCase().includes(name) ||\n element.placeholder?.toLowerCase().includes(name) ||\n element.id?.toLowerCase().includes(name)\n );\n }\n\n /**\n * 管理数组长度\n */\n private manageArrayLength<T>(array: T[], maxLength: number): void {\n if (array.length > maxLength) {\n array.shift();\n }\n }\n\n /** ----------------- 公共接口方法 ----------------- */\n\n /**\n * 获取交互历史\n */\n public getInteractionHistory(): UserInteraction[] {\n return [...this.interactions];\n }\n\n /**\n * 获取最近的交互记录\n */\n public getRecentInteractions(count: number = 8): UserInteraction[] {\n return this.interactions.slice(-count);\n }\n\n /**\n * 手动发送交互数据到父窗口(用于测试或特殊情况)\n */\n public sendInteractionData(): void {\n if (this.interactions.length === 0) return;\n\n this.sendMessage({\n type: 'INTERACTION_EVENT',\n payload: {\n type: 'summary',\n interactions: this.interactions,\n count: this.interactions.length,\n timeRange: {\n start: this.interactions[0]?.timestamp || Date.now(),\n end: this.interactions[this.interactions.length - 1]?.timestamp || Date.now()\n },\n summary: this.generateInteractionSummary()\n },\n timestamp: Date.now()\n });\n }\n\n /**\n * 生成交互摘要\n */\n private generateInteractionSummary() {\n const summary = {\n totalInteractions: this.interactions.length,\n typeCount: {} as Record<string, number>,\n uniqueElements: new Set<string>(),\n timeSpan: 0\n };\n\n this.interactions.forEach(interaction => {\n summary.typeCount[interaction.type] = (summary.typeCount[interaction.type] || 0) + 1;\n if (interaction.element) {\n summary.uniqueElements.add(interaction.element);\n }\n });\n\n if (this.interactions.length > 1) {\n summary.timeSpan = this.interactions[this.interactions.length - 1].timestamp - this.interactions[0].timestamp;\n }\n\n return {\n ...summary,\n uniqueElements: Array.from(summary.uniqueElements),\n mostCommonType: Object.entries(summary.typeCount)\n .sort(([,a], [,b]) => b - a)[0]?.[0] || 'unknown'\n };\n }\n\n /**\n * 清除交互历史\n */\n public clearInteractionHistory(): void {\n this.interactions = [];\n }\n\n /**\n * 更新追踪配置\n */\n public updateConfig(newConfig: Partial<typeof this.trackingConfig>): void {\n this.trackingConfig = { ...this.trackingConfig, ...newConfig };\n \n // 如果正在追踪,重新设置监听器\n if (this.isTracking) {\n this.removeEventListeners();\n this.setupEventListeners();\n }\n }\n\n /**\n * 获取追踪状态\n */\n public isTrackingActive(): boolean {\n return this.isTracking;\n }\n\n /**\n * 销毁交互追踪\n */\n public destroy(): void {\n this.stopTracking();\n this.interactions = [];\n console.log('[InteractionTracking] 交互追踪模块已销毁');\n }\n}","/**\n * ElementSelector 元素选择器功能模块\n * 负责元素选择、高亮、交互等功能\n */\nimport type { \n SelectorConfig, \n SelectorState,\n ElementLocation,\n ElementData\n} from '../types';\nimport { DEFAULT_SELECTOR_CONFIG } from '../types';\n\nexport class ElementSelector {\n private config: SelectorConfig = { ...DEFAULT_SELECTOR_CONFIG };\n private isActive = false;\n private highlightedElement: Element | null = null;\n private selectedElements: Element[] = [];\n private sendMessage: (message: any) => void;\n private rootElement: HTMLElement | null = null;\n private tooltip: HTMLElement | null = null;\n private styleElement: HTMLStyleElement | null = null;\n private eventListeners: Array<{ element: any; event: string; handler: any; options?: any }> = [];\n private lastClickTimestamp = 0;\n private lastClickTarget: Element | null = null;\n private mousePosition = { x: 0, y: 0 };\n\n constructor(sendMessage: (message: any) => void) {\n this.sendMessage = sendMessage;\n this.initializeSelector();\n }\n\n /** ----------------- 初始化方法 ----------------- */\n\n /**\n * 初始化选择器\n */\n private initializeSelector(): void {\n this.waitForRootElement();\n this.createTooltip();\n this.createStyles();\n console.log('[ElementSelector] 元素选择器初始化完成');\n }\n\n /**\n * 等待根元素加载\n */\n private async waitForRootElement(): Promise<void> {\n const maxAttempts = 50;\n let attempts = 0;\n\n while (attempts < maxAttempts) {\n this.rootElement = document.querySelector('#root') || document.body;\n if (this.rootElement) {\n break;\n }\n await new Promise(resolve => setTimeout(resolve, 100));\n attempts++;\n }\n\n if (!this.rootElement) {\n this.rootElement = document.body;\n }\n }\n\n /**\n * 创建工具提示\n */\n private createTooltip(): void {\n this.tooltip = document.createElement('div');\n this.tooltip.className = 'element-selector-tooltip';\n this.tooltip.setAttribute('role', 'tooltip');\n this.tooltip.style.display = 'none';\n document.body.appendChild(this.tooltip);\n }\n\n /**\n * 创建样式\n */\n private createStyles(): void {\n this.styleElement = document.createElement('style');\n this.styleElement.id = 'element-selector-styles';\n this.styleElement.textContent = this.generateCSS();\n document.head.appendChild(this.styleElement);\n }\n\n /**\n * 生成 CSS 样式\n */\n private generateCSS(): string {\n return `\n .element-selector-tooltip {\n position: fixed;\n z-index: ${this.config.TOOLTIP_Z_INDEX};\n pointer-events: none;\n background-color: ${this.config.TOOLTIP_BACKGROUND};\n color: ${this.config.TOOLTIP_COLOR};\n padding: ${this.config.TOOLTIP_PADDING};\n border-radius: ${this.config.TOOLTIP_BORDER_RADIUS};\n font-size: ${this.config.TOOLTIP_FONT_SIZE};\n font-weight: bold;\n line-height: 1;\n white-space: nowrap;\n box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n transition: opacity 0.2s ease-in-out;\n margin: 0;\n }\n \n [data-element-hovered] {\n position: relative;\n outline: ${this.config.HIGHLIGHT_BORDER_WIDTH} ${this.config.HIGHLIGHT_BORDER_STYLE} ${this.config.HIGHLIGHT_COLOR} !important;\n outline-offset: 0 !important;\n background-color: ${this.config.HIGHLIGHT_COLOR}20 !important;\n z-index: 9999;\n }\n\n [data-element-selected] {\n position: relative;\n outline: ${this.config.SELECTED_BORDER_WIDTH} ${this.config.HIGHLIGHT_BORDER_STYLE} ${this.config.SELECTED_COLOR} !important;\n outline-offset: 3px !important;\n background-color: ${this.config.SELECTED_COLOR}15 !important;\n z-index: 9999;\n }\n\n [data-element-selected][contenteditable] {\n outline: none !important;\n }\n\n [data-element-hovered][data-full-width],\n [data-element-selected][data-full-width] {\n outline-offset: -5px !important;\n }\n \n .element-selector-active {\n cursor: ${this.config.cursor} !important;\n }\n \n .element-selector-active * {\n cursor: ${this.config.cursor} !important;\n }\n\n /* 阻止原生 hover 效果的全局样式 */\n body.element-selector-active * {\n /* 阻止原生 CSS hover 伪类效果 */\n transition: none !important;\n }\n\n /* 阻止所有 hover 相关的 CSS 伪类,但排除我们的选择器元素 */\n body.element-selector-active *:hover:not([data-element-selected]):not([data-element-hovered]) {\n background-color: inherit !important;\n color: inherit !important;\n border-color: inherit !important;\n box-shadow: inherit !important;\n transform: inherit !important;\n opacity: inherit !important;\n filter: inherit !important;\n }\n\n /* 确保我们的选择器样式优先级最高 */\n body.element-selector-active [data-element-selected] {\n background-color: ${this.config.SELECTED_COLOR}15 !important;\n outline: ${this.config.SELECTED_BORDER_WIDTH} ${this.config.HIGHLIGHT_BORDER_STYLE} ${this.config.SELECTED_COLOR} !important;\n }\n\n body.element-selector-active [data-element-hovered] {\n background-color: ${this.config.HIGHLIGHT_COLOR}20 !important;\n outline: ${this.config.HIGHLIGHT_BORDER_WIDTH} ${this.config.HIGHLIGHT_BORDER_STYLE} ${this.config.HIGHLIGHT_COLOR} !important;\n }\n\n /* 确保工具提示不受影响 */\n body.element-selector-active .element-selector-tooltip {\n pointer-events: none !important;\n }\n `;\n }\n\n /** ----------------- 选择器状态管理 ----------------- */\n\n /**\n * 启用选择器\n */\n public enableSelector(): void {\n if (this.isActive) return;\n\n this.isActive = true;\n document.body.classList.add('element-selector-active');\n \n this.setupEventListeners();\n this.manageButtonStates(true);\n \n console.log('[ElementSelector] 选择器已启用');\n \n this.sendMessage({\n type: 'SELECTOR_ENABLED',\n payload: { isActive: true }\n });\n }\n\n /**\n * 禁用选择器\n */\n public disableSelector(): void {\n if (!this.isActive) return;\n\n this.isActive = false;\n document.body.classList.remove('element-selector-active');\n \n this.removeEventListeners();\n this.clearHighlight();\n this.clearSelection();\n this.manageButtonStates(false);\n this.hideTooltip();\n \n console.log('[ElementSelector] 选择器已禁用');\n \n this.sendMessage({\n type: 'SELECTOR_DISABLED',\n payload: { isActive: false }\n });\n }\n\n /**\n * 切换选择器状态\n */\n public toggleSelector(): void {\n if (this.isActive) {\n this.disableSelector();\n } else {\n this.enableSelector();\n }\n }\n\n /**\n * 获取选择器状态\n */\n public getSelectorState(): SelectorState {\n return {\n isActive: this.isActive,\n highlightedElement: this.highlightedElement ? this.getElementInfo(this.highlightedElement) : null,\n selectedElements: this.selectedElements.map(el => this.getElementInfo(el)),\n config: { ...this.config }\n };\n }\n\n /** ----------------- 事件监听器管理 ----------------- */\n\n /**\n * 设置事件监听器\n */\n private setupEventListeners(): void {\n this.addEventListenerWithCleanup(document, 'mouseover', this.handleMouseOver.bind(this), { passive: true });\n this.addEventListenerWithCleanup(document, 'mouseout', this.handleMouseOut.bind(this), { passive: true });\n this.addEventListenerWithCleanup(document, 'mousemove', this.trackMousePosition.bind(this), { passive: true });\n // 使用捕获阶段确保在其他事件处理器之前拦截\n this.addEventListenerWithCleanup(document, 'click', this.handleClick.bind(this), { capture: true });\n this.addEventListenerWithCleanup(document, 'dblclick', this.handleDoubleClick.bind(this), { capture: true });\n this.addEventListenerWithCleanup(window, 'scroll', this.handleScroll.bind(this), { passive: true });\n this.addEventListenerWithCleanup(document, 'keydown', this.handleKeyDown.bind(this));\n \n // 阻止表单交互 - 使用捕获阶段\n this.addEventListenerWithCleanup(document, 'mousedown', this.preventFormInteraction.bind(this), { capture: true });\n this.addEventListenerWithCleanup(document, 'submit', this.preventAllInteraction.bind(this), { capture: true });\n this.addEventListenerWithCleanup(document, 'touchstart', this.preventAllInteraction.bind(this), { capture: true });\n this.addEventListenerWithCleanup(document, 'touchend', this.preventAllInteraction.bind(this), { capture: true });\n }\n\n /**\n * 添加事件监听器并记录以便清理\n */\n private addEventListenerWithCleanup(\n element: any, \n event: string, \n handler: any, \n options?: any\n ): void {\n element.addEventListener(event, handler, options);\n this.eventListeners.push({ element, event, handler, options });\n }\n\n /**\n * 移除所有事件监听器\n */\n private removeEventListeners(): void {\n this.eventListeners.forEach(({ element, event, handler }) => {\n element.removeEventListener(event, handler);\n });\n this.eventListeners = [];\n }\n\n /** ----------------- 事件处理方法 ----------------- */\n\n /**\n * 跟踪鼠标位置\n */\n private trackMousePosition(event: MouseEvent): void {\n this.mousePosition = { x: event.clientX, y: event.clientY };\n }\n\n /**\n * 处理鼠标悬停\n */\n private handleMouseOver(event: MouseEvent): void {\n if (!this.isActive) return;\n\n const target = event.target as Element;\n if (!this.isSelectableElement(target)) return;\n\n this.highlightElement(target);\n this.updateTooltip(target);\n }\n\n /**\n * 处理鼠标离开\n */\n private handleMouseOut(event: MouseEvent): void {\n if (!this.isActive) return;\n\n this.clearHighlight();\n this.hideTooltip();\n }\n\n /**\n * 处理点击\n */\n private handleClick(event: MouseEvent): void {\n if (!this.isActive) return;\n\n const currentTimestamp = Date.now();\n const target = event.target as Element;\n \n // 防重复点击:如果是同一个元素在很短时间内被点击,忽略\n if (this.lastClickTarget === target && currentTimestamp - this.lastClickTimestamp < 100) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n // 更新防重复记录\n this.lastClickTimestamp = currentTimestamp;\n this.lastClickTarget = target;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (!this.isSelectableElement(target)) return;\n\n if (event.metaKey || event.ctrlKey) {\n this.toggleElementSelection(target);\n } else {\n this.selectElement(target);\n }\n\n this.sendMessage({\n type: 'ELEMENT_CLICKED',\n payload: {\n element: this.getElementInfo(target),\n isMultiSelect: event.metaKey || event.ctrlKey\n }\n });\n }\n\n /**\n * 处理双击\n */\n private handleDoubleClick(event: MouseEvent): void {\n if (!this.isActive) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n const target = event.target as Element;\n if (!this.isSelectableElement(target)) return;\n\n this.sendMessage({\n type: 'ELEMENT_DOUBLE_CLICKED',\n payload: {\n element: this.getElementInfo(target)\n }\n });\n }\n\n /**\n * 处理滚动\n */\n private handleScroll(): void {\n if (!this.isActive) return;\n this.hideTooltip();\n }\n\n /**\n * 处理键盘事件\n */\n private handleKeyDown(event: Event): void {\n if (!this.isActive) return;\n\n const keyboardEvent = event as KeyboardEvent;\n if (keyboardEvent.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.disableSelector();\n }\n }\n\n /**\n * 阻止表单交互\n */\n private preventFormInteraction(event: Event): void {\n if (!this.isActive) return;\n\n const target = event.target as HTMLElement;\n if (['input', 'textarea', 'select'].includes(target.tagName.toLowerCase())) {\n event.preventDefault();\n }\n }\n\n /**\n * 阻止所有交互\n */\n private preventAllInteraction(event: Event): boolean | void {\n if (this.isActive) {\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n }\n\n /** ----------------- 元素操作方法 ----------------- */\n\n /**\n * 高亮元素\n */\n private highlightElement(element: Element): void {\n this.clearHighlight();\n this.highlightedElement = element;\n \n element.setAttribute('data-element-hovered', 'true');\n \n // 检测全宽元素\n if (this.isFullWidthElement(element)) {\n element.setAttribute('data-full-width', 'true');\n }\n }\n\n /**\n * 清除高亮\n */\n private clearHighlight(): void {\n if (this.highlightedElement) {\n this.highlightedElement.removeAttribute('data-element-hovered');\n this.highlightedElement.removeAttribute('data-full-width');\n this.highlightedElement = null;\n }\n }\n\n /**\n * 选择元素\n */\n private selectElement(element: Element): void {\n this.clearSelection();\n this.selectedElements = [element];\n element.setAttribute('data-element-selected', 'true');\n \n if (this.isFullWidthElement(element)) {\n element.setAttribute('data-full-width', 'true');\n }\n }\n\n /**\n * 切换元素选择状态\n */\n private toggleElementSelection(element: Element): void {\n const index = this.selectedElements.indexOf(element);\n \n if (index > -1) {\n // 取消选择\n this.selectedElements.splice(index, 1);\n element.removeAttribute('data-element-selected');\n element.removeAttribute('data-full-width');\n } else {\n // 添加选择\n this.selectedElements.push(element);\n element.setAttribute('data-element-selected', 'true');\n \n if (this.isFullWidthElement(element)) {\n element.setAttribute('data-full-width', 'true');\n }\n }\n }\n\n /**\n * 清除选择\n */\n private clearSelection(): void {\n this.selectedElements.forEach(element => {\n element.removeAttribute('data-element-selected');\n element.removeAttribute('data-full-width');\n });\n this.selectedElements = [];\n }\n\n /** ----------------- 工具提示管理 ----------------- */\n\n /**\n * 更新工具提示\n */\n private updateTooltip(element: Element): void {\n if (!this.tooltip) return;\n\n const rect = element.getBoundingClientRect();\n const tagName = element.tagName.toLowerCase();\n \n this.tooltip.textContent = tagName;\n this.tooltip.style.display = 'block';\n \n // 计算位置\n const isFullWidth = this.isFullWidthElement(element);\n if (isFullWidth) {\n this.tooltip.style.left = this.config.FULL_WIDTH_TOOLTIP_OFFSET + 'px';\n this.tooltip.style.top = this.config.FULL_WIDTH_TOOLTIP_OFFSET + 'px';\n } else {\n const top = Math.max(0, rect.top - 30);\n this.tooltip.style.left = `${Math.max(0, rect.left)}px`;\n this.tooltip.style.top = `${top}px`;\n }\n }\n\n /**\n * 隐藏工具提示\n */\n private hideTooltip(): void {\n if (this.tooltip) {\n this.tooltip.style.display = 'none';\n }\n }\n\n /** ----------------- 按钮状态管理 ----------------- */\n\n /**\n * 管理按钮状态\n */\n private manageButtonStates(enable: boolean): void {\n if (!this.rootElement) return;\n\n const buttons = this.rootElement.querySelectorAll('button, input[type=\"button\"], input[type=\"submit\"]');\n \n if (enable) {\n // 启用选择器时,禁用所有按钮并标记\n buttons.forEach(button => {\n const btn = button as HTMLButtonElement;\n if (!btn.disabled) {\n btn.disabled = true;\n btn.setAttribute('data-selector-disabled', 'true');\n }\n });\n } else {\n // 禁用选择器时,恢复之前被禁用的按钮\n buttons.forEach(button => {\n const btn = button as HTMLButtonElement;\n if (btn.hasAttribute('data-selector-disabled')) {\n btn.disabled = false;\n btn.removeAttribute('data-selector-disabled');\n }\n });\n }\n }\n\n /** ----------------- 新增的精确代码位置定位方法 ----------------- */\n\n /**\n * 检查元素是否有 howone ID\n */\n private hasHowoneId(element: Element): boolean {\n return element.hasAttribute('data-howone-id');\n }\n\n /**\n * 解析 howone ID\n */\n private parseHowoneId(element: Element): ElementLocation | null {\n const howoneId = element.getAttribute('data-howone-id');\n if (!howoneId) return null;\n\n try {\n // 假设 data-howone-id 格式为 \"filePath:lineNumber:col\" 或 JSON 格式\n if (howoneId.includes(':')) {\n const parts = howoneId.split(':');\n if (parts.length >= 2) {\n return {\n filePath: parts[0],\n lineNumber: parseInt(parts[1], 10),\n col: parts[2] ? parseInt(parts[2], 10) : 0\n };\n }\n } else {\n // 尝试解析为 JSON\n const parsed = JSON.parse(howoneId);\n if (parsed.filePath && parsed.lineNumber) {\n return {\n filePath: parsed.filePath,\n lineNumber: parsed.lineNumber,\n col: parsed.col || 0\n };\n }\n }\n } catch (error) {\n console.warn('[ElementSelector] 解析 data-howone-id 失败:', error);\n }\n\n return null;\n }\n\n /**\n * 获取元素的代码位置\n */\n public getElementLocation(element: Element): ElementLocation | null {\n return this.parseHowoneId(element);\n }\n\n /**\n * 提取元素数据(包含位置信息)\n */\n public extractElementData(element: Element): ElementData {\n const location = this.getElementLocation(element);\n \n return {\n id: element.id || undefined,\n className: element.className || undefined,\n textContent: element.textContent?.trim().substring(0, 100) || undefined,\n filePath: location?.filePath,\n lineNumber: location?.lineNumber,\n col: location?.col,\n elementType: element.tagName.toLowerCase(),\n attrs: this.getElementAttributes(element)\n };\n }\n\n /**\n * 根据代码位置查找元素\n */\n public findElementsByLocation(filePath: string, lineNumber: number): Element[] {\n const elements: Element[] = [];\n \n // 查找所有带有 data-howone-id 的元素\n const elementsWithHowoneId = this.rootElement?.querySelectorAll('[data-howone-id]') || [];\n \n elementsWithHowoneId.forEach(element => {\n const location = this.getElementLocation(element);\n if (location && location.filePath === filePath && location.lineNumber === lineNumber) {\n elements.push(element);\n }\n });\n \n return elements;\n }\n\n /**\n * 获取指定坐标位置的元素\n */\n public getElementAtPoint(x: number, y: number): Element | null {\n // 临时隐藏工具提示以避免干扰\n const originalDisplay = this.tooltip?.style.display;\n if (this.tooltip) {\n this.tooltip.style.display = 'none';\n }\n \n const element = document.elementFromPoint(x, y);\n \n // 恢复工具提示显示\n if (this.tooltip && originalDisplay) {\n this.tooltip.style.display = originalDisplay;\n }\n \n return element;\n }\n\n /** ----------------- 元素编辑功能 ----------------- */\n\n /**\n * 设置元素内容\n */\n public setElementContent(selector: string, content: string): boolean {\n try {\n const element = document.querySelector(selector);\n if (!element) return false;\n\n if (element.tagName.toLowerCase() === 'input' || element.tagName.toLowerCase() === 'textarea') {\n (element as HTMLInputElement).value = content;\n } else {\n element.textContent = content;\n }\n\n this.sendMessage({\n type: 'ELEMENT_CONTENT_UPDATED',\n payload: {\n selector,\n content,\n element: this.getElementInfo(element)\n }\n });\n\n return true;\n } catch (error) {\n console.error('[ElementSelector] 设置元素内容失败:', error);\n return false;\n }\n }\n\n /**\n * 设置元素属性\n */\n public setElementAttributes(selector: string, attributes: Record<string, string>): boolean {\n try {\n const element = document.querySelector(selector);\n if (!element) return false;\n\n Object.entries(attributes).forEach(([key, value]) => {\n if (value === null || value === undefined) {\n element.removeAttribute(key);\n } else {\n element.setAttribute(key, value);\n }\n });\n\n this.sendMessage({\n type: 'ELEMENT_ATTRIBUTES_UPDATED',\n payload: {\n selector,\n attributes,\n element: this.getElementInfo(element)\n }\n });\n\n return true;\n } catch (error) {\n console.error('[ElementSelector] 设置元素属性失败:', error);\n return false;\n }\n }\n\n /**\n * 复制元素\n */\n public duplicateElement(selector: string): boolean {\n try {\n const element = document.querySelector(selector);\n if (!element || !element.parentNode) return false;\n\n const clonedElement = element.cloneNode(true) as Element;\n \n // 移除 data-blnk-id 以避免冲突\n clonedElement.removeAttribute('data-blnk-id');\n \n // 插入到原元素后面\n element.parentNode.insertBefore(clonedElement, element.nextSibling);\n\n this.sendMessage({\n type: 'ELEMENT_DUPLICATED',\n payload: {\n originalSelector: selector,\n duplicatedElement: this.getElementInfo(clonedElement)\n }\n });\n\n return true;\n } catch (error) {\n console.error('[ElementSelector] 复制元素失败:', error);\n return false;\n }\n }\n\n /**\n * 启用文本编辑\n */\n public enableTextEditing(selector: string): boolean {\n try {\n const element = document.querySelector(selector);\n if (!element) return false;\n\n // 使元素可编辑\n element.setAttribute('contenteditable', 'true');\n element.setAttribute('data-editing', 'true');\n \n // 聚焦元素\n (element as HTMLElement).focus();\n\n // 添加编辑完成监听器\n const handleEditComplete = () => {\n element.removeAttribute('contenteditable');\n element.removeAttribute('data-editing');\n element.removeEventListener('blur', handleEditComplete);\n element.removeEventListener('keydown', handleKeyDown);\n\n this.sendMessage({\n type: 'ELEMENT_TEXT_UPDATED',\n payload: {\n selector,\n content: element.textContent || '',\n element: this.getElementInfo(element)\n }\n });\n };\n\n const handleKeyDown = (event: Event) => {\n const keyboardEvent = event as KeyboardEvent;\n if (keyboardEvent.key === 'Enter' && !keyboardEvent.shiftKey) {\n event.preventDefault();\n handleEditComplete();\n } else if (keyboardEvent.key === 'Escape') {\n event.preventDefault();\n handleEditComplete();\n }\n };\n\n element.addEventListener('blur', handleEditComplete);\n element.addEventListener('keydown', handleKeyDown);\n\n return true;\n } catch (error) {\n console.error('[ElementSelector] 启用文本编辑失败:', error);\n return false;\n }\n }\n\n /** ----------------- 高级交互功能 ----------------- */\n\n /**\n * 获取父元素\n */\n public getParentElement(selector: string): Element | null {\n try {\n const element = document.querySelector(selector);\n return element?.parentElement || null;\n } catch (error) {\n console.error('[ElementSelector] 获取父元素失败:', error);\n return null;\n }\n }\n\n /**\n * 外部悬停控制 - 通过选择器悬停元素\n */\n public hoverElementBySelector(selector: string): boolean {\n try {\n const element = document.querySelector(selector);\n if (!element) return false;\n\n this.highlightElement(element);\n this.updateTooltip(element);\n return true;\n } catch (error) {\n console.error('[ElementSelector] 外部悬停控制失败:', error);\n return false;\n }\n }\n\n /**\n * 外部悬停控制 - 取消悬停\n */\n public unhoverElement(): void {\n this.clearHighlight();\n this.hideTooltip();\n }\n\n /** ----------------- 辅助方法 ----------------- */\n\n /**\n * 检查元素是否为全宽元素\n */\n private isFullWidthElement(element: Element): boolean {\n try {\n const rect = element.getBoundingClientRect();\n return Math.abs(rect.width - window.innerWidth) < 5;\n } catch (error) {\n console.warn('[ElementSelector] 检查全宽元素失败:', error);\n return false;\n }\n }\n\n /**\n * 检查元素是否可选择\n */\n private isSelectableElement(element: Element): boolean {\n if (!element || element === document.body || element === document.documentElement) {\n return false;\n }\n\n // 优先检查是否有 data-howone-id\n if (this.hasHowoneId(element)) {\n return true;\n }\n\n // 跳过工具提示元素\n if (element.id === 'howone-element-tooltip' || \n element.classList.contains('howone-tooltip')) {\n return false;\n }\n\n // 跳过脚本和样式元素\n const tagName = element.tagName.toLowerCase();\n if (['script', 'style', 'meta', 'link', 'title'].includes(tagName)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * 获取元素信息\n */\n private getElementInfo(element: Element): any {\n const location = this.getElementLocation(element);\n \n return {\n tagName: element.tagName.toLowerCase(),\n id: element.id || undefined,\n className: element.className || undefined,\n textContent: element.textContent?.trim().substring(0, 100) || undefined,\n attributes: this.getElementAttributes(element),\n selector: this.getElementSelector(element),\n boundingRect: element.getBoundingClientRect(),\n location: location || undefined\n };\n }\n\n /**\n * 获取元素属性\n */\n private getElementAttributes(element: Element): Record<string, string> {\n const attrs: Record<string, string> = {};\n const importantAttrs = ['id', 'class', 'data-testid', 'data-howone-id', 'data-component-path', 'data-blnk-id', 'href', 'src', 'type', 'name'];\n \n importantAttrs.forEach(attr => {\n const value = element.getAttribute(attr);\n if (value) {\n attrs[attr] = value;\n }\n });\n \n return attrs;\n }\n\n /**\n * 获取元素选择器\n */\n private getElementSelector(element: Element): string {\n // 优先使用 data-howone-id\n const howoneId = element.getAttribute('data-howone-id');\n if (howoneId) {\n return `[data-howone-id=\"${howoneId}\"]`;\n }\n\n if (element.id) {\n return `#${element.id}`;\n }\n \n const dataTestId = element.getAttribute('data-testid');\n if (dataTestId) {\n return `[data-testid=\"${dataTestId}\"]`;\n }\n \n if (element.className) {\n const classes = element.className.split(' ').filter(c => c.trim());\n if (classes.length > 0) {\n return `.${classes[0]}`;\n }\n }\n \n return element.tagName.toLowerCase();\n }\n\n /** ----------------- 公共接口方法 ----------------- */\n\n /**\n * 通过选择器高亮元素\n */\n public highlightElementBySelector(selector: string): void {\n const element = document.querySelector(selector);\n if (element) {\n this.highlightElement(element);\n }\n }\n\n /**\n * 通过选择器取消高亮元素\n */\n public unhighlightElementBySelector(selector: string): void {\n const element = document.querySelector(selector);\n if (element && element === this.highlightedElement) {\n this.clearHighlight();\n }\n }\n\n /**\n * 更新选中的元素\n */\n public updateSelectedElements(elements: any[]): void {\n this.clearSelection();\n \n elements.forEach(elementData => {\n const element = this.findElementByData(elementData);\n if (element) {\n this.selectedElements.push(element);\n element.setAttribute('data-element-selected', 'true');\n \n if (this.isFullWidthElement(element)) {\n element.setAttribute('data-full-width', 'true');\n }\n }\n });\n }\n\n /**\n * 根据数据查找元素\n */\n private findElementByData(elementData: any): Element | null {\n // 优先使用 blinkId\n if (elementData.blinkId) {\n return document.querySelector(`[data-blnk-id=\"${elementData.blinkId}\"]`);\n }\n \n if (elementData.id) {\n return document.getElementById(elementData.id);\n }\n \n if (elementData.selector) {\n return document.querySelector(elementData.selector);\n }\n \n return null;\n }\n\n /**\n * 销毁选择器\n */\n public destroy(): void {\n this.disableSelector();\n \n if (this.tooltip) {\n this.tooltip.remove();\n this.tooltip = null;\n }\n \n if (this.styleElement) {\n this.styleElement.remove();\n this.styleElement = null;\n }\n \n console.log('[ElementSelector] 元素选择器已销毁');\n }\n}","/**\n * MessageBridge 消息桥接功能模块\n * 负责处理各种消息类型和与父窗口的通信\n */\nimport type { SelectorState, MessageType } from '../types';\nimport { GLOBAL_CONFIG } from '../types';\nimport { ElementSelector } from './ElementSelector';\nimport { ComponentTreeGenerator } from '../utils/ComponentTreeGenerator';\nimport { MessageSender, createDefaultMessageSender } from '../utils/MessageSender';\n\n// 获取原始控制台方法的引用\nconst getOriginalConsole = () => (window as any).__originalConsole || {\n log: console.log.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n info: console.info.bind(console),\n debug: console.debug.bind(console)\n};\n\nexport class MessageBridge {\n private elementSelector: ElementSelector | null = null;\n private componentTreeGenerator: ComponentTreeGenerator | null = null;\n private messageSender: MessageSender;\n private sendMessage: (message: any) => void;\n private messageListener?: (event: MessageEvent) => void;\n\n constructor(sendMessage?: (message: any) => void) {\n // 创建统一的消息发送器\n this.messageSender = createDefaultMessageSender({\n addTimestamp: true,\n enableDebugLog: false\n });\n \n // 如果提供了自定义发送函数,使用它;否则使用统一的消息发送器\n this.sendMessage = sendMessage || this.messageSender.createSendFunction();\n \n this.setupMessageListener();\n console.log('[MessageBridge] 消息桥接器初始化完成');\n }\n\n /** ----------------- 依赖注入方法 ----------------- */\n\n /**\n * 设置元素选择器\n */\n public setElementSelector(elementSelector: ElementSelector): void {\n this.elementSelector = elementSelector;\n }\n\n /**\n * 设置组件树生成器\n */\n public setComponentTreeGenerator(componentTreeGenerator: ComponentTreeGenerator): void {\n this.componentTreeGenerator = componentTreeGenerator;\n }\n\n /** ----------------- 消息监听设置 ----------------- */\n\n /**\n * 设置消息监听器\n */\n private setupMessageListener(): void {\n this.messageListener = (event) => {\n if (!this.isOriginAllowed(event.origin)) {\n return;\n }\n\n if (event.data && typeof event.data === 'object' && event.data.type) {\n this.handleMessage(event.data);\n }\n };\n window.addEventListener('message', this.messageListener);\n }\n\n /**\n * 检查来源是否被允许\n */\n private isOriginAllowed(origin: string): boolean {\n return GLOBAL_CONFIG.ALLOWED_ORIGINS.some(allowedOrigin => \n origin.includes(allowedOrigin.replace('https://', '').replace('http://', ''))\n );\n }\n\n /** ----------------- 主要消息处理方法 ----------------- */\n\n /**\n * 处理消息\n */\n public handleMessage(message: any): void {\n try {\n const { type, payload } = message;\n\n switch (type) {\n // 选择器相关消息\n case 'TOGGLE_SELECTOR':\n this.handleToggleSelector(payload);\n break;\n case 'ENABLE_SELECTOR':\n this.handleEnableElementSelector();\n break;\n case 'DISABLE_SELECTOR':\n this.handleDisableElementSelector();\n break;\n case 'GET_SELECTOR_STATE':\n this.handleGetSelectorState();\n break;\n\n // 元素操作消息\n case 'HOVER_ELEMENT_BY_ID':\n this.handleHoverElementById(payload);\n break;\n case 'UNHOVER_ELEMENT_BY_ID':\n this.handleUnhoverElementById(payload);\n break;\n case 'HOVER_ELEMENT_REQUESTED':\n this.handleHoverElementRequested(payload);\n break;\n case 'UNHOVER_ELEMENT_REQUESTED':\n this.handleUnhoverElementRequested(payload);\n break;\n case 'SET_ELEMENT_CONTENT':\n this.handleSetElementContent(payload);\n break;\n case 'SET_ELEMENT_ATTRS':\n this.handleSetElementAttrs(payload);\n break;\n case 'DUPLICATE_ELEMENT_REQUESTED':\n this.handleDuplicateElementRequested(payload);\n break;\n case 'EDIT_TEXT_REQUESTED':\n this.handleEditTextRequested(payload);\n break;\n case 'UPDATE_SELECTED_ELEMENTS':\n this.handleUpdateSelectedElements(payload);\n break;\n\n // 新增的消息类型\n case 'GET_ELEMENT_AT_POINT':\n this.handleGetElementAtPoint(payload);\n break;\n case 'FIND_ELEMENTS_BY_LOCATION':\n this.handleFindElementsByLocation(payload);\n break;\n case 'SET_ELEMENT_ATTRIBUTES':\n this.handleSetElementAttributes(payload);\n break;\n case 'ENABLE_TEXT_EDITING':\n this.handleEnableTextEditing(payload);\n break;\n case 'HOVER_ELEMENT_BY_SELECTOR':\n this.handleHoverElementBySelector(payload);\n break;\n case 'UNHOVER_ELEMENT':\n this.handleUnhoverElement();\n break;\n\n // 组件树相关消息\n case 'REQUEST_COMPONENT_TREE':\n this.handleRequestComponentTree();\n break;\n case 'GET_PARENT_ELEMENT':\n this.handleGetParentElement(payload);\n break;\n\n // 样式相关消息\n case 'SET_STYLESHEET':\n this.handleSetStylesheet(payload);\n break;\n\n default:\n console.warn('[MessageBridge] 未知消息类型:', type);\n break;\n }\n } catch (error) {\n console.error('[MessageBridge] 处理消息失败:', error);\n this.sendMessage({\n type: 'ERROR_EVENT',\n payload: {\n type: 'message_handling',\n originalMessage: message,\n error: error instanceof Error ? error.message : String(error)\n },\n timestamp: Date.now()\n });\n }\n }\n\n /** ----------------- 选择器相关消息处理 ----------------- */\n\n /**\n * 处理切换选择器\n */\n private handleToggleSelector(payload: any): void {\n if (!this.elementSelector) return;\n\n const shouldActivate = !!payload;\n if (shouldActivate) {\n this.elementSelector.enableSelector();\n } else {\n this.elementSelector.disableSelector();\n }\n }\n\n /**\n * 处理获取选择器状态\n */\n private handleGetSelectorState(): void {\n if (!this.elementSelector) return;\n\n const state = this.elementSelector.getSelectorState();\n this.sendMessage({\n type: 'SELECTOR_EVENT',\n payload: {\n type: 'state_response',\n ...state\n },\n timestamp: Date.now()\n });\n }\n\n /**\n * 处理启用元素选择器\n */\n private handleEnableElementSelector(): void {\n if (!this.elementSelector) return;\n this.elementSelector.enableSelector();\n }\n\n /**\n * 处理禁用元素选择器\n */\n private handleDisableElementSelector(): void {\n if (!this.elementSelector) return;\n this.elementSelector.disableSelector();\n }\n\n /** ----------------- 元素操作消息处理 ----------------- */\n\n /**\n * 处理通过 ID 高亮元素\n */\n private handleHoverElementById(payload: any): void {\n if (!this.elementSelector || !payload?.id) return;\n\n const selector = `#${payload.id}`;\n this.elementSelector.highlightElementBySelector(selector);\n }\n\n /**\n * 处理通过 ID 取消高亮元素\n */\n private handleUnhoverElementById(payload: any): void {\n if (!this.elementSelector || !payload?.id) return;\n\n const selector = `#${payload.id}`;\n this.elementSelector.unhighlightElementBySelector(selector);\n }\n\n /**\n * 处理高亮元素请求\n */\n private handleHoverElementRequested(payload: any): void {\n if (!this.elementSelector || !payload?.selector) return;\n this.elementSelector.highlightElementBySelector(payload.selector);\n }\n\n /**\n * 处理取消高亮元素请求\n */\n private handleUnhoverElementRequested(payload: any): void {\n if (!this.elementSelector || !payload?.selector) return;\n this.elementSelector.unhighlightElementBySelector(payload.selector);\n }\n\n /**\n * 处理设置元素内容\n */\n private handleSetElementContent(payload: any): void {\n if (!payload?.selector || !payload?.content) return;\n\n const elements = document.querySelectorAll(payload.selector);\n elements.forEach(element => {\n if (element instanceof HTMLElement) {\n element.innerHTML = payload.content;\n }\n });\n\n this.sendMessage({\n type: 'ELEMENT_EVENT',\n payload: {\n type: 'content_updated',\n selector: payload.selector,\n content: payload.content,\n elementsUpdated: elements.length\n },\n timestamp: Date.now()\n });\n }\n\n /**\n * 处理设置元素属性\n */\n private handleSetElementAttrs(payload: any): void {\n if (!payload?.selector || !payload?.attrs) return;\n\n const elements = document.querySelectorAll(payload.selector);\n elements.forEach(element => {\n Object.entries(payload.attrs).forEach(([key, value]) => {\n element.setAttribute(key, String(value));\n });\n });\n\n this.sendMessage({\n type: 'ELEMENT_EVENT',\n payload: {\n type: 'attrs_updated',\n selector: payload.selector,\n attrs: payload.attrs,\n elementsUpdated: elements.length\n },\n timestamp: Date.now()\n });\n }\n\n /**\n * 处理复制元素请求\n */\n private handleDuplicateElementRequested(payload: any): void {\n if (!payload?.selector) return;\n\n const element = document.querySelector(payload.selector);\n if (element && element.parentElement) {\n const clone = element.cloneNode(true) as Element;\n clone.setAttribute('data-duplicated', 'true');\n element.parentElement.appendChild(clone);\n\n this.sendMessage({\n type: 'ELEMENT_EVENT',\n payload: {\n type: 'duplicated',\n originalSelector: payload.selector,\n duplicatedElement: this.getElementInfo(clone)\n },\n timestamp: Date.now()\n });\n }\n }\n\n /**\n * 处理编辑文本请求\n */\n private handleEditTextRequested(payload: any): void {\n if (!payload?.selector) return;\n\n const element = document.querySelector(payload.selector);\n if (element instanceof HTMLElement) {\n element.setAttribute('contenteditable', 'true');\n element.focus();\n\n const handleInput = () => {\n this.sendMessage({\n type: 'ELEMENT_EVENT',\n payload: {\n type: 'text_updated',\n selector: payload.selector,\n content: element.innerText\n },\n timestamp: Date.now()\n });\n };\n\n const handleBlur = () => {\n element.removeAttribute('contenteditable');\n element.removeEventListener('input', handleInput);\n element.removeEventListener('blur', handleBlur);\n \n this.sendMessage({\n type: 'ELEMENT_EVENT',\n payload: {\n type: 'edit_completed',\n selector: payload.selector,\n finalContent: element.innerText\n },\n timestamp: Date.now()\n });\n };\n\n element.addEventListener('input', handleInput);\n element.addEventListener('blur', handleBlur);\n }\n }\n\n /**\n * 处理更新选中元素\n */\n private handleUpdateSelectedElements(payload: any): void {\n if (!this.elementSelector || !Array.isArray(payload)) return;\n\n this.elementSelector.updateSelectedElements(payload);\n\n this.sendMessage({\n type: 'ELEMENT_EVENT',\n payload: {\n type: 'selected_elements_updated',\n selectedElements: payload,\n count: payload.length\n },\n timestamp: Date.now()\n });\n }\n\n /** ----------------- 组件树相关消息处理 ----------------- */\n\n /**\n * 处理请求组件树\n */\n private handleRequestComponentTree(): void {\n if (!this.componentTreeGenerator) return;\n\n try {\n const rootElement = document.querySelector('#root') || document.body;\n const componentTree = this.componentTreeGenerator.generateComponentTree(rootElement);\n\n this.sendMessage({\n type: 'COMPONENT_EVENT',\n payload: {\n type: 'tree_response',\n ...componentTree\n },\n timestamp: Date.now()\n });\n } catch (error) {\n // 避免递归调用,使用原始控制台\n const originalConsole = getOriginalConsole();\n originalConsole.error('[MessageBridge] 生成组件树失败:', error);\n this.sendMessage({\n type: 'COMPONENT_EVENT',\n payload: {\n type: 'tree_error',\n error: error instanceof Error ? error.message : String(error)\n },\n timestamp: Date.now()\n });\n }\n }\n\n /**\n * 处理获取父元素\n */\n private handleGetParentElement(payload: any): void {\n if (!payload?.selector) return;\n\n const element = document.querySelector(payload.selector);\n if (element && element.parentElement) {\n const parentInfo = this.getElementInfo(element.parentElement);\n \n this.sendMessage({\n type: 'ELEMENT_EVENT',\n payload: {\n type: 'parent_element_response',\n childSelector: payload.selector,\n parentElement: parentInfo\n },\n timestamp: Date.now()\n });\n } else {\n this.sendMessage({\n type: 'ELEMENT_EVENT',\n payload: {\n type: 'parent_element_response',\n childSelector: payload.selector,\n parentElement: null\n },\n timestamp: Date.now()\n });\n }\n }\n\n /** ----------------- 样式相关消息处理 ----------------- */\n\n /**\n * 处理设置样式表\n */\n private handleSetStylesheet(payload: any): void {\n if (!payload?.stylesheet) return;\n\n const styleId = 'dynamic-stylesheet';\n let styleElement = document.getElementById(styleId) as HTMLStyleElement;\n \n if (styleElement) {\n styleElement.textContent = payload.stylesheet;\n } else {\n styleElement = document.createElement('style');\n styleElement.id = styleId;\n styleElement.textContent = payload.stylesheet;\n document.head.appendChild(styleElement);\n }\n\n this.sendMessage({\n type: 'STYLE_EVENT',\n payload: {\n type: 'stylesheet_updated',\n styleId: styleId,\n stylesheetLength: payload.stylesheet.length\n },\n timestamp: Date.now()\n });\n }\n\n /** ----------------- 辅助方法 ----------------- */\n\n /**\n * 获取元素信息\n */\n private getElementInfo(element: Element): any {\n return {\n tagName: element.tagName.toLowerCase(),\n id: element.id || undefined,\n className: element.className || undefined,\n textContent: element.textContent?.trim().substring(0, 100) || undefined,\n attributes: this.getElementAttributes(element),\n selector: this.getElementSelector(element),\n boundingRect: element.getBoundingClientRect()\n };\n }\n\n /**\n * 获取元素属性\n */\n private getElementAttributes(element: Element): Record<string, string> {\n const attrs: Record<string, string> = {};\n const importantAttrs = ['id', 'class', 'data-testid', 'data-howone-id', 'data-component-path', 'href', 'src', 'type', 'name'];\n \n importantAttrs.forEach(attr => {\n const value = element.getAttribute(attr);\n if (value) {\n attrs[attr] = value;\n }\n });\n \n return attrs;\n }\n\n /**\n * 获取元素选择器\n */\n private getElementSelector(element: Element): string {\n if (element.id) return `#${element.id}`;\n \n const dataTestId = element.getAttribute('data-testid');\n if (dataTestId) return `[data-testid=\"${dataTestId}\"]`;\n \n const dataHowoneId = element.getAttribute('data-howone-id');\n if (dataHowoneId) return `[data-howone-id=\"${dataHowoneId}\"]`;\n \n if (element.className) {\n const classes = element.className.split(' ').filter(c => c.trim());\n if (classes.length > 0) {\n return `.${classes[0]}`;\n }\n }\n \n return element.tagName.toLowerCase();\n }\n\n /** ----------------- 公共接口方法 ----------------- */\n\n /**\n * 发送消息到父窗口\n */\n public sendToParent(type: string, payload?: any): void {\n this.sendMessage({\n type,\n payload,\n timestamp: Date.now()\n });\n }\n\n /**\n * 广播状态更新\n */\n public broadcastStateUpdate(state: any): void {\n this.sendMessage({\n type: 'STATE_EVENT',\n payload: {\n type: 'update',\n ...state\n },\n timestamp: Date.now()\n });\n }\n\n\n /** ----------------- 新增的消息处理方法 ----------------- */\n\n /**\n * 处理获取鼠标位置的元素\n */\n private handleGetElementAtPoint(payload: any): void {\n if (!this.elementSelector) return;\n\n const element = this.elementSelector.getElementAtPoint(payload?.x, payload?.y);\n\n this.sendMessage({\n type: 'ELEMENT_EVENT',\n payload: {\n type: 'at_point_response',\n element: element ? this.getElementInfo(element) : null,\n coordinates: { x: payload?.x, y: payload?.y }\n },\n timestamp: Date.now()\n });\n }\n\n /**\n * 处理根据位置查找元素\n */\n private handleFindElementsByLocation(payload: any): void {\n if (!this.elementSelector || !payload?.filePath || !payload?.lineNumber) return;\n\n const elements = this.elementSelector.findElementsByLocation(payload.filePath, payload.lineNumber);\n\n this.sendMessage({\n type: 'ELEMENT_EVENT',\n payload: {\n type: 'elements_by_location_response',\n elements: elements.map(el => this.getElementInfo(el)),\n location: {\n filePath: payload.filePath,\n lineNumber: payload.lineNumber\n }\n },\n timestamp: Date.now()\n });\n }\n\n /**\n * 处理设置元素属性(新版本)\n */\n private handleSetElementAttributes(payload: any): void {\n if (!this.elementSelector || !payload?.selector || !payload?.attributes) return;\n\n const success = this.elementSelector.setElementAttributes(payload.selector, payload.attributes);\n\n this.sendMessage({\n type: 'ELEMENT_EVENT',\n payload: {\n type: 'attributes_set_response',\n success,\n selector: payload.selector,\n attributes: payload.attributes\n },\n timestamp: Date.now()\n });\n }\n\n /**\n * 处理启用文本编辑\n */\n private handleEnableTextEditing(payload: any): void {\n if (!this.elementSelector || !payload?.selector) return;\n\n const success = this.elementSelector.enableTextEditing(payload.selector);\n\n this.sendMessage({\n type: 'ELEMENT_EVENT',\n payload: {\n type: 'text_editing_enabled_response',\n success,\n selector: payload.selector\n },\n timestamp: Date.now()\n });\n }\n\n /**\n * 处理通过选择器悬停元素\n */\n private handleHoverElementBySelector(payload: any): void {\n if (!this.elementSelector || !payload?.selector) return;\n\n const success = this.elementSelector.hoverElementBySelector(payload.selector);\n\n this.sendMessage({\n type: 'ELEMENT_EVENT',\n payload: {\n type: 'hovered_by_selector_response',\n success,\n selector: payload.selector\n },\n timestamp: Date.now()\n });\n }\n\n /**\n * 处理取消悬停元素\n */\n private handleUnhoverElement(): void {\n if (!this.elementSelector) return;\n\n this.elementSelector.unhoverElement();\n\n this.sendMessage({\n type: 'ELEMENT_EVENT',\n payload: {\n type: 'unhovered_response',\n success: true\n },\n timestamp: Date.now()\n });\n }\n\n /** ----------------- 统一消息发送管理方法 ----------------- */\n\n /**\n * 获取统一的消息发送器实例\n */\n public getMessageSender(): MessageSender {\n return this.messageSender;\n }\n\n /**\n * 创建新的发送函数(用于注入到其他模块)\n */\n public createSendFunction(): (message: any) => void {\n return this.messageSender.createSendFunction();\n }\n\n /**\n * 更新消息发送器配置\n */\n public updateMessageSenderOptions(options: {\n addTimestamp?: boolean;\n enableDebugLog?: boolean;\n allowedOrigins?: string[];\n }): void {\n this.messageSender.updateOptions(options);\n }\n\n /**\n * 直接发送消息(使用统一的消息发送器)\n */\n public sendUnifiedMessage(message: any): boolean {\n return this.messageSender.send(message);\n }\n\n /**\n * 销毁消息桥接器\n */\n public destroy(): void {\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n this.messageListener = undefined;\n }\n console.log('[MessageBridge] 消息桥接器已销毁');\n }\n}\n\n","/**\n * 统一错误处理器 - 核心模块\n * 整合了错误追踪、用户交互、元素选择等所有功能\n */\nimport type { \n ErrorPayload, \n UserInteraction, \n ViewInfo, \n ErrorStats,\n SelectorState\n} from '../types';\nimport { ERROR_CONFIG, GLOBAL_CONFIG } from '../types';\n\n// 功能模块导入\nimport { DeepSerializer } from '../utils/DeepSerializer';\nimport { ViteHMRDetector } from '../utils/ViteHMRDetector';\nimport { HardRefreshManager } from '../utils/HardRefreshManager';\nimport { ViewDetector } from '../utils/ViewDetector';\nimport { ComponentTreeGenerator } from '../utils/ComponentTreeGenerator';\nimport { MessageSender, createDefaultMessageSender } from '../utils/MessageSender';\n\n// 新的功能模块导入\nimport { ErrorTracking } from '../features/ErrorTracking';\nimport { InteractionTracking } from '../features/InteractionTracking';\nimport { ElementSelector } from '../features/ElementSelector';\nimport { MessageBridge } from '../features/MessageBridge';\n\n// 获取原始控制台方法的引用\nconst getOriginalConsole = () => (window as any).__originalConsole || {\n log: console.log.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n info: console.info.bind(console),\n debug: console.debug.bind(console)\n};\n\n/**\n * 统一错误处理器主类\n * 提供完整的错误处理、交互追踪、元素选择等功能\n */\nexport class ErrorHandler {\n // 核心状态\n private initialized = false;\n private errorHistory: ErrorPayload[] = [];\n \n // 统一消息发送器\n private messageSender: MessageSender;\n \n // 功能模块\n private errorTracking: ErrorTracking;\n private interactionTracking: InteractionTracking;\n private elementSelector: ElementSelector;\n private messageBridge: MessageBridge;\n \n // 工具模块\n private viteHMRDetector: ViteHMRDetector | null = null;\n private hardRefreshManager: HardRefreshManager;\n private viewDetector: ViewDetector;\n private componentTreeGenerator: ComponentTreeGenerator;\n \n // 配置\n private config = {\n maxErrorHistory: ERROR_CONFIG.MAX_ERRORS,\n maxInteractionHistory: ERROR_CONFIG.MAX_INTERACTIONS,\n enableViteHMR: true,\n enableElementSelector: true,\n enableInteractionTracking: true\n };\n\n constructor(options: Partial<typeof this.config> = {}) {\n this.config = { ...this.config, ...options };\n \n console.log('[ErrorHandler] 开始初始化统一错误处理器...');\n \n // 初始化统一消息发送器\n this.messageSender = createDefaultMessageSender({\n addTimestamp: true,\n enableDebugLog: false\n });\n \n // 创建发送函数\n const sendMessage = this.messageSender.createSendFunction();\n \n // 初始化功能模块\n this.errorTracking = new ErrorTracking(sendMessage);\n this.interactionTracking = new InteractionTracking(sendMessage);\n this.elementSelector = new ElementSelector(sendMessage);\n this.messageBridge = new MessageBridge();\n \n // 初始化工具模块\n this.viewDetector = new ViewDetector();\n this.hardRefreshManager = new HardRefreshManager(GLOBAL_CONFIG.ALLOWED_ORIGINS);\n this.componentTreeGenerator = new ComponentTreeGenerator();\n \n // 仅在 Vite 环境中初始化 HMR 检测器\n if (this.config.enableViteHMR && ViteHMRDetector.isViteEnvironment()) {\n this.viteHMRDetector = new ViteHMRDetector(sendMessage);\n console.log('[ErrorHandler] Vite HMR 检测器已初始化');\n }\n \n console.log('[ErrorHandler] 模块初始化完成');\n }\n\n /** ----------------- 主要初始化方法 ----------------- */\n\n /**\n * 初始化错误处理器\n */\n public init(): void {\n if (this.initialized) {\n console.warn('[ErrorHandler] 已经初始化,跳过重复初始化');\n return;\n }\n\n try {\n console.log('[ErrorHandler] 开始初始化各个模块...');\n\n // 初始化核心功能\n this.initializeCore();\n \n // 设置模块间的协作\n this.setupModuleIntegration();\n \n // 启用功能模块\n this.enableFeatures();\n \n this.initialized = true;\n console.log('[ErrorHandler] 初始化完成');\n \n // 发送初始化完成消息\n // this.sendInitializationComplete();\n \n } catch (error) {\n console.error('[ErrorHandler] 初始化失败:', error);\n throw error;\n }\n }\n\n /**\n * 初始化核心功能\n */\n private initializeCore(): void {\n // 初始化全局状态\n this.initializeGlobalState();\n \n // 设置调试端点\n this.setupDebugEndpoint();\n \n // 启用错误追踪\n this.errorTracking.initialize();\n \n console.log('[ErrorHandler] 核心功能初始化完成');\n }\n\n /**\n * 初始化全局状态\n */\n private initializeGlobalState(): void {\n if (!window.__AUTO_ENGINEER_ERRORS__) {\n window.__AUTO_ENGINEER_ERRORS__ = [];\n }\n\n if (!window.__AUTO_ENGINEER_INTERACTION_TRAIL__) {\n window.__AUTO_ENGINEER_INTERACTION_TRAIL__ = [];\n }\n\n console.log('[ErrorHandler] 全局状态初始化完成');\n }\n\n /**\n * 设置调试端点\n */\n private setupDebugEndpoint(): void {\n if (window.location.pathname === '/__debug/errors') {\n const errorData = {\n errors: window.__AUTO_ENGINEER_ERRORS__ || [],\n interactions: window.__AUTO_ENGINEER_INTERACTION_TRAIL__ || [],\n timestamp: Date.now()\n };\n \n document.body.innerHTML = `<pre>${JSON.stringify(errorData, null, 2)}</pre>`;\n return;\n }\n }\n\n /**\n * 设置模块间的协作\n */\n private setupModuleIntegration(): void {\n // 设置消息桥接器的依赖\n this.messageBridge.setElementSelector(this.elementSelector);\n this.messageBridge.setComponentTreeGenerator(this.componentTreeGenerator);\n \n // 设置错误追踪的依赖\n this.errorTracking.setViewDetector(this.viewDetector);\n this.errorTracking.setInteractionTracking(this.interactionTracking);\n \n console.log('[ErrorHandler] 模块集成设置完成');\n }\n\n /**\n * 启用功能模块\n */\n private enableFeatures(): void {\n console.log('[ErrorHandler] 启用功能模块...');\n\n // 启用交互追踪\n if (this.config.enableInteractionTracking) {\n this.interactionTracking.startTracking();\n console.log('[ErrorHandler] 交互追踪已启用');\n }\n\n // 启用 Vite HMR 检测器\n if (this.viteHMRDetector) {\n this.viteHMRDetector.initialize();\n console.log('[ErrorHandler] Vite HMR 检测器已启用');\n }\n\n // 处理硬刷新相关逻辑\n this.handleHardRefreshLogic();\n\n // 设置视图检测\n this.setupViewDetection();\n\n console.log('[ErrorHandler] 功能模块启用完成');\n }\n\n /**\n * 处理硬刷新逻辑\n */\n private handleHardRefreshLogic(): void {\n // 清理 URL 中的硬刷新参数\n HardRefreshManager.cleanupRefreshParams();\n\n // 检查是否是硬刷新\n const refreshStats = HardRefreshManager.getRefreshStats();\n if (refreshStats.isHardRefresh) {\n console.log('[ErrorHandler] 检测到硬刷新:', refreshStats);\n \n // 发送硬刷新统计信息\n this.messageSender.send({\n type: 'SYSTEM_EVENT',\n payload: {\n type: 'hard_refresh',\n ...refreshStats\n },\n timestamp: Date.now()\n });\n }\n }\n\n /**\n * 设置视图检测\n */\n private setupViewDetection(): void {\n // 初始视图检测\n const initialView = this.viewDetector.getCurrentViewInfo();\n // console.log('[ErrorHandler] 当前视图:', initialView);\n\n // 只记录初始视图信息,不发送消息\n // 视图信息会在错误发生时一起发送\n\n // 监听视图变化\n let lastViewTitle = initialView.title;\n const checkViewChange = () => {\n const currentView = this.viewDetector.getCurrentViewInfo();\n if (currentView.title !== lastViewTitle) {\n lastViewTitle = currentView.title;\n console.log('[ErrorHandler] 视图变化:', currentView);\n \n // 只记录视图变化,不立即发送消息\n // 视图信息会在错误发生时通过 ErrorTracking 模块一起发送\n }\n };\n\n // 定期检查视图变化\n setInterval(checkViewChange, 1000);\n }\n \n /**\n * 发送初始化完成消息\n */\n // private sendInitializationComplete(): void {\n // this.messageSender.send({\n // type: 'ERROR_EVENT',\n // payload: {\n // type: 'initialization',\n // version: '2.0.0',\n // features: {\n // errorTracking: true,\n // interactionTracking: this.config.enableInteractionTracking,\n // elementSelector: this.config.enableElementSelector,\n // viteHMR: !!this.viteHMRDetector,\n // hardRefresh: true,\n // viewDetection: true\n // }\n // },\n // timestamp: Date.now()\n // });\n // }\n\n /** ----------------- 公共接口方法 ----------------- */\n\n /**\n * 获取错误统计\n */\n public getErrorStats(): ErrorStats {\n return this.errorTracking.getErrorStats();\n }\n\n /**\n * 获取选择器状态\n */\n public getSelectorState(): SelectorState {\n return this.elementSelector.getSelectorState();\n }\n\n /**\n * 获取交互历史\n */\n public getInteractionHistory(): UserInteraction[] {\n return this.interactionTracking.getInteractionHistory();\n }\n\n /**\n * 获取当前视图信息\n */\n public getCurrentView(): ViewInfo {\n return this.viewDetector.getCurrentViewInfo();\n }\n\n /**\n * 执行硬刷新\n */\n public async performHardRefresh(options?: any) {\n return await this.hardRefreshManager.performHardRefresh(options);\n }\n\n /**\n * 获取深度序列化的错误历史\n */\n public getSerializedErrorHistory() {\n return DeepSerializer.serialize(this.errorHistory, {\n maxDepth: 3,\n maxArrayLength: 50\n });\n }\n\n /**\n * 检查是否在 Vite 环境中\n */\n public isViteEnvironment(): boolean {\n return ViteHMRDetector.isViteEnvironment();\n }\n\n /**\n * 启用元素选择器\n */\n public enableElementSelector(): void {\n this.elementSelector.enableSelector();\n }\n\n /**\n * 禁用元素选择器\n */\n public disableElementSelector(): void {\n this.elementSelector.disableSelector();\n }\n\n /**\n * 切换元素选择器状态\n */\n public toggleElementSelector(): void {\n this.elementSelector.toggleSelector();\n }\n\n /**\n * 更新配置\n */\n public updateConfig(newConfig: Partial<typeof this.config>): void {\n this.config = { ...this.config, ...newConfig };\n console.log('[ErrorHandler] 配置已更新:', this.config);\n }\n\n /**\n * 销毁错误处理器\n */\n public destroy(): void {\n try {\n // 销毁功能模块\n this.errorTracking.destroy();\n this.interactionTracking.destroy();\n this.elementSelector.destroy();\n this.messageBridge.destroy();\n \n // 销毁工具模块\n if (this.viteHMRDetector) {\n this.viteHMRDetector.destroy();\n this.viteHMRDetector = null;\n }\n \n if (this.viewDetector) {\n this.viewDetector.clearCache();\n }\n \n this.initialized = false;\n console.log('[ErrorHandler] 已销毁');\n } catch (error) {\n // 避免递归调用,使用原始控制台\n const originalConsole = getOriginalConsole();\n originalConsole.error('[ErrorHandler] 销毁时发生错误:', error);\n }\n }\n\n /**\n * 检查是否已初始化\n */\n public isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * 报告当前状态\n */\n public reportStatus(): void {\n try {\n const status = {\n initialized: this.initialized,\n errorStats: this.getErrorStats(),\n currentView: this.getCurrentView(),\n interactionHistory: this.getInteractionHistory(),\n selectorState: this.getSelectorState(),\n isViteEnvironment: this.isViteEnvironment(),\n timestamp: Date.now()\n };\n\n // 发送状态报告到父窗口\n this.messageSender.send({\n type: 'SYSTEM_EVENT',\n payload: {\n type: 'status_report',\n ...status\n },\n timestamp: Date.now()\n });\n\n // console.log('[ErrorHandler] 状态报告已发送:', status);\n } catch (error) {\n const originalConsole = getOriginalConsole();\n originalConsole.error('[ErrorHandler] 发送状态报告时发生错误:', error);\n }\n }\n}\n","/**\n * 简化版错误处理器\n * 提供基础的错误捕获和上报功能,适用于轻量级场景\n */\nimport { createSimpleSendFunction } from './utils/MessageSender';\nimport type { ErrorPayload } from './types';\n\n/**\n * 简化版错误处理器\n * 去除所有复杂功能,只保留最基本的错误收集和发送\n */\nexport class SimpleErrorHandler {\n private initialized = false;\n private sendMessage!: (message: any) => void; // 使用明确赋值断言,因为在 init() 方法中会初始化\n\n /**\n * 初始化错误处理器\n */\n init(): void {\n if (this.initialized) return;\n\n // 初始化统一的消息发送器\n this.sendMessage = createSimpleSendFunction({\n addTimestamp: false, // 简化版自己处理时间戳\n enableDebugLog: false\n });\n\n // 设置全局错误监听\n this.setupErrorListeners();\n \n // 设置兼容性函数\n this.setupCompatibility();\n \n this.initialized = true;\n console.log('[简化错误处理] 初始化完成');\n }\n\n /**\n * 设置错误监听器\n */\n private setupErrorListeners(): void {\n // 运行时错误\n window.addEventListener('error', (event) => {\n this.sendError(event.error || new Error(event.message), {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n type: 'runtime'\n });\n });\n\n // Promise 拒绝\n window.addEventListener('unhandledrejection', (event) => {\n const error = event.reason instanceof Error ? event.reason : new Error(String(event.reason));\n this.sendError(error, { type: 'promise' });\n });\n }\n\n /**\n * 设置兼容性函数\n */\n private setupCompatibility(): void {\n (window as any).__SEND_ERROR_TO_PARENT__ = (error: any, details: any) => {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n this.sendError(errorObj, details);\n };\n }\n\n /**\n * 发送错误到父窗口\n */\n private sendError(error: Error, details: any = {}): void {\n const payload: ErrorPayload = {\n message: error.message,\n stack: error.stack,\n filename: details.filename || details.file,\n lineno: details.lineno || details.line,\n colno: details.colno || details.column,\n timestamp: Date.now(),\n type: details.type || 'unknown',\n severity: 'medium', // 简化版使用默认严重性级别\n details\n };\n\n // 使用统一的消息发送器发送到父窗口\n try {\n this.sendMessage({\n type: 'ERROR_EVENT',\n payload: payload,\n timestamp: Date.now()\n });\n } catch (e) {\n // 避免递归调用,使用原始控制台\n const originalConsole = (window as any).__originalConsole;\n if (originalConsole?.error) {\n originalConsole.error('[简化错误处理] 发送失败:', e);\n }\n }\n }\n\n /**\n * 手动捕获错误\n */\n captureError(error: Error, details?: any): void {\n this.sendError(error, details);\n }\n}\n\n/**\n * 全局实例\n */\nlet globalHandler: SimpleErrorHandler | null = null;\n\n/**\n * 初始化函数\n */\nexport function initSimpleErrorHandler(): SimpleErrorHandler {\n if (!globalHandler) {\n globalHandler = new SimpleErrorHandler();\n globalHandler.init();\n }\n return globalHandler;\n}\n\n/**\n * 兼容性别名\n */\nexport const injectEarlyErrorHandler = initSimpleErrorHandler;","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'\n// export { injectEarlyErrorHandler } from './utils/errorHandler'\nexport { \n ErrorHandler,\n SimpleErrorHandler,\n ERROR_CONFIG,\n GLOBAL_CONFIG,\n DEFAULT_SELECTOR_CONFIG\n} from './utils/unified-error-handler'\n\n// 导出错误处理相关类型\nexport type {\n ErrorSeverity,\n ErrorType,\n ErrorPayload,\n SimpleErrorConfig,\n EnhancedErrorConfig,\n UserInteraction,\n ViewInfo,\n SelectorState,\n ErrorStats,\n MessageType\n} from './utils/unified-error-handler'\nexport { getAuthRoot, setAuthRoot } from './config'\nexport { getDefaultProjectId, setDefaultProjectId } from './config'\n\n\n"],"mappings":"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","names":["getToken","setToken","config","useState","useEffect","Icon","jsx","jsxs","email","code","createContext","useContext","useState","useEffect","useEffect","useState","jsx","theme","jsx","jsx","jsxs","createContext","useState","useEffect","useContext","jsx","jsxs","jsx","jsxs","React","Icon","jsx","jsxs","React","Icon","jsx","jsxs","React","Icon","React","useState","useEffect","getOriginalConsole","getOriginalConsole"]}
|