@howone/sdk 0.3.2 → 0.3.3
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.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/auth/index.ts","../src/index.ts","../src/components/FloatingButton.tsx","../src/services/unified-oauth.ts","../src/components/auth/LoginForm.tsx","../src/components/auth/HowoneProvider.tsx","../src/components/theme/ThemeProvider.tsx","../src/components/ui/Toast/GlobalToastContainer.tsx","../src/components/ElementSelectorProvider.tsx","../src/components/ElementSelector.tsx","../src/hooks/use-element-selector.ts","../src/components/index.ts","../src/howone/client.ts","../src/components/ui/Loading.tsx","../src/components/ui/ErrorBoundary.tsx","../src/components/ui/ClayxButton.tsx","../src/components/ui/LimitUpgradeToast.tsx","../src/components/ui/Toast/ClayxToast.tsx","../src/components/theme/ThemeToggle.tsx","../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/sse-executor.ts","../src/services/sse-client.ts","../src/services/index.ts","../src/utils/urlSanitizer.ts","../src/services/workflow-stream.ts","../src/services/workflow-executor.ts","../src/hooks/use-mobile.ts","../src/hooks/use-debounce.ts","../src/hooks/use-workflow-stream.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/utils/SelectorUtils.ts","../src/utils/unified-error-handler/features/InteractionTracking.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/utils/iframe-navigation.ts"],"sourcesContent":["// Central auth configuration for howone-client\n// Default AUTH_ROOT can be overridden at runtime by calling setAuthRoot\nlet DEFAULT_PROJECT_ID: string | null = null\n\nexport type Environment = 'local' | 'dev' | 'prod'\n\nlet env: Environment = 'dev'\n\n\n\nexport type envs = {\n AUTH_ROOT_VALUE: string\n baseUrl: string\n aiBaseUrl: string\n}\n\nconst localEnv: envs = {\n AUTH_ROOT_VALUE: 'https://howone.dev',\n baseUrl: 'http://localhost:3002/api',\n aiBaseUrl: 'https://evoagentx-server.fly.dev',\n}\n\n// dev\nconst devEnv: envs = {\n AUTH_ROOT_VALUE: 'https://howone.dev',\n baseUrl: 'https://api.howone.dev/api',\n aiBaseUrl: 'https://evoagentx-server-stable.fly.dev',\n}\n\n// prod\nconst prodEnv: envs = {\n AUTH_ROOT_VALUE: 'https://howone.ai',\n baseUrl: 'https://api.howone.ai/api',\n aiBaseUrl: 'https://evoagentx-server-deploy.fly.dev',\n}\n\nconst envs = {\n local: localEnv,\n dev: devEnv,\n prod: prodEnv,\n}\n\nexport function setEnvironment(e: Environment) {\n env = e\n return envs[env] || envs['dev']\n}\n\nexport function getEnvironment() {\n return env\n}\n\nexport function getEnvs() {\n return envs[env] || envs['dev']\n}\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\n// Helper: Get environment from global variable (set by AI during code generation)\nexport function getGlobalEnvironment(): Environment | null {\n try {\n const g = (globalThis as any).__HOWONE_ENV__\n if (g === 'local' || g === 'dev' || g === 'prod') return g\n return 'prod'\n } catch {\n return 'prod'\n }\n}\n\n","// 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","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 { getDefaultProjectId, setDefaultProjectId } from './config'\n\n// Export iframe navigation utilities\nexport { iframeNavigation, elementSelector, initIframeNavigation } from './utils/iframe-navigation'\n\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 = 'Built with 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 */\nimport { getGlobalEnvironment } from \"../config\";\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\nconst API_BASE_URLS = {\n local: \"https://api.howone.dev\",\n dev: \"https://api.howone.dev\",\n prod: \"https://api.howone.ai\",\n} as const;\n\nconst detectEnvironmentFromHostname = (): \"local\" | \"dev\" | \"prod\" => {\n try {\n const hostname = window.location.hostname.toLowerCase();\n\n if (hostname.includes(\"howone.ai\")) {\n return \"prod\";\n }\n\n if (hostname.includes(\"howone.dev\")) {\n return \"dev\";\n }\n\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname.startsWith(\"192.168.\") || hostname.endsWith(\".local\")) {\n return \"local\";\n }\n\n const globalEnv = getGlobalEnvironment();\n if (globalEnv) {\n return globalEnv;\n }\n\n return \"prod\";\n } catch (error) {\n return getGlobalEnvironment() ?? \"dev\";\n }\n};\n\nconst resolveApiBaseUrl = () => {\n const env = detectEnvironmentFromHostname();\n return API_BASE_URLS[env] ?? API_BASE_URLS.dev;\n};\n\nclass UnifiedAuthService {\n private readonly API_BASE_URL = resolveApiBaseUrl();\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 console.log(\"Using API_BASE_URL:\", this.API_BASE_URL);\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 // 动态获取当前环境的 validOrigins\n const validOrigins = [\n window.location.origin,\n this.API_BASE_URL, // 使用当前环境的 API_BASE_URL\n \"https://api.howone.dev\",\n \"https://api.howone.ai\",\n ];\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 event.origin.includes(\"howone.dev\") ||\n event.origin.includes(\"howone.ai\")\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\") || urlParams.get('project_id');\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","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 }\n\n const githubLogin = async () => {\n // TODO: 实现GitHub登录\n }\n\n const sendEmailCode = async (email: string) => {\n // TODO: 实现发送验证码\n setCodeSent(true)\n }\n\n const loginWithEmail = async (email: string, code: string) => {\n // TODO: 实现邮箱登录\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, useMemo } from 'react'\nimport { getToken, parseUserFromToken, setToken } from '../../auth'\nimport { FloatingButton } from '../FloatingButton'\nimport { ThemeProvider } from '../theme/ThemeProvider'\nimport { GlobalToastContainer } from '../ui/Toast/GlobalToastContainer'\nimport { ElementSelectorProvider } from '../ElementSelectorProvider'\nimport { getGlobalEnvironment } from '../../config'\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\nlet redirectOverlayStylesInjected = false\nconst injectRedirectOverlayStyles = () => {\n if (redirectOverlayStylesInjected || typeof document === 'undefined') return\n const style = document.createElement('style')\n style.setAttribute('data-howone-auth-overlay', 'true')\n style.textContent = `\n@keyframes howone-logo-pulse {\n 0%, 100% {\n opacity: 0.2;\n transform: scale(0.95);\n filter: drop-shadow(0 0 0 rgba(255, 255, 255, 0.2));\n }\n 50% {\n opacity: 1;\n transform: scale(1.03);\n filter: drop-shadow(0 0 28px rgba(255, 255, 255, 0.55));\n }\n}\n\n@keyframes howone-glow-ring {\n 0%, 100% {\n opacity: 0.12;\n transform: scale(0.85);\n }\n 50% {\n opacity: 0.42;\n transform: scale(1.05);\n }\n}\n `\n document.head.appendChild(style)\n redirectOverlayStylesInjected = true\n}\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 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 * 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 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 const [pendingRedirect, setPendingRedirect] = useState(false)\n // Auto-capture token from URL on mount\n useEffect(() => {\n\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\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 } 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 const resolvedAuthUrl = useMemo(() => {\n const env = getGlobalEnvironment() ?? 'dev'\n switch (env) {\n case 'local':\n return 'http://localhost:3000/auth'\n case 'prod':\n return 'https://howone.ai/auth'\n case 'dev':\n default:\n return 'https://howone.dev/auth'\n }\n }, [])\n\n useEffect(() => {\n if (pendingRedirect) {\n injectRedirectOverlayStyles()\n }\n }, [pendingRedirect])\n\n useEffect(() => {\n if (pendingRedirect) {\n injectRedirectOverlayStyles()\n }\n }, [pendingRedirect])\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\n // Build auth URL with redirect_uri and project_id parameters\n try {\n const authUrlObj = new URL(resolvedAuthUrl)\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 setPendingRedirect(true)\n requestAnimationFrame(() => {\n window.location.href = authUrlObj.toString()\n })\n } catch (error) {\n // Fallback to simple redirect if URL construction fails\n console.error('[HowOneProvider] Failed to build auth URL:', error)\n setPendingRedirect(true)\n requestAnimationFrame(() => {\n window.location.href = resolvedAuthUrl\n })\n }\n }\n }\n }, [token, user, redirectOnUnauthenticated, resolvedAuthUrl, 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: hasCheckedUrlToken && !!token,\n logout\n }\n\n return (\n <ThemeProvider\n defaultTheme={defaultTheme}\n storageKey={themeStorageKey}\n forceDefault={forceDefaultTheme}\n >\n <ElementSelectorProvider>\n <HowoneContext.Provider value={value}>\n {children}\n {showFloatingButton && (\n <FloatingButton onClick={() => window.open('https://howone.ai', '_blank')} />\n )}\n\n {pendingRedirect && (\n <div className=\"fixed inset-0 z-[10000] h-full w-full flex flex-col items-center justify-center bg-black/65 backdrop-blur-sm text-white\">\n <div className=\"relative mt-6 flex h-[220px] w-[220px] items-center justify-center\">\n <div\n className=\"absolute inset-0 rounded-full bg-white/20\"\n style={{ animation: 'howone-glow-ring 2.4s ease-in-out infinite' }}\n />\n <div className=\"absolute inset-0 rounded-full bg-gradient-to-br from-white/10 via-white/25 to-white/10 blur-2xl\" />\n <img\n style={{ width: 250, animation: 'howone-logo-pulse 2s ease-in-out infinite' }}\n src=\"https://sxwxqoixnnklnpeutjrj.supabase.co/storage/v1/object/public/create-x/logo/logo.svg\"\n alt=\"HowOne\"\n />\n </div>\n </div>\n )}\n </HowoneContext.Provider>\n </ElementSelectorProvider>\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","import React, { useEffect, useState, useCallback } from 'react'\nimport { ElementSelector, ElementSelectionData } from './ElementSelector'\nimport { sendElementSelectionToParent } from '../hooks/use-element-selector'\n\ninterface ElementSelectorProviderProps {\n children: React.ReactNode\n}\n\n/**\n * 元素选择器提供者组件\n * 监听来自 iframe.js 的自定义事件,自动显示/隐藏元素选择器\n */\nexport const ElementSelectorProvider: React.FC<ElementSelectorProviderProps> = ({ children }) => {\n const [isSelecting, setIsSelecting] = useState(false)\n\n const handleCancel = useCallback(() => {\n setIsSelecting(false)\n\n // 发送取消消息给父窗口\n if (window.parent && window.parent !== window) {\n window.parent.postMessage({\n type: 'ELEMENT_SELECTION_CANCELLED'\n }, '*')\n }\n }, [])\n\n const handleSelect = useCallback((data: ElementSelectionData) => {\n // 发送给父窗口\n sendElementSelectionToParent(data)\n }, [])\n\n useEffect(() => {\n // 监听来自 iframe.js 的自定义事件\n const handleStartSelection = () => {\n setIsSelecting(true)\n }\n\n // 监听取消选择事件\n const handleCancelSelection = () => {\n handleCancel()\n }\n\n window.addEventListener('howone:start-element-selection', handleStartSelection)\n window.addEventListener('howone:cancel-element-selection', handleCancelSelection)\n\n // 也监听 postMessage(备用)\n const handleMessage = (event: MessageEvent) => {\n if (event.data.type === 'START_ELEMENT_SELECTION') {\n setIsSelecting(true)\n } else if (event.data.type === 'CANCEL_ELEMENT_SELECTION') {\n handleCancel()\n }\n }\n\n window.addEventListener('message', handleMessage)\n\n return () => {\n window.removeEventListener('howone:start-element-selection', handleStartSelection)\n window.removeEventListener('howone:cancel-element-selection', handleCancelSelection)\n window.removeEventListener('message', handleMessage)\n }\n }, [handleCancel])\n\n return (\n <>\n {children}\n <ElementSelector\n active={isSelecting}\n onSelect={handleSelect}\n onCancel={handleCancel}\n />\n </>\n )\n}\n\n","import React, { useEffect, useState, useCallback, useRef } from 'react'\n\nexport interface SourceLocation {\n file: string\n line: number\n component: string\n}\n\nexport interface ElementSelectionData {\n sourceLocation: SourceLocation | null\n element: {\n tagName: string\n className: string\n id: string\n text: string\n }\n rect: {\n top: number\n left: number\n width: number\n height: number\n }\n}\n\ninterface ElementSelectorProps {\n active: boolean\n onSelect?: (data: ElementSelectionData) => void\n onCancel?: () => void\n}\n\nexport const ElementSelector: React.FC<ElementSelectorProps> = ({\n active,\n onSelect,\n onCancel\n}) => {\n const [hoveredElement, setHoveredElement] = useState<HTMLElement | null>(null)\n const [highlightRect, setHighlightRect] = useState<DOMRect | null>(null)\n const overlayRef = useRef<HTMLDivElement>(null)\n\n const getSourceLocation = useCallback((element: HTMLElement): SourceLocation | null => {\n let current: HTMLElement | null = element\n\n while (current && current !== document.body) {\n const sourceLocationAttr = current.getAttribute('data-source-location')\n if (sourceLocationAttr) {\n try {\n return JSON.parse(sourceLocationAttr.replace(/"/g, '\"'))\n } catch (e) {\n console.error('Failed to parse source location:', e)\n }\n }\n current = current.parentElement\n }\n\n return null\n }, [])\n\n const handleMouseMove = useCallback((e: MouseEvent) => {\n if (!active) return\n\n const elements = document.elementsFromPoint(e.clientX, e.clientY)\n const targetElement = elements.find(el =>\n el !== overlayRef.current &&\n !overlayRef.current?.contains(el) &&\n el !== document.body &&\n el !== document.documentElement\n ) as HTMLElement | undefined\n\n if (targetElement && targetElement !== hoveredElement) {\n setHoveredElement(targetElement)\n const rect = targetElement.getBoundingClientRect()\n setHighlightRect(rect)\n }\n }, [active, hoveredElement])\n\n const handleClick = useCallback((e: MouseEvent) => {\n if (!active || !hoveredElement) return\n\n e.preventDefault()\n e.stopPropagation()\n\n const sourceLocation = getSourceLocation(hoveredElement)\n const rect = hoveredElement.getBoundingClientRect()\n\n const elementData = {\n sourceLocation,\n element: {\n tagName: hoveredElement.tagName,\n className: hoveredElement.className,\n id: hoveredElement.id,\n text: hoveredElement.textContent?.substring(0, 100) || ''\n },\n rect: {\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height\n }\n }\n\n if (onSelect) {\n onSelect(elementData)\n // 选中元素后自动关闭选择模式\n if (onCancel) {\n onCancel()\n }\n }\n }, [active, hoveredElement, getSourceLocation, onSelect, onCancel])\n\n useEffect(() => {\n if (active) {\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('click', handleClick, true)\n document.body.style.overflow = 'hidden'\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('click', handleClick, true)\n document.body.style.overflow = ''\n }\n } else {\n setHoveredElement(null)\n setHighlightRect(null)\n }\n }, [active, handleMouseMove, handleClick])\n\n if (!active) return null\n\n return (\n <>\n <div\n ref={overlayRef}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.3)',\n zIndex: 999998,\n cursor: 'crosshair',\n pointerEvents: 'none'\n }}\n />\n\n {highlightRect && (\n <div\n style={{\n position: 'fixed',\n top: highlightRect.top,\n left: highlightRect.left,\n width: highlightRect.width,\n height: highlightRect.height,\n border: '2px dashed #36D2A6',\n borderRadius: '5px',\n backgroundColor: 'rgba(54, 210, 166, 0.1)',\n zIndex: 999999,\n pointerEvents: 'none',\n transition: 'all 0.1s ease'\n }}\n />\n )}\n\n {hoveredElement && highlightRect && (\n <div\n style={{\n position: 'fixed',\n top: highlightRect.top - 30,\n left: highlightRect.left,\n backgroundColor: '#36D2A6',\n color: 'white',\n padding: '4px 8px',\n borderRadius: '4px',\n fontSize: '12px',\n zIndex: 1000000,\n pointerEvents: 'none',\n whiteSpace: 'nowrap'\n }}\n >\n {(() => {\n const location = getSourceLocation(hoveredElement)\n return location\n ? `${location.component} (${location.file}:${location.line})`\n : hoveredElement.tagName.toLowerCase()\n })()}\n </div>\n )}\n </>\n )\n}\n\n","import { useState, useCallback } from 'react'\nimport type { ElementSelectionData } from '../components/ElementSelector'\n\nexport interface UseElementSelectorReturn {\n isSelecting: boolean\n selectedElement: ElementSelectionData | null\n startSelecting: () => void\n stopSelecting: () => void\n clearSelection: () => void\n}\n\n/**\n * 元素选择器 Hook\n * 用于管理元素选择状态和向父窗口发送消息\n */\nexport function useElementSelector(): UseElementSelectorReturn {\n const [isSelecting, setIsSelecting] = useState(false)\n const [selectedElement, setSelectedElement] = useState<ElementSelectionData | null>(null)\n\n const startSelecting = useCallback(() => {\n setIsSelecting(true)\n }, [])\n\n const stopSelecting = useCallback(() => {\n setIsSelecting(false)\n }, [])\n\n const clearSelection = useCallback(() => {\n setSelectedElement(null)\n }, [])\n\n return {\n isSelecting,\n selectedElement,\n startSelecting,\n stopSelecting,\n clearSelection\n }\n}\n\n/**\n * 向父窗口发送元素选择数据\n */\nexport function sendElementSelectionToParent(data: ElementSelectionData) {\n if (window.parent && window.parent !== window) {\n window.parent.postMessage({\n type: 'ELEMENT_SELECTED',\n payload: data\n }, '*')\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'\nexport { ClayxButton } from './ui/ClayxButton'\nexport { showLimitUpgradeToast } from './ui/LimitUpgradeToast'\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\n// Element Selector Components\nexport { ElementSelector } from './ElementSelector'\nexport { ElementSelectorProvider } from './ElementSelectorProvider'\nexport type { SourceLocation, ElementSelectionData } from './ElementSelector'\n","import { getToken, setToken, parseUserFromToken } from '../auth'\nimport { getEnvs } 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 = getEnvs().AUTH_ROOT_VALUE\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","import React from \"react\";\n\ntype ButtonSize = \"sm\" | \"md\" | \"lg\";\ntype ButtonVariant = \"solid\" | \"ghost\" | \"flat\";\n\ninterface ClayxButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n isIconOnly?: boolean;\n size?: ButtonSize;\n variant?: ButtonVariant;\n children?: React.ReactNode;\n}\n\nconst getSizeClasses = (size: ButtonSize, isIconOnly: boolean): string => {\n if (isIconOnly) {\n switch (size) {\n case \"sm\":\n return \"h-8 w-8 min-w-8 p-0\";\n case \"md\":\n return \"h-10 w-10 min-w-10 p-0\";\n case \"lg\":\n return \"h-12 w-12 min-w-12 p-0\";\n default:\n return \"h-10 w-10 min-w-10 p-0\";\n }\n }\n\n switch (size) {\n case \"sm\":\n return \"h-8 px-3 text-sm\";\n case \"md\":\n return \"h-10 px-4 text-base\";\n case \"lg\":\n return \"h-12 px-6 text-lg\";\n default:\n return \"h-10 px-4 text-base\";\n }\n};\n\nconst getVariantClasses = (variant: ButtonVariant): string => {\n switch (variant) {\n case \"solid\":\n return \"bg-primary text-white hover:bg-primary/90\";\n case \"ghost\":\n return \"bg-transparent hover:bg-white/10\";\n case \"flat\":\n return \"bg-white/5 hover:bg-white/10\";\n default:\n return \"\";\n }\n};\n\nexport const ClayxButton: React.FC<ClayxButtonProps> = ({\n isIconOnly = false,\n size = \"md\",\n variant = \"solid\",\n className = \"\",\n children,\n disabled = false,\n ...props\n}) => {\n const sizeClasses = getSizeClasses(size, isIconOnly);\n const variantClasses = getVariantClasses(variant);\n\n const baseClasses = `\n inline-flex items-center justify-center\n rounded-md font-medium\n transition-all duration-200\n focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-transparent\n disabled:opacity-50 disabled:cursor-not-allowed disabled:pointer-events-none\n `.replace(/\\s+/g, \" \").trim();\n\n const combinedClasses = `${baseClasses} ${sizeClasses} ${variantClasses} ${className}`.trim();\n\n return (\n <button\n className={combinedClasses}\n disabled={disabled}\n {...props}\n >\n {children}\n </button>\n );\n};\n","import React from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { ClayxToast } from \"./Toast/ClayxToast\";\nimport { ClayxButton } from \"./ClayxButton\";\n\nconst LimitToastContainer: React.FC<{\n message: string;\n onUpgrade: () => void;\n closeToast?: () => void;\n}> = ({ message, onUpgrade, closeToast }) => {\n const [hover, setHover] = React.useState(false);\n const [closeHover, setCloseHover] = React.useState(false);\n return (\n <div className=\"relative w-full max-w-[420px] overflow-hidden rounded-md bg-gradient-to-br from-[#1A1A1A] via-[#151515] to-[#1A1A1A] shadow-[0_20px_60px_rgba(168,85,247,0.2)] backdrop-blur-sm\">\n <div\n className=\"absolute left-0 top-0 w-full h-full rounded-md\"\n style={{\n background: '#0f1419',\n zIndex: -2,\n }}\n />\n\n <div\n className=\"absolute left-0 top-0 w-full h-full pointer-events-none rounded-md\"\n style={{\n background: `linear-gradient(135deg, rgba(168,85,247,0.3) 0%, rgba(168,85,247,0.2) 15%, #1A1A1A 30%)`,\n zIndex: -1,\n }}\n />\n\n <div\n className=\"absolute left-0 top-0 w-full h-full pointer-events-none rounded-md\"\n style={{\n border: '2px solid transparent',\n backgroundImage: `linear-gradient(135deg, rgba(168,85,247,0.6) 0%, rgba(168,85,247,0.4) 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=\"absolute -top-16 -right-16 h-32 w-32 rounded-full bg-gradient-to-br from-purple-500/20 via-pink-500/10 to-transparent blur-3xl animate-pulse\" />\n <div className=\"absolute -bottom-16 -left-16 h-32 w-32 rounded-full bg-gradient-to-tr from-blue-500/10 to-transparent blur-2xl animate-pulse\" style={{ animationDelay: '1s' }} />\n\n <div className=\"relative z-10 flex items-start gap-4 p-4\">\n <div className=\"flex flex-1 flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <div className=\"text-lg font-bold text-white\">\n Upgrade Required\n </div>\n <div className=\"px-2 py-0.5 text-xs font-bold bg-purple-500/20 text-purple-400 rounded-md border border-purple-500/30\">\n Premium\n </div>\n </div>\n <ClayxButton\n onClick={closeToast}\n isIconOnly\n size=\"sm\"\n onMouseEnter={() => setCloseHover(true)}\n onMouseLeave={() => setCloseHover(false)}\n style={{\n height: '1.5rem',\n width: '1.5rem',\n minWidth: '1.5rem',\n borderRadius: '9999px',\n backgroundColor: closeHover ? 'rgba(255,255,255,0.1)' : 'rgba(255,255,255,0.05)',\n transition: 'background-color 150ms ease',\n cursor: 'pointer',\n }}\n >\n <Icon icon=\"iconamoon:close\" className=\"w-4 h-4 text-gray-400\" />\n </ClayxButton>\n </div>\n\n <p className=\"text-sm text-gray-300 leading-relaxed\">\n {message}\n </p>\n\n <div className=\"mt-1 flex items-center gap-3\">\n <ClayxButton\n onClick={() => {\n onUpgrade();\n closeToast?.();\n }}\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n style={{\n flex: 1,\n color: '#ffffff',\n fontWeight: 600,\n cursor: 'pointer',\n transition: 'all 300ms ease-in-out',\n backgroundImage: hover\n ? 'linear-gradient(to right, #9333ea, #db2777)'\n : 'linear-gradient(to right, #a855f7, #ec4899)',\n boxShadow: hover\n ? '0 10px 15px -3px rgba(168,85,247,0.3), 0 4px 6px -2px rgba(168,85,247,0.3)'\n : 'none',\n }}\n >\n <span className=\"flex items-center gap-2\">\n <Icon icon=\"solar:rocket-2-bold\" className=\"w-4 h-4\" />\n Upgrade Now\n </span>\n </ClayxButton>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport function showLimitUpgradeToast(message: string, onUpgrade: () => void) {\n ClayxToast.default({\n render: (closeToast) => (\n <LimitToastContainer message={message} onUpgrade={onUpgrade} closeToast={closeToast} />\n ),\n options: {\n position: \"bottom-right\",\n closeOnClick: false,\n autoClose: false,\n hideProgressBar: true,\n draggable: false,\n pauseOnHover: true,\n className: \"!bg-transparent !shadow-none\",\n style: {\n background: \"transparent\",\n padding: 0,\n width: \"auto\",\n maxWidth: \"420px\",\n },\n },\n });\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 const lightBaseBackgroundByType: Record<ToastType, string> = {\n success: '#f0fdf4', // green-50\n error: '#fef2f2', // red-50\n warning: '#fffbeb', // amber-50\n info: '#eff6ff', // blue-50\n default: '#f9fafb', // gray-50\n };\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 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 : lightBaseBackgroundByType[type],\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}20 0%, ${themeConfig.gradientColor}12 15%, #ffffff 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}99 0%, ${themeConfig.borderGradientColor}66 5%, transparent 22%)`,\n backgroundOrigin: 'border-box',\n backgroundClip: 'border-box',\n WebkitMask: 'linear-gradient(#ffffff 0 0) padding-box, linear-gradient(#ffffff 0 0)',\n WebkitMaskComposite: 'xor',\n zIndex: 0\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 ${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 transition: Bounce,\n};\n\nconst getToastifyTheme = (): ToastOptions['theme'] => {\n if (typeof window !== 'undefined') {\n const root = document.documentElement;\n if (root.classList.contains('dark')) return 'dark';\n if (root.classList.contains('light')) return 'light';\n return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n};\n\ninterface ToastParams {\n title?: string;\n message?: string;\n render?: (closeToast: () => void) => React.ReactNode\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\n if (params.render) return params.render(closeToast);\n\n return <ToastContent\n type={type}\n title={title}\n message={message || ''}\n component={component}\n closeToast={closeToast}\n />\n },\n {\n ...defaultToastOptions,\n ...options,\n theme: getToastifyTheme(),\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","\"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}","/**\n * AI Workflow 服务(精简版,仅支持按 ID 的 path 风格执行)\n *\n * 说明:模板仅需要一种执行接口,形如 POST {baseUrl}/workflow/{workflowId}/execute\n */\n\nimport { showLimitUpgradeToast } from \"../components\"\n\nexport interface AIWorkflowResponse {\n success: boolean\n status?: number\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 | null> {\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) as AIWorkflowResponse\n\n if (!res.ok) {\n return { success: false, error: (data as any)?.error || `HTTP ${res.status}` }\n }\n\n\n if (data && data.status && data.status === 4003) {\n showLimitUpgradeToast(\n 'Your credits are exhausted. Please upgrade your plan to continue generating projects.',\n () => window.open('https://clayx.ai/pricing', '_blank')\n )\n return null\n }\n\n return (data) || { 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","/**\n * 统一的 SSE 工作流执行模块\n * \n * 集成所有 SSE 相关功能:\n * - 流式执行 (streaming execution)\n * - 事件处理 (event handling)\n * - 完整数据收集 (complete data collection)\n * - 上下文管理 (context management)\n * \n * 提供统一的 API 给 client 使用\n */\n\n// ============================================================\n// 事件类型定义\n// ============================================================\n\nexport interface SSEEventPayload {\n type: string\n data?: Record<string, unknown>\n [key: string]: unknown\n}\n\nexport interface NodeExecution {\n nodeName: string\n content: string\n timestamp: number\n}\n\nexport interface CostUpdate {\n token: number\n totalToken: number\n cost: number\n totalCost: number\n timestamp: number\n}\n\nexport interface ExecutionResult {\n success: boolean\n finalResult: Record<string, unknown> | null\n nodeExecutions: NodeExecution[]\n costUpdates: CostUpdate[]\n totalDuration: number\n errors: string[]\n}\n\n// ============================================================\n// 回调选项\n// ============================================================\n\nexport interface SSEExecutionOptions {\n onEvent?: (event: SSEEventPayload) => void\n onNodeStart?: (nodeName: string, content: string) => void\n onStreamContent?: (delta: string) => void\n onCostUpdate?: (cost: CostUpdate) => void\n onProgress?: (progress: number) => void\n onLog?: (message: string) => void\n onStreamChunk?: (chunk: string) => void\n onError?: (error: Error) => void\n onComplete?: (result: ExecutionResult) => void\n signal?: AbortSignal\n}\n\nexport interface SSEWorkflowRequestInit {\n url: string\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n body?: Record<string, unknown>\n headers?: Record<string, string>\n}\n\n// ============================================================\n// 核心执行引擎\n// ============================================================\n\nexport async function executeSSEWorkflow(\n request: SSEWorkflowRequestInit,\n options: SSEExecutionOptions & { authToken?: string } = {}\n): Promise<ExecutionResult> {\n const startTime = Date.now()\n const result: ExecutionResult = {\n success: false,\n finalResult: null,\n nodeExecutions: [],\n costUpdates: [],\n totalDuration: 0,\n errors: []\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'text/event-stream',\n ...(request.headers || {})\n }\n\n if (options.authToken) {\n headers['Authorization'] = `Bearer ${options.authToken}`\n }\n\n const method = request.method?.toUpperCase() as SSEWorkflowRequestInit['method'] ?? 'POST'\n const hasBody = request.body && Object.keys(request.body).length > 0\n if (method === 'GET') {\n delete headers['Content-Type']\n }\n\n try {\n const response = await fetch(request.url, {\n method,\n headers,\n body: method === 'GET' ? undefined : hasBody ? JSON.stringify(request.body) : undefined,\n signal: options.signal\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new Error('Response body is not readable')\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n let eventCount = 0\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const rawEvent = JSON.parse(line.slice(6))\n eventCount++\n\n // 处理 execution_log 事件\n if (rawEvent.type === 'execution_log' && rawEvent.data) {\n const logData = rawEvent.data as Record<string, unknown>\n const logType = logData.log_type as string\n\n // node_start 事件\n if (logType === 'node_start') {\n const logResult = logData.result as Record<string, unknown> | undefined\n const nodeName = (logResult?.next_node_name as string) || 'unknown'\n const nodeExec: NodeExecution = {\n nodeName,\n content: logData.content as string,\n timestamp: Date.now()\n }\n result.nodeExecutions.push(nodeExec)\n\n if (options.onNodeStart) {\n options.onNodeStart(nodeName, logData.content as string)\n }\n }\n\n // cost_update 事件\n if (logType === 'cost_update') {\n const logResult = logData.result as Record<string, unknown> | undefined\n const costUpdate: CostUpdate = {\n token: (logResult?.current_token as number) || 0,\n totalToken: (logResult?.total_token as number) || 0,\n cost: (logResult?.current_cost as number) || 0,\n totalCost: (logResult?.total_cost as number) || 0,\n timestamp: Date.now()\n }\n result.costUpdates.push(costUpdate)\n\n if (options.onCostUpdate) {\n options.onCostUpdate(costUpdate)\n }\n }\n\n // 检查是否有流式内容\n if (logData.delta && options.onStreamContent) {\n options.onStreamContent(logData.delta as string)\n }\n }\n\n // 处理 stream 事件(流式内容)\n if (rawEvent.type === 'stream' && rawEvent.delta && options.onStreamContent) {\n options.onStreamContent(rawEvent.delta as string)\n }\n\n // 处理 execution_complete 事件\n if (rawEvent.type === 'execution_complete' && rawEvent.data) {\n const eventData = rawEvent.data as Record<string, unknown>\n const eventResult = eventData.result as Record<string, unknown> | undefined\n result.finalResult = (eventResult?.original_message as Record<string, unknown>) || eventResult || null\n result.success = true\n }\n\n // 触发通用事件处理\n if (options.onEvent) {\n options.onEvent(rawEvent)\n }\n\n // 进度更新\n if (options.onProgress) {\n const progress = Math.min(90, (eventCount / 15) * 100)\n options.onProgress(progress)\n }\n } catch (error) {\n const msg = `Failed to parse SSE event: ${error}`\n result.errors.push(msg)\n if (options.onLog) {\n options.onLog(msg)\n }\n }\n }\n }\n }\n\n reader.releaseLock()\n result.totalDuration = Date.now() - startTime\n\n if (options.onProgress) {\n options.onProgress(100)\n }\n\n if (options.onComplete) {\n options.onComplete(result)\n }\n\n return result\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n result.errors.push(err.message)\n result.totalDuration = Date.now() - startTime\n\n if (options.onError) {\n options.onError(err)\n }\n\n throw error\n }\n}\n\n// ============================================================\n// SSE 请求对象 (用于 client.sseRequest)\n// ============================================================\n\nexport interface SSERequest {\n (config: {\n // 新方式:只需传 workflowId 和 inputs(projectId 由 client 内部管理)\n workflowId?: string\n inputs?: Record<string, unknown>\n // 旧方式:自定义 URL 和请求体\n url?: string\n body?: Record<string, unknown>\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n headers?: Record<string, string>\n signal?: AbortSignal\n onEvent?: (event: SSEEventPayload) => void\n onNodeStart?: (nodeName: string, content: string) => void\n onStreamContent?: (delta: string) => void\n onCostUpdate?: (cost: CostUpdate) => void\n onProgress?: (progress: number) => void\n onLog?: (message: string) => void\n onStreamChunk?: (chunk: string) => void\n onError?: (error: Error) => void\n onComplete?: (result: ExecutionResult) => void\n }): Promise<ExecutionResult>\n}\n\nexport function createSSERequest(\n baseUrl: string,\n projectId?: string,\n getAuthToken?: () => string | null\n): SSERequest {\n const ensureUrl = (path: string): string => {\n if (path.startsWith('http://') || path.startsWith('https://')) {\n return path\n }\n return `${baseUrl}${path.startsWith('/') ? '' : '/'}${path}`\n }\n\n return async (config) => {\n // 支持新方式:workflowId + inputs + projectId\n let url: string\n let body: Record<string, unknown>\n\n if (config.workflowId && projectId) {\n // 新方式:自动构建 SSE 执行 URL\n url = ensureUrl(`/workflow/${projectId}/${config.workflowId}/execute_sse`)\n body = { inputs: config.inputs || {} }\n } else {\n // 旧方式:使用自定义 URL 和请求体\n url = ensureUrl(config.url || '')\n body = config.body || {}\n }\n\n const authToken = getAuthToken?.() || undefined\n\n return executeSSEWorkflow({\n url,\n method: config.method,\n body,\n headers: config.headers\n }, {\n authToken: authToken as string | undefined,\n onEvent: config.onEvent,\n onNodeStart: config.onNodeStart,\n onStreamContent: config.onStreamContent,\n onCostUpdate: config.onCostUpdate,\n onProgress: config.onProgress,\n onLog: config.onLog,\n onStreamChunk: config.onStreamChunk,\n onError: config.onError,\n onComplete: config.onComplete,\n signal: config.signal\n })\n }\n}\n","import {\n executeSSEWorkflow,\n type ExecutionResult,\n type SSEEventPayload,\n type SSEExecutionOptions,\n} from \"./sse-executor\";\n\ntype SSEStreamCallbacks = Omit<SSEExecutionOptions, \"signal\" | \"authToken\">;\n\nexport type SSEStreamConfig = {\n workflowId?: string;\n inputs?: Record<string, unknown>;\n url?: string;\n body?: Record<string, unknown>;\n method?: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n headers?: Record<string, string>;\n signal?: AbortSignal;\n} & SSEStreamCallbacks;\n\nexport type SSEWorkflowOptions = Omit<\n SSEStreamConfig,\n \"workflowId\" | \"inputs\" | \"url\" | \"body\"\n>;\n\nexport interface SSESession {\n /** Promise for the underlying execution result. */\n result: Promise<ExecutionResult>;\n /** Abort the running SSE request. Safe to call multiple times. */\n cancel: () => void;\n /** The abort signal used for the fetch call. */\n signal: AbortSignal;\n}\n\nexport interface SSEClientConfig {\n baseUrl: string;\n projectId?: string;\n getAuthToken?: () => string | null;\n}\n\nexport interface SSEClient {\n /**\n * Starts an SSE session (workflowId or url required) and returns controls.\n * The returned session starts immediately.\n */\n stream(config: SSEStreamConfig): SSESession;\n\n /**\n * Convenience wrapper over `stream` that resolves once the SSE completes.\n */\n execute(config: SSEStreamConfig): Promise<ExecutionResult>;\n\n /**\n * Workflow-specific sugar for `stream`.\n */\n streamWorkflow(\n workflowId: string,\n inputs?: Record<string, unknown>,\n options?: SSEWorkflowOptions\n ): SSESession;\n\n /**\n * Workflow-specific sugar for `execute`.\n */\n executeWorkflow(\n workflowId: string,\n inputs?: Record<string, unknown>,\n options?: SSEWorkflowOptions\n ): Promise<ExecutionResult>;\n\n /**\n * Returns an async iterable of raw SSE events. Useful for `for await`.\n * Note: the iterable owns the session and ensures cleanup on completion.\n */\n events(config: SSEStreamConfig): AsyncIterable<SSEEventPayload>;\n\n /**\n * Workflow-specific sugar for `events`.\n */\n workflowEvents(\n workflowId: string,\n inputs?: Record<string, unknown>,\n options?: SSEWorkflowOptions\n ): AsyncIterable<SSEEventPayload>;\n}\n\ntype ResolvedRequest = {\n url: string;\n body: Record<string, unknown>;\n method?: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n headers?: Record<string, string>;\n};\n\nfunction ensureAbsoluteUrl(baseUrl: string, path: string): string {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (!path.startsWith(\"/\")) return `${baseUrl}/${path}`;\n return `${baseUrl}${path}`;\n}\n\nfunction resolveRequest(\n baseUrl: string,\n projectId: string | undefined,\n config: SSEStreamConfig\n): ResolvedRequest {\n if (config.workflowId) {\n if (!projectId) {\n throw new Error(\"workflowId provided but client is missing projectId\");\n }\n const workflowUrl = `/workflow/${projectId}/${config.workflowId}/execute_sse`;\n return {\n url: ensureAbsoluteUrl(baseUrl, workflowUrl),\n body: { inputs: config.inputs ?? {} },\n method: config.method ?? \"POST\",\n headers: config.headers,\n };\n }\n\n if (!config.url) {\n throw new Error(\"SSE stream requires either workflowId or url\");\n }\n\n return {\n url: ensureAbsoluteUrl(baseUrl, config.url),\n body: config.body ?? {},\n method: config.method,\n headers: config.headers,\n };\n}\n\nfunction createLinkedAbortController(\n externalSignal?: AbortSignal\n): { signal: AbortSignal; cancel: () => void; cleanup: () => void } {\n const controller = new AbortController();\n const abort = () => {\n if (!controller.signal.aborted) {\n controller.abort();\n }\n };\n\n if (externalSignal) {\n if (externalSignal.aborted) {\n abort();\n } else {\n externalSignal.addEventListener(\"abort\", abort);\n }\n }\n\n const cleanup = () => {\n if (externalSignal) {\n externalSignal.removeEventListener(\"abort\", abort);\n }\n };\n\n return { signal: controller.signal, cancel: abort, cleanup };\n}\n\nfunction createEventIterable(\n streamFactory: (config: SSEStreamConfig) => SSESession,\n config: SSEStreamConfig\n): AsyncIterable<SSEEventPayload> {\n return {\n async *[Symbol.asyncIterator]() {\n const queue: SSEEventPayload[] = [];\n const waiters: Array<{\n resolve: (value: SSEEventPayload) => void;\n reject: (error: unknown) => void;\n }> = [];\n let completed = false;\n let failure: Error | null = null;\n\n const session = streamFactory({\n ...config,\n onEvent: (event) => {\n config.onEvent?.(event);\n if (waiters.length) {\n const waiter = waiters.shift();\n waiter?.resolve(event);\n } else {\n queue.push(event);\n }\n },\n onError: (error) => {\n config.onError?.(error);\n failure = error instanceof Error ? error : new Error(String(error));\n while (waiters.length) {\n waiters.shift()?.reject(failure);\n }\n },\n onComplete: (result) => {\n config.onComplete?.(result);\n completed = true;\n while (waiters.length) {\n waiters.shift()?.resolve(undefined as unknown as SSEEventPayload);\n }\n },\n });\n\n try {\n while (true) {\n if (queue.length) {\n yield queue.shift() as SSEEventPayload;\n continue;\n }\n\n if (failure) {\n throw failure;\n }\n\n if (completed) {\n break;\n }\n\n // Wait for next event or completion\n try {\n const event = await new Promise<SSEEventPayload>((resolve, reject) =>\n waiters.push({ resolve, reject })\n );\n if (completed && queue.length === 0 && event === undefined) {\n break;\n }\n if (event !== undefined) {\n yield event;\n }\n } catch (error) {\n throw error;\n }\n }\n } finally {\n session.cancel();\n try {\n await session.result;\n } catch {\n // ignore abort errors\n }\n }\n\n if (failure) {\n throw failure;\n }\n },\n };\n}\n\nexport function createSSEClient(config: SSEClientConfig): SSEClient {\n const { baseUrl, projectId, getAuthToken } = config;\n\n const stream = (streamConfig: SSEStreamConfig): SSESession => {\n const { signal: externalSignal, ...callbacks } = streamConfig;\n const request = resolveRequest(baseUrl, projectId, streamConfig);\n const authToken = getAuthToken?.() ?? undefined;\n const controller = createLinkedAbortController(externalSignal);\n\n const result = executeSSEWorkflow(\n {\n url: request.url,\n method: request.method,\n body: request.body,\n headers: request.headers,\n },\n {\n ...callbacks,\n authToken,\n signal: controller.signal,\n }\n ).finally(() => {\n controller.cleanup();\n });\n\n return {\n result,\n cancel: controller.cancel,\n signal: controller.signal,\n };\n };\n\n const execute = (executeConfig: SSEStreamConfig) => stream(executeConfig).result;\n\n const streamWorkflow = (\n workflowId: string,\n inputs?: Record<string, unknown>,\n options: SSEWorkflowOptions = {}\n ) =>\n stream({\n workflowId,\n inputs,\n ...options,\n });\n\n const executeWorkflow = (\n workflowId: string,\n inputs?: Record<string, unknown>,\n options: SSEWorkflowOptions = {}\n ) =>\n execute({\n workflowId,\n inputs,\n ...options,\n });\n\n const events = (eventConfig: SSEStreamConfig) =>\n createEventIterable(stream, eventConfig);\n\n const workflowEvents = (\n workflowId: string,\n inputs?: Record<string, unknown>,\n options: SSEWorkflowOptions = {}\n ) =>\n events({\n workflowId,\n inputs,\n ...options,\n });\n\n return {\n stream,\n execute,\n streamWorkflow,\n executeWorkflow,\n events,\n workflowEvents,\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 \"./sse-executor\"; // 统一的 SSE 执行模块 (推荐使用)\nexport * from \"./sse-client\";\nexport * from \"../auth\";\nexport * from \"../config\";\nimport { getEnvs, setDefaultProjectId, setEnvironment, getGlobalEnvironment } 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 } from \"../utils/urlSanitizer\";\nimport { RequestConfig } from \"./request/types\";\nimport { showLimitUpgradeToast } from \"../components\";\nimport { executeWorkflowStreamPost, type WorkflowStreamOptions, type WorkflowStreamResponse } from \"./workflow-stream\";\nimport { WorkflowExecutor, type WorkflowExecutorOptions, type ParsedWorkflowResult } from \"./workflow-executor\";\nimport { type ExecutionResult } from \"./sse-executor\";\nimport { createSSEClient, type SSEClient, type SSEStreamConfig } from \"./sse-client\";\n\ntype LegacySSERequestFunction = (config: SSEStreamConfig) => Promise<ExecutionResult>;\ntype LegacySSERequest = LegacySSERequestFunction & {\n stream: SSEClient[\"stream\"];\n execute: SSEClient[\"execute\"];\n events: SSEClient[\"events\"];\n streamWorkflow: SSEClient[\"streamWorkflow\"];\n executeWorkflow: SSEClient[\"executeWorkflow\"];\n workflowEvents: SSEClient[\"workflowEvents\"];\n};\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\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/**\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 env?: 'local' | 'dev' | 'prod';\n baseUrl?: string; // 自定义 baseUrl,优先级最高\n authRequired?: boolean;\n mode?: \"auto\" | \"standalone\" | \"embedded\";\n auth?: {\n mode?: \"none\" | \"managed\" | \"headless\";\n getToken?: () => Promise<string | null>;\n tokenCacheMs?: number;\n tokenInjection?: {\n allowedOrigins?: string[];\n waitMs?: number;\n clearUrlParamsAfterInjectionMs?: number;\n clearAllUrlParams?: boolean;\n sensitiveParams?: string[];\n };\n };\n}) {\n // Priority: explicit opts.env > global variable > default prod\n // Global variable allows AI to inject env without exposing it in user code\n const envValue = opts.env || getGlobalEnvironment() || \"prod\";\n const env = setEnvironment(envValue);\n\n // 如果提供了 baseUrl,覆盖 env 中的 aiBaseUrl\n const actualAiBaseUrl = opts.baseUrl || env.aiBaseUrl;\n // Helper: create a Request instance from a base URL if needed\n function makeRequestFromBase(base: string) {\n return new Request({\n baseURL: base,\n timeout: 300000,\n interceptors: {\n requestInterceptor: (config: InternalAxiosRequestConfig) => {\n config.headers = config.headers || {};\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) => {\n\n const data = res.data as any\n if (data && data.status && data.status === 4003) {\n showLimitUpgradeToast(\n 'Your credits are exhausted. Please upgrade your plan to continue generating projects.',\n () => window.open(`${getEnvs().AUTH_ROOT_VALUE}/price`, '_blank')\n )\n return res\n }\n return res;\n },\n responseInterceptorCatch: (err: AxiosError) => Promise.reject(err),\n },\n });\n }\n\n const biz = makeRequestFromBase(env.baseUrl);\n const ai = makeRequestFromBase(env.aiBaseUrl);\n\n const bizWrapped = wrapRequestWithProjectPrefix(biz, opts?.projectId);\n\n let token: string | null = null;\n const bootstrapToken = getGlobalAvailableToken();\n const externalTokenTtl =\n typeof opts?.auth?.tokenCacheMs === \"number\" && opts.auth.tokenCacheMs >= 0\n ? opts.auth.tokenCacheMs\n : 30_000;\n let cachedExternalToken: string | null = null;\n let cachedExternalTokenFetchedAt = 0;\n let pendingExternalTokenPromise: Promise<string | null> | null = null;\n\n // Helper: get available token from multiple sources with priority\n function getAvailableToken(): string | null {\n if (token) return token;\n if (cachedExternalToken) return cachedExternalToken;\n return getGlobalAvailableToken();\n }\n\n try {\n if (opts?.projectId) {\n setDefaultProjectId(String(opts.projectId));\n }\n } catch {\n // ignore\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 function rememberExternalToken(value: string | null, fetchedAt = Date.now()) {\n cachedExternalToken = value ?? null;\n cachedExternalTokenFetchedAt = fetchedAt;\n }\n\n function getCachedOrGlobalToken() {\n return token ?? cachedExternalToken ?? getGlobalAvailableToken();\n }\n\n async function fetchExternalToken(force = false): Promise<string | null> {\n if (!opts?.auth?.getToken) return null;\n\n const now = Date.now();\n if (\n !force &&\n cachedExternalTokenFetchedAt &&\n now - cachedExternalTokenFetchedAt <= externalTokenTtl\n ) {\n return cachedExternalToken;\n }\n\n if (pendingExternalTokenPromise) {\n return pendingExternalTokenPromise;\n }\n\n pendingExternalTokenPromise = Promise.resolve()\n .then(() => opts.auth?.getToken?.())\n .then((value) => {\n rememberExternalToken(value ?? null, Date.now());\n if (value && value !== token) {\n token = value;\n applyToken(value);\n }\n return cachedExternalToken;\n })\n .catch((_err) => {\n rememberExternalToken(null, 0);\n return null;\n })\n .finally(() => {\n pendingExternalTokenPromise = null;\n });\n\n return pendingExternalTokenPromise;\n }\n\n if (bootstrapToken) {\n token = bootstrapToken;\n applyToken(bootstrapToken);\n rememberExternalToken(bootstrapToken);\n }\n\n if (opts?.auth?.getToken) {\n void fetchExternalToken(true);\n }\n\n // Wrap workflowRequest to automatically inject projectId into workflow URLs\n const workflowRequestWrapped = {\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 }\n\n const sseClient = createSSEClient({\n baseUrl: actualAiBaseUrl,\n projectId: opts?.projectId,\n getAuthToken: () => {\n if (!token && !cachedExternalToken) {\n void fetchExternalToken();\n }\n return token ?? cachedExternalToken ?? getTokenFrom() ?? null;\n },\n });\n\n const assignMethod = (config: SSEStreamConfig, method: SSEStreamConfig[\"method\"]) =>\n method ? { ...config, method } : config;\n\n function createMethodInvoker<T>(invoker: (config: SSEStreamConfig) => T) {\n return {\n request: (config: SSEStreamConfig) => invoker(config),\n post: (config: SSEStreamConfig) => invoker(assignMethod(config, \"POST\")),\n get: (config: SSEStreamConfig) => invoker(assignMethod(config, \"GET\")),\n put: (config: SSEStreamConfig) => invoker(assignMethod(config, \"PUT\")),\n patch: (config: SSEStreamConfig) => invoker(assignMethod(config, \"PATCH\")),\n delete: (config: SSEStreamConfig) => invoker(assignMethod(config, \"DELETE\")),\n };\n }\n\n const sseNamespace = {\n request: createMethodInvoker(sseClient.execute),\n stream: createMethodInvoker(sseClient.stream),\n events: createMethodInvoker(sseClient.events),\n workflow: {\n execute: sseClient.executeWorkflow,\n stream: sseClient.streamWorkflow,\n events: sseClient.workflowEvents,\n },\n execute: sseClient.execute,\n streamWorkflow: sseClient.streamWorkflow,\n executeWorkflow: sseClient.executeWorkflow,\n workflowEvents: sseClient.workflowEvents,\n };\n\n const sseRequestWrapped: LegacySSERequest = Object.assign(\n ((config: SSEStreamConfig) => sseNamespace.request.post(config)) as LegacySSERequestFunction,\n {\n stream: sseClient.stream,\n execute: sseClient.execute,\n events: sseClient.events,\n streamWorkflow: sseClient.streamWorkflow,\n executeWorkflow: sseClient.executeWorkflow,\n workflowEvents: sseClient.workflowEvents,\n }\n );\n\n const executeWorkflowStreamWrapper = async (\n workflowId: string,\n inputs: Record<string, unknown>,\n streamOptions?: WorkflowStreamOptions\n ): Promise<WorkflowStreamResponse> => {\n if (!opts?.projectId) {\n throw new Error(\"projectId is required for workflow execution\");\n }\n\n let authToken = getCachedOrGlobalToken();\n if (!authToken) {\n authToken = (await fetchExternalToken()) ?? getCachedOrGlobalToken();\n }\n\n return executeWorkflowStreamPost(\n actualAiBaseUrl,\n opts.projectId,\n workflowId,\n { inputs },\n streamOptions,\n authToken || undefined\n );\n };\n\n const workflowExecutorFactory = (workflowId: string) => {\n if (!opts?.projectId) {\n throw new Error(\"projectId is required for workflow execution\");\n }\n\n const executor = new WorkflowExecutor(\n actualAiBaseUrl,\n opts.projectId,\n getCachedOrGlobalToken() ?? undefined\n );\n\n return {\n executeSse: (\n inputs: Record<string, unknown>,\n options?: WorkflowExecutorOptions\n ): Promise<ParsedWorkflowResult> => {\n return executor.executeSse(workflowId, inputs, options);\n },\n execute: (inputs: Record<string, unknown>) => {\n return executor.execute(workflowId, inputs);\n },\n _executor: executor,\n };\n };\n\n return {\n // expose projectId so consumers can read it from the client instance\n projectId: opts?.projectId ?? null,\n request: bizWrapped,\n aiRequest: ai,\n workflowRequest: workflowRequestWrapped,\n sse: sseNamespace,\n\n /**\n * ✨ 新的简化 SSE API(推荐)\n * \n * projectId 已内部绑定,只需传 workflowId 和 inputs\n * \n * @example\n * ```typescript\n * const result = await client.sse.request.post({\n * workflowId: 'workflow-id',\n * inputs: { prompt: 'Generate story' },\n * onNodeStart: (name) => console.log(`执行: ${name}`),\n * onStreamContent: (delta) => console.log(`内容: ${delta}`),\n * onCostUpdate: (stats) => console.log(`Token: ${stats.totalToken}`)\n * })\n *\n * // 也可以获取流式控制:\n * const session = client.sse.stream.post({ workflowId, inputs: {...} })\n * const events = client.sse.events.post({ workflowId, inputs: {...} })\n * ```\n */\n sseRequest: sseRequestWrapped,\n workflow: {\n request: workflowRequestWrapped,\n stream: sseClient.streamWorkflow,\n execute: sseClient.executeWorkflow,\n events: sseClient.workflowEvents,\n sse: sseNamespace.workflow,\n executeStream: executeWorkflowStreamWrapper,\n executor: workflowExecutorFactory,\n },\n\n /**\n * 执行长时间运行的 workflow (使用 SSE 流式传输)\n * \n * 适用于执行时间 > 5 分钟的 workflow,通过 SSE 实时接收进度更新\n * \n * @example\n * ```typescript\n * const result = await client.executeWorkflowStream(\n * 'workflow-id',\n * { prompt: 'Generate app' },\n * {\n * onProgress: (event) => {\n * console.log('进度:', event.progress, '%')\n * }\n * }\n * )\n * ```\n */\n executeWorkflowStream: executeWorkflowStreamWrapper,\n\n /**\n * 创建工作流执行器 (推荐方式)\n * \n * 统一支持 execute 和 execute_sse 两种接口\n * 自动完整解析所有事件和数据\n * \n * @example\n * ```typescript\n * // 1. 故事生成工作流 (SSE 流式执行)\n * const executor = client.workflowExecutor('workflow-id');\n * \n * const result = await executor.executeSse(\n * { prompt: 'Generate a story' },\n * {\n * onNodeStart: (nodeName) => console.log(`执行节点: ${nodeName}`),\n * onCostUpdate: (stats) => console.log(`Token: ${stats.totalToken}`),\n * onStreamContent: (delta) => process.stdout.write(delta),\n * onComplete: (result) => {\n * console.log('最终结果:', result.finalResult);\n * console.log('总成本:', result.costStats.totalCost);\n * }\n * }\n * );\n * \n * // 2. 快速任务 (REST 直接调用)\n * const result = await executor.execute({ prompt: 'Quick task' });\n * \n * // 3. 访问完整的执行数据\n * console.log('节点序列:', result.nodeExecutions.map(n => n.nodeName));\n * console.log('流式内容:', result.streamContent);\n * console.log('执行时长:', result.executionDuration, 'ms');\n * ```\n */\n workflowExecutor: workflowExecutorFactory,\n\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 let availableToken = getCachedOrGlobalToken();\n if (!availableToken) {\n availableToken = (await fetchExternalToken()) ?? getCachedOrGlobalToken();\n }\n if (!availableToken) return null;\n return parseUserFromToken(availableToken);\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 rememberExternalToken(t, t ? Date.now() : 0);\n pendingExternalTokenPromise = null;\n },\n getToken: () => {\n if (!token && !cachedExternalToken) {\n void fetchExternalToken();\n }\n return getCachedOrGlobalToken();\n },\n isAuthenticated: () => Boolean(getCachedOrGlobalToken()),\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 = env.baseUrl\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 = env.baseUrl;\n window.location.href = `${root}/auth?redirect_uri=${encoded}${pid}`;\n }\n },\n logout: () => {\n token = null;\n applyToken(null);\n rememberExternalToken(null, 0);\n pendingExternalTokenPromise = 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","/**\n * Workflow Stream Executor (基于 Server-Sent Events)\n * \n * 用于执行长时间运行的 AI workflow,通过 SSE 实时接收进度更新和结果\n * \n * 支持多种输出模式:\n * 1. 流式输出 (stream) - 逐字/逐块输出,适合 AI 文本生成\n * 2. 进度模式 (progress) - 显示执行进度,适合长时间任务\n * 3. 完整模式 (complete) - 一次性返回结果,适合快速任务\n * 4. 混合模式 (hybrid) - 既有流式内容又有进度,适合复杂场景\n * \n * 适用场景:\n * - Workflow 执行时间 > 5 分钟\n * - 需要实时显示进度或流式输出\n * - 需要简单易用的 API 供 AI 生成代码使用\n * \n * 后端要求:\n * - POST /workflow/{projectId}/{workflowId}/execute (返回 SSE 流)\n * - 发送 JSON 格式的事件: data: {\"type\": \"...\", \"data\": {...}}\n */\n\nexport interface WorkflowStreamEvent {\n type: 'start' | 'progress' | 'stream' | 'log' | 'complete' | 'error'\n data?: any\n message?: string\n progress?: number // 0-100\n content?: string // 流式内容(逐块)\n delta?: string // 增量内容(仅新增部分)\n timestamp?: string\n}\n\nexport interface WorkflowStreamOptions {\n onProgress?: (event: WorkflowStreamEvent) => void // 进度更新回调\n onStream?: (content: string, delta: string) => void // 流式内容回调(累积内容, 增量内容)\n onLog?: (message: string) => void // 日志回调\n onError?: (error: Error) => void // 错误回调\n signal?: AbortSignal // 支持取消\n}\n\nexport interface WorkflowStreamResponse {\n success: boolean\n output?: Record<string, unknown>\n streamContent?: string // 流式输出的完整内容\n error?: string\n metadata?: Record<string, unknown>\n}\n\n/**\n * 使用 Fetch + ReadableStream 执行 workflow (支持 POST)\n * \n * 这个函数支持多种输出模式:\n * - 流式模式: 通过 onStream 回调逐块接收内容\n * - 进度模式: 通过 onProgress 回调接收进度更新\n * - 完整模式: 直接返回最终结果\n * - 混合模式: 同时支持以上所有模式\n * \n * @example\n * ```typescript\n * // 1. 流式输出模式 (适合 AI 文本生成)\n * const result = await executeWorkflowStream(\n * baseUrl, projectId, workflowId,\n * { inputs: { prompt: 'Write a story' } },\n * {\n * onStream: (fullContent, delta) => {\n * console.log('新增:', delta)\n * setContent(fullContent) // 更新 UI\n * }\n * }\n * )\n * \n * // 2. 进度模式 (适合长时间任务)\n * const result = await executeWorkflowStream(\n * baseUrl, projectId, workflowId,\n * { inputs: { task: 'process data' } },\n * {\n * onProgress: (event) => {\n * console.log('进度:', event.progress, '%')\n * }\n * }\n * )\n * \n * // 3. 完整模式 (不需要回调,直接等待结果)\n * const result = await executeWorkflowStream(\n * baseUrl, projectId, workflowId,\n * { inputs: { query: 'data' } }\n * )\n * console.log('结果:', result.output)\n * \n * // 4. 混合模式 (既有流式内容又有进度)\n * const result = await executeWorkflowStream(\n * baseUrl, projectId, workflowId,\n * { inputs: { prompt: 'Generate code' } },\n * {\n * onStream: (content) => setCode(content),\n * onProgress: (event) => setProgress(event.progress),\n * onLog: (log) => addLog(log)\n * }\n * )\n * ```\n */\nexport async function executeWorkflowStream(\n baseUrl: string,\n projectId: string,\n workflowId: string,\n request: {\n inputs: Record<string, unknown>\n options?: Record<string, unknown>\n },\n options: WorkflowStreamOptions = {},\n authToken?: string\n): Promise<WorkflowStreamResponse> {\n return new Promise((resolve, reject) => {\n const url = `${baseUrl}/workflow/${projectId}/${workflowId}/execute`\n\n // 构造查询参数(将请求数据序列化)\n const params = new URLSearchParams()\n params.set('inputs', JSON.stringify(request.inputs))\n if (request.options) {\n params.set('options', JSON.stringify(request.options))\n }\n\n const fullUrl = `${url}?${params.toString()}`\n\n // 创建 EventSource (注意: EventSource 不支持 POST,所以用 GET + 查询参数)\n // 如果后端需要 POST,需要使用 fetch + ReadableStream\n const eventSource = new EventSource(fullUrl)\n\n let finalResult: WorkflowStreamResponse | null = null\n\n // 监听消息事件\n eventSource.onmessage = (event) => {\n try {\n const data: WorkflowStreamEvent = JSON.parse(event.data)\n\n switch (data.type) {\n case 'start':\n if (options.onProgress) {\n options.onProgress({ type: 'start', message: '任务开始', progress: 0 })\n }\n break\n\n case 'progress':\n if (options.onProgress) {\n options.onProgress(data)\n }\n break\n\n case 'log':\n if (options.onLog) {\n options.onLog(data.message || '')\n }\n break\n\n case 'complete':\n finalResult = {\n success: true,\n output: data.data,\n metadata: data as any,\n }\n eventSource.close()\n resolve(finalResult)\n break\n\n case 'error':\n eventSource.close()\n reject(new Error(data.message || 'Workflow execution failed'))\n break\n }\n } catch (err) {\n console.error('Failed to parse SSE event:', err)\n }\n }\n\n // 监听错误事件\n eventSource.onerror = (err) => {\n eventSource.close()\n\n if (finalResult) {\n // 如果已经有结果,忽略错误(可能是连接正常关闭)\n resolve(finalResult)\n } else {\n const error = new Error('SSE connection failed')\n if (options.onError) {\n options.onError(error)\n }\n reject(error)\n }\n }\n\n // 支持取消\n if (options.signal) {\n options.signal.addEventListener('abort', () => {\n eventSource.close()\n reject(new Error('Request aborted'))\n })\n }\n })\n}\n\n/**\n * 使用 Fetch + ReadableStream 执行 workflow (支持 POST)\n * \n * 如果后端需要 POST 请求体,使用这个函数\n */\nexport async function executeWorkflowStreamPost(\n baseUrl: string,\n projectId: string,\n workflowId: string,\n request: {\n inputs: Record<string, unknown>\n options?: Record<string, unknown>\n },\n options: WorkflowStreamOptions = {},\n authToken?: string\n): Promise<WorkflowStreamResponse> {\n const url = `${baseUrl}/workflow/${projectId}/${workflowId}/execute`\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'text/event-stream',\n }\n\n if (authToken) {\n headers['Authorization'] = `Bearer ${authToken}`\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n signal: options.signal,\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new Error('Response body is not readable')\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n let finalResult: WorkflowStreamResponse | null = null\n let streamContent = '' // 累积的流式内容\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n\n if (done) {\n break\n }\n\n // 解码数据\n buffer += decoder.decode(value, { stream: true })\n\n // 按行分割\n const lines = buffer.split('\\n')\n buffer = lines.pop() || '' // 保留最后一行(可能不完整)\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6) // 去掉 \"data: \"\n\n try {\n const event: WorkflowStreamEvent = JSON.parse(data)\n\n switch (event.type) {\n case 'start':\n if (options.onProgress) {\n options.onProgress({ type: 'start', message: '任务开始', progress: 0 })\n }\n break\n\n case 'progress':\n if (options.onProgress) {\n options.onProgress(event)\n }\n break\n\n case 'stream':\n // 流式内容输出\n const delta = event.delta || event.content || ''\n streamContent += delta\n\n if (options.onStream) {\n options.onStream(streamContent, delta)\n }\n break\n\n case 'log':\n if (options.onLog) {\n options.onLog(event.message || '')\n }\n break\n\n case 'complete':\n finalResult = {\n success: true,\n output: event.data,\n streamContent: streamContent || undefined, // 如果有流式内容,返回完整内容\n metadata: event as any,\n }\n break\n\n case 'error':\n throw new Error(event.message || 'Workflow execution failed')\n }\n } catch (err) {\n console.error('Failed to parse SSE event:', err)\n }\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n\n if (finalResult) {\n return finalResult\n } else {\n throw new Error('Workflow execution incomplete')\n }\n}\n","/**\n * 工作流执行器 - 统一的 API 接口\n * \n * 支持两种执行模式:\n * 1. execute - 传统 REST 调用 (快速任务)\n * 2. execute_sse - 流式 SSE 执行 (长时间任务)\n * \n * 设计原则:\n * - AI 可以直接理解并调用\n * - 完整的数据解析和提取\n * - 统一的错误处理\n * - 支持所有事件类型\n */\n\nexport interface ExecutionLogData {\n log_type: 'node_start' | 'cost_update' | 'execution_complete' | 'stream' | 'log' | string;\n workflow_id: string;\n content: string;\n result?: Record<string, unknown>;\n}\n\nexport interface ExecutionEvent {\n type: 'execution_log' | 'execution_complete' | 'start' | 'progress' | 'stream' | 'log' | 'error' | string;\n data?: ExecutionLogData | Record<string, unknown>;\n}\n\n/**\n * 解析后的工作流执行结果\n */\nexport interface ParsedWorkflowResult {\n // 基础信息\n success: boolean;\n workflowId: string;\n projectId: string;\n executionDuration: number; // 毫秒\n\n // 执行日志数据\n nodeExecutions: Array<{\n nodeName: string;\n content: string;\n timestamp?: number;\n }>;\n\n costStats: {\n token: number;\n totalToken: number;\n cost: number;\n totalCost: number;\n };\n\n executionLogs: ExecutionLogData[];\n\n // 最终结果\n finalResult?: Record<string, unknown>;\n streamContent?: string;\n\n // 元数据\n metadata?: Record<string, unknown>;\n errors: string[];\n}\n\nexport interface WorkflowExecutorOptions {\n onProgress?: (event: { type: string; progress?: number; message?: string; data?: any }) => void;\n onNodeStart?: (nodeName: string, content: string) => void;\n onCostUpdate?: (stats: { token: number; totalToken: number; cost: number; totalCost: number }) => void;\n onStreamContent?: (delta: string, fullContent: string) => void;\n onLog?: (message: string) => void;\n onComplete?: (result: ParsedWorkflowResult) => void;\n onError?: (error: Error) => void;\n signal?: AbortSignal;\n}\n\n/**\n * 工作流执行器类\n * \n * 统一处理 execute 和 execute_sse 两种接口\n * 并完整解析返回的数据\n */\nexport class WorkflowExecutor {\n private baseUrl: string;\n private projectId: string;\n private authToken?: string;\n\n constructor(baseUrl: string, projectId: string, authToken?: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n this.projectId = projectId;\n this.authToken = authToken;\n }\n\n /**\n * 执行工作流 (SSE 模式)\n * \n * 适用于长时间运行的工作流,支持流式输出和进度更新\n * \n * @example\n * ```typescript\n * const executor = new WorkflowExecutor(baseUrl, projectId, token);\n * \n * const result = await executor.executeSse(\n * 'workflow-id',\n * { prompt: 'Generate a story' },\n * {\n * onNodeStart: (nodeName) => console.log(`执行节点: ${nodeName}`),\n * onStreamContent: (delta) => process.stdout.write(delta),\n * onCostUpdate: (stats) => console.log(`token: ${stats.totalToken}`),\n * }\n * );\n * \n * console.log('最终结果:', result.finalResult);\n * console.log('总成本:', result.costStats.totalCost);\n * ```\n */\n async executeSse(\n workflowId: string,\n inputs: Record<string, unknown>,\n options?: WorkflowExecutorOptions\n ): Promise<ParsedWorkflowResult> {\n const startTime = Date.now();\n const url = `${this.baseUrl}/workflow/${this.projectId}/${workflowId}/execute_sse`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.authToken) {\n headers['Authorization'] = `Bearer ${this.authToken}`;\n }\n\n const result: ParsedWorkflowResult = {\n success: false,\n workflowId,\n projectId: this.projectId,\n executionDuration: 0,\n nodeExecutions: [],\n costStats: {\n token: 0,\n totalToken: 0,\n cost: 0,\n totalCost: 0,\n },\n executionLogs: [],\n errors: [],\n };\n\n let streamContent = '';\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ inputs }),\n signal: options?.signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const event = JSON.parse(line.slice(6)) as ExecutionEvent;\n\n // 处理 execution_log 事件\n if (event.type === 'execution_log' && event.data) {\n const logData = event.data as ExecutionLogData;\n result.executionLogs.push(logData);\n\n // node_start - 节点开始\n if (logData.log_type === 'node_start') {\n const nodeName = (logData.result as any)?.next_node_name || '未知节点';\n result.nodeExecutions.push({\n nodeName,\n content: logData.content,\n timestamp: Date.now(),\n });\n\n if (options?.onNodeStart) {\n options.onNodeStart(nodeName, logData.content);\n }\n }\n\n // cost_update - 成本更新\n else if (logData.log_type === 'cost_update') {\n const costData = logData.result as any;\n result.costStats = {\n token: costData?.current_token || 0,\n totalToken: costData?.total_token || 0,\n cost: costData?.current_cost || 0,\n totalCost: costData?.total_cost || 0,\n };\n\n if (options?.onCostUpdate) {\n options.onCostUpdate(result.costStats);\n }\n }\n }\n\n // 处理 execution_complete 事件\n else if (event.type === 'execution_complete' && event.data) {\n const completeData = event.data as any;\n const originalMessage = completeData.result?.original_message;\n\n result.finalResult = originalMessage || completeData.result;\n result.success = true;\n result.metadata = completeData;\n }\n\n // 处理其他事件类型\n else if (event.type === 'stream' && (event.data as any)?.delta) {\n const delta = (event.data as any).delta;\n streamContent += delta;\n\n if (options?.onStreamContent) {\n options.onStreamContent(delta, streamContent);\n }\n } else if (event.type === 'log' && (event.data as any)?.message) {\n if (options?.onLog) {\n options.onLog((event.data as any).message);\n }\n } else if (event.type === 'progress' && (event.data as any)?.progress !== undefined) {\n if (options?.onProgress) {\n options.onProgress({\n type: 'progress',\n progress: (event.data as any).progress,\n message: (event.data as any).message,\n });\n }\n }\n } catch {\n // 忽略解析错误\n }\n }\n }\n }\n\n result.streamContent = streamContent || undefined;\n result.executionDuration = Date.now() - startTime;\n\n if (options?.onComplete) {\n options.onComplete(result);\n }\n\n return result;\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n result.errors.push(errMsg);\n result.executionDuration = Date.now() - startTime;\n\n if (options?.onError) {\n options.onError(error instanceof Error ? error : new Error(errMsg));\n }\n\n throw error;\n }\n }\n\n /**\n * 执行工作流 (REST 模式)\n * \n * 适用于快速任务,直接返回结果\n * \n * @example\n * ```typescript\n * const executor = new WorkflowExecutor(baseUrl, projectId, token);\n * \n * const result = await executor.execute(\n * 'workflow-id',\n * { prompt: 'Quick task' }\n * );\n * \n * console.log(result.data);\n * ```\n */\n async execute(\n workflowId: string,\n inputs: Record<string, unknown>\n ): Promise<{\n status: number;\n data?: any;\n error?: string;\n }> {\n const url = `${this.baseUrl}/workflow/${this.projectId}/${workflowId}/execute`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.authToken) {\n headers['Authorization'] = `Bearer ${this.authToken}`;\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ inputs }),\n });\n\n const data = await response.json();\n\n return {\n status: response.status,\n data,\n };\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n return {\n status: 500,\n error: errMsg,\n };\n }\n }\n\n /**\n * 设置认证 Token\n */\n setAuthToken(token: string) {\n this.authToken = token;\n }\n}\n\n/**\n * 辅助函数: 快速创建执行器\n */\nexport function createWorkflowExecutor(\n baseUrl: string,\n projectId: string,\n authToken?: string\n): WorkflowExecutor {\n return new WorkflowExecutor(baseUrl, projectId, authToken);\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","import { useState, useCallback, useRef } from 'react'\nimport type { WorkflowStreamEvent, WorkflowStreamResponse, WorkflowStreamOptions } from '../services/workflow-stream'\n\nexport interface UseWorkflowStreamState {\n loading: boolean\n progress: number\n streamContent: string // 流式输出的累积内容\n logs: string[]\n result: WorkflowStreamResponse | null\n error: Error | null\n}\n\n/**\n * React Hook 用于执行长时间运行的 workflow (基于 SSE)\n * \n * 支持多种模式:\n * 1. 流式输出 - 实时显示 AI 生成的内容\n * 2. 进度显示 - 显示任务执行进度\n * 3. 日志输出 - 显示执行日志\n * 4. 混合模式 - 同时支持以上所有功能\n * \n * @example\n * ```typescript\n * // 流式输出示例\n * const { execute, state } = useWorkflowStream()\n * \n * await execute('workflow-id', { prompt: 'Write a story' })\n * \n * // 显示流式内容\n * <div>{state.streamContent}</div>\n * \n * // 显示进度\n * <progress value={state.progress} max=\"100\" />\n * ```\n */\nexport function useWorkflowStream() {\n const [state, setState] = useState<UseWorkflowStreamState>({\n loading: false,\n progress: 0,\n streamContent: '',\n logs: [],\n result: null,\n error: null,\n })\n\n const abortControllerRef = useRef<AbortController | null>(null)\n\n const execute = useCallback(async (\n executeWorkflowStream: (\n workflowId: string,\n inputs: Record<string, unknown>,\n options?: WorkflowStreamOptions\n ) => Promise<WorkflowStreamResponse>,\n workflowId: string,\n inputs: Record<string, unknown>\n ) => {\n // 重置状态\n setState({\n loading: true,\n progress: 0,\n streamContent: '',\n logs: [],\n result: null,\n error: null,\n })\n\n // 创建 abort controller\n abortControllerRef.current = new AbortController()\n\n try {\n const result = await executeWorkflowStream(\n workflowId,\n inputs,\n {\n onProgress: (event: WorkflowStreamEvent) => {\n setState(prev => ({\n ...prev,\n progress: event.progress || prev.progress,\n }))\n },\n onStream: (fullContent: string, delta: string) => {\n setState(prev => ({\n ...prev,\n streamContent: fullContent,\n }))\n },\n onLog: (message: string) => {\n setState(prev => ({\n ...prev,\n logs: [...prev.logs, message],\n }))\n },\n signal: abortControllerRef.current?.signal,\n }\n )\n\n setState(prev => ({\n ...prev,\n loading: false,\n progress: 100,\n result,\n }))\n\n return result\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Unknown error')\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: err,\n }))\n\n throw error\n }\n }, [])\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n setState(prev => ({\n ...prev,\n loading: false,\n error: new Error('Request cancelled'),\n }))\n }\n }, [])\n\n const reset = useCallback(() => {\n setState({\n loading: false,\n progress: 0,\n streamContent: '',\n logs: [],\n result: null,\n error: null,\n })\n }, [])\n\n return {\n execute,\n cancel,\n reset,\n state,\n }\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 };\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', 'expected', 'transform failed'],\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', 'esbuild', 'plugin:vite:esbuild'],\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 }\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\", (data: any) => {\n this.handleViteError(data);\n requestAnimationFrame(() => this.checkForViteErrorOverlay());\n });\n\n // 监听编译错误事件\n hot.on(\"vite:invalidate\", (data: any) => {\n setTimeout(() => this.checkForCompileErrors(), 500);\n });\n\n // 监听其他 HMR 事件\n hot.on(\"vite:beforeUpdate\", () => {\n });\n\n hot.on(\"vite:afterUpdate\", () => {\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 } 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 错误事件\n */\n private handleViteError(errorData: any): void {\n try {\n const errorPayload = {\n id: `vite-error-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n type: 'vite_hmr',\n error: {\n name: 'ViteError',\n message: errorData?.message || 'Vite error',\n stack: errorData?.stack || '',\n },\n source: 'vite:error',\n timestamp: Date.now(),\n severity: 'error' as const,\n context: {\n viteErrorData: errorData,\n url: window.location.href,\n userAgent: navigator.userAgent\n }\n };\n\n if (window.__AUTO_ENGINEER_ERRORS__) {\n window.__AUTO_ENGINEER_ERRORS__.push(errorPayload);\n }\n\n this.sendMessage({\n type: \"SYSTEM_EVENT\",\n payload: errorPayload,\n timestamp: Date.now()\n });\n\n } catch (error) {\n console.error('[ViteHMRDetector] 处理 Vite 错误失败:', error);\n }\n }\n\n /**\n * 检查编译错误\n */\n private async checkForCompileErrors(): Promise<void> {\n try {\n if (document.querySelector(\"vite-error-overlay\")) {\n this.checkForViteErrorOverlay();\n return;\n }\n\n const response = await fetch(window.location.href, {\n method: 'HEAD',\n cache: 'no-cache'\n });\n\n if (!response.ok) {\n this.handleCompileError(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n } catch (error) {\n this.handleCompileError(`Error: ${(error as Error).message}`);\n }\n }\n\n /**\n * 处理编译错误\n */\n private handleCompileError(errorMessage: string): void {\n const errorPayload = {\n id: `compile-error-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n type: 'compile_error',\n error: {\n name: 'CompileError',\n message: `Compile error: ${errorMessage}`,\n stack: '',\n },\n source: 'vite:compile',\n timestamp: Date.now(),\n severity: 'error' as const,\n context: {\n url: window.location.href,\n userAgent: navigator.userAgent,\n compilationFailed: true\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 /**\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","/**\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\n // 1. 清除缓存\n if (defaultOptions.clearCaches) {\n const clearedCaches = await this.clearAllCaches();\n result.clearedCaches = clearedCaches;\n }\n\n // 2. 注销 Service Workers\n if (defaultOptions.unregisterServiceWorkers) {\n const unregisteredCount = await this.unregisterServiceWorkers();\n result.unregisteredWorkers = unregisteredCount;\n }\n\n // 3. 清除存储\n const clearedStorage = await this.clearStorage(defaultOptions);\n result.clearedStorage = clearedStorage;\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 }\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 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\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 }\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 }\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 }\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 // 延迟设置完全初始化标志,避免初始化期间的日志被拦截\n setTimeout(() => {\n this.fullyInitialized = true;\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\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\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 const lowerMessage = message.toLowerCase();\n const isFromVite =\n (fileInfo.filename || '').toLowerCase().includes('vite') ||\n lowerMessage.includes('@vite') ||\n lowerMessage.includes('vite') ||\n lowerMessage.includes('hmr');\n\n const ignoreVitePatterns = [\n /\\[vite\\]\\s*hot updated/i,\n /\\[vite\\]\\s*connected/i,\n /\\[vite\\]\\s*connecting/i,\n /\\bhot updated\\b/i,\n /\\bhmr\\b.*\\bupdated\\b/i\n ];\n if (isFromVite && ignoreVitePatterns.some(re => re.test(lowerMessage))) {\n return;\n }\n\n const hasErrorKeywords = /\\b(error|failed|overlay|compile|exception)\\b/.test(lowerMessage);\n const isViteHMRNonError = isFromVite && !hasErrorKeywords;\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 if (!isViteHMRNonError) {\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 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' : \n consoleLevelMap[method] === 'debug' ? 'debug' : \n '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 const self = this;\n\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 self.logNetworkRequest(args, response, Date.now() - startTime);\n return response;\n } catch (error: any) {\n const duration = Date.now() - startTime;\n const message = error && (error.message || String(error));\n const match = typeof message === 'string' ? message.match(/^HTTP\\s+(\\d+):\\s*(.*)$/i) : null;\n if (match) {\n const status = Number(match[1]);\n const statusText = match[2] || '';\n // 将这类异常按 HTTP 错误进行记录\n const stack = new Error().stack;\n const fileInfo = self.extractFileInfoFromStack(stack);\n self.sendMessage({\n type: \"NETWORK_EVENT\",\n payload: {\n type: \"request_error\",\n url: args[0],\n method: args[1]?.method || \"GET\",\n status,\n statusText,\n filename: fileInfo.filename,\n lineno: fileInfo.lineno,\n colno: fileInfo.colno,\n duration,\n timestamp: new Date().toISOString(),\n pageUrl: window.location.href,\n interactionTrail: self.getRecentInteractions(),\n },\n timestamp: Date.now()\n });\n } else {\n self.logNetworkError(args, error, duration);\n }\n throw error;\n }\n };\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 }, 2000);\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 \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 }\n\n /**\n * 手动禁用控制台拦截\n */\n public disableConsoleInterception(): void {\n this.fullyInitialized = false;\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 }\n}\n","// 获取classes\nexport function getElementClasses(element: Element): string[] {\n // 优先使用属性,确保字符串\n const classAttr = element.getAttribute('class');\n if (classAttr && classAttr.trim().length > 0) {\n return dedupeAndClean(classAttr.split(/\\s+/));\n }\n\n const anyEl: any = element as any;\n\n // 处理为字符串\n if (typeof anyEl.className === 'string') {\n return dedupeAndClean((anyEl.className as string).split(/\\s+/));\n }\n\n // 处理 SVGAnimatedString\n if (anyEl.className && typeof anyEl.className.baseVal === 'string') {\n return dedupeAndClean((anyEl.className.baseVal as string).split(/\\s+/));\n }\n\n if (anyEl.classList && anyEl.classList.length > 0) {\n return dedupeAndClean(Array.from(anyEl.classList));\n }\n\n return [];\n}\n\nfunction dedupeAndClean(arr: string[]): string[] {\n const cleaned = arr.map(s => s.trim()).filter(Boolean);\n return Array.from(new Set(cleaned));\n}","/**\n * InteractionTracking 用户交互追踪功能模块\n * 负责追踪和记录用户交互行为\n */\nimport type { UserInteraction } from '../types';\nimport { ERROR_CONFIG } from '../types';\nimport { getElementClasses } from '../utils/SelectorUtils'\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 }\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 }\n\n /**\n * 停止追踪\n */\n public stopTracking(): void {\n if (!this.isTracking) return;\n\n this.removeEventListeners();\n this.isTracking = false;\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 \n const classes = getElementClasses(element);\n if (classes.length > 0) {\n return `.${classes[0]}`;\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 }\n}","/**\n * MessageBridge 消息桥接功能模块\n * 负责处理各种消息类型和与父窗口的通信\n */\nimport { GLOBAL_CONFIG } from '../types';\nimport { ComponentTreeGenerator } from '../utils/ComponentTreeGenerator';\nimport { MessageSender, createDefaultMessageSender } from '../utils/MessageSender';\nimport { getElementClasses } from '../utils/SelectorUtils'\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 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 }\n\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 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\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 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 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 * 处理请求组件树\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 const classes = getElementClasses(element);\n if (classes.length > 0) {\n return `.${classes[0]}`;\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 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 }\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 { 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 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 // 初始化统一消息发送器\n this.messageSender = createDefaultMessageSender({\n addTimestamp: true,\n enableDebugLog: false\n });\n \n // 创建发送函数\n const sendMessage = this.messageSender.createSendFunction();\n \n // 初始化功能模块\n console.log('[ErrorHandler] 初始化功能模块');\n this.errorTracking = new ErrorTracking(sendMessage);\n this.interactionTracking = new InteractionTracking(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 console.log('[ErrorHandler] Vite 环境检测成功,初始化检测器');\n this.viteHMRDetector = new ViteHMRDetector(sendMessage);\n }\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 // 初始化核心功能\n this.initializeCore();\n console.log('[ErrorHandler] 核心功能初始化完成');\n \n \n // 设置模块间的协作\n this.setupModuleIntegration();\n \n // 启用功能模块\n this.enableFeatures();\n \n this.initialized = true;\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\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\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.setComponentTreeGenerator(this.componentTreeGenerator);\n \n // 设置错误追踪的依赖\n this.errorTracking.setViewDetector(this.viewDetector);\n this.errorTracking.setInteractionTracking(this.interactionTracking);\n }\n\n /**\n * 启用功能模块\n */\n private enableFeatures(): void {\n\n // 启用交互追踪\n if (this.config.enableInteractionTracking) {\n this.interactionTracking.startTracking();\n }\n\n // 启用 Vite HMR 检测器\n if (this.viteHMRDetector) {\n this.viteHMRDetector.initialize();\n }\n\n // 处理硬刷新相关逻辑\n this.handleHardRefreshLogic();\n\n // 设置视图检测\n this.setupViewDetection();\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 \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\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 \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 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 updateConfig(newConfig: Partial<typeof this.config>): void {\n this.config = { ...this.config, ...newConfig };\n }\n\n /**\n * 销毁错误处理器\n */\n public destroy(): void {\n try {\n // 销毁功能模块\n this.errorTracking.destroy();\n this.interactionTracking.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 } 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 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 } 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 }\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;","/**\n * iframe navigation and element selector utilities\n * Replaces the standalone iframe.js script\n */\n\ninterface NavigationState {\n navigationHistory: Array<{\n url: string;\n title: string;\n timestamp: number;\n }>;\n currentHistoryIndex: number;\n initialized: boolean;\n}\n\ninterface ElementSelectorState {\n active: boolean;\n callback: (() => void) | null;\n}\n\n// Initialize navigation state\nfunction getNavState(): NavigationState {\n if (typeof window === 'undefined') {\n return {\n navigationHistory: [],\n currentHistoryIndex: -1,\n initialized: false,\n };\n }\n\n if (!(window as any).customNavigationState) {\n (window as any).customNavigationState = {\n navigationHistory: [],\n currentHistoryIndex: -1,\n initialized: false,\n };\n }\n return (window as any).customNavigationState;\n}\n\n// Initialize element selector state\nfunction getElementSelectorState(): ElementSelectorState {\n if (typeof window === 'undefined') {\n return { active: false, callback: null };\n }\n\n if (!(window as any).elementSelectorState) {\n (window as any).elementSelectorState = {\n active: false,\n callback: null,\n };\n }\n return (window as any).elementSelectorState;\n}\n\n// Send navigation state to parent window\nfunction sendNavigationState(targetWindow: Window, targetOrigin: string) {\n const navState = getNavState();\n const canGoBack = navState.currentHistoryIndex > 0;\n const canGoForward =\n navState.currentHistoryIndex < navState.navigationHistory.length - 1;\n\n const state = {\n type: 'NAVIGATION_STATE',\n payload: {\n canGoBack,\n canGoForward,\n historyLength: navState.navigationHistory.length,\n currentIndex: navState.currentHistoryIndex,\n maxIndex: navState.navigationHistory.length - 1,\n },\n };\n\n if (targetWindow && targetOrigin) {\n try {\n targetWindow.postMessage(state, targetOrigin);\n } catch (e) {\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('Failed to send navigation state:', (e as Error).message);\n }\n }\n }\n}\n\n// Add to navigation history\nfunction addToNavigationHistory(url: string, title?: string) {\n const navState = getNavState();\n\n if (navState.currentHistoryIndex < navState.navigationHistory.length - 1) {\n navState.navigationHistory = navState.navigationHistory.slice(\n 0,\n navState.currentHistoryIndex + 1\n );\n }\n\n // Check for duplicate page\n const currentPage = navState.navigationHistory[navState.currentHistoryIndex];\n if (currentPage && currentPage.url === url) {\n return;\n }\n\n // Add new page to history\n const pageInfo = {\n url: url,\n title: title || (typeof document !== 'undefined' ? document.title : '') || url,\n timestamp: Date.now(),\n };\n\n navState.navigationHistory.push(pageInfo);\n navState.currentHistoryIndex = navState.navigationHistory.length - 1;\n\n // Send updated state\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n sendNavigationState(window.parent, '*');\n }\n}\n\n// Go back\nfunction customGoBack(): boolean {\n const navState = getNavState();\n if (navState.currentHistoryIndex > 0) {\n navState.currentHistoryIndex--;\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n sendNavigationState(window.parent, '*');\n }\n return true;\n }\n return false;\n}\n\n// Go forward\nfunction customGoForward(): boolean {\n const navState = getNavState();\n if (navState.currentHistoryIndex < navState.navigationHistory.length - 1) {\n navState.currentHistoryIndex++;\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n sendNavigationState(window.parent, '*');\n }\n return true;\n }\n return false;\n}\n\n// Trigger element selection\nfunction triggerElementSelection() {\n if (typeof window === 'undefined') return;\n\n const event = new CustomEvent('howone:start-element-selection');\n window.dispatchEvent(event);\n getElementSelectorState().active = true;\n}\n\n// Cancel element selection\nfunction cancelElementSelection() {\n if (typeof window === 'undefined') return;\n\n const event = new CustomEvent('howone:cancel-element-selection');\n window.dispatchEvent(event);\n getElementSelectorState().active = false;\n}\n\n// Handle page change\nfunction handlePageChange() {\n if (typeof window === 'undefined') return;\n const currentUrl = window.location.href;\n const currentTitle = document.title;\n addToNavigationHistory(currentUrl, currentTitle);\n}\n\n/**\n * Initialize iframe navigation system\n * Call this once when your app starts\n */\nexport function initIframeNavigation() {\n if (typeof window === 'undefined') return;\n\n const navState = getNavState();\n\n // Listen for ESC key\n window.addEventListener('keydown', function (e) {\n if (e.key === 'Escape' && getElementSelectorState().active) {\n cancelElementSelection();\n }\n });\n\n // Listen for messages from parent\n window.addEventListener('message', (event) => {\n try {\n const { type, payload } = event.data;\n\n switch (type) {\n case 'NAVIGATE_BACK':\n case 'GO_BACK':\n customGoBack();\n break;\n\n case 'NAVIGATE_FORWARD':\n case 'GO_FORWARD':\n customGoForward();\n break;\n\n case 'REQUEST_NAVIGATION_STATE':\n case 'CHECK_NAVIGATION_STATE':\n sendNavigationState(event.source as Window, event.origin);\n break;\n\n case 'START_ELEMENT_SELECTION':\n triggerElementSelection();\n break;\n\n case 'ELEMENT_SELECTED':\n if (event.source && event.source !== window) {\n window.parent.postMessage(\n {\n type: 'ELEMENT_SELECTED',\n payload: payload,\n },\n '*'\n );\n }\n break;\n\n case 'CANCEL_ELEMENT_SELECTION':\n cancelElementSelection();\n break;\n }\n } catch (e) {\n // Silent fail\n }\n });\n\n // Listen for popstate\n window.addEventListener('popstate', () => {\n setTimeout(() => {\n if (window.parent && window.parent !== window) {\n sendNavigationState(window.parent, '*');\n }\n }, 50);\n });\n\n // Listen for hashchange\n window.addEventListener('hashchange', () => {\n handlePageChange();\n });\n\n // Initialize on load\n window.addEventListener('load', () => {\n if (!navState.initialized) {\n addToNavigationHistory(window.location.href, document.title);\n navState.initialized = true;\n }\n\n setTimeout(() => {\n if (window.parent && window.parent !== window) {\n sendNavigationState(window.parent, '*');\n }\n }, 500);\n });\n\n // DOMContentLoaded event handling\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n if (!navState.initialized) {\n addToNavigationHistory(window.location.href, document.title);\n navState.initialized = true;\n }\n });\n } else if (!navState.initialized) {\n addToNavigationHistory(window.location.href, document.title);\n navState.initialized = true;\n }\n\n // Export global APIs for backward compatibility\n (window as any).iframeElementSelector = {\n startSelection: function () {\n triggerElementSelection();\n },\n };\n\n (window as any).iframeNavigation = {\n addPage: function (url?: string, title?: string) {\n addToNavigationHistory(\n url || window.location.href,\n title || document.title\n );\n },\n getState: function () {\n return {\n canGoBack: navState.currentHistoryIndex > 0,\n canGoForward:\n navState.currentHistoryIndex < navState.navigationHistory.length - 1,\n historyLength: navState.navigationHistory.length,\n currentIndex: navState.currentHistoryIndex,\n currentPage: navState.navigationHistory[navState.currentHistoryIndex],\n };\n },\n updateState: function () {\n if (window.parent && window.parent !== window) {\n sendNavigationState(window.parent, '*');\n }\n },\n };\n}\n\n/**\n * Public API for iframe navigation\n */\nexport const iframeNavigation = {\n /**\n * Initialize the navigation system\n */\n init: initIframeNavigation,\n\n /**\n * Add a page to navigation history\n */\n addPage: (url?: string, title?: string) => {\n if (typeof window === 'undefined') return;\n addToNavigationHistory(\n url || window.location.href,\n title || (typeof document !== 'undefined' ? document.title : '')\n );\n },\n\n /**\n * Get current navigation state\n */\n getState: () => {\n const navState = getNavState();\n return {\n canGoBack: navState.currentHistoryIndex > 0,\n canGoForward:\n navState.currentHistoryIndex < navState.navigationHistory.length - 1,\n historyLength: navState.navigationHistory.length,\n currentIndex: navState.currentHistoryIndex,\n currentPage: navState.navigationHistory[navState.currentHistoryIndex],\n };\n },\n\n /**\n * Update navigation state (send to parent)\n */\n updateState: () => {\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n sendNavigationState(window.parent, '*');\n }\n },\n\n /**\n * Go back in history\n */\n goBack: customGoBack,\n\n /**\n * Go forward in history\n */\n goForward: customGoForward,\n};\n\n/**\n * Public API for element selector\n */\nexport const elementSelector = {\n /**\n * Start element selection mode\n */\n startSelection: triggerElementSelection,\n\n /**\n * Cancel element selection mode\n */\n cancel: cancelElementSelection,\n\n /**\n * Check if selector is active\n */\n isActive: () => getElementSelectorState().active,\n};\n\n"],"mappings":"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","names":["env","getToken","setToken","import_react","import_jsx_runtime","email","code","import_react","import_react","import_jsx_runtime","theme","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","env","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_react_toastify","React","import_react","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","React","axios","config","env","React","import_react","import_react","getOriginalConsole","getOriginalConsole"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/auth/index.ts","../src/index.ts","../src/components/FloatingButton.tsx","../src/services/unified-oauth.ts","../src/components/auth/LoginForm.tsx","../src/components/auth/HowoneProvider.tsx","../src/components/theme/ThemeProvider.tsx","../src/components/ui/Toast/GlobalToastContainer.tsx","../src/components/ElementSelectorProvider.tsx","../src/components/ElementSelector.tsx","../src/hooks/use-element-selector.ts","../src/components/index.ts","../src/howone/client.ts","../src/components/ui/Loading.tsx","../src/components/ui/ErrorBoundary.tsx","../src/components/ui/ClayxButton.tsx","../src/components/ui/LimitUpgradeToast.tsx","../src/components/ui/Toast/ClayxToast.tsx","../src/components/theme/ThemeToggle.tsx","../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/sse-executor.ts","../src/services/sse-client.ts","../src/services/index.ts","../src/utils/urlSanitizer.ts","../src/services/workflow-stream.ts","../src/services/workflow-executor.ts","../src/hooks/use-mobile.ts","../src/hooks/use-debounce.ts","../src/hooks/use-workflow-stream.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/utils/SelectorUtils.ts","../src/utils/unified-error-handler/features/InteractionTracking.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/utils/iframe-navigation.ts"],"sourcesContent":["// Central auth configuration for howone-client\n// Default AUTH_ROOT can be overridden at runtime by calling setAuthRoot\nlet DEFAULT_PROJECT_ID: string | null = null\n\nexport type Environment = 'local' | 'dev' | 'prod'\n\nlet env: Environment = 'dev'\n\n\n\nexport type envs = {\n AUTH_ROOT_VALUE: string\n baseUrl: string\n aiBaseUrl: string\n}\n\nconst localEnv: envs = {\n AUTH_ROOT_VALUE: 'https://howone.dev',\n baseUrl: 'http://localhost:3002/api',\n aiBaseUrl: 'https://evoagentx-server.fly.dev',\n}\n\n// dev\nconst devEnv: envs = {\n AUTH_ROOT_VALUE: 'https://howone.dev',\n baseUrl: 'https://api.howone.dev/api',\n aiBaseUrl: 'https://evoagentx-server-stable.fly.dev',\n}\n\n// prod\nconst prodEnv: envs = {\n AUTH_ROOT_VALUE: 'https://howone.ai',\n baseUrl: 'https://api.howone.ai/api',\n aiBaseUrl: 'https://evoagentx-server-deploy.fly.dev',\n}\n\nconst envs = {\n local: localEnv,\n dev: devEnv,\n prod: prodEnv,\n}\n\nexport function setEnvironment(e: Environment) {\n env = e\n return envs[env] || envs['dev']\n}\n\nexport function getEnvironment() {\n return env\n}\n\nexport function getEnvs() {\n return envs[env] || envs['dev']\n}\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\n// Helper: Get environment from global variable (set by AI during code generation)\nexport function getGlobalEnvironment(): Environment | null {\n try {\n const g = (globalThis as any).__HOWONE_ENV__\n if (g === 'local' || g === 'dev' || g === 'prod') return g\n return 'prod'\n } catch {\n return 'prod'\n }\n}\n\n","// 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","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 { getDefaultProjectId, setDefaultProjectId } from './config'\n\n// Export iframe navigation utilities\nexport { iframeNavigation, elementSelector, initIframeNavigation } from './utils/iframe-navigation'\n\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 = 'Built with 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 */\nimport { getGlobalEnvironment } from \"../config\";\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\nconst API_BASE_URLS = {\n local: \"https://api.howone.dev\",\n dev: \"https://api.howone.dev\",\n prod: \"https://api.howone.ai\",\n} as const;\n\nconst detectEnvironmentFromHostname = (): \"local\" | \"dev\" | \"prod\" => {\n try {\n const hostname = window.location.hostname.toLowerCase();\n\n if (hostname.includes(\"howone.ai\")) {\n return \"prod\";\n }\n\n if (hostname.includes(\"howone.dev\")) {\n return \"dev\";\n }\n\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname.startsWith(\"192.168.\") || hostname.endsWith(\".local\")) {\n return \"local\";\n }\n\n const globalEnv = getGlobalEnvironment();\n if (globalEnv) {\n return globalEnv;\n }\n\n return \"prod\";\n } catch (error) {\n return getGlobalEnvironment() ?? \"dev\";\n }\n};\n\nconst resolveApiBaseUrl = () => {\n const env = detectEnvironmentFromHostname();\n return API_BASE_URLS[env] ?? API_BASE_URLS.dev;\n};\n\nclass UnifiedAuthService {\n private readonly API_BASE_URL = resolveApiBaseUrl();\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 console.log(\"Using API_BASE_URL:\", this.API_BASE_URL);\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 // 动态获取当前环境的 validOrigins\n const validOrigins = [\n window.location.origin,\n this.API_BASE_URL, // 使用当前环境的 API_BASE_URL\n \"https://api.howone.dev\",\n \"https://api.howone.ai\",\n ];\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 event.origin.includes(\"howone.dev\") ||\n event.origin.includes(\"howone.ai\")\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\") || urlParams.get('project_id');\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","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 }\n\n const githubLogin = async () => {\n // TODO: 实现GitHub登录\n }\n\n const sendEmailCode = async (email: string) => {\n // TODO: 实现发送验证码\n setCodeSent(true)\n }\n\n const loginWithEmail = async (email: string, code: string) => {\n // TODO: 实现邮箱登录\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, useMemo } from 'react'\nimport { getToken, parseUserFromToken, setToken } from '../../auth'\nimport { FloatingButton } from '../FloatingButton'\nimport { ThemeProvider } from '../theme/ThemeProvider'\nimport { GlobalToastContainer } from '../ui/Toast/GlobalToastContainer'\nimport { ElementSelectorProvider } from '../ElementSelectorProvider'\nimport { getGlobalEnvironment } from '../../config'\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\nlet redirectOverlayStylesInjected = false\nconst injectRedirectOverlayStyles = () => {\n if (redirectOverlayStylesInjected || typeof document === 'undefined') return\n const style = document.createElement('style')\n style.setAttribute('data-howone-auth-overlay', 'true')\n style.textContent = `\n@keyframes howone-logo-pulse {\n 0%, 100% {\n opacity: 0.2;\n transform: scale(0.95);\n filter: drop-shadow(0 0 0 rgba(255, 255, 255, 0.2));\n }\n 50% {\n opacity: 1;\n transform: scale(1.03);\n filter: drop-shadow(0 0 28px rgba(255, 255, 255, 0.55));\n }\n}\n\n@keyframes howone-glow-ring {\n 0%, 100% {\n opacity: 0.12;\n transform: scale(0.85);\n }\n 50% {\n opacity: 0.42;\n transform: scale(1.05);\n }\n}\n `\n document.head.appendChild(style)\n redirectOverlayStylesInjected = true\n}\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 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 * 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 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 const [pendingRedirect, setPendingRedirect] = useState(false)\n // Auto-capture token from URL on mount\n useEffect(() => {\n\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\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 } 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 const resolvedAuthUrl = useMemo(() => {\n const env = getGlobalEnvironment() ?? 'dev'\n switch (env) {\n case 'local':\n return 'http://localhost:3000/auth'\n case 'prod':\n return 'https://howone.ai/auth'\n case 'dev':\n default:\n return 'https://howone.dev/auth'\n }\n }, [])\n\n useEffect(() => {\n if (pendingRedirect) {\n injectRedirectOverlayStyles()\n }\n }, [pendingRedirect])\n\n useEffect(() => {\n if (pendingRedirect) {\n injectRedirectOverlayStyles()\n }\n }, [pendingRedirect])\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\n // Build auth URL with redirect_uri and project_id parameters\n try {\n const authUrlObj = new URL(resolvedAuthUrl)\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 setPendingRedirect(true)\n requestAnimationFrame(() => {\n window.location.href = authUrlObj.toString()\n })\n } catch (error) {\n // Fallback to simple redirect if URL construction fails\n console.error('[HowOneProvider] Failed to build auth URL:', error)\n setPendingRedirect(true)\n requestAnimationFrame(() => {\n window.location.href = resolvedAuthUrl\n })\n }\n }\n }\n }, [token, user, redirectOnUnauthenticated, resolvedAuthUrl, 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: hasCheckedUrlToken && !!token,\n logout\n }\n\n if (!hasCheckedUrlToken) return null\n\n return (\n <ThemeProvider\n defaultTheme={defaultTheme}\n storageKey={themeStorageKey}\n forceDefault={forceDefaultTheme}\n >\n <ElementSelectorProvider>\n <HowoneContext.Provider value={value}>\n {children}\n {showFloatingButton && (\n <FloatingButton onClick={() => window.open('https://howone.ai', '_blank')} />\n )}\n\n {pendingRedirect && (\n <div className=\"fixed inset-0 z-[10000] h-full w-full flex flex-col items-center justify-center bg-black/65 backdrop-blur-sm text-white\">\n <div className=\"relative mt-6 flex h-[220px] w-[220px] items-center justify-center\">\n <div\n className=\"absolute inset-0 rounded-full bg-white/20\"\n style={{ animation: 'howone-glow-ring 2.4s ease-in-out infinite' }}\n />\n <div className=\"absolute inset-0 rounded-full bg-gradient-to-br from-white/10 via-white/25 to-white/10 blur-2xl\" />\n <img\n style={{ width: 250, animation: 'howone-logo-pulse 2s ease-in-out infinite' }}\n src=\"https://sxwxqoixnnklnpeutjrj.supabase.co/storage/v1/object/public/create-x/logo/logo.svg\"\n alt=\"HowOne\"\n />\n </div>\n </div>\n )}\n </HowoneContext.Provider>\n </ElementSelectorProvider>\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","import React, { useEffect, useState, useCallback } from 'react'\nimport { ElementSelector, ElementSelectionData } from './ElementSelector'\nimport { sendElementSelectionToParent } from '../hooks/use-element-selector'\n\ninterface ElementSelectorProviderProps {\n children: React.ReactNode\n}\n\n/**\n * 元素选择器提供者组件\n * 监听来自 iframe.js 的自定义事件,自动显示/隐藏元素选择器\n */\nexport const ElementSelectorProvider: React.FC<ElementSelectorProviderProps> = ({ children }) => {\n const [isSelecting, setIsSelecting] = useState(false)\n\n const handleCancel = useCallback(() => {\n setIsSelecting(false)\n\n // 发送取消消息给父窗口\n if (window.parent && window.parent !== window) {\n window.parent.postMessage({\n type: 'ELEMENT_SELECTION_CANCELLED'\n }, '*')\n }\n }, [])\n\n const handleSelect = useCallback((data: ElementSelectionData) => {\n // 发送给父窗口\n sendElementSelectionToParent(data)\n }, [])\n\n useEffect(() => {\n // 监听来自 iframe.js 的自定义事件\n const handleStartSelection = () => {\n setIsSelecting(true)\n }\n\n // 监听取消选择事件\n const handleCancelSelection = () => {\n handleCancel()\n }\n\n window.addEventListener('howone:start-element-selection', handleStartSelection)\n window.addEventListener('howone:cancel-element-selection', handleCancelSelection)\n\n // 也监听 postMessage(备用)\n const handleMessage = (event: MessageEvent) => {\n if (event.data.type === 'START_ELEMENT_SELECTION') {\n setIsSelecting(true)\n } else if (event.data.type === 'CANCEL_ELEMENT_SELECTION') {\n handleCancel()\n }\n }\n\n window.addEventListener('message', handleMessage)\n\n return () => {\n window.removeEventListener('howone:start-element-selection', handleStartSelection)\n window.removeEventListener('howone:cancel-element-selection', handleCancelSelection)\n window.removeEventListener('message', handleMessage)\n }\n }, [handleCancel])\n\n return (\n <>\n {children}\n <ElementSelector\n active={isSelecting}\n onSelect={handleSelect}\n onCancel={handleCancel}\n />\n </>\n )\n}\n\n","import React, { useEffect, useState, useCallback, useRef } from 'react'\n\nexport interface SourceLocation {\n file: string\n line: number\n component: string\n}\n\nexport interface ElementSelectionData {\n sourceLocation: SourceLocation | null\n element: {\n tagName: string\n className: string\n id: string\n text: string\n }\n rect: {\n top: number\n left: number\n width: number\n height: number\n }\n}\n\ninterface ElementSelectorProps {\n active: boolean\n onSelect?: (data: ElementSelectionData) => void\n onCancel?: () => void\n}\n\nexport const ElementSelector: React.FC<ElementSelectorProps> = ({\n active,\n onSelect,\n onCancel\n}) => {\n const [hoveredElement, setHoveredElement] = useState<HTMLElement | null>(null)\n const [highlightRect, setHighlightRect] = useState<DOMRect | null>(null)\n const overlayRef = useRef<HTMLDivElement>(null)\n\n const getSourceLocation = useCallback((element: HTMLElement): SourceLocation | null => {\n let current: HTMLElement | null = element\n\n while (current && current !== document.body) {\n const sourceLocationAttr = current.getAttribute('data-source-location')\n if (sourceLocationAttr) {\n try {\n return JSON.parse(sourceLocationAttr.replace(/"/g, '\"'))\n } catch (e) {\n console.error('Failed to parse source location:', e)\n }\n }\n current = current.parentElement\n }\n\n return null\n }, [])\n\n const handleMouseMove = useCallback((e: MouseEvent) => {\n if (!active) return\n\n const elements = document.elementsFromPoint(e.clientX, e.clientY)\n const targetElement = elements.find(el =>\n el !== overlayRef.current &&\n !overlayRef.current?.contains(el) &&\n el !== document.body &&\n el !== document.documentElement\n ) as HTMLElement | undefined\n\n if (targetElement && targetElement !== hoveredElement) {\n setHoveredElement(targetElement)\n const rect = targetElement.getBoundingClientRect()\n setHighlightRect(rect)\n }\n }, [active, hoveredElement])\n\n const handleClick = useCallback((e: MouseEvent) => {\n if (!active || !hoveredElement) return\n\n e.preventDefault()\n e.stopPropagation()\n\n const sourceLocation = getSourceLocation(hoveredElement)\n const rect = hoveredElement.getBoundingClientRect()\n\n const elementData = {\n sourceLocation,\n element: {\n tagName: hoveredElement.tagName,\n className: hoveredElement.className,\n id: hoveredElement.id,\n text: hoveredElement.textContent?.substring(0, 100) || ''\n },\n rect: {\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height\n }\n }\n\n if (onSelect) {\n onSelect(elementData)\n // 选中元素后自动关闭选择模式\n if (onCancel) {\n onCancel()\n }\n }\n }, [active, hoveredElement, getSourceLocation, onSelect, onCancel])\n\n useEffect(() => {\n if (active) {\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('click', handleClick, true)\n document.body.style.overflow = 'hidden'\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('click', handleClick, true)\n document.body.style.overflow = ''\n }\n } else {\n setHoveredElement(null)\n setHighlightRect(null)\n }\n }, [active, handleMouseMove, handleClick])\n\n if (!active) return null\n\n return (\n <>\n <div\n ref={overlayRef}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.3)',\n zIndex: 999998,\n cursor: 'crosshair',\n pointerEvents: 'none'\n }}\n />\n\n {highlightRect && (\n <div\n style={{\n position: 'fixed',\n top: highlightRect.top,\n left: highlightRect.left,\n width: highlightRect.width,\n height: highlightRect.height,\n border: '2px dashed #36D2A6',\n borderRadius: '5px',\n backgroundColor: 'rgba(54, 210, 166, 0.1)',\n zIndex: 999999,\n pointerEvents: 'none',\n transition: 'all 0.1s ease'\n }}\n />\n )}\n\n {hoveredElement && highlightRect && (\n <div\n style={{\n position: 'fixed',\n top: highlightRect.top - 30,\n left: highlightRect.left,\n backgroundColor: '#36D2A6',\n color: 'white',\n padding: '4px 8px',\n borderRadius: '4px',\n fontSize: '12px',\n zIndex: 1000000,\n pointerEvents: 'none',\n whiteSpace: 'nowrap'\n }}\n >\n {(() => {\n const location = getSourceLocation(hoveredElement)\n return location\n ? `${location.component} (${location.file}:${location.line})`\n : hoveredElement.tagName.toLowerCase()\n })()}\n </div>\n )}\n </>\n )\n}\n\n","import { useState, useCallback } from 'react'\nimport type { ElementSelectionData } from '../components/ElementSelector'\n\nexport interface UseElementSelectorReturn {\n isSelecting: boolean\n selectedElement: ElementSelectionData | null\n startSelecting: () => void\n stopSelecting: () => void\n clearSelection: () => void\n}\n\n/**\n * 元素选择器 Hook\n * 用于管理元素选择状态和向父窗口发送消息\n */\nexport function useElementSelector(): UseElementSelectorReturn {\n const [isSelecting, setIsSelecting] = useState(false)\n const [selectedElement, setSelectedElement] = useState<ElementSelectionData | null>(null)\n\n const startSelecting = useCallback(() => {\n setIsSelecting(true)\n }, [])\n\n const stopSelecting = useCallback(() => {\n setIsSelecting(false)\n }, [])\n\n const clearSelection = useCallback(() => {\n setSelectedElement(null)\n }, [])\n\n return {\n isSelecting,\n selectedElement,\n startSelecting,\n stopSelecting,\n clearSelection\n }\n}\n\n/**\n * 向父窗口发送元素选择数据\n */\nexport function sendElementSelectionToParent(data: ElementSelectionData) {\n if (window.parent && window.parent !== window) {\n window.parent.postMessage({\n type: 'ELEMENT_SELECTED',\n payload: data\n }, '*')\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'\nexport { ClayxButton } from './ui/ClayxButton'\nexport { showLimitUpgradeToast } from './ui/LimitUpgradeToast'\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\n// Element Selector Components\nexport { ElementSelector } from './ElementSelector'\nexport { ElementSelectorProvider } from './ElementSelectorProvider'\nexport type { SourceLocation, ElementSelectionData } from './ElementSelector'\n","import { getToken, setToken, parseUserFromToken } from '../auth'\nimport { getEnvs } 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 = getEnvs().AUTH_ROOT_VALUE\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","import React from \"react\";\n\ntype ButtonSize = \"sm\" | \"md\" | \"lg\";\ntype ButtonVariant = \"solid\" | \"ghost\" | \"flat\";\n\ninterface ClayxButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n isIconOnly?: boolean;\n size?: ButtonSize;\n variant?: ButtonVariant;\n children?: React.ReactNode;\n}\n\nconst getSizeClasses = (size: ButtonSize, isIconOnly: boolean): string => {\n if (isIconOnly) {\n switch (size) {\n case \"sm\":\n return \"h-8 w-8 min-w-8 p-0\";\n case \"md\":\n return \"h-10 w-10 min-w-10 p-0\";\n case \"lg\":\n return \"h-12 w-12 min-w-12 p-0\";\n default:\n return \"h-10 w-10 min-w-10 p-0\";\n }\n }\n\n switch (size) {\n case \"sm\":\n return \"h-8 px-3 text-sm\";\n case \"md\":\n return \"h-10 px-4 text-base\";\n case \"lg\":\n return \"h-12 px-6 text-lg\";\n default:\n return \"h-10 px-4 text-base\";\n }\n};\n\nconst getVariantClasses = (variant: ButtonVariant): string => {\n switch (variant) {\n case \"solid\":\n return \"bg-primary text-white hover:bg-primary/90\";\n case \"ghost\":\n return \"bg-transparent hover:bg-white/10\";\n case \"flat\":\n return \"bg-white/5 hover:bg-white/10\";\n default:\n return \"\";\n }\n};\n\nexport const ClayxButton: React.FC<ClayxButtonProps> = ({\n isIconOnly = false,\n size = \"md\",\n variant = \"solid\",\n className = \"\",\n children,\n disabled = false,\n ...props\n}) => {\n const sizeClasses = getSizeClasses(size, isIconOnly);\n const variantClasses = getVariantClasses(variant);\n\n const baseClasses = `\n inline-flex items-center justify-center\n rounded-md font-medium\n transition-all duration-200\n focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-transparent\n disabled:opacity-50 disabled:cursor-not-allowed disabled:pointer-events-none\n `.replace(/\\s+/g, \" \").trim();\n\n const combinedClasses = `${baseClasses} ${sizeClasses} ${variantClasses} ${className}`.trim();\n\n return (\n <button\n className={combinedClasses}\n disabled={disabled}\n {...props}\n >\n {children}\n </button>\n );\n};\n","import React from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { ClayxToast } from \"./Toast/ClayxToast\";\nimport { ClayxButton } from \"./ClayxButton\";\n\nconst LimitToastContainer: React.FC<{\n message: string;\n onUpgrade: () => void;\n closeToast?: () => void;\n}> = ({ message, onUpgrade, closeToast }) => {\n const [hover, setHover] = React.useState(false);\n const [closeHover, setCloseHover] = React.useState(false);\n return (\n <div className=\"relative w-full max-w-[420px] overflow-hidden rounded-md bg-gradient-to-br from-[#1A1A1A] via-[#151515] to-[#1A1A1A] shadow-[0_20px_60px_rgba(168,85,247,0.2)] backdrop-blur-sm\">\n <div\n className=\"absolute left-0 top-0 w-full h-full rounded-md\"\n style={{\n background: '#0f1419',\n zIndex: -2,\n }}\n />\n\n <div\n className=\"absolute left-0 top-0 w-full h-full pointer-events-none rounded-md\"\n style={{\n background: `linear-gradient(135deg, rgba(168,85,247,0.3) 0%, rgba(168,85,247,0.2) 15%, #1A1A1A 30%)`,\n zIndex: -1,\n }}\n />\n\n <div\n className=\"absolute left-0 top-0 w-full h-full pointer-events-none rounded-md\"\n style={{\n border: '2px solid transparent',\n backgroundImage: `linear-gradient(135deg, rgba(168,85,247,0.6) 0%, rgba(168,85,247,0.4) 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=\"absolute -top-16 -right-16 h-32 w-32 rounded-full bg-gradient-to-br from-purple-500/20 via-pink-500/10 to-transparent blur-3xl animate-pulse\" />\n <div className=\"absolute -bottom-16 -left-16 h-32 w-32 rounded-full bg-gradient-to-tr from-blue-500/10 to-transparent blur-2xl animate-pulse\" style={{ animationDelay: '1s' }} />\n\n <div className=\"relative z-10 flex items-start gap-4 p-4\">\n <div className=\"flex flex-1 flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <div className=\"text-lg font-bold text-white\">\n Upgrade Required\n </div>\n <div className=\"px-2 py-0.5 text-xs font-bold bg-purple-500/20 text-purple-400 rounded-md border border-purple-500/30\">\n Premium\n </div>\n </div>\n <ClayxButton\n onClick={closeToast}\n isIconOnly\n size=\"sm\"\n onMouseEnter={() => setCloseHover(true)}\n onMouseLeave={() => setCloseHover(false)}\n style={{\n height: '1.5rem',\n width: '1.5rem',\n minWidth: '1.5rem',\n borderRadius: '9999px',\n backgroundColor: closeHover ? 'rgba(255,255,255,0.1)' : 'rgba(255,255,255,0.05)',\n transition: 'background-color 150ms ease',\n cursor: 'pointer',\n }}\n >\n <Icon icon=\"iconamoon:close\" className=\"w-4 h-4 text-gray-400\" />\n </ClayxButton>\n </div>\n\n <p className=\"text-sm text-gray-300 leading-relaxed\">\n {message}\n </p>\n\n <div className=\"mt-1 flex items-center gap-3\">\n <ClayxButton\n onClick={() => {\n onUpgrade();\n closeToast?.();\n }}\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n style={{\n flex: 1,\n color: '#ffffff',\n fontWeight: 600,\n cursor: 'pointer',\n transition: 'all 300ms ease-in-out',\n backgroundImage: hover\n ? 'linear-gradient(to right, #9333ea, #db2777)'\n : 'linear-gradient(to right, #a855f7, #ec4899)',\n boxShadow: hover\n ? '0 10px 15px -3px rgba(168,85,247,0.3), 0 4px 6px -2px rgba(168,85,247,0.3)'\n : 'none',\n }}\n >\n <span className=\"flex items-center gap-2\">\n <Icon icon=\"solar:rocket-2-bold\" className=\"w-4 h-4\" />\n Upgrade Now\n </span>\n </ClayxButton>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport function showLimitUpgradeToast(message: string, onUpgrade: () => void) {\n ClayxToast.default({\n render: (closeToast) => (\n <LimitToastContainer message={message} onUpgrade={onUpgrade} closeToast={closeToast} />\n ),\n options: {\n position: \"bottom-right\",\n closeOnClick: false,\n autoClose: false,\n hideProgressBar: true,\n draggable: false,\n pauseOnHover: true,\n className: \"!bg-transparent !shadow-none\",\n style: {\n background: \"transparent\",\n padding: 0,\n width: \"auto\",\n maxWidth: \"420px\",\n },\n },\n });\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 const lightBaseBackgroundByType: Record<ToastType, string> = {\n success: '#f0fdf4', // green-50\n error: '#fef2f2', // red-50\n warning: '#fffbeb', // amber-50\n info: '#eff6ff', // blue-50\n default: '#f9fafb', // gray-50\n };\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 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 : lightBaseBackgroundByType[type],\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}20 0%, ${themeConfig.gradientColor}12 15%, #ffffff 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}99 0%, ${themeConfig.borderGradientColor}66 5%, transparent 22%)`,\n backgroundOrigin: 'border-box',\n backgroundClip: 'border-box',\n WebkitMask: 'linear-gradient(#ffffff 0 0) padding-box, linear-gradient(#ffffff 0 0)',\n WebkitMaskComposite: 'xor',\n zIndex: 0\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 ${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 transition: Bounce,\n};\n\nconst getToastifyTheme = (): ToastOptions['theme'] => {\n if (typeof window !== 'undefined') {\n const root = document.documentElement;\n if (root.classList.contains('dark')) return 'dark';\n if (root.classList.contains('light')) return 'light';\n return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n};\n\ninterface ToastParams {\n title?: string;\n message?: string;\n render?: (closeToast: () => void) => React.ReactNode\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\n if (params.render) return params.render(closeToast);\n\n return <ToastContent\n type={type}\n title={title}\n message={message || ''}\n component={component}\n closeToast={closeToast}\n />\n },\n {\n ...defaultToastOptions,\n ...options,\n theme: getToastifyTheme(),\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","\"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}","/**\n * AI Workflow 服务(精简版,仅支持按 ID 的 path 风格执行)\n *\n * 说明:模板仅需要一种执行接口,形如 POST {baseUrl}/workflow/{workflowId}/execute\n */\n\nimport { showLimitUpgradeToast } from \"../components\"\n\nexport interface AIWorkflowResponse {\n success: boolean\n status?: number\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 | null> {\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) as AIWorkflowResponse\n\n if (!res.ok) {\n return { success: false, error: (data as any)?.error || `HTTP ${res.status}` }\n }\n\n\n if (data && data.status && data.status === 4003) {\n showLimitUpgradeToast(\n 'Your credits are exhausted. Please upgrade your plan to continue generating projects.',\n () => window.open('https://clayx.ai/pricing', '_blank')\n )\n return null\n }\n\n return (data) || { 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","/**\n * 统一的 SSE 工作流执行模块\n * \n * 集成所有 SSE 相关功能:\n * - 流式执行 (streaming execution)\n * - 事件处理 (event handling)\n * - 完整数据收集 (complete data collection)\n * - 上下文管理 (context management)\n * \n * 提供统一的 API 给 client 使用\n */\n\n// ============================================================\n// 事件类型定义\n// ============================================================\n\nexport interface SSEEventPayload {\n type: string\n data?: Record<string, unknown>\n [key: string]: unknown\n}\n\nexport interface NodeExecution {\n nodeName: string\n content: string\n timestamp: number\n}\n\nexport interface CostUpdate {\n token: number\n totalToken: number\n cost: number\n totalCost: number\n timestamp: number\n}\n\nexport interface ExecutionResult {\n success: boolean\n finalResult: Record<string, unknown> | null\n nodeExecutions: NodeExecution[]\n costUpdates: CostUpdate[]\n totalDuration: number\n errors: string[]\n}\n\n// ============================================================\n// 回调选项\n// ============================================================\n\nexport interface SSEExecutionOptions {\n onEvent?: (event: SSEEventPayload) => void\n onNodeStart?: (nodeName: string, content: string) => void\n onStreamContent?: (delta: string) => void\n onCostUpdate?: (cost: CostUpdate) => void\n onProgress?: (progress: number) => void\n onLog?: (message: string) => void\n onStreamChunk?: (chunk: string) => void\n onError?: (error: Error) => void\n onComplete?: (result: ExecutionResult) => void\n signal?: AbortSignal\n}\n\nexport interface SSEWorkflowRequestInit {\n url: string\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n body?: Record<string, unknown>\n headers?: Record<string, string>\n}\n\n// ============================================================\n// 核心执行引擎\n// ============================================================\n\nexport async function executeSSEWorkflow(\n request: SSEWorkflowRequestInit,\n options: SSEExecutionOptions & { authToken?: string } = {}\n): Promise<ExecutionResult> {\n const startTime = Date.now()\n const result: ExecutionResult = {\n success: false,\n finalResult: null,\n nodeExecutions: [],\n costUpdates: [],\n totalDuration: 0,\n errors: []\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'text/event-stream',\n ...(request.headers || {})\n }\n\n if (options.authToken) {\n headers['Authorization'] = `Bearer ${options.authToken}`\n }\n\n const method = request.method?.toUpperCase() as SSEWorkflowRequestInit['method'] ?? 'POST'\n const hasBody = request.body && Object.keys(request.body).length > 0\n if (method === 'GET') {\n delete headers['Content-Type']\n }\n\n try {\n const response = await fetch(request.url, {\n method,\n headers,\n body: method === 'GET' ? undefined : hasBody ? JSON.stringify(request.body) : undefined,\n signal: options.signal\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new Error('Response body is not readable')\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n let eventCount = 0\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const rawEvent = JSON.parse(line.slice(6))\n eventCount++\n\n // 处理 execution_log 事件\n if (rawEvent.type === 'execution_log' && rawEvent.data) {\n const logData = rawEvent.data as Record<string, unknown>\n const logType = logData.log_type as string\n\n // node_start 事件\n if (logType === 'node_start') {\n const logResult = logData.result as Record<string, unknown> | undefined\n const nodeName = (logResult?.next_node_name as string) || 'unknown'\n const nodeExec: NodeExecution = {\n nodeName,\n content: logData.content as string,\n timestamp: Date.now()\n }\n result.nodeExecutions.push(nodeExec)\n\n if (options.onNodeStart) {\n options.onNodeStart(nodeName, logData.content as string)\n }\n }\n\n // cost_update 事件\n if (logType === 'cost_update') {\n const logResult = logData.result as Record<string, unknown> | undefined\n const costUpdate: CostUpdate = {\n token: (logResult?.current_token as number) || 0,\n totalToken: (logResult?.total_token as number) || 0,\n cost: (logResult?.current_cost as number) || 0,\n totalCost: (logResult?.total_cost as number) || 0,\n timestamp: Date.now()\n }\n result.costUpdates.push(costUpdate)\n\n if (options.onCostUpdate) {\n options.onCostUpdate(costUpdate)\n }\n }\n\n // 检查是否有流式内容\n if (logData.delta && options.onStreamContent) {\n options.onStreamContent(logData.delta as string)\n }\n }\n\n // 处理 stream 事件(流式内容)\n if (rawEvent.type === 'stream' && rawEvent.delta && options.onStreamContent) {\n options.onStreamContent(rawEvent.delta as string)\n }\n\n // 处理 execution_complete 事件\n if (rawEvent.type === 'execution_complete' && rawEvent.data) {\n const eventData = rawEvent.data as Record<string, unknown>\n const eventResult = eventData.result as Record<string, unknown> | undefined\n result.finalResult = (eventResult?.original_message as Record<string, unknown>) || eventResult || null\n result.success = true\n }\n\n // 触发通用事件处理\n if (options.onEvent) {\n options.onEvent(rawEvent)\n }\n\n // 进度更新\n if (options.onProgress) {\n const progress = Math.min(90, (eventCount / 15) * 100)\n options.onProgress(progress)\n }\n } catch (error) {\n const msg = `Failed to parse SSE event: ${error}`\n result.errors.push(msg)\n if (options.onLog) {\n options.onLog(msg)\n }\n }\n }\n }\n }\n\n reader.releaseLock()\n result.totalDuration = Date.now() - startTime\n\n if (options.onProgress) {\n options.onProgress(100)\n }\n\n if (options.onComplete) {\n options.onComplete(result)\n }\n\n return result\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n result.errors.push(err.message)\n result.totalDuration = Date.now() - startTime\n\n if (options.onError) {\n options.onError(err)\n }\n\n throw error\n }\n}\n\n// ============================================================\n// SSE 请求对象 (用于 client.sseRequest)\n// ============================================================\n\nexport interface SSERequest {\n (config: {\n // 新方式:只需传 workflowId 和 inputs(projectId 由 client 内部管理)\n workflowId?: string\n inputs?: Record<string, unknown>\n // 旧方式:自定义 URL 和请求体\n url?: string\n body?: Record<string, unknown>\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n headers?: Record<string, string>\n signal?: AbortSignal\n onEvent?: (event: SSEEventPayload) => void\n onNodeStart?: (nodeName: string, content: string) => void\n onStreamContent?: (delta: string) => void\n onCostUpdate?: (cost: CostUpdate) => void\n onProgress?: (progress: number) => void\n onLog?: (message: string) => void\n onStreamChunk?: (chunk: string) => void\n onError?: (error: Error) => void\n onComplete?: (result: ExecutionResult) => void\n }): Promise<ExecutionResult>\n}\n\nexport function createSSERequest(\n baseUrl: string,\n projectId?: string,\n getAuthToken?: () => string | null\n): SSERequest {\n const ensureUrl = (path: string): string => {\n if (path.startsWith('http://') || path.startsWith('https://')) {\n return path\n }\n return `${baseUrl}${path.startsWith('/') ? '' : '/'}${path}`\n }\n\n return async (config) => {\n // 支持新方式:workflowId + inputs + projectId\n let url: string\n let body: Record<string, unknown>\n\n if (config.workflowId && projectId) {\n // 新方式:自动构建 SSE 执行 URL\n url = ensureUrl(`/workflow/${projectId}/${config.workflowId}/execute_sse`)\n body = { inputs: config.inputs || {} }\n } else {\n // 旧方式:使用自定义 URL 和请求体\n url = ensureUrl(config.url || '')\n body = config.body || {}\n }\n\n const authToken = getAuthToken?.() || undefined\n\n return executeSSEWorkflow({\n url,\n method: config.method,\n body,\n headers: config.headers\n }, {\n authToken: authToken as string | undefined,\n onEvent: config.onEvent,\n onNodeStart: config.onNodeStart,\n onStreamContent: config.onStreamContent,\n onCostUpdate: config.onCostUpdate,\n onProgress: config.onProgress,\n onLog: config.onLog,\n onStreamChunk: config.onStreamChunk,\n onError: config.onError,\n onComplete: config.onComplete,\n signal: config.signal\n })\n }\n}\n","import {\n executeSSEWorkflow,\n type ExecutionResult,\n type SSEEventPayload,\n type SSEExecutionOptions,\n} from \"./sse-executor\";\n\ntype SSEStreamCallbacks = Omit<SSEExecutionOptions, \"signal\" | \"authToken\">;\n\nexport type SSEStreamConfig = {\n workflowId?: string;\n inputs?: Record<string, unknown>;\n url?: string;\n body?: Record<string, unknown>;\n method?: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n headers?: Record<string, string>;\n signal?: AbortSignal;\n} & SSEStreamCallbacks;\n\nexport type SSEWorkflowOptions = Omit<\n SSEStreamConfig,\n \"workflowId\" | \"inputs\" | \"url\" | \"body\"\n>;\n\nexport interface SSESession {\n /** Promise for the underlying execution result. */\n result: Promise<ExecutionResult>;\n /** Abort the running SSE request. Safe to call multiple times. */\n cancel: () => void;\n /** The abort signal used for the fetch call. */\n signal: AbortSignal;\n}\n\nexport interface SSEClientConfig {\n baseUrl: string;\n projectId?: string;\n getAuthToken?: () => string | null;\n}\n\nexport interface SSEClient {\n /**\n * Starts an SSE session (workflowId or url required) and returns controls.\n * The returned session starts immediately.\n */\n stream(config: SSEStreamConfig): SSESession;\n\n /**\n * Convenience wrapper over `stream` that resolves once the SSE completes.\n */\n execute(config: SSEStreamConfig): Promise<ExecutionResult>;\n\n /**\n * Workflow-specific sugar for `stream`.\n */\n streamWorkflow(\n workflowId: string,\n inputs?: Record<string, unknown>,\n options?: SSEWorkflowOptions\n ): SSESession;\n\n /**\n * Workflow-specific sugar for `execute`.\n */\n executeWorkflow(\n workflowId: string,\n inputs?: Record<string, unknown>,\n options?: SSEWorkflowOptions\n ): Promise<ExecutionResult>;\n\n /**\n * Returns an async iterable of raw SSE events. Useful for `for await`.\n * Note: the iterable owns the session and ensures cleanup on completion.\n */\n events(config: SSEStreamConfig): AsyncIterable<SSEEventPayload>;\n\n /**\n * Workflow-specific sugar for `events`.\n */\n workflowEvents(\n workflowId: string,\n inputs?: Record<string, unknown>,\n options?: SSEWorkflowOptions\n ): AsyncIterable<SSEEventPayload>;\n}\n\ntype ResolvedRequest = {\n url: string;\n body: Record<string, unknown>;\n method?: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n headers?: Record<string, string>;\n};\n\nfunction ensureAbsoluteUrl(baseUrl: string, path: string): string {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (!path.startsWith(\"/\")) return `${baseUrl}/${path}`;\n return `${baseUrl}${path}`;\n}\n\nfunction resolveRequest(\n baseUrl: string,\n projectId: string | undefined,\n config: SSEStreamConfig\n): ResolvedRequest {\n if (config.workflowId) {\n if (!projectId) {\n throw new Error(\"workflowId provided but client is missing projectId\");\n }\n const workflowUrl = `/workflow/${projectId}/${config.workflowId}/execute_sse`;\n return {\n url: ensureAbsoluteUrl(baseUrl, workflowUrl),\n body: { inputs: config.inputs ?? {} },\n method: config.method ?? \"POST\",\n headers: config.headers,\n };\n }\n\n if (!config.url) {\n throw new Error(\"SSE stream requires either workflowId or url\");\n }\n\n return {\n url: ensureAbsoluteUrl(baseUrl, config.url),\n body: config.body ?? {},\n method: config.method,\n headers: config.headers,\n };\n}\n\nfunction createLinkedAbortController(\n externalSignal?: AbortSignal\n): { signal: AbortSignal; cancel: () => void; cleanup: () => void } {\n const controller = new AbortController();\n const abort = () => {\n if (!controller.signal.aborted) {\n controller.abort();\n }\n };\n\n if (externalSignal) {\n if (externalSignal.aborted) {\n abort();\n } else {\n externalSignal.addEventListener(\"abort\", abort);\n }\n }\n\n const cleanup = () => {\n if (externalSignal) {\n externalSignal.removeEventListener(\"abort\", abort);\n }\n };\n\n return { signal: controller.signal, cancel: abort, cleanup };\n}\n\nfunction createEventIterable(\n streamFactory: (config: SSEStreamConfig) => SSESession,\n config: SSEStreamConfig\n): AsyncIterable<SSEEventPayload> {\n return {\n async *[Symbol.asyncIterator]() {\n const queue: SSEEventPayload[] = [];\n const waiters: Array<{\n resolve: (value: SSEEventPayload) => void;\n reject: (error: unknown) => void;\n }> = [];\n let completed = false;\n let failure: Error | null = null;\n\n const session = streamFactory({\n ...config,\n onEvent: (event) => {\n config.onEvent?.(event);\n if (waiters.length) {\n const waiter = waiters.shift();\n waiter?.resolve(event);\n } else {\n queue.push(event);\n }\n },\n onError: (error) => {\n config.onError?.(error);\n failure = error instanceof Error ? error : new Error(String(error));\n while (waiters.length) {\n waiters.shift()?.reject(failure);\n }\n },\n onComplete: (result) => {\n config.onComplete?.(result);\n completed = true;\n while (waiters.length) {\n waiters.shift()?.resolve(undefined as unknown as SSEEventPayload);\n }\n },\n });\n\n try {\n while (true) {\n if (queue.length) {\n yield queue.shift() as SSEEventPayload;\n continue;\n }\n\n if (failure) {\n throw failure;\n }\n\n if (completed) {\n break;\n }\n\n // Wait for next event or completion\n try {\n const event = await new Promise<SSEEventPayload>((resolve, reject) =>\n waiters.push({ resolve, reject })\n );\n if (completed && queue.length === 0 && event === undefined) {\n break;\n }\n if (event !== undefined) {\n yield event;\n }\n } catch (error) {\n throw error;\n }\n }\n } finally {\n session.cancel();\n try {\n await session.result;\n } catch {\n // ignore abort errors\n }\n }\n\n if (failure) {\n throw failure;\n }\n },\n };\n}\n\nexport function createSSEClient(config: SSEClientConfig): SSEClient {\n const { baseUrl, projectId, getAuthToken } = config;\n\n const stream = (streamConfig: SSEStreamConfig): SSESession => {\n const { signal: externalSignal, ...callbacks } = streamConfig;\n const request = resolveRequest(baseUrl, projectId, streamConfig);\n const authToken = getAuthToken?.() ?? undefined;\n const controller = createLinkedAbortController(externalSignal);\n\n const result = executeSSEWorkflow(\n {\n url: request.url,\n method: request.method,\n body: request.body,\n headers: request.headers,\n },\n {\n ...callbacks,\n authToken,\n signal: controller.signal,\n }\n ).finally(() => {\n controller.cleanup();\n });\n\n return {\n result,\n cancel: controller.cancel,\n signal: controller.signal,\n };\n };\n\n const execute = (executeConfig: SSEStreamConfig) => stream(executeConfig).result;\n\n const streamWorkflow = (\n workflowId: string,\n inputs?: Record<string, unknown>,\n options: SSEWorkflowOptions = {}\n ) =>\n stream({\n workflowId,\n inputs,\n ...options,\n });\n\n const executeWorkflow = (\n workflowId: string,\n inputs?: Record<string, unknown>,\n options: SSEWorkflowOptions = {}\n ) =>\n execute({\n workflowId,\n inputs,\n ...options,\n });\n\n const events = (eventConfig: SSEStreamConfig) =>\n createEventIterable(stream, eventConfig);\n\n const workflowEvents = (\n workflowId: string,\n inputs?: Record<string, unknown>,\n options: SSEWorkflowOptions = {}\n ) =>\n events({\n workflowId,\n inputs,\n ...options,\n });\n\n return {\n stream,\n execute,\n streamWorkflow,\n executeWorkflow,\n events,\n workflowEvents,\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 \"./sse-executor\"; // 统一的 SSE 执行模块 (推荐使用)\nexport * from \"./sse-client\";\nexport * from \"../auth\";\nexport * from \"../config\";\nimport { getEnvs, setDefaultProjectId, setEnvironment, getGlobalEnvironment } 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 } from \"../utils/urlSanitizer\";\nimport { RequestConfig } from \"./request/types\";\nimport { showLimitUpgradeToast } from \"../components\";\nimport { executeWorkflowStreamPost, type WorkflowStreamOptions, type WorkflowStreamResponse } from \"./workflow-stream\";\nimport { WorkflowExecutor, type WorkflowExecutorOptions, type ParsedWorkflowResult } from \"./workflow-executor\";\nimport { type ExecutionResult } from \"./sse-executor\";\nimport { createSSEClient, type SSEClient, type SSEStreamConfig } from \"./sse-client\";\n\ntype LegacySSERequestFunction = (config: SSEStreamConfig) => Promise<ExecutionResult>;\ntype LegacySSERequest = LegacySSERequestFunction & {\n stream: SSEClient[\"stream\"];\n execute: SSEClient[\"execute\"];\n events: SSEClient[\"events\"];\n streamWorkflow: SSEClient[\"streamWorkflow\"];\n executeWorkflow: SSEClient[\"executeWorkflow\"];\n workflowEvents: SSEClient[\"workflowEvents\"];\n};\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\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/**\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 env?: 'local' | 'dev' | 'prod';\n baseUrl?: string; // 自定义 baseUrl,优先级最高\n authRequired?: boolean;\n mode?: \"auto\" | \"standalone\" | \"embedded\";\n auth?: {\n mode?: \"none\" | \"managed\" | \"headless\";\n getToken?: () => Promise<string | null>;\n tokenCacheMs?: number;\n tokenInjection?: {\n allowedOrigins?: string[];\n waitMs?: number;\n clearUrlParamsAfterInjectionMs?: number;\n clearAllUrlParams?: boolean;\n sensitiveParams?: string[];\n };\n };\n}) {\n // Priority: explicit opts.env > global variable > default prod\n // Global variable allows AI to inject env without exposing it in user code\n const envValue = opts.env || getGlobalEnvironment() || \"prod\";\n const env = setEnvironment(envValue);\n\n // 如果提供了 baseUrl,覆盖 env 中的 aiBaseUrl\n const actualAiBaseUrl = opts.baseUrl || env.aiBaseUrl;\n // Helper: create a Request instance from a base URL if needed\n function makeRequestFromBase(base: string) {\n return new Request({\n baseURL: base,\n timeout: 300000,\n interceptors: {\n requestInterceptor: (config: InternalAxiosRequestConfig) => {\n config.headers = config.headers || {};\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) => {\n\n const data = res.data as any\n if (data && data.status && data.status === 4003) {\n showLimitUpgradeToast(\n 'Your credits are exhausted. Please upgrade your plan to continue generating projects.',\n () => window.open(`${getEnvs().AUTH_ROOT_VALUE}/price`, '_blank')\n )\n return res\n }\n return res;\n },\n responseInterceptorCatch: (err: AxiosError) => Promise.reject(err),\n },\n });\n }\n\n const biz = makeRequestFromBase(env.baseUrl);\n const ai = makeRequestFromBase(env.aiBaseUrl);\n\n const bizWrapped = wrapRequestWithProjectPrefix(biz, opts?.projectId);\n\n let token: string | null = null;\n const bootstrapToken = getGlobalAvailableToken();\n const externalTokenTtl =\n typeof opts?.auth?.tokenCacheMs === \"number\" && opts.auth.tokenCacheMs >= 0\n ? opts.auth.tokenCacheMs\n : 30_000;\n let cachedExternalToken: string | null = null;\n let cachedExternalTokenFetchedAt = 0;\n let pendingExternalTokenPromise: Promise<string | null> | null = null;\n\n // Helper: get available token from multiple sources with priority\n function getAvailableToken(): string | null {\n if (token) return token;\n if (cachedExternalToken) return cachedExternalToken;\n return getGlobalAvailableToken();\n }\n\n try {\n if (opts?.projectId) {\n setDefaultProjectId(String(opts.projectId));\n }\n } catch {\n // ignore\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 function rememberExternalToken(value: string | null, fetchedAt = Date.now()) {\n cachedExternalToken = value ?? null;\n cachedExternalTokenFetchedAt = fetchedAt;\n }\n\n function getCachedOrGlobalToken() {\n return token ?? cachedExternalToken ?? getGlobalAvailableToken();\n }\n\n async function fetchExternalToken(force = false): Promise<string | null> {\n if (!opts?.auth?.getToken) return null;\n\n const now = Date.now();\n if (\n !force &&\n cachedExternalTokenFetchedAt &&\n now - cachedExternalTokenFetchedAt <= externalTokenTtl\n ) {\n return cachedExternalToken;\n }\n\n if (pendingExternalTokenPromise) {\n return pendingExternalTokenPromise;\n }\n\n pendingExternalTokenPromise = Promise.resolve()\n .then(() => opts.auth?.getToken?.())\n .then((value) => {\n rememberExternalToken(value ?? null, Date.now());\n if (value && value !== token) {\n token = value;\n applyToken(value);\n }\n return cachedExternalToken;\n })\n .catch((_err) => {\n rememberExternalToken(null, 0);\n return null;\n })\n .finally(() => {\n pendingExternalTokenPromise = null;\n });\n\n return pendingExternalTokenPromise;\n }\n\n if (bootstrapToken) {\n token = bootstrapToken;\n applyToken(bootstrapToken);\n rememberExternalToken(bootstrapToken);\n }\n\n if (opts?.auth?.getToken) {\n void fetchExternalToken(true);\n }\n\n // Wrap workflowRequest to automatically inject projectId into workflow URLs\n const workflowRequestWrapped = {\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 }\n\n const sseClient = createSSEClient({\n baseUrl: actualAiBaseUrl,\n projectId: opts?.projectId,\n getAuthToken: () => {\n if (!token && !cachedExternalToken) {\n void fetchExternalToken();\n }\n return token ?? cachedExternalToken ?? getTokenFrom() ?? null;\n },\n });\n\n const assignMethod = (config: SSEStreamConfig, method: SSEStreamConfig[\"method\"]) =>\n method ? { ...config, method } : config;\n\n function createMethodInvoker<T>(invoker: (config: SSEStreamConfig) => T) {\n return {\n request: (config: SSEStreamConfig) => invoker(config),\n post: (config: SSEStreamConfig) => invoker(assignMethod(config, \"POST\")),\n get: (config: SSEStreamConfig) => invoker(assignMethod(config, \"GET\")),\n put: (config: SSEStreamConfig) => invoker(assignMethod(config, \"PUT\")),\n patch: (config: SSEStreamConfig) => invoker(assignMethod(config, \"PATCH\")),\n delete: (config: SSEStreamConfig) => invoker(assignMethod(config, \"DELETE\")),\n };\n }\n\n const sseNamespace = {\n request: createMethodInvoker(sseClient.execute),\n stream: createMethodInvoker(sseClient.stream),\n events: createMethodInvoker(sseClient.events),\n workflow: {\n execute: sseClient.executeWorkflow,\n stream: sseClient.streamWorkflow,\n events: sseClient.workflowEvents,\n },\n execute: sseClient.execute,\n streamWorkflow: sseClient.streamWorkflow,\n executeWorkflow: sseClient.executeWorkflow,\n workflowEvents: sseClient.workflowEvents,\n };\n\n const sseRequestWrapped: LegacySSERequest = Object.assign(\n ((config: SSEStreamConfig) => sseNamespace.request.post(config)) as LegacySSERequestFunction,\n {\n stream: sseClient.stream,\n execute: sseClient.execute,\n events: sseClient.events,\n streamWorkflow: sseClient.streamWorkflow,\n executeWorkflow: sseClient.executeWorkflow,\n workflowEvents: sseClient.workflowEvents,\n }\n );\n\n const executeWorkflowStreamWrapper = async (\n workflowId: string,\n inputs: Record<string, unknown>,\n streamOptions?: WorkflowStreamOptions\n ): Promise<WorkflowStreamResponse> => {\n if (!opts?.projectId) {\n throw new Error(\"projectId is required for workflow execution\");\n }\n\n let authToken = getCachedOrGlobalToken();\n if (!authToken) {\n authToken = (await fetchExternalToken()) ?? getCachedOrGlobalToken();\n }\n\n return executeWorkflowStreamPost(\n actualAiBaseUrl,\n opts.projectId,\n workflowId,\n { inputs },\n streamOptions,\n authToken || undefined\n );\n };\n\n const workflowExecutorFactory = (workflowId: string) => {\n if (!opts?.projectId) {\n throw new Error(\"projectId is required for workflow execution\");\n }\n\n const executor = new WorkflowExecutor(\n actualAiBaseUrl,\n opts.projectId,\n getCachedOrGlobalToken() ?? undefined\n );\n\n return {\n executeSse: (\n inputs: Record<string, unknown>,\n options?: WorkflowExecutorOptions\n ): Promise<ParsedWorkflowResult> => {\n return executor.executeSse(workflowId, inputs, options);\n },\n execute: (inputs: Record<string, unknown>) => {\n return executor.execute(workflowId, inputs);\n },\n _executor: executor,\n };\n };\n\n return {\n // expose projectId so consumers can read it from the client instance\n projectId: opts?.projectId ?? null,\n request: bizWrapped,\n aiRequest: ai,\n workflowRequest: workflowRequestWrapped,\n sse: sseNamespace,\n\n /**\n * ✨ 新的简化 SSE API(推荐)\n * \n * projectId 已内部绑定,只需传 workflowId 和 inputs\n * \n * @example\n * ```typescript\n * const result = await client.sse.request.post({\n * workflowId: 'workflow-id',\n * inputs: { prompt: 'Generate story' },\n * onNodeStart: (name) => console.log(`执行: ${name}`),\n * onStreamContent: (delta) => console.log(`内容: ${delta}`),\n * onCostUpdate: (stats) => console.log(`Token: ${stats.totalToken}`)\n * })\n *\n * // 也可以获取流式控制:\n * const session = client.sse.stream.post({ workflowId, inputs: {...} })\n * const events = client.sse.events.post({ workflowId, inputs: {...} })\n * ```\n */\n sseRequest: sseRequestWrapped,\n workflow: {\n request: workflowRequestWrapped,\n stream: sseClient.streamWorkflow,\n execute: sseClient.executeWorkflow,\n events: sseClient.workflowEvents,\n sse: sseNamespace.workflow,\n executeStream: executeWorkflowStreamWrapper,\n executor: workflowExecutorFactory,\n },\n\n /**\n * 执行长时间运行的 workflow (使用 SSE 流式传输)\n * \n * 适用于执行时间 > 5 分钟的 workflow,通过 SSE 实时接收进度更新\n * \n * @example\n * ```typescript\n * const result = await client.executeWorkflowStream(\n * 'workflow-id',\n * { prompt: 'Generate app' },\n * {\n * onProgress: (event) => {\n * console.log('进度:', event.progress, '%')\n * }\n * }\n * )\n * ```\n */\n executeWorkflowStream: executeWorkflowStreamWrapper,\n\n /**\n * 创建工作流执行器 (推荐方式)\n * \n * 统一支持 execute 和 execute_sse 两种接口\n * 自动完整解析所有事件和数据\n * \n * @example\n * ```typescript\n * // 1. 故事生成工作流 (SSE 流式执行)\n * const executor = client.workflowExecutor('workflow-id');\n * \n * const result = await executor.executeSse(\n * { prompt: 'Generate a story' },\n * {\n * onNodeStart: (nodeName) => console.log(`执行节点: ${nodeName}`),\n * onCostUpdate: (stats) => console.log(`Token: ${stats.totalToken}`),\n * onStreamContent: (delta) => process.stdout.write(delta),\n * onComplete: (result) => {\n * console.log('最终结果:', result.finalResult);\n * console.log('总成本:', result.costStats.totalCost);\n * }\n * }\n * );\n * \n * // 2. 快速任务 (REST 直接调用)\n * const result = await executor.execute({ prompt: 'Quick task' });\n * \n * // 3. 访问完整的执行数据\n * console.log('节点序列:', result.nodeExecutions.map(n => n.nodeName));\n * console.log('流式内容:', result.streamContent);\n * console.log('执行时长:', result.executionDuration, 'ms');\n * ```\n */\n workflowExecutor: workflowExecutorFactory,\n\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 let availableToken = getCachedOrGlobalToken();\n if (!availableToken) {\n availableToken = (await fetchExternalToken()) ?? getCachedOrGlobalToken();\n }\n if (!availableToken) return null;\n return parseUserFromToken(availableToken);\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 rememberExternalToken(t, t ? Date.now() : 0);\n pendingExternalTokenPromise = null;\n },\n getToken: () => {\n if (!token && !cachedExternalToken) {\n void fetchExternalToken();\n }\n return getCachedOrGlobalToken();\n },\n isAuthenticated: () => Boolean(getCachedOrGlobalToken()),\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 = env.baseUrl\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 = env.baseUrl;\n window.location.href = `${root}/auth?redirect_uri=${encoded}${pid}`;\n }\n },\n logout: () => {\n token = null;\n applyToken(null);\n rememberExternalToken(null, 0);\n pendingExternalTokenPromise = 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","/**\n * Workflow Stream Executor (基于 Server-Sent Events)\n * \n * 用于执行长时间运行的 AI workflow,通过 SSE 实时接收进度更新和结果\n * \n * 支持多种输出模式:\n * 1. 流式输出 (stream) - 逐字/逐块输出,适合 AI 文本生成\n * 2. 进度模式 (progress) - 显示执行进度,适合长时间任务\n * 3. 完整模式 (complete) - 一次性返回结果,适合快速任务\n * 4. 混合模式 (hybrid) - 既有流式内容又有进度,适合复杂场景\n * \n * 适用场景:\n * - Workflow 执行时间 > 5 分钟\n * - 需要实时显示进度或流式输出\n * - 需要简单易用的 API 供 AI 生成代码使用\n * \n * 后端要求:\n * - POST /workflow/{projectId}/{workflowId}/execute (返回 SSE 流)\n * - 发送 JSON 格式的事件: data: {\"type\": \"...\", \"data\": {...}}\n */\n\nexport interface WorkflowStreamEvent {\n type: 'start' | 'progress' | 'stream' | 'log' | 'complete' | 'error'\n data?: any\n message?: string\n progress?: number // 0-100\n content?: string // 流式内容(逐块)\n delta?: string // 增量内容(仅新增部分)\n timestamp?: string\n}\n\nexport interface WorkflowStreamOptions {\n onProgress?: (event: WorkflowStreamEvent) => void // 进度更新回调\n onStream?: (content: string, delta: string) => void // 流式内容回调(累积内容, 增量内容)\n onLog?: (message: string) => void // 日志回调\n onError?: (error: Error) => void // 错误回调\n signal?: AbortSignal // 支持取消\n}\n\nexport interface WorkflowStreamResponse {\n success: boolean\n output?: Record<string, unknown>\n streamContent?: string // 流式输出的完整内容\n error?: string\n metadata?: Record<string, unknown>\n}\n\n/**\n * 使用 Fetch + ReadableStream 执行 workflow (支持 POST)\n * \n * 这个函数支持多种输出模式:\n * - 流式模式: 通过 onStream 回调逐块接收内容\n * - 进度模式: 通过 onProgress 回调接收进度更新\n * - 完整模式: 直接返回最终结果\n * - 混合模式: 同时支持以上所有模式\n * \n * @example\n * ```typescript\n * // 1. 流式输出模式 (适合 AI 文本生成)\n * const result = await executeWorkflowStream(\n * baseUrl, projectId, workflowId,\n * { inputs: { prompt: 'Write a story' } },\n * {\n * onStream: (fullContent, delta) => {\n * console.log('新增:', delta)\n * setContent(fullContent) // 更新 UI\n * }\n * }\n * )\n * \n * // 2. 进度模式 (适合长时间任务)\n * const result = await executeWorkflowStream(\n * baseUrl, projectId, workflowId,\n * { inputs: { task: 'process data' } },\n * {\n * onProgress: (event) => {\n * console.log('进度:', event.progress, '%')\n * }\n * }\n * )\n * \n * // 3. 完整模式 (不需要回调,直接等待结果)\n * const result = await executeWorkflowStream(\n * baseUrl, projectId, workflowId,\n * { inputs: { query: 'data' } }\n * )\n * console.log('结果:', result.output)\n * \n * // 4. 混合模式 (既有流式内容又有进度)\n * const result = await executeWorkflowStream(\n * baseUrl, projectId, workflowId,\n * { inputs: { prompt: 'Generate code' } },\n * {\n * onStream: (content) => setCode(content),\n * onProgress: (event) => setProgress(event.progress),\n * onLog: (log) => addLog(log)\n * }\n * )\n * ```\n */\nexport async function executeWorkflowStream(\n baseUrl: string,\n projectId: string,\n workflowId: string,\n request: {\n inputs: Record<string, unknown>\n options?: Record<string, unknown>\n },\n options: WorkflowStreamOptions = {},\n authToken?: string\n): Promise<WorkflowStreamResponse> {\n return new Promise((resolve, reject) => {\n const url = `${baseUrl}/workflow/${projectId}/${workflowId}/execute`\n\n // 构造查询参数(将请求数据序列化)\n const params = new URLSearchParams()\n params.set('inputs', JSON.stringify(request.inputs))\n if (request.options) {\n params.set('options', JSON.stringify(request.options))\n }\n\n const fullUrl = `${url}?${params.toString()}`\n\n // 创建 EventSource (注意: EventSource 不支持 POST,所以用 GET + 查询参数)\n // 如果后端需要 POST,需要使用 fetch + ReadableStream\n const eventSource = new EventSource(fullUrl)\n\n let finalResult: WorkflowStreamResponse | null = null\n\n // 监听消息事件\n eventSource.onmessage = (event) => {\n try {\n const data: WorkflowStreamEvent = JSON.parse(event.data)\n\n switch (data.type) {\n case 'start':\n if (options.onProgress) {\n options.onProgress({ type: 'start', message: '任务开始', progress: 0 })\n }\n break\n\n case 'progress':\n if (options.onProgress) {\n options.onProgress(data)\n }\n break\n\n case 'log':\n if (options.onLog) {\n options.onLog(data.message || '')\n }\n break\n\n case 'complete':\n finalResult = {\n success: true,\n output: data.data,\n metadata: data as any,\n }\n eventSource.close()\n resolve(finalResult)\n break\n\n case 'error':\n eventSource.close()\n reject(new Error(data.message || 'Workflow execution failed'))\n break\n }\n } catch (err) {\n console.error('Failed to parse SSE event:', err)\n }\n }\n\n // 监听错误事件\n eventSource.onerror = (err) => {\n eventSource.close()\n\n if (finalResult) {\n // 如果已经有结果,忽略错误(可能是连接正常关闭)\n resolve(finalResult)\n } else {\n const error = new Error('SSE connection failed')\n if (options.onError) {\n options.onError(error)\n }\n reject(error)\n }\n }\n\n // 支持取消\n if (options.signal) {\n options.signal.addEventListener('abort', () => {\n eventSource.close()\n reject(new Error('Request aborted'))\n })\n }\n })\n}\n\n/**\n * 使用 Fetch + ReadableStream 执行 workflow (支持 POST)\n * \n * 如果后端需要 POST 请求体,使用这个函数\n */\nexport async function executeWorkflowStreamPost(\n baseUrl: string,\n projectId: string,\n workflowId: string,\n request: {\n inputs: Record<string, unknown>\n options?: Record<string, unknown>\n },\n options: WorkflowStreamOptions = {},\n authToken?: string\n): Promise<WorkflowStreamResponse> {\n const url = `${baseUrl}/workflow/${projectId}/${workflowId}/execute`\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'text/event-stream',\n }\n\n if (authToken) {\n headers['Authorization'] = `Bearer ${authToken}`\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n signal: options.signal,\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new Error('Response body is not readable')\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n let finalResult: WorkflowStreamResponse | null = null\n let streamContent = '' // 累积的流式内容\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n\n if (done) {\n break\n }\n\n // 解码数据\n buffer += decoder.decode(value, { stream: true })\n\n // 按行分割\n const lines = buffer.split('\\n')\n buffer = lines.pop() || '' // 保留最后一行(可能不完整)\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6) // 去掉 \"data: \"\n\n try {\n const event: WorkflowStreamEvent = JSON.parse(data)\n\n switch (event.type) {\n case 'start':\n if (options.onProgress) {\n options.onProgress({ type: 'start', message: '任务开始', progress: 0 })\n }\n break\n\n case 'progress':\n if (options.onProgress) {\n options.onProgress(event)\n }\n break\n\n case 'stream':\n // 流式内容输出\n const delta = event.delta || event.content || ''\n streamContent += delta\n\n if (options.onStream) {\n options.onStream(streamContent, delta)\n }\n break\n\n case 'log':\n if (options.onLog) {\n options.onLog(event.message || '')\n }\n break\n\n case 'complete':\n finalResult = {\n success: true,\n output: event.data,\n streamContent: streamContent || undefined, // 如果有流式内容,返回完整内容\n metadata: event as any,\n }\n break\n\n case 'error':\n throw new Error(event.message || 'Workflow execution failed')\n }\n } catch (err) {\n console.error('Failed to parse SSE event:', err)\n }\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n\n if (finalResult) {\n return finalResult\n } else {\n throw new Error('Workflow execution incomplete')\n }\n}\n","/**\n * 工作流执行器 - 统一的 API 接口\n * \n * 支持两种执行模式:\n * 1. execute - 传统 REST 调用 (快速任务)\n * 2. execute_sse - 流式 SSE 执行 (长时间任务)\n * \n * 设计原则:\n * - AI 可以直接理解并调用\n * - 完整的数据解析和提取\n * - 统一的错误处理\n * - 支持所有事件类型\n */\n\nexport interface ExecutionLogData {\n log_type: 'node_start' | 'cost_update' | 'execution_complete' | 'stream' | 'log' | string;\n workflow_id: string;\n content: string;\n result?: Record<string, unknown>;\n}\n\nexport interface ExecutionEvent {\n type: 'execution_log' | 'execution_complete' | 'start' | 'progress' | 'stream' | 'log' | 'error' | string;\n data?: ExecutionLogData | Record<string, unknown>;\n}\n\n/**\n * 解析后的工作流执行结果\n */\nexport interface ParsedWorkflowResult {\n // 基础信息\n success: boolean;\n workflowId: string;\n projectId: string;\n executionDuration: number; // 毫秒\n\n // 执行日志数据\n nodeExecutions: Array<{\n nodeName: string;\n content: string;\n timestamp?: number;\n }>;\n\n costStats: {\n token: number;\n totalToken: number;\n cost: number;\n totalCost: number;\n };\n\n executionLogs: ExecutionLogData[];\n\n // 最终结果\n finalResult?: Record<string, unknown>;\n streamContent?: string;\n\n // 元数据\n metadata?: Record<string, unknown>;\n errors: string[];\n}\n\nexport interface WorkflowExecutorOptions {\n onProgress?: (event: { type: string; progress?: number; message?: string; data?: any }) => void;\n onNodeStart?: (nodeName: string, content: string) => void;\n onCostUpdate?: (stats: { token: number; totalToken: number; cost: number; totalCost: number }) => void;\n onStreamContent?: (delta: string, fullContent: string) => void;\n onLog?: (message: string) => void;\n onComplete?: (result: ParsedWorkflowResult) => void;\n onError?: (error: Error) => void;\n signal?: AbortSignal;\n}\n\n/**\n * 工作流执行器类\n * \n * 统一处理 execute 和 execute_sse 两种接口\n * 并完整解析返回的数据\n */\nexport class WorkflowExecutor {\n private baseUrl: string;\n private projectId: string;\n private authToken?: string;\n\n constructor(baseUrl: string, projectId: string, authToken?: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n this.projectId = projectId;\n this.authToken = authToken;\n }\n\n /**\n * 执行工作流 (SSE 模式)\n * \n * 适用于长时间运行的工作流,支持流式输出和进度更新\n * \n * @example\n * ```typescript\n * const executor = new WorkflowExecutor(baseUrl, projectId, token);\n * \n * const result = await executor.executeSse(\n * 'workflow-id',\n * { prompt: 'Generate a story' },\n * {\n * onNodeStart: (nodeName) => console.log(`执行节点: ${nodeName}`),\n * onStreamContent: (delta) => process.stdout.write(delta),\n * onCostUpdate: (stats) => console.log(`token: ${stats.totalToken}`),\n * }\n * );\n * \n * console.log('最终结果:', result.finalResult);\n * console.log('总成本:', result.costStats.totalCost);\n * ```\n */\n async executeSse(\n workflowId: string,\n inputs: Record<string, unknown>,\n options?: WorkflowExecutorOptions\n ): Promise<ParsedWorkflowResult> {\n const startTime = Date.now();\n const url = `${this.baseUrl}/workflow/${this.projectId}/${workflowId}/execute_sse`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.authToken) {\n headers['Authorization'] = `Bearer ${this.authToken}`;\n }\n\n const result: ParsedWorkflowResult = {\n success: false,\n workflowId,\n projectId: this.projectId,\n executionDuration: 0,\n nodeExecutions: [],\n costStats: {\n token: 0,\n totalToken: 0,\n cost: 0,\n totalCost: 0,\n },\n executionLogs: [],\n errors: [],\n };\n\n let streamContent = '';\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ inputs }),\n signal: options?.signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const event = JSON.parse(line.slice(6)) as ExecutionEvent;\n\n // 处理 execution_log 事件\n if (event.type === 'execution_log' && event.data) {\n const logData = event.data as ExecutionLogData;\n result.executionLogs.push(logData);\n\n // node_start - 节点开始\n if (logData.log_type === 'node_start') {\n const nodeName = (logData.result as any)?.next_node_name || '未知节点';\n result.nodeExecutions.push({\n nodeName,\n content: logData.content,\n timestamp: Date.now(),\n });\n\n if (options?.onNodeStart) {\n options.onNodeStart(nodeName, logData.content);\n }\n }\n\n // cost_update - 成本更新\n else if (logData.log_type === 'cost_update') {\n const costData = logData.result as any;\n result.costStats = {\n token: costData?.current_token || 0,\n totalToken: costData?.total_token || 0,\n cost: costData?.current_cost || 0,\n totalCost: costData?.total_cost || 0,\n };\n\n if (options?.onCostUpdate) {\n options.onCostUpdate(result.costStats);\n }\n }\n }\n\n // 处理 execution_complete 事件\n else if (event.type === 'execution_complete' && event.data) {\n const completeData = event.data as any;\n const originalMessage = completeData.result?.original_message;\n\n result.finalResult = originalMessage || completeData.result;\n result.success = true;\n result.metadata = completeData;\n }\n\n // 处理其他事件类型\n else if (event.type === 'stream' && (event.data as any)?.delta) {\n const delta = (event.data as any).delta;\n streamContent += delta;\n\n if (options?.onStreamContent) {\n options.onStreamContent(delta, streamContent);\n }\n } else if (event.type === 'log' && (event.data as any)?.message) {\n if (options?.onLog) {\n options.onLog((event.data as any).message);\n }\n } else if (event.type === 'progress' && (event.data as any)?.progress !== undefined) {\n if (options?.onProgress) {\n options.onProgress({\n type: 'progress',\n progress: (event.data as any).progress,\n message: (event.data as any).message,\n });\n }\n }\n } catch {\n // 忽略解析错误\n }\n }\n }\n }\n\n result.streamContent = streamContent || undefined;\n result.executionDuration = Date.now() - startTime;\n\n if (options?.onComplete) {\n options.onComplete(result);\n }\n\n return result;\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n result.errors.push(errMsg);\n result.executionDuration = Date.now() - startTime;\n\n if (options?.onError) {\n options.onError(error instanceof Error ? error : new Error(errMsg));\n }\n\n throw error;\n }\n }\n\n /**\n * 执行工作流 (REST 模式)\n * \n * 适用于快速任务,直接返回结果\n * \n * @example\n * ```typescript\n * const executor = new WorkflowExecutor(baseUrl, projectId, token);\n * \n * const result = await executor.execute(\n * 'workflow-id',\n * { prompt: 'Quick task' }\n * );\n * \n * console.log(result.data);\n * ```\n */\n async execute(\n workflowId: string,\n inputs: Record<string, unknown>\n ): Promise<{\n status: number;\n data?: any;\n error?: string;\n }> {\n const url = `${this.baseUrl}/workflow/${this.projectId}/${workflowId}/execute`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.authToken) {\n headers['Authorization'] = `Bearer ${this.authToken}`;\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ inputs }),\n });\n\n const data = await response.json();\n\n return {\n status: response.status,\n data,\n };\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n return {\n status: 500,\n error: errMsg,\n };\n }\n }\n\n /**\n * 设置认证 Token\n */\n setAuthToken(token: string) {\n this.authToken = token;\n }\n}\n\n/**\n * 辅助函数: 快速创建执行器\n */\nexport function createWorkflowExecutor(\n baseUrl: string,\n projectId: string,\n authToken?: string\n): WorkflowExecutor {\n return new WorkflowExecutor(baseUrl, projectId, authToken);\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","import { useState, useCallback, useRef } from 'react'\nimport type { WorkflowStreamEvent, WorkflowStreamResponse, WorkflowStreamOptions } from '../services/workflow-stream'\n\nexport interface UseWorkflowStreamState {\n loading: boolean\n progress: number\n streamContent: string // 流式输出的累积内容\n logs: string[]\n result: WorkflowStreamResponse | null\n error: Error | null\n}\n\n/**\n * React Hook 用于执行长时间运行的 workflow (基于 SSE)\n * \n * 支持多种模式:\n * 1. 流式输出 - 实时显示 AI 生成的内容\n * 2. 进度显示 - 显示任务执行进度\n * 3. 日志输出 - 显示执行日志\n * 4. 混合模式 - 同时支持以上所有功能\n * \n * @example\n * ```typescript\n * // 流式输出示例\n * const { execute, state } = useWorkflowStream()\n * \n * await execute('workflow-id', { prompt: 'Write a story' })\n * \n * // 显示流式内容\n * <div>{state.streamContent}</div>\n * \n * // 显示进度\n * <progress value={state.progress} max=\"100\" />\n * ```\n */\nexport function useWorkflowStream() {\n const [state, setState] = useState<UseWorkflowStreamState>({\n loading: false,\n progress: 0,\n streamContent: '',\n logs: [],\n result: null,\n error: null,\n })\n\n const abortControllerRef = useRef<AbortController | null>(null)\n\n const execute = useCallback(async (\n executeWorkflowStream: (\n workflowId: string,\n inputs: Record<string, unknown>,\n options?: WorkflowStreamOptions\n ) => Promise<WorkflowStreamResponse>,\n workflowId: string,\n inputs: Record<string, unknown>\n ) => {\n // 重置状态\n setState({\n loading: true,\n progress: 0,\n streamContent: '',\n logs: [],\n result: null,\n error: null,\n })\n\n // 创建 abort controller\n abortControllerRef.current = new AbortController()\n\n try {\n const result = await executeWorkflowStream(\n workflowId,\n inputs,\n {\n onProgress: (event: WorkflowStreamEvent) => {\n setState(prev => ({\n ...prev,\n progress: event.progress || prev.progress,\n }))\n },\n onStream: (fullContent: string, delta: string) => {\n setState(prev => ({\n ...prev,\n streamContent: fullContent,\n }))\n },\n onLog: (message: string) => {\n setState(prev => ({\n ...prev,\n logs: [...prev.logs, message],\n }))\n },\n signal: abortControllerRef.current?.signal,\n }\n )\n\n setState(prev => ({\n ...prev,\n loading: false,\n progress: 100,\n result,\n }))\n\n return result\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Unknown error')\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: err,\n }))\n\n throw error\n }\n }, [])\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n setState(prev => ({\n ...prev,\n loading: false,\n error: new Error('Request cancelled'),\n }))\n }\n }, [])\n\n const reset = useCallback(() => {\n setState({\n loading: false,\n progress: 0,\n streamContent: '',\n logs: [],\n result: null,\n error: null,\n })\n }, [])\n\n return {\n execute,\n cancel,\n reset,\n state,\n }\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 };\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', 'expected', 'transform failed'],\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', 'esbuild', 'plugin:vite:esbuild'],\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 }\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\", (data: any) => {\n this.handleViteError(data);\n requestAnimationFrame(() => this.checkForViteErrorOverlay());\n });\n\n // 监听编译错误事件\n hot.on(\"vite:invalidate\", (data: any) => {\n setTimeout(() => this.checkForCompileErrors(), 500);\n });\n\n // 监听其他 HMR 事件\n hot.on(\"vite:beforeUpdate\", () => {\n });\n\n hot.on(\"vite:afterUpdate\", () => {\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 } 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 错误事件\n */\n private handleViteError(errorData: any): void {\n try {\n const errorPayload = {\n id: `vite-error-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n type: 'vite_hmr',\n error: {\n name: 'ViteError',\n message: errorData?.message || 'Vite error',\n stack: errorData?.stack || '',\n },\n source: 'vite:error',\n timestamp: Date.now(),\n severity: 'error' as const,\n context: {\n viteErrorData: errorData,\n url: window.location.href,\n userAgent: navigator.userAgent\n }\n };\n\n if (window.__AUTO_ENGINEER_ERRORS__) {\n window.__AUTO_ENGINEER_ERRORS__.push(errorPayload);\n }\n\n this.sendMessage({\n type: \"SYSTEM_EVENT\",\n payload: errorPayload,\n timestamp: Date.now()\n });\n\n } catch (error) {\n console.error('[ViteHMRDetector] 处理 Vite 错误失败:', error);\n }\n }\n\n /**\n * 检查编译错误\n */\n private async checkForCompileErrors(): Promise<void> {\n try {\n if (document.querySelector(\"vite-error-overlay\")) {\n this.checkForViteErrorOverlay();\n return;\n }\n\n const response = await fetch(window.location.href, {\n method: 'HEAD',\n cache: 'no-cache'\n });\n\n if (!response.ok) {\n this.handleCompileError(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n } catch (error) {\n this.handleCompileError(`Error: ${(error as Error).message}`);\n }\n }\n\n /**\n * 处理编译错误\n */\n private handleCompileError(errorMessage: string): void {\n const errorPayload = {\n id: `compile-error-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n type: 'compile_error',\n error: {\n name: 'CompileError',\n message: `Compile error: ${errorMessage}`,\n stack: '',\n },\n source: 'vite:compile',\n timestamp: Date.now(),\n severity: 'error' as const,\n context: {\n url: window.location.href,\n userAgent: navigator.userAgent,\n compilationFailed: true\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 /**\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","/**\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\n // 1. 清除缓存\n if (defaultOptions.clearCaches) {\n const clearedCaches = await this.clearAllCaches();\n result.clearedCaches = clearedCaches;\n }\n\n // 2. 注销 Service Workers\n if (defaultOptions.unregisterServiceWorkers) {\n const unregisteredCount = await this.unregisterServiceWorkers();\n result.unregisteredWorkers = unregisteredCount;\n }\n\n // 3. 清除存储\n const clearedStorage = await this.clearStorage(defaultOptions);\n result.clearedStorage = clearedStorage;\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 }\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 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\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 }\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 }\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 }\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 // 延迟设置完全初始化标志,避免初始化期间的日志被拦截\n setTimeout(() => {\n this.fullyInitialized = true;\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\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\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 const lowerMessage = message.toLowerCase();\n const isFromVite =\n (fileInfo.filename || '').toLowerCase().includes('vite') ||\n lowerMessage.includes('@vite') ||\n lowerMessage.includes('vite') ||\n lowerMessage.includes('hmr');\n\n const ignoreVitePatterns = [\n /\\[vite\\]\\s*hot updated/i,\n /\\[vite\\]\\s*connected/i,\n /\\[vite\\]\\s*connecting/i,\n /\\bhot updated\\b/i,\n /\\bhmr\\b.*\\bupdated\\b/i\n ];\n if (isFromVite && ignoreVitePatterns.some(re => re.test(lowerMessage))) {\n return;\n }\n\n const hasErrorKeywords = /\\b(error|failed|overlay|compile|exception)\\b/.test(lowerMessage);\n const isViteHMRNonError = isFromVite && !hasErrorKeywords;\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 if (!isViteHMRNonError) {\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 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' : \n consoleLevelMap[method] === 'debug' ? 'debug' : \n '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 const self = this;\n\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 self.logNetworkRequest(args, response, Date.now() - startTime);\n return response;\n } catch (error: any) {\n const duration = Date.now() - startTime;\n const message = error && (error.message || String(error));\n const match = typeof message === 'string' ? message.match(/^HTTP\\s+(\\d+):\\s*(.*)$/i) : null;\n if (match) {\n const status = Number(match[1]);\n const statusText = match[2] || '';\n // 将这类异常按 HTTP 错误进行记录\n const stack = new Error().stack;\n const fileInfo = self.extractFileInfoFromStack(stack);\n self.sendMessage({\n type: \"NETWORK_EVENT\",\n payload: {\n type: \"request_error\",\n url: args[0],\n method: args[1]?.method || \"GET\",\n status,\n statusText,\n filename: fileInfo.filename,\n lineno: fileInfo.lineno,\n colno: fileInfo.colno,\n duration,\n timestamp: new Date().toISOString(),\n pageUrl: window.location.href,\n interactionTrail: self.getRecentInteractions(),\n },\n timestamp: Date.now()\n });\n } else {\n self.logNetworkError(args, error, duration);\n }\n throw error;\n }\n };\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 }, 2000);\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 \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 }\n\n /**\n * 手动禁用控制台拦截\n */\n public disableConsoleInterception(): void {\n this.fullyInitialized = false;\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 }\n}\n","// 获取classes\nexport function getElementClasses(element: Element): string[] {\n // 优先使用属性,确保字符串\n const classAttr = element.getAttribute('class');\n if (classAttr && classAttr.trim().length > 0) {\n return dedupeAndClean(classAttr.split(/\\s+/));\n }\n\n const anyEl: any = element as any;\n\n // 处理为字符串\n if (typeof anyEl.className === 'string') {\n return dedupeAndClean((anyEl.className as string).split(/\\s+/));\n }\n\n // 处理 SVGAnimatedString\n if (anyEl.className && typeof anyEl.className.baseVal === 'string') {\n return dedupeAndClean((anyEl.className.baseVal as string).split(/\\s+/));\n }\n\n if (anyEl.classList && anyEl.classList.length > 0) {\n return dedupeAndClean(Array.from(anyEl.classList));\n }\n\n return [];\n}\n\nfunction dedupeAndClean(arr: string[]): string[] {\n const cleaned = arr.map(s => s.trim()).filter(Boolean);\n return Array.from(new Set(cleaned));\n}","/**\n * InteractionTracking 用户交互追踪功能模块\n * 负责追踪和记录用户交互行为\n */\nimport type { UserInteraction } from '../types';\nimport { ERROR_CONFIG } from '../types';\nimport { getElementClasses } from '../utils/SelectorUtils'\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 }\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 }\n\n /**\n * 停止追踪\n */\n public stopTracking(): void {\n if (!this.isTracking) return;\n\n this.removeEventListeners();\n this.isTracking = false;\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 \n const classes = getElementClasses(element);\n if (classes.length > 0) {\n return `.${classes[0]}`;\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 }\n}","/**\n * MessageBridge 消息桥接功能模块\n * 负责处理各种消息类型和与父窗口的通信\n */\nimport { GLOBAL_CONFIG } from '../types';\nimport { ComponentTreeGenerator } from '../utils/ComponentTreeGenerator';\nimport { MessageSender, createDefaultMessageSender } from '../utils/MessageSender';\nimport { getElementClasses } from '../utils/SelectorUtils'\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 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 }\n\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 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\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 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 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 * 处理请求组件树\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 const classes = getElementClasses(element);\n if (classes.length > 0) {\n return `.${classes[0]}`;\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 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 }\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 { 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 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 // 初始化统一消息发送器\n this.messageSender = createDefaultMessageSender({\n addTimestamp: true,\n enableDebugLog: false\n });\n \n // 创建发送函数\n const sendMessage = this.messageSender.createSendFunction();\n \n // 初始化功能模块\n console.log('[ErrorHandler] 初始化功能模块');\n this.errorTracking = new ErrorTracking(sendMessage);\n this.interactionTracking = new InteractionTracking(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 console.log('[ErrorHandler] Vite 环境检测成功,初始化检测器');\n this.viteHMRDetector = new ViteHMRDetector(sendMessage);\n }\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 // 初始化核心功能\n this.initializeCore();\n console.log('[ErrorHandler] 核心功能初始化完成');\n \n \n // 设置模块间的协作\n this.setupModuleIntegration();\n \n // 启用功能模块\n this.enableFeatures();\n \n this.initialized = true;\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\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\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.setComponentTreeGenerator(this.componentTreeGenerator);\n \n // 设置错误追踪的依赖\n this.errorTracking.setViewDetector(this.viewDetector);\n this.errorTracking.setInteractionTracking(this.interactionTracking);\n }\n\n /**\n * 启用功能模块\n */\n private enableFeatures(): void {\n\n // 启用交互追踪\n if (this.config.enableInteractionTracking) {\n this.interactionTracking.startTracking();\n }\n\n // 启用 Vite HMR 检测器\n if (this.viteHMRDetector) {\n this.viteHMRDetector.initialize();\n }\n\n // 处理硬刷新相关逻辑\n this.handleHardRefreshLogic();\n\n // 设置视图检测\n this.setupViewDetection();\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 \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\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 \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 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 updateConfig(newConfig: Partial<typeof this.config>): void {\n this.config = { ...this.config, ...newConfig };\n }\n\n /**\n * 销毁错误处理器\n */\n public destroy(): void {\n try {\n // 销毁功能模块\n this.errorTracking.destroy();\n this.interactionTracking.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 } 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 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 } 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 }\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;","/**\n * iframe navigation and element selector utilities\n * Replaces the standalone iframe.js script\n */\n\ninterface NavigationState {\n navigationHistory: Array<{\n url: string;\n title: string;\n timestamp: number;\n }>;\n currentHistoryIndex: number;\n initialized: boolean;\n}\n\ninterface ElementSelectorState {\n active: boolean;\n callback: (() => void) | null;\n}\n\n// Initialize navigation state\nfunction getNavState(): NavigationState {\n if (typeof window === 'undefined') {\n return {\n navigationHistory: [],\n currentHistoryIndex: -1,\n initialized: false,\n };\n }\n\n if (!(window as any).customNavigationState) {\n (window as any).customNavigationState = {\n navigationHistory: [],\n currentHistoryIndex: -1,\n initialized: false,\n };\n }\n return (window as any).customNavigationState;\n}\n\n// Initialize element selector state\nfunction getElementSelectorState(): ElementSelectorState {\n if (typeof window === 'undefined') {\n return { active: false, callback: null };\n }\n\n if (!(window as any).elementSelectorState) {\n (window as any).elementSelectorState = {\n active: false,\n callback: null,\n };\n }\n return (window as any).elementSelectorState;\n}\n\n// Send navigation state to parent window\nfunction sendNavigationState(targetWindow: Window, targetOrigin: string) {\n const navState = getNavState();\n const canGoBack = navState.currentHistoryIndex > 0;\n const canGoForward =\n navState.currentHistoryIndex < navState.navigationHistory.length - 1;\n\n const state = {\n type: 'NAVIGATION_STATE',\n payload: {\n canGoBack,\n canGoForward,\n historyLength: navState.navigationHistory.length,\n currentIndex: navState.currentHistoryIndex,\n maxIndex: navState.navigationHistory.length - 1,\n },\n };\n\n if (targetWindow && targetOrigin) {\n try {\n targetWindow.postMessage(state, targetOrigin);\n } catch (e) {\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('Failed to send navigation state:', (e as Error).message);\n }\n }\n }\n}\n\n// Add to navigation history\nfunction addToNavigationHistory(url: string, title?: string) {\n const navState = getNavState();\n\n if (navState.currentHistoryIndex < navState.navigationHistory.length - 1) {\n navState.navigationHistory = navState.navigationHistory.slice(\n 0,\n navState.currentHistoryIndex + 1\n );\n }\n\n // Check for duplicate page\n const currentPage = navState.navigationHistory[navState.currentHistoryIndex];\n if (currentPage && currentPage.url === url) {\n return;\n }\n\n // Add new page to history\n const pageInfo = {\n url: url,\n title: title || (typeof document !== 'undefined' ? document.title : '') || url,\n timestamp: Date.now(),\n };\n\n navState.navigationHistory.push(pageInfo);\n navState.currentHistoryIndex = navState.navigationHistory.length - 1;\n\n // Send updated state\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n sendNavigationState(window.parent, '*');\n }\n}\n\n// Go back\nfunction customGoBack(): boolean {\n const navState = getNavState();\n if (navState.currentHistoryIndex > 0) {\n navState.currentHistoryIndex--;\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n sendNavigationState(window.parent, '*');\n }\n return true;\n }\n return false;\n}\n\n// Go forward\nfunction customGoForward(): boolean {\n const navState = getNavState();\n if (navState.currentHistoryIndex < navState.navigationHistory.length - 1) {\n navState.currentHistoryIndex++;\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n sendNavigationState(window.parent, '*');\n }\n return true;\n }\n return false;\n}\n\n// Trigger element selection\nfunction triggerElementSelection() {\n if (typeof window === 'undefined') return;\n\n const event = new CustomEvent('howone:start-element-selection');\n window.dispatchEvent(event);\n getElementSelectorState().active = true;\n}\n\n// Cancel element selection\nfunction cancelElementSelection() {\n if (typeof window === 'undefined') return;\n\n const event = new CustomEvent('howone:cancel-element-selection');\n window.dispatchEvent(event);\n getElementSelectorState().active = false;\n}\n\n// Handle page change\nfunction handlePageChange() {\n if (typeof window === 'undefined') return;\n const currentUrl = window.location.href;\n const currentTitle = document.title;\n addToNavigationHistory(currentUrl, currentTitle);\n}\n\n/**\n * Initialize iframe navigation system\n * Call this once when your app starts\n */\nexport function initIframeNavigation() {\n if (typeof window === 'undefined') return;\n\n const navState = getNavState();\n\n // Listen for ESC key\n window.addEventListener('keydown', function (e) {\n if (e.key === 'Escape' && getElementSelectorState().active) {\n cancelElementSelection();\n }\n });\n\n // Listen for messages from parent\n window.addEventListener('message', (event) => {\n try {\n const { type, payload } = event.data;\n\n switch (type) {\n case 'NAVIGATE_BACK':\n case 'GO_BACK':\n customGoBack();\n break;\n\n case 'NAVIGATE_FORWARD':\n case 'GO_FORWARD':\n customGoForward();\n break;\n\n case 'REQUEST_NAVIGATION_STATE':\n case 'CHECK_NAVIGATION_STATE':\n sendNavigationState(event.source as Window, event.origin);\n break;\n\n case 'START_ELEMENT_SELECTION':\n triggerElementSelection();\n break;\n\n case 'ELEMENT_SELECTED':\n if (event.source && event.source !== window) {\n window.parent.postMessage(\n {\n type: 'ELEMENT_SELECTED',\n payload: payload,\n },\n '*'\n );\n }\n break;\n\n case 'CANCEL_ELEMENT_SELECTION':\n cancelElementSelection();\n break;\n }\n } catch (e) {\n // Silent fail\n }\n });\n\n // Listen for popstate\n window.addEventListener('popstate', () => {\n setTimeout(() => {\n if (window.parent && window.parent !== window) {\n sendNavigationState(window.parent, '*');\n }\n }, 50);\n });\n\n // Listen for hashchange\n window.addEventListener('hashchange', () => {\n handlePageChange();\n });\n\n // Initialize on load\n window.addEventListener('load', () => {\n if (!navState.initialized) {\n addToNavigationHistory(window.location.href, document.title);\n navState.initialized = true;\n }\n\n setTimeout(() => {\n if (window.parent && window.parent !== window) {\n sendNavigationState(window.parent, '*');\n }\n }, 500);\n });\n\n // DOMContentLoaded event handling\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n if (!navState.initialized) {\n addToNavigationHistory(window.location.href, document.title);\n navState.initialized = true;\n }\n });\n } else if (!navState.initialized) {\n addToNavigationHistory(window.location.href, document.title);\n navState.initialized = true;\n }\n\n // Export global APIs for backward compatibility\n (window as any).iframeElementSelector = {\n startSelection: function () {\n triggerElementSelection();\n },\n };\n\n (window as any).iframeNavigation = {\n addPage: function (url?: string, title?: string) {\n addToNavigationHistory(\n url || window.location.href,\n title || document.title\n );\n },\n getState: function () {\n return {\n canGoBack: navState.currentHistoryIndex > 0,\n canGoForward:\n navState.currentHistoryIndex < navState.navigationHistory.length - 1,\n historyLength: navState.navigationHistory.length,\n currentIndex: navState.currentHistoryIndex,\n currentPage: navState.navigationHistory[navState.currentHistoryIndex],\n };\n },\n updateState: function () {\n if (window.parent && window.parent !== window) {\n sendNavigationState(window.parent, '*');\n }\n },\n };\n}\n\n/**\n * Public API for iframe navigation\n */\nexport const iframeNavigation = {\n /**\n * Initialize the navigation system\n */\n init: initIframeNavigation,\n\n /**\n * Add a page to navigation history\n */\n addPage: (url?: string, title?: string) => {\n if (typeof window === 'undefined') return;\n addToNavigationHistory(\n url || window.location.href,\n title || (typeof document !== 'undefined' ? document.title : '')\n );\n },\n\n /**\n * Get current navigation state\n */\n getState: () => {\n const navState = getNavState();\n return {\n canGoBack: navState.currentHistoryIndex > 0,\n canGoForward:\n navState.currentHistoryIndex < navState.navigationHistory.length - 1,\n historyLength: navState.navigationHistory.length,\n currentIndex: navState.currentHistoryIndex,\n currentPage: navState.navigationHistory[navState.currentHistoryIndex],\n };\n },\n\n /**\n * Update navigation state (send to parent)\n */\n updateState: () => {\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n sendNavigationState(window.parent, '*');\n }\n },\n\n /**\n * Go back in history\n */\n goBack: customGoBack,\n\n /**\n * Go forward in history\n */\n goForward: customGoForward,\n};\n\n/**\n * Public API for element selector\n */\nexport const elementSelector = {\n /**\n * Start element selection mode\n */\n startSelection: triggerElementSelection,\n\n /**\n * Cancel element selection mode\n */\n cancel: cancelElementSelection,\n\n /**\n * Check if selector is active\n */\n isActive: () => getElementSelectorState().active,\n};\n\n"],"mappings":"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","names":["env","getToken","setToken","import_react","import_jsx_runtime","email","code","import_react","import_react","import_jsx_runtime","theme","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","env","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_react_toastify","React","import_react","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","React","axios","config","env","React","import_react","import_react","getOriginalConsole","getOriginalConsole"]}
|