@howone/sdk 0.3.12 → 0.3.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +16 -7
- package/dist/index.d.ts +16 -7
- package/dist/index.js +81 -38
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +81 -38
- 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/upload-client.ts","../src/services/ai-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/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\nimport { setEnvironment, getGlobalEnvironment, getDefaultProjectId } from \"../config\";\n\nexport const AUTH_TOKEN_KEY = 'auth_token'\n// no internal helper exported — setToken already notifies subscribers\n\n// Import the `env` configuration from the appropriate module\n\n// Initialize `env` using the same logic as in services/index.ts\nconst envValue = getGlobalEnvironment() || \"prod\";\nconst env = setEnvironment(envValue);\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.puid || 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 // Redirect to login page after logout\n if (typeof window !== \"undefined\") {\n const loc = window.location.href\n // try to get a default project id (may be set via global or runtime)\n const pid = getDefaultProjectId()\n try {\n // Use environment base URL and attach project_id when available\n const root = env.AUTH_ROOT_VALUE\n const authUrl = new URL(\"/auth\", String(root))\n authUrl.searchParams.set(\"redirect_uri\", String(loc))\n if (pid) authUrl.searchParams.set(\"project_id\", String(pid))\n window.location.href = authUrl.toString()\n } catch {\n // Fallback to simple href\n const encoded = encodeURIComponent(String(loc))\n const pidParam = pid ? `&project_id=${encodeURIComponent(String(pid))}` : \"\"\n const root = env.baseUrl\n window.location.href = `${root}/auth?redirect_uri=${encoded}${pidParam}`\n }\n }\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","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\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, useCallback } 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 const redirectToAuth = useCallback(() => {\n if (!redirectOnUnauthenticated || typeof window === 'undefined') return\n\n try {\n const currentUrl = new URL(window.location.href)\n if (currentUrl.pathname.includes('/auth')) return\n\n try {\n const authUrlObj = new URL(resolvedAuthUrl)\n authUrlObj.searchParams.set('redirect_uri', window.location.href)\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 return\n } catch (error) {\n console.error('[HowOneProvider] Failed to build auth URL:', error)\n }\n\n setPendingRedirect(true)\n requestAnimationFrame(() => {\n window.location.href = resolvedAuthUrl\n })\n } catch {\n setPendingRedirect(true)\n requestAnimationFrame(() => {\n window.location.href = resolvedAuthUrl\n })\n }\n }, [redirectOnUnauthenticated, resolvedAuthUrl, projectId])\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 if (!hasCheckedUrlToken) return\n if (!token && !user) {\n redirectToAuth()\n }\n }, [token, user, hasCheckedUrlToken, redirectToAuth])\n\n const logout = () => {\n try {\n setToken(null)\n } catch { /* ignore */ }\n setTokenState(null)\n setUser(null)\n redirectToAuth()\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 {pendingRedirect && (\n <div className=\"fixed inset-0 z-[100000] 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 flex-grow-0 mt-0.5 relative z-10\">\n <div\n className=\"backdrop-blur-sm rounded-full flex items-center justify-center overflow-hidden flex-shrink-0 flex-grow-0\"\n style={{\n backgroundColor:\n (theme === \"dark\" || (theme === \"system\" && window.matchMedia(\"(prefers-color-scheme: dark)\").matches))\n ? 'rgba(255, 255, 255, 0.1)'\n : 'rgba(0, 0, 0, 0.05)',\n width: '28px',\n height: '28px',\n }}\n >\n <div className=\"rounded-full flex items-center justify-center\">\n <Icon\n icon={iconConfig.icon}\n width={16}\n height={16}\n className={`flex-shrink-0`}\n style={{\n color: themeConfig.gradientColor,\n display: 'block',\n }}\n />\n </div>\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', backgroundColor: 'transparent' }\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 * 文件上传客户端\n * \n * 独立的上传功能,不依赖其他模块\n */\n\nimport type Request from './request'\nimport type { \n UploadOptions, \n UploadResponse, \n BatchUploadOptions,\n BatchUploadResponse \n} from './upload-types'\n\nexport function createUploadClient(req: Request, projectId?: string) {\n // 直接使用完整路径(参考后端接口:/api/entities/apps/{appId}/files)\n const uploadUrl = projectId \n ? `/entities/apps/${projectId}/files`\n : '/files'\n return {\n /**\n * 上传单个文件\n * \n * @example\n * ```typescript\n * const { url } = await client.upload.file(imageFile)\n * console.log('文件地址:', url)\n * ```\n */\n async file(\n file: File | Blob | string,\n options?: UploadOptions\n ): Promise<UploadResponse> {\n const formData = new FormData()\n\n // 处理不同类型的输入\n if (typeof file === 'string') {\n // Base64 或 URL\n if (file.startsWith('data:')) {\n const response = await fetch(file)\n const blob = await response.blob()\n formData.append('file', blob, 'upload.bin')\n } else {\n formData.append('fileUrl', file)\n }\n } else if (file instanceof File) {\n formData.append('file', file, file.name)\n } else {\n formData.append('file', file, 'upload.bin')\n }\n\n // 添加元数据\n if (options?.metadata) {\n formData.append('metadata', JSON.stringify(options.metadata))\n }\n\n // 发送上传请求\n const response = await req.post({\n url: uploadUrl,\n data: formData,\n signal: options?.signal,\n })\n\n // 返回简化的结果\n return {\n url: response.data.publicUrl\n }\n },\n\n /**\n * 上传图片(快捷方法,专为 AI 设计)\n * \n * @example\n * ```typescript\n * const { url } = await client.upload.image(imageFile)\n * ```\n */\n async image(file: File | Blob | string): Promise<{ url: string }> {\n const result = await this.file(file)\n return { url: result.url }\n },\n\n /**\n * 批量上传文件\n * \n * @example\n * ```typescript\n * const result = await client.upload.batch({\n * files: [file1, file2, file3],\n * concurrent: 3,\n * onProgress: (completed, total) => {\n * console.log(`${completed}/${total}`)\n * }\n * })\n * ```\n */\n async batch(options: BatchUploadOptions): Promise<BatchUploadResponse> {\n const { files, concurrent = 3, onProgress, onFileComplete, signal } = options\n \n const success: UploadResponse[] = []\n const failed: Array<{ index: number; error: string }> = []\n let completed = 0\n\n // 分批上传\n for (let i = 0; i < files.length; i += concurrent) {\n if (signal?.aborted) break\n\n const batch = files.slice(i, Math.min(i + concurrent, files.length))\n \n const promises = batch.map(async (file, batchIndex) => {\n const globalIndex = i + batchIndex\n\n try {\n const result = await this.file(file, { signal })\n success.push(result)\n \n if (onFileComplete) {\n onFileComplete(result, globalIndex)\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n failed.push({ index: globalIndex, error: errorMsg })\n \n if (onFileComplete) {\n onFileComplete(\n error instanceof Error ? error : new Error(errorMsg),\n globalIndex\n )\n }\n } finally {\n completed++\n if (onProgress) {\n onProgress(completed, files.length)\n }\n }\n })\n\n await Promise.all(promises)\n }\n\n return {\n success,\n failed,\n total: files.length,\n }\n },\n }\n}\n\n","/**\n * AI 功能客户端\n * \n * 包含图片生成、修改等 AI 相关功能\n */\n\nimport type Request from './request'\n\n/**\n * 图片生成/修改选项\n */\nexport interface GenerateImageOptions {\n imageUrl: string\n description: string\n signal?: AbortSignal\n}\n\n/**\n * 图片生成结果\n */\nexport interface GenerateImageResponse {\n imageUrl: string\n taskId?: string\n metadata?: Record<string, any>\n}\n\n/**\n * 创建 AI 客户端\n */\nexport function createAIClient(req: Request, projectId?: string) {\n // 构建 URL\n const generateImageUrl = projectId \n ? `/entities/apps/${projectId}/generate-image`\n : '/generate-image'\n\n return {\n /**\n * 生成/修改图片\n * \n * @example\n * ```typescript\n * const result = await client.ai.generateImage({\n * imageUrl: 'https://example.com/image.jpg',\n * description: '把天空改成蓝色'\n * })\n * console.log('新图片:', result.imageUrl)\n * ```\n */\n async generateImage(options: GenerateImageOptions): Promise<GenerateImageResponse> {\n const { imageUrl, description, signal } = options\n\n const response = await req.post({\n url: generateImageUrl,\n data: {\n imageUrl,\n description\n },\n signal\n })\n\n return {\n imageUrl: response.imageUrl || response.url,\n taskId: response.taskId || response.id,\n metadata: response.metadata\n }\n }\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\nimport { showLimitUpgradeToast } from '../components'\nimport { getEnvs } from '../config'\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 // 处理 key_limit_exceed 事件\n if (rawEvent.type === 'key_limit_exceed') {\n const errorMsg = rawEvent.data.content\n result.errors.push(errorMsg)\n\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\n if (options.onError) {\n options.onError(new Error(errorMsg))\n }\n\n throw new Error(errorMsg)\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 \"./upload-types\";\nexport { createUploadClient } from \"./upload-client\";\nexport { createAIClient } from \"./ai-client\";\nexport type { GenerateImageOptions, GenerateImageResponse } from \"./ai-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 { createUploadClient } from \"./upload-client\";\nimport { createAIClient } from \"./ai-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 // Always set the global default project id from opts (use null to clear).\n // This ensures `getDefaultProjectId()` reflects the latest client creation.\n setDefaultProjectId(opts?.projectId ? String(opts.projectId) : null);\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\n /**\n * 文件上传模块(独立,不依赖 artifact)\n * \n * @example\n * ```typescript\n * // 最简单的用法\n * const { url } = await client.upload.file(imageFile)\n * console.log('文件地址:', url)\n * \n * // AI 友好版本(只返回 url)\n * const { url } = await client.upload.image(imageFile)\n * \n * // 批量上传\n * const result = await client.upload.batch({\n * files: [file1, file2, file3],\n * concurrent: 3,\n * onProgress: (completed, total) => console.log(`${completed}/${total}`)\n * })\n * ```\n */\n upload: createUploadClient(bizWrapped as any as Request, opts?.projectId),\n\n /**\n * AI 功能模块\n * \n * @example\n * ```typescript\n * // 图片生成/修改\n * const result = await client.ai.generateImage({\n * imageUrl: 'https://example.com/image.jpg',\n * description: '把天空改成蓝色'\n * })\n * console.log('新图片:', result.imageUrl)\n * ```\n */\n ai: createAIClient(bizWrapped as any as Request, opts?.projectId),\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 // Redirect to login page after logout\n if (typeof window !== \"undefined\") {\n const loc = window.location.href;\n try {\n const root = env.AUTH_ROOT_VALUE;\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 },\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\nimport { showLimitUpgradeToast } from \"../components\";\nimport { getEnvs } from \"../config\";\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 // 处理 key_limit_exceed 事件\n else if (event.type === 'key_limit_exceed') {\n const errorMsg = event.data?.content as string\n result.errors.push(errorMsg);\n\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\n if (options?.onError) {\n options.onError(new Error(errorMsg));\n }\n\n throw new Error(errorMsg);\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 * 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","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","response","envValue","env","React","import_react","import_react"]}
|
|
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/upload-client.ts","../src/services/ai-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/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\nimport { setEnvironment, getGlobalEnvironment, getDefaultProjectId } from \"../config\";\n\nexport const AUTH_TOKEN_KEY = 'auth_token'\n// no internal helper exported — setToken already notifies subscribers\n\n// Import the `env` configuration from the appropriate module\n\n// Initialize `env` using the same logic as in services/index.ts\nconst envValue = getGlobalEnvironment() || \"prod\";\nconst env = setEnvironment(envValue);\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.puid || 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 // Redirect to login page after logout\n if (typeof window !== \"undefined\") {\n const loc = window.location.href\n // try to get a default project id (may be set via global or runtime)\n const pid = getDefaultProjectId()\n try {\n // Use environment base URL and attach project_id when available\n const root = env.AUTH_ROOT_VALUE\n const authUrl = new URL(\"/auth\", String(root))\n authUrl.searchParams.set(\"redirect_uri\", String(loc))\n if (pid) authUrl.searchParams.set(\"project_id\", String(pid))\n window.location.href = authUrl.toString()\n } catch {\n // Fallback to simple href\n const encoded = encodeURIComponent(String(loc))\n const pidParam = pid ? `&project_id=${encodeURIComponent(String(pid))}` : \"\"\n const root = env.baseUrl\n window.location.href = `${root}/auth?redirect_uri=${encoded}${pidParam}`\n }\n }\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","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\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, useCallback } 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 { getDefaultProjectId, 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[data-howone-auth-overlay-root] {\n position: fixed;\n inset: 0;\n z-index: 2147483646;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100vw;\n height: 100vh;\n color: #ffffff;\n background: rgba(0, 0, 0, 0.65);\n backdrop-filter: blur(6px);\n -webkit-backdrop-filter: blur(6px);\n text-align: center;\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 const redirectToAuth = useCallback(() => {\n if (!redirectOnUnauthenticated || typeof window === 'undefined') return\n const activeProjectId = projectId ?? getDefaultProjectId()\n\n const navigateToResolvedAuth = () => {\n setPendingRedirect(true)\n requestAnimationFrame(() => {\n if (activeProjectId) {\n try {\n const url = new URL(resolvedAuthUrl)\n url.searchParams.set('redirect_uri', window.location.href)\n url.searchParams.set('project_id', activeProjectId)\n window.location.href = url.toString()\n return\n } catch (error) {\n console.error('[HowOneProvider] Failed to attach project_id to auth URL:', error)\n }\n }\n window.location.href = resolvedAuthUrl\n })\n }\n\n try {\n const currentUrl = new URL(window.location.href)\n if (currentUrl.pathname.includes('/auth')) return\n\n try {\n const authUrlObj = new URL(resolvedAuthUrl)\n authUrlObj.searchParams.set('redirect_uri', window.location.href)\n if (activeProjectId) {\n authUrlObj.searchParams.set('project_id', activeProjectId)\n }\n\n setPendingRedirect(true)\n requestAnimationFrame(() => {\n window.location.href = authUrlObj.toString()\n })\n return\n } catch (error) {\n console.error('[HowOneProvider] Failed to build auth URL:', error)\n }\n\n navigateToResolvedAuth()\n } catch {\n navigateToResolvedAuth()\n }\n }, [redirectOnUnauthenticated, resolvedAuthUrl, projectId])\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 if (!hasCheckedUrlToken) return\n if (!token && !user) {\n redirectToAuth()\n }\n }, [token, user, hasCheckedUrlToken, redirectToAuth])\n\n const logout = () => {\n try {\n setToken(null)\n } catch { /* ignore */ }\n setTokenState(null)\n setUser(null)\n redirectToAuth()\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 {pendingRedirect && (\n <div\n data-howone-auth-overlay-root\n className=\"fixed inset-0 z-[100000] h-full w-full flex flex-col items-center justify-center bg-black/65 backdrop-blur-sm text-white\"\n >\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 flex-grow-0 mt-0.5 relative z-10\">\n <div\n className=\"backdrop-blur-sm rounded-full flex items-center justify-center overflow-hidden flex-shrink-0 flex-grow-0\"\n style={{\n backgroundColor:\n (theme === \"dark\" || (theme === \"system\" && window.matchMedia(\"(prefers-color-scheme: dark)\").matches))\n ? 'rgba(255, 255, 255, 0.1)'\n : 'rgba(0, 0, 0, 0.05)',\n width: '28px',\n height: '28px',\n }}\n >\n <div className=\"rounded-full flex items-center justify-center\">\n <Icon\n icon={iconConfig.icon}\n width={16}\n height={16}\n className={`flex-shrink-0`}\n style={{\n color: themeConfig.gradientColor,\n display: 'block',\n }}\n />\n </div>\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', backgroundColor: 'transparent' }\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 * 文件上传客户端\n * \n * 独立的上传功能,不依赖其他模块\n */\n\nimport type Request from './request'\nimport type { \n UploadOptions, \n UploadResponse, \n BatchUploadOptions,\n BatchUploadResponse \n} from './upload-types'\n\nexport function createUploadClient(req: Request, projectId?: string) {\n // 直接使用完整路径(参考后端接口:/api/entities/apps/{appId}/files)\n const uploadUrl = projectId \n ? `/entities/apps/${projectId}/files`\n : '/files'\n return {\n /**\n * 上传单个文件\n * \n * @example\n * ```typescript\n * const { url } = await client.upload.file(imageFile)\n * console.log('文件地址:', url)\n * ```\n */\n async file(\n file: File | Blob | string,\n options?: UploadOptions\n ): Promise<UploadResponse> {\n const formData = new FormData()\n\n // 处理不同类型的输入\n if (typeof file === 'string') {\n // Base64 或 URL\n if (file.startsWith('data:')) {\n const response = await fetch(file)\n const blob = await response.blob()\n formData.append('file', blob, 'upload.bin')\n } else {\n formData.append('fileUrl', file)\n }\n } else if (file instanceof File) {\n formData.append('file', file, file.name)\n } else {\n formData.append('file', file, 'upload.bin')\n }\n\n // 添加元数据\n if (options?.metadata) {\n formData.append('metadata', JSON.stringify(options.metadata))\n }\n\n // 发送上传请求\n const response = await req.post({\n url: uploadUrl,\n data: formData,\n signal: options?.signal,\n })\n\n // 返回简化的结果\n return {\n url: response.data.publicUrl\n }\n },\n\n /**\n * 上传图片(快捷方法,专为 AI 设计)\n * \n * @example\n * ```typescript\n * const { url } = await client.upload.image(imageFile)\n * ```\n */\n async image(file: File | Blob | string): Promise<{ url: string }> {\n const result = await this.file(file)\n return { url: result.url }\n },\n\n /**\n * 批量上传文件\n * \n * @example\n * ```typescript\n * const result = await client.upload.batch({\n * files: [file1, file2, file3],\n * concurrent: 3,\n * onProgress: (completed, total) => {\n * console.log(`${completed}/${total}`)\n * }\n * })\n * ```\n */\n async batch(options: BatchUploadOptions): Promise<BatchUploadResponse> {\n const { files, concurrent = 3, onProgress, onFileComplete, signal } = options\n \n const success: UploadResponse[] = []\n const failed: Array<{ index: number; error: string }> = []\n let completed = 0\n\n // 分批上传\n for (let i = 0; i < files.length; i += concurrent) {\n if (signal?.aborted) break\n\n const batch = files.slice(i, Math.min(i + concurrent, files.length))\n \n const promises = batch.map(async (file, batchIndex) => {\n const globalIndex = i + batchIndex\n\n try {\n const result = await this.file(file, { signal })\n success.push(result)\n \n if (onFileComplete) {\n onFileComplete(result, globalIndex)\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n failed.push({ index: globalIndex, error: errorMsg })\n \n if (onFileComplete) {\n onFileComplete(\n error instanceof Error ? error : new Error(errorMsg),\n globalIndex\n )\n }\n } finally {\n completed++\n if (onProgress) {\n onProgress(completed, files.length)\n }\n }\n })\n\n await Promise.all(promises)\n }\n\n return {\n success,\n failed,\n total: files.length,\n }\n },\n }\n}\n\n","/**\n * AI 功能客户端\n * \n * 包含图片生成、修改等 AI 相关功能\n */\n\nimport type Request from './request'\n\n/**\n * 图片生成/修改选项\n */\nexport interface GenerateImageOptions {\n imageUrl: string\n description: string\n signal?: AbortSignal\n}\n\n/**\n * 图片生成结果\n */\nexport interface GenerateImageResponse {\n imageUrl: string\n taskId?: string\n metadata?: Record<string, any>\n}\n\n/**\n * 创建 AI 客户端\n */\nexport function createAIClient(req: Request, projectId?: string) {\n // 构建 URL\n const generateImageUrl = projectId\n ? `/entities/apps/${projectId}/generate-image`\n : '/generate-image'\n\n return {\n /**\n * 生成/修改图片\n * \n * @example\n * ```typescript\n * const result = await client.ai.generateImage({\n * imageUrl: 'https://example.com/image.jpg',\n * description: '把天空改成蓝色'\n * })\n * console.log('新图片:', result.imageUrl)\n * ```\n */\n async generateImage(options: GenerateImageOptions): Promise<GenerateImageResponse> {\n const { imageUrl, description, signal } = options\n\n const response = await req.post({\n url: generateImageUrl,\n data: {\n imageUrl,\n description\n },\n signal\n })\n\n return {\n imageUrl: response.data.result.imageUrl\n }\n }\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\nimport { showLimitUpgradeToast } from '../components'\nimport { getEnvs } from '../config'\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 // 处理 key_limit_exceed 事件\n if (rawEvent.type === 'key_limit_exceed') {\n const errorMsg = rawEvent.data.content\n result.errors.push(errorMsg)\n\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\n if (options.onError) {\n options.onError(new Error(errorMsg))\n }\n\n throw new Error(errorMsg)\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 \"./upload-types\";\nexport { createUploadClient } from \"./upload-client\";\nexport { createAIClient } from \"./ai-client\";\nexport type { GenerateImageOptions, GenerateImageResponse } from \"./ai-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 { createUploadClient } from \"./upload-client\";\nimport { createAIClient } from \"./ai-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 // Always set the global default project id from opts (use null to clear).\n // This ensures `getDefaultProjectId()` reflects the latest client creation.\n setDefaultProjectId(opts?.projectId ? String(opts.projectId) : null);\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: 'd27e7fbd-651a-4ff1-ae44-a220cb3b0522',\n * inputs: {\n * source_file_url: fileUrl,\n * analysis_depth: 'standard',\n * },\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({\n * workflowId: 'd27e7fbd-651a-4ff1-ae44-a220cb3b0522',\n * inputs: { source_file_url: fileUrl, analysis_depth: 'standard' },\n * })\n * const events = client.sse.events.post({\n * workflowId: 'd27e7fbd-651a-4ff1-ae44-a220cb3b0522',\n * inputs: { source_file_url: fileUrl, analysis_depth: 'standard' },\n * })\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\n /**\n * 文件上传模块(独立,不依赖 artifact)\n * \n * @example\n * ```typescript\n * // 最简单的用法\n * const { url } = await client.upload.file(imageFile)\n * console.log('文件地址:', url)\n * \n * // AI 友好版本(只返回 url)\n * const { url } = await client.upload.image(imageFile)\n * \n * // 批量上传\n * const result = await client.upload.batch({\n * files: [file1, file2, file3],\n * concurrent: 3,\n * onProgress: (completed, total) => console.log(`${completed}/${total}`)\n * })\n * ```\n */\n upload: createUploadClient(bizWrapped as any as Request, opts?.projectId),\n\n /**\n * AI 功能模块\n * \n * @example\n * ```typescript\n * // 图片生成/修改\n * const result = await client.ai.generateImage({\n * imageUrl: 'https://example.com/image.jpg',\n * description: '把天空改成蓝色'\n * })\n * console.log('新图片:', result.imageUrl)\n * ```\n */\n ai: createAIClient(bizWrapped as any as Request, opts?.projectId),\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 // Redirect to login page after logout\n if (typeof window !== \"undefined\") {\n const loc = window.location.href;\n try {\n const root = env.AUTH_ROOT_VALUE;\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 },\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\nimport { showLimitUpgradeToast } from \"../components\";\nimport { getEnvs } from \"../config\";\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 // 处理 key_limit_exceed 事件\n else if (event.type === 'key_limit_exceed') {\n const errorMsg = event.data?.content as string\n result.errors.push(errorMsg);\n\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\n if (options?.onError) {\n options.onError(new Error(errorMsg));\n }\n\n throw new Error(errorMsg);\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 * 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","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","response","envValue","env","React","import_react","import_react"]}
|