@lark-apaas/client-toolkit-lite 1.1.15-alpha.5 → 1.1.15-alpha.6
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.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/AppContainer/index.tsx","../src/runtime/react-devtools-hook.ts","../src/utils/axiosConfig.ts","../src/utils/getCsrfToken.ts","../src/runtime/observable.ts","../src/utils/apiPath.ts","../src/logger/logger.ts","../src/logger/intercept-global-error.ts","../src/utils/hmr-api.ts","../src/utils/postMessage.ts","../src/logger/log-types.ts","../src/utils/safeStringify.ts","../src/logger/selected-logs.ts","../src/logger/batch-logger.ts","../src/runtime/iframe-bridge.ts","../src/utils/utils.ts","../src/components/AppContainer/utils/childApi.ts","../src/runtime/index.ts","../src/components/AppContainer/safety.tsx","../src/utils/getAppId.ts","../src/utils/getEnv.ts","../src/utils/getInitialInfo.ts","../src/utils/getTenantInfo.ts","../src/hooks/useAppInfo.tsx","../src/integrations/getAppInfo.ts","../src/hooks/useCurrentUserProfile.tsx","../src/integrations/getCurrentUserProfile.ts","../src/hooks/useIsMobile.ts","../src/hooks/useLogout.ts","../src/locales/messages.ts","../src/utils/locale.ts","../src/locales/index.ts","../src/components/AppContainer/Watermark.tsx","../src/components/AppContainer/doubao-watermark-asset.ts","../src/components/QueryProvider/index.tsx","../src/components/AppContainer/IframeBridge.tsx","../src/hooks/useUpdatingRef.ts","../src/components/AppContainer/utils/tea.ts","../src/utils/deviceType.ts","../src/components/AppContainer/utils/getLarkUser.ts","../src/types/tea.ts","../src/components/Welcome/index.tsx","../src/components/PagePlaceholder/index.tsx","../src/components/ErrorRender/index.tsx","../src/route-components/ActiveLink.tsx","../src/route-components/NavLink.tsx","../src/route-components/UniversalLink.tsx","../src/utils/scopedStorage.ts","../src/utils/copyToClipboard.ts","../src/utils/resolveAppUrl.ts","../src/utils/getEnvPath.ts","../src/utils/getAxiosForBackend.ts","../src/utils/url.ts","../src/integrations/dataloom.ts","../src/integrations/capabilityClient.ts","../src/components/ui/toast.tsx","../src/trace/index.ts","../src/constants/img-resources/avatar.ts","../src/constants/img-resources/banner.ts","../src/constants/img-resources/cover.ts"],"sourcesContent":["// Components\nexport { default as AppContainer } from './components/AppContainer';\nexport { default as QueryProvider } from './components/QueryProvider';\nexport { default as Welcome } from './components/Welcome';\nexport { default as PagePlaceholder } from './components/PagePlaceholder';\nexport { default as ErrorRender } from './components/ErrorRender';\n\n// Route Components\nexport { ActiveLink } from './route-components/ActiveLink';\nexport { NavLink } from './route-components/NavLink';\nexport { UniversalLink } from './route-components/UniversalLink';\n\n// Hooks\nexport { useAppInfo } from './hooks/useAppInfo';\nexport { useCurrentUserProfile } from './hooks/useCurrentUserProfile';\nexport { useIsMobile } from './hooks/useIsMobile';\nexport { useLogout } from './hooks/useLogout';\n\n// Utils\nexport { clsxWithTw, isPreview, normalizeBasePath, getWsPath } from './utils/utils';\nexport { getAppId } from './utils/getAppId';\nexport { getCsrfToken } from './utils/getCsrfToken';\nexport { scopedStorage } from './utils/scopedStorage';\nexport { copyToClipboard } from './utils/copyToClipboard';\nexport { isIpad, isMobile, isIOS } from './utils/deviceType';\nexport { resolveAppUrl } from './utils/resolveAppUrl';\nexport { getEnvPath } from './utils/getEnvPath';\nexport { safeStringify } from './utils/safeStringify';\nexport { getAxiosForBackend, axiosForBackend } from './utils/getAxiosForBackend';\nexport { initAxiosConfig } from './utils/axiosConfig';\n\n// Integrations\nexport { getAppInfo } from './integrations/getAppInfo';\nexport { getCurrentUserProfile } from './integrations/getCurrentUserProfile';\nexport { getDataloom } from './integrations/dataloom';\nexport { capabilityClient } from './integrations/capabilityClient';\n\n// Logger\nexport { logger } from './logger';\nexport type { LogLevel, LogWithMeta } from './logger/log-types';\n\n// Observability\nexport { trace } from './trace';\nexport { initObservable } from './runtime/observable';\n\n// Types\nexport type { AppInfoPayload } from './types/common';\nexport type { IUserProfile, IJson, IFileAttachment } from './types/udt-types';\nexport type { TrackParams } from './types/tea';\nexport { TrackKey } from './types/tea';\n\n// Tea\nexport { reportTeaEvent } from './components/AppContainer/utils/tea';\n\n// Constants\nexport * as avatarImages from './constants/img-resources/avatar';\nexport * as bannerImages from './constants/img-resources/banner';\nexport * as coverImages from './constants/img-resources/cover';\n","import React, { useEffect } from 'react';\nimport { MiaodaInspector } from '@lark-apaas/miaoda-inspector';\n\n// 兼容性:确保 runtime 被加载\n// runtime 内部有防重复机制(__FULLSTACK_RUNTIME_INITIALIZED__),不会重复执行\nimport '../../runtime';\n\nimport Safety from './safety';\nimport Watermark from './Watermark';\nimport QueryProvider from '../QueryProvider';\nimport IframeBridge from './IframeBridge';\nimport { useAppInfo } from '../../hooks';\nimport { reportTeaEvent } from './utils/tea';\nimport { TrackKey } from '../../types/tea';\nimport { getAppId } from '../../utils/getAppId';\n\ninterface AppContainerProps {\n children: React.ReactNode;\n}\n\nconst AppContainer: React.FC<AppContainerProps> = ({ children }) => {\n useAppInfo();\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'production') {\n reportTeaEvent({\n trackKey: TrackKey.VIEW,\n trackParams: {\n artifact_uid: getAppId(),\n agent_id: 'agent_miaoda',\n url: window.location.href,\n },\n });\n }\n }, []);\n\n return (\n <>\n {/* AppType=7 是 jsPage MODERN_APP,不显示「由妙搭搭建」徽标。\n AppType 由沙箱注入 MIAODA_APP_TYPE 环境变量,preset 顶层 define 透传给客户端。\n 在此 gate(而非 Safety 内部),jsPage 下 Safety 整个不挂载,省掉 effect/fetch/render。\n process.env 在浏览器是 undefined,env 必然是字符串(即使语义是数字)。 */}\n {String(process.env.MIAODA_APP_TYPE) !== '7' && <Safety />}\n {process.env.NODE_ENV !== 'production' && <MiaodaInspector />}\n {process.env.NODE_ENV !== 'production' && <IframeBridge />}\n <Watermark />\n <QueryProvider>\n {children}\n </QueryProvider>\n </>\n );\n};\n\nexport default AppContainer;\n","/* eslint-disable */\n/**\n * Inject minimal __REACT_DEVTOOLS_GLOBAL_HOOK__ before React loads.\n * React checks for this hook during module initialization and registers its\n * renderer via hook.inject(). This gives us access to renderer.overrideProps()\n * for live component prop modification in the inspector.\n *\n * Must execute before React's module-level code runs.\n *\n * When react-refresh-runtime runs first (as an rspack runtime module),\n * it may create __REACT_DEVTOOLS_GLOBAL_HOOK__ with an inject() that\n * doesn't populate the renderers Map. We patch the existing hook to\n * ensure renderers are always tracked.\n */\n\nexport {};\n\ndeclare global {\n interface Window {\n __REACT_DEVTOOLS_GLOBAL_HOOK__?: any;\n }\n}\n\nif (typeof window !== 'undefined' && process.env.NODE_ENV !== 'production') {\n if (!window.__REACT_DEVTOOLS_GLOBAL_HOOK__) {\n // No hook yet — create a minimal one\n window.__REACT_DEVTOOLS_GLOBAL_HOOK__ = {\n renderers: new Map(),\n supportsFiber: true,\n inject(renderer: any) {\n const id = this.renderers.size + 1;\n this.renderers.set(id, renderer);\n return id;\n },\n onCommitFiberRoot() {},\n onCommitFiberUnmount() {},\n };\n } else {\n // Hook already exists (react-refresh, React DevTools extension, etc.)\n // Ensure renderers Map and inject() both work correctly.\n const hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n if (!(hook.renderers instanceof Map)) {\n hook.renderers = new Map();\n }\n\n const originalInject =\n typeof hook.inject === 'function' ? hook.inject.bind(hook) : null;\n\n hook.inject = function (renderer: any) {\n const id = originalInject\n ? originalInject(renderer)\n : hook.renderers.size + 1;\n if (id != null && !hook.renderers.has(id)) {\n hook.renderers.set(id, renderer);\n }\n return id;\n };\n }\n}\n","import axios, { type AxiosInstance } from 'axios';\nimport { getCsrfToken } from './getCsrfToken';\n\n/**\n * 精简版 Axios 配置\n * 仅注入 CSRF token 和基础拦截器,不包含 observable/slardar/trace\n */\nexport function initAxiosConfig(axiosInstance?: AxiosInstance): void {\n if (!axiosInstance) {\n axiosInstance = axios;\n }\n // 请求拦截器:注入 CSRF token\n axiosInstance.interceptors.request.use(\n (config) => {\n const csrfToken = getCsrfToken();\n if (csrfToken) {\n config.headers['X-Suda-Csrf-Token'] = csrfToken;\n }\n\n // 注入当前页面路由\n if (typeof window !== 'undefined') {\n config.headers['X-Page-Route'] = window.location.pathname;\n }\n\n return config;\n },\n (error) => Promise.reject(error),\n );\n\n // 响应拦截器:开发环境日志\n axiosInstance.interceptors.response.use(\n (response) => response,\n (error) => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[axios]', error.config?.method?.toUpperCase(), error.config?.url, error.message);\n }\n return Promise.reject(error);\n },\n );\n}\n","/**\n * 获取cookie中存放的suda-csrf-token值\n * @returns {string | null} - suda-csrf-token的值,如果不存在则返回null\n */\nexport function getCsrfToken() {\n const cookieName = 'suda-csrf-token';\n\n // 从document.cookie中获取所有cookie\n const cookies = document.cookie.split('; ');\n\n // 查找指定name的cookie\n for (const cookie of cookies) {\n const [name, value] = cookie.split('=');\n if (name === cookieName) {\n // 解码cookie值\n return decodeURIComponent(value);\n }\n }\n\n // 如果没有找到,则从window上获取(全栈模式下,window上会有这个值)\n return window.csrfToken ?? null;\n}\n","import { observable, AppEnv } from '@lark-apaas/observable-web';\nimport { isNewPathEnabled } from '../utils/apiPath';\n\n/**\n * 初始化 OpenTelemetry 可观测(traces / logs / metrics)。\n * 从老 client-toolkit 搬过来——逻辑保持一致:\n * - serviceName 固定 \"app\"\n * - dev / prod 区分 AppEnv\n * - collector URL 区分新旧 path 形态(/app/:appId vs /spark/app/:appId)\n *\n * 内部 try/catch 吞错——SDK 启动失败不应阻断应用渲染。\n */\nexport const initObservable = (): void => {\n try {\n const appId = (window as unknown as { appId: string }).appId;\n observable.start({\n serviceName: 'app',\n env: process.env.NODE_ENV === 'development' ? AppEnv.Dev : AppEnv.Prod,\n collectorUrl: isNewPathEnabled()\n ? {\n log: `/app/${appId}/__runtime__/api/v1/observability/logs/collect`,\n trace: `/app/${appId}/__runtime__/api/v1/observability/traces/collect`,\n metric: `/app/${appId}/__runtime__/api/v1/observability/metrics/collect`,\n time: `/app/${appId}/__runtime__/api/v1/observability/current_server_timestamp`,\n }\n : {\n log: `/spark/app/${appId}/runtime/api/v1/observability/logs/collect`,\n trace: `/spark/app/${appId}/runtime/api/v1/observability/traces/collect`,\n metric: `/spark/app/${appId}/runtime/api/v1/observability/metrics/collect`,\n time: `/spark/api/v1/observability/app/${appId}/current_server_timestamp`,\n },\n });\n } catch (error) {\n console.error('Failed to start WebObservableSdk:', error);\n }\n};\n","/**\n * 判断当前是否启用新的路径规范\n * 新路径规范:CLIENT_BASE_PATH 以 /app/:appId 格式开头\n */\nexport function isNewPathEnabled(): boolean {\n const basePath = process.env.CLIENT_BASE_PATH || '/';\n return /^\\/app\\/[^/]/.test(basePath);\n}\n","import { observable } from '@lark-apaas/observable-web';\nimport { interceptErrors as interceptLogs } from './intercept-global-error';\nimport { LogLevel, LogWithMeta } from './log-types';\nimport { processLogParams, mapLogLevel } from '../utils/safeStringify';\nimport { interceptors } from './selected-logs';\n\n/**\n * lite 版 logger:\n * - 跟老 toolkit 一样的语义(debug/info/warn/error/success + 通用 log())\n * - 生产环境通过 observable.log 上报到 OpenTelemetry\n * - dev 环境调 interceptErrors,监听全局 error/unhandledrejection、devServer 状态\n * - 末尾通过 interceptors 链路包一层 typedLogInterceptor:任何 logger 顶层方法调用\n * 都会同步 postMessage `SELECTED_LOG`(typedLogV2 格式)给妙搭外壳,level==='error'\n * 时妙搭 sandbox-console 把它计入 errorCount → 显示「一键修复」按钮\n */\n\nexport type LogInterceptor = (originLogger: typeof logger) => typeof logger;\n\nconst shouldReportToObservable = process.env.NODE_ENV === 'production';\n\ninterface LoggerConfig {\n /** 是否显示日志级别前缀 */\n showLevel?: boolean;\n /** 是否显示时间戳 */\n showTimestamp?: boolean;\n /** 日志级别 */\n level?: LogLevel;\n /** 配置前缀字符串 */\n prefix?: string;\n}\n\nconst ORDERED_LEVELS: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n\nconst defaultConfig: Required<LoggerConfig> = {\n showLevel: false,\n showTimestamp: false,\n level: 'info',\n prefix: '',\n};\n\nlet config: Required<LoggerConfig> = { ...defaultConfig };\n\nfunction configureLogger(options: LoggerConfig) {\n config = { ...defaultConfig, ...options };\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return ORDERED_LEVELS.indexOf(level) >= ORDERED_LEVELS.indexOf(config.level);\n}\n\nfunction getFormattedPrefix(level: LogLevel): string[] {\n const parts: string[] = [];\n if (config.prefix) {\n parts.push(`[${config.prefix}]`);\n }\n if (config.showLevel) {\n parts.push(`[${level.toUpperCase()}]`);\n }\n return parts;\n}\n\n// 默认配置 logger,import 即生效\nconfigureLogger({\n showLevel: true,\n showTimestamp: false,\n level: process.env.NODE_ENV === 'development' ? 'debug' : 'error',\n prefix: 'MiaoDa',\n});\n\nexport let logger = {\n debug(message: unknown, ...args: unknown[]) {\n if (shouldLog('debug')) {\n console.log(...getFormattedPrefix('debug'), message, ...args);\n }\n },\n info(message: unknown, ...args: unknown[]) {\n if (shouldLog('info')) {\n console.log(...getFormattedPrefix('info'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('INFO', processLogParams([message, ...args]).join(' '));\n }\n },\n warn(message: unknown, ...args: unknown[]) {\n if (shouldLog('warn')) {\n console.log(...getFormattedPrefix('warn'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('WARN', processLogParams([message, ...args]).join(' '));\n }\n },\n error(message: unknown, ...args: unknown[]) {\n if (shouldLog('error')) {\n console.error(...getFormattedPrefix('error'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('ERROR', processLogParams([message, ...args]).join(' '));\n }\n },\n success(message: unknown, ...args: unknown[]) {\n if (shouldLog('info')) {\n console.log(...getFormattedPrefix('success'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('INFO', processLogParams([message, ...args]).join(' '));\n }\n },\n log({ level, args }: LogWithMeta) {\n if (shouldLog(level)) {\n console.log(...getFormattedPrefix(level), ...args);\n }\n if (shouldReportToObservable && level !== 'debug') {\n observable.log(mapLogLevel(level), processLogParams(args).join(' '));\n }\n },\n};\n\nif (process.env.NODE_ENV !== 'production') {\n // 在 window 上挂内置 logger,用于收集 ErrorBoundary 之外的运行时报错\n (window as unknown as { __RUNTIME_LOGGER__?: unknown }).__RUNTIME_LOGGER__ = {\n get() {\n return logger;\n },\n };\n}\n\n// 应用 interceptors 链:包一层 typedLogInterceptor,让所有 logger 方法都发 SELECTED_LOG\nfor (const interceptor of interceptors) {\n logger = interceptor(logger);\n}\n\nif (process.env.NODE_ENV !== 'production') {\n interceptLogs();\n}\n","import { slardar } from '@lark-apaas/internal-slardar';\nimport { getHmrApi } from '../utils/hmr-api';\nimport { submitPostMessage } from '../utils/postMessage';\nimport { isLogLevel, LogLevel } from './log-types';\nimport { logger } from './logger';\n\n/**\n * lite 版 intercept-global-error:\n * - 拦截全局 error / unhandledrejection → logger.error 上报\n * - 监听 HMR 成功/失败 → postMessage 通知妙搭外壳 + Slardar 埋点\n * - 监听 console 输出里的 devServer 断连/重连关键词 → postMessage 通知外壳 + Slardar 埋点\n */\n\n/** 记录 devServer 断开时间 */\nlet devServerDisconnectInfo: { time: number } | null = null;\nlet retryCount = 0;\n\nfunction processDevServerLog(log: string) {\n if (!log) return;\n const devFlag = log.includes('[webpack-dev-server]') || log.includes('[vite]');\n // 检测断连\n if (devFlag && log.includes('Disconnected')) {\n const time = Date.now();\n devServerDisconnectInfo = { time };\n submitPostMessage({\n type: 'DevServerMessage',\n data: {\n type: 'devServer-status',\n status: 'disconnected',\n },\n });\n slardar.sendEvent({\n name: 'sandbox-devServer',\n metrics: { time },\n categories: {\n type: 'disconnected',\n },\n });\n return;\n }\n if (!devServerDisconnectInfo) {\n return;\n }\n // 检测重连尝试\n if (devFlag && log.includes('Trying to reconnect')) {\n if (retryCount) {\n // 已经重连过一次还没成功,记为 reconnect-failed\n slardar.sendEvent({\n name: 'sandbox-devServer',\n metrics: { retryCount: retryCount + 1 },\n categories: {\n type: 'reconnect-failed',\n },\n });\n }\n retryCount++;\n return;\n }\n // 检测重连成功\n const hmrFlag = log.includes('[HMR]');\n if (\n hmrFlag ||\n (devFlag &&\n (log.includes('Socket connected') ||\n log.includes('App updated') ||\n log.includes('App hot update') ||\n log.includes('connected')))\n ) {\n submitPostMessage({\n type: 'DevServerMessage',\n data: {\n type: 'devServer-status',\n status: 'connected',\n },\n });\n const startTime = devServerDisconnectInfo.time;\n const duration = Date.now() - startTime;\n slardar.sendEvent({\n name: 'sandbox-devServer',\n metrics: { startTime, duration },\n categories: {\n type: 'devServer-reconnected',\n },\n });\n devServerDisconnectInfo = null;\n retryCount = 0;\n }\n}\n\n/**\n * 监听模块热更:\n * - 热更应用成功 → postMessage 通知主应用更新完成\n * - 热更失败 → console.warn + Slardar 埋点\n */\nfunction listenModuleHmr() {\n const hmr = getHmrApi();\n if (hmr) {\n hmr.onSuccess(() => {\n submitPostMessage({\n type: 'DevServerMessage',\n data: {\n type: 'devServer-status',\n status: 'hmr-apply-success',\n },\n });\n });\n\n hmr.onError((error) => {\n console.warn('hmr apply failed', error);\n slardar.sendEvent({\n name: 'sandbox-devServer',\n categories: {\n type: 'hmr-apply-failed',\n error: String(error),\n },\n });\n });\n }\n}\n\nconst PROXY_CONSOLE_METHOD = ['log', 'info', 'warn', 'error'] as const;\n\n/** 当前只有开发态会执行此操作 */\nexport function interceptErrors() {\n window.addEventListener('error', (event) => {\n logger.error(event.error);\n });\n\n window.addEventListener('unhandledrejection', (event) => {\n logger.error(event.reason);\n });\n\n listenModuleHmr();\n\n PROXY_CONSOLE_METHOD.forEach((method) => {\n const originalMethod = window.console[method];\n window.console[method] = (...args: unknown[]) => {\n originalMethod(...args);\n const level: LogLevel = method === 'log' ? 'info' : (method as LogLevel);\n const first = args[0];\n // 检测 devServer 断连/重连\n if (typeof first === 'string') {\n processDevServerLog(first);\n }\n // 转发特定 prefix 日志给妙搭外壳(典型场景:dataloom 报错)\n if (\n typeof first === 'string' &&\n first.startsWith('[Dataloom]') &&\n isLogLevel(level)\n ) {\n logger.log({ level, args });\n submitPostMessage({\n type: 'Console',\n method,\n data: args as unknown as Record<string, unknown>,\n });\n }\n };\n });\n}\n","/**\n * 统一 HMR API\n *\n * 提供统一的 HMR 成功/失败回调接口,屏蔽 Webpack 和 Vite 的差异。\n *\n * - Webpack/Rspack: 通过 import.meta.webpackHot 或 module.hot\n * - Vite: 通过 error-overlay 注入的 window.__VITE_HMR__\n *\n * @see docs/RFC_HMR_API.md\n */\n\nexport interface HmrApi {\n /**\n * 注册 HMR 更新前回调(模块替换之前触发)\n * @param callback 回调函数\n * @returns cleanup 函数,用于取消注册\n */\n onBeforeApply?(callback: () => void): () => void;\n\n /**\n * 注册 HMR 成功回调\n * @param callback 成功回调函数\n * @returns cleanup 函数,用于取消注册\n */\n onSuccess(callback: () => void): () => void;\n\n /**\n * 注册 HMR 失败回调\n * @param callback 失败回调函数,参数为错误信息\n * @returns cleanup 函数,用于取消注册\n */\n onError(callback: (error: unknown) => void): () => void;\n}\n\ndeclare global {\n interface Window {\n __VITE_HMR__?: Required<HmrApi>;\n }\n}\n\ninterface WebpackHot {\n addStatusHandler(handler: (status: string) => void): void;\n removeStatusHandler(handler: (status: string) => void): void;\n}\n\n/**\n * 创建 Webpack/Rspack HMR 适配器\n */\nfunction createWebpackHmrApi(hot: WebpackHot): HmrApi {\n return {\n onSuccess(callback) {\n let lastStatus: string | null = null;\n const handler = (status: string) => {\n // apply -> idle 转换表示 HMR 成功\n if (status === 'idle' && lastStatus === 'apply') {\n try {\n callback();\n } catch (e) {\n console.error('[HMR] Success callback error:', e);\n }\n }\n lastStatus = status;\n };\n hot.addStatusHandler(handler);\n return () => hot.removeStatusHandler(handler);\n },\n\n onError(callback) {\n const handler = (status: string) => {\n // fail 或 abort 表示 HMR 失败\n if (status === 'fail' || status === 'abort') {\n try {\n callback(new Error(`HMR ${status}`));\n } catch (e) {\n console.error('[HMR] Error callback error:', e);\n }\n }\n };\n hot.addStatusHandler(handler);\n return () => hot.removeStatusHandler(handler);\n },\n };\n}\n\n/**\n * 获取 HMR API 实例\n *\n * 自动检测当前构建工具(Webpack/Vite)并返回对应实现:\n * - Webpack/Rspack: 使用内置适配器\n * - Vite: 使用 error-overlay 注入的 window.__VITE_HMR__\n *\n * @returns HmrApi 实例,如果不在开发环境或不支持 HMR 则返回 null\n */\nexport function getHmrApi(): HmrApi | null {\n if (process.env.NODE_ENV === 'production') return null;\n\n // Webpack/Rspack (import.meta.webpackHot)\n // @ts-ignore - Webpack HMR API\n if (import.meta.webpackHot) {\n // @ts-ignore\n return createWebpackHmrApi(import.meta.webpackHot);\n }\n\n // Legacy webpack (module.hot)\n // @ts-ignore\n if (typeof module !== 'undefined' && module.hot) {\n // @ts-ignore\n return createWebpackHmrApi(module.hot);\n }\n\n // Vite (通过 error-overlay 注入)\n if (window.__VITE_HMR__) {\n return window.__VITE_HMR__;\n }\n\n return null;\n}\n","import type { IncomingMessage, OutgoingMessage } from '../types/iframe-events';\n\nconst PARENT_ORIGIN_KEY = '__parentOrigin';\n\nfunction getParentOriginFromParams(): string | undefined {\n try {\n const params = new URLSearchParams(window.location.search);\n const origin = params.get(PARENT_ORIGIN_KEY);\n if (origin) {\n sessionStorage.setItem(PARENT_ORIGIN_KEY, origin);\n return origin;\n }\n } catch {\n // URL 解析失败时忽略\n }\n try {\n return sessionStorage.getItem(PARENT_ORIGIN_KEY) || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getLegacyParentOrigin(): string {\n const { origin } = window.location;\n if (origin.includes('force.feishuapp.net')) {\n return 'https://force.feishu.cn';\n }\n if (origin.includes('force-pre.feishuapp.net')) {\n return 'https://force.feishu-pre.cn';\n }\n if (origin.includes('force.byted.org')) {\n return 'https://force.feishu-boe.cn';\n }\n if (origin.includes('feishuapp.cn') || origin.includes('miaoda.feishuapp.net')) {\n return 'https://miaoda.feishu.cn';\n }\n if (origin.includes('fsapp.kundou.cn') || origin.includes('miaoda-pre.feishuapp.net')) {\n return 'https://miaoda.feishu-pre.cn';\n }\n return 'https://miaoda.feishu-boe.cn';\n}\n\nexport function resolveParentOrigin(): string {\n // 本地开发:父页面为 localhost / 127.0.0.1 时,使用 referrer 真实 origin 作为 targetOrigin\n try {\n if (document.referrer) {\n const referrerOrigin = new URL(document.referrer).origin;\n if (\n referrerOrigin.startsWith('http://localhost') ||\n referrerOrigin.startsWith('http://127.0.0.1')\n ) {\n return referrerOrigin;\n }\n }\n } catch {\n // referrer 为空或无效时忽略,走正常环境匹配逻辑\n }\n\n // 父页面运行时通过 URL 参数传入\n const paramOrigin = getParentOriginFromParams();\n if (paramOrigin) return paramOrigin;\n\n return process.env?.FORCE_FRAMEWORK_DOMAIN_MAIN ?? getLegacyParentOrigin();\n}\n\nexport function submitPostMessage<T extends OutgoingMessage>(\n message: T,\n targetOrigin?: string\n): void {\n try {\n const parentOrigin = resolveParentOrigin();\n const origin = targetOrigin ?? parentOrigin;\n if (!origin) return;\n window.parent.postMessage(message, origin);\n } catch (e) {\n console.error('postMessage error', e);\n }\n}\n\nexport function isOutgoingMessage<T extends OutgoingMessage['type']>(\n msg: OutgoingMessage,\n type: T\n): msg is Extract<OutgoingMessage, { type: T }> {\n return msg.type === type;\n}\n\nexport function isIncomingMessage<T extends IncomingMessage['type']>(\n msg: IncomingMessage,\n type: T\n): msg is Extract<IncomingMessage, { type: T }> {\n return msg.type === type;\n}\n","/**\n * Logger 类型定义。\n *\n * 跟老 toolkit 相比,lite 砍掉了 zod schema 校验,改成纯 TS 类型——\n * intercept-global-error 不再走 levelSchema.safeParse 那条分支,\n * 而是直接用 LOG_LEVELS 字面量数组 includes 判断。\n */\n\nexport const LOG_LEVELS = ['debug', 'info', 'warn', 'error', 'success'] as const;\nexport type LogLevel = (typeof LOG_LEVELS)[number];\n\nexport function isLogLevel(value: unknown): value is LogLevel {\n return typeof value === 'string' && (LOG_LEVELS as readonly string[]).includes(value);\n}\n\nexport interface LogStackFrame {\n functionName: string;\n fileName: string;\n lineNumber: number;\n columnNumber: number;\n}\n\nexport interface LogMeta {\n stacktrace?: LogStackFrame[];\n logTraceID?: string;\n skipFrame?: number;\n noStacktrace?: boolean;\n repairMessage?: string;\n /** 预留字段,用于分类日志 */\n type?: string;\n /** 日志去重相关字段 */\n isDuplicate?: boolean;\n duplicateCount?: number;\n duplicateOfId?: string;\n}\n\nexport interface LogWithMeta {\n level: LogLevel;\n args: unknown[];\n meta?: LogMeta;\n}\n\nexport interface SelectedLog {\n type: 'typedLogV2';\n level: LogLevel;\n id: string;\n args: unknown[];\n meta: LogMeta;\n}\n","import type { LogLevel } from '../logger/log-types';\n\n// 安全的 JSON.stringify 实现\nexport function safeStringify(obj: unknown): string {\n const seen = new Set<object>();\n\n try {\n return JSON.stringify(obj, (_key, value) => {\n // 处理循环引用\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) {\n return '[Circular]';\n }\n seen.add(value);\n }\n\n // 处理 BigInt\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n // 处理 Date\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n // 处理 Map\n if (value instanceof Map) {\n return Object.fromEntries(value);\n }\n\n // 处理 Set\n if (value instanceof Set) {\n return Array.from(value);\n }\n\n // 处理 Error(safeStringify 默认会丢失 name/message/stack)\n if (value instanceof Error) {\n return {\n name: value.name,\n message: value.message,\n stack: value.stack,\n };\n }\n\n // 处理 undefined\n if (typeof value === 'undefined') {\n return 'undefined';\n }\n\n // 处理 Symbol\n if (typeof value === 'symbol') {\n return value.toString();\n }\n\n return value;\n });\n } catch {\n return '';\n } finally {\n seen.clear();\n }\n}\n\n/** 把任意 log 参数(可能含 Error/对象/循环引用)转成可序列化的字符串数组 */\nexport function processLogParams(args: unknown[]): string[] {\n return args.map((arg) => {\n if (typeof arg === 'string') return arg;\n if (arg instanceof Error) {\n return `${arg.name}: ${arg.message}\\n${arg.stack ?? ''}`;\n }\n if (typeof arg === 'object' && arg !== null) {\n return safeStringify(arg);\n }\n return String(arg);\n });\n}\n\n/** logger.log({ level }) → observable.log 的等级字符串 */\nexport function mapLogLevel(level: LogLevel): 'INFO' | 'WARN' | 'ERROR' {\n if (level === 'warn') return 'WARN';\n if (level === 'error') return 'ERROR';\n return 'INFO';\n}\n","/**\n * Selected logs interceptor 链。\n *\n * 跟老 toolkit 对齐:把 logger 顶层 6 个方法(debug/info/warn/error/success/log)\n * 都包一层 typedLogInterceptor,每次调用同步发 `SELECTED_LOG` postMessage 给妙搭外壳。\n * 妙搭 sandbox-console 监听 SELECTED_LOG,把 level==='error' 的计入 errorCount,\n * 进而显示\"一键修复\"按钮。\n *\n * 与老 toolkit 的差异:\n * - 砍掉了 webpack 模式专用的 parseSourceMap / source-map WASM / SourceMapConsumer 链路\n * (老 toolkit 里 parseSourceMap 是 dead code 无人调用;lite 跑在 vite 上也不需要)\n * - 保留 stacktrace-js:StackTrace.fromError 把 Error.stack 字符串解析成结构化 frames;\n * vite dev 模式下 stack 已经是源码路径,结构化后 sandbox-console 显示更友好\n */\n\nimport StackTrace from 'stacktrace-js';\nimport { batchLogInfo } from './batch-logger';\nimport { submitPostMessage } from '../utils/postMessage';\nimport {\n LogMeta,\n LogStackFrame,\n LogWithMeta,\n SelectedLog,\n} from './log-types';\nimport type { LogInterceptor } from './logger';\n\n/**\n * 把 stacktrace-js 的 StackFrame[] 转成本仓 LogStackFrame schema 格式。\n */\nfunction mapStacktrace(stacktrace: StackTrace.StackFrame[]): LogStackFrame[] {\n return stacktrace.map((frame) => ({\n functionName: frame.functionName || '',\n fileName: frame.fileName || '',\n lineNumber: frame.lineNumber || 0,\n columnNumber: frame.columnNumber || 0,\n }));\n}\n\n/**\n * stacktrace 解析失败时上报给外壳,外壳可用于诊断 sourcemap 加载/解析问题。\n */\nfunction reportStacktraceParseError(e: unknown, context: string): void {\n if (window.parent === window) return;\n try {\n submitPostMessage({\n type: 'STACKTRACE_PARSE_ERROR',\n payload: {\n error: e instanceof Error ? e.message : String(e),\n context,\n },\n });\n } catch {\n // ignore\n }\n}\n\n/**\n * 拿当前调用栈(filter 由调用方处理)。\n * 主 toolkit 在 sendSelectedLog 末尾若 meta.stacktrace 缺失会调一次。\n */\nexport async function getStacktrace(): Promise<LogStackFrame[]> {\n const stacktrace = await StackTrace.get();\n return mapStacktrace(stacktrace);\n}\n\n/**\n * 序列化 Error 实例为 {message, stack, name}。\n * Error 默认属性不可枚举,直接 JSON.stringify 会输出 `{}` 丢信息。\n */\nfunction errorReplacer(_key: string, value: unknown) {\n if (value instanceof Error) {\n return {\n message: value.message,\n stack: value.stack,\n name: value.name,\n };\n }\n return value;\n}\n\nfunction generateLogId(): string {\n try {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n } catch {\n // ignore — fall through to fallback\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/** 保存上一次的日志内容用于去重 */\nlet lastLogInfo: { content: string; id: string; count: number } | null = null;\n\n/**\n * 发送一条 SelectedLog 到妙搭外壳。\n *\n * 包含:\n * - args 里的 Error 实例展开为 [message, errorObj](与老 toolkit 一致)\n * - meta.skipFrame 默认 2(让外壳跳过 logger 自己的栈帧)\n * - 与上一条内容完全一样时设 meta.isDuplicate / duplicateCount / duplicateOfId\n * - 同时走 batchLogInfo 批量通道 + window.parent.postMessage SELECTED_LOG\n */\nasync function sendSelectedLog(logWithoutID: Omit<SelectedLog, 'id'>) {\n try {\n const log: SelectedLog = {\n ...logWithoutID,\n id: generateLogId(),\n };\n\n const newParts: unknown[] = [];\n for (let i = 0; i < log.args.length; i++) {\n const item = log.args[i];\n if (item instanceof Error) {\n const newError = {\n message: item.message,\n stack: item.stack,\n name: item.name,\n };\n // 首个 Error 优先用其 stack 反查到结构化 frames,覆盖 meta.stacktrace\n if (!log.meta.stacktrace) {\n try {\n const stacktrace = await StackTrace.fromError(item);\n log.meta.stacktrace = mapStacktrace(stacktrace);\n } catch (e) {\n reportStacktraceParseError(e, 'StackTrace.fromError');\n }\n }\n newParts.push(newError.message, newError);\n } else {\n newParts.push(item);\n }\n }\n log.args = newParts;\n\n // 兜底:args 里没有 Error 时拿当前调用栈\n if (!log.meta.stacktrace) {\n try {\n const frames = await getStacktrace();\n // 过滤本 logger 内部的栈帧(避免噪音)\n const firstFrameIndex = frames.findIndex(\n (frame) => !frame.fileName.includes('client-toolkit-lite/dist/logger'),\n );\n log.meta.stacktrace = firstFrameIndex === -1 ? [] : frames.slice(firstFrameIndex);\n } catch (e) {\n reportStacktraceParseError(e, 'getStacktrace');\n }\n }\n\n if (log.meta.skipFrame === undefined) {\n log.meta.skipFrame = 2;\n }\n\n const logJSON = JSON.stringify(log, errorReplacer);\n\n // 去重:以去掉 id 的版本做比较\n const logForDedup = { ...log };\n delete (logForDedup as Partial<SelectedLog>).id;\n const logContentForDedup = JSON.stringify(logForDedup, errorReplacer);\n\n if (lastLogInfo && lastLogInfo.content === logContentForDedup) {\n lastLogInfo.count++;\n log.meta.isDuplicate = true;\n log.meta.duplicateCount = lastLogInfo.count;\n log.meta.duplicateOfId = lastLogInfo.id;\n const updatedJSON = JSON.stringify(log, errorReplacer);\n try {\n batchLogInfo('info', updatedJSON);\n } catch {\n // ignore\n }\n if (window.parent !== window) {\n try {\n submitPostMessage({ type: 'SELECTED_LOG', payload: updatedJSON });\n } catch {\n // ignore\n }\n }\n return;\n }\n\n lastLogInfo = {\n content: logContentForDedup,\n id: log.id,\n count: 1,\n };\n\n try {\n batchLogInfo('info', logJSON);\n } catch {\n // ignore\n }\n if (window.parent !== window) {\n try {\n submitPostMessage({ type: 'SELECTED_LOG', payload: logJSON });\n } catch {\n // ignore\n }\n }\n } catch {\n // sendSelectedLog 失败不应影响业务\n }\n}\n\nfunction sendTypedLogV2(logWithMeta: LogWithMeta) {\n // sendSelectedLog 是 async(stacktrace 解析需要异步),但调用方不关心结果,\n // 用 void 忽略 Promise,避免 unhandled rejection 噪音\n void sendSelectedLog({\n type: 'typedLogV2',\n level: logWithMeta.level,\n args: logWithMeta.args,\n meta: logWithMeta.meta ?? {},\n });\n}\n\n/**\n * 拦截 logger 的 6 个方法(debug/info/warn/error/success/log),\n * 在调用原方法的同时同步 sendTypedLogV2 到妙搭外壳。\n */\nconst typedLogInterceptor: LogInterceptor = (originLogger) => ({\n debug: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.debug(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'info', args: [message, ...args], meta: {} });\n },\n info: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.info(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'info', args: [message, ...args], meta: {} });\n },\n warn: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.warn(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'warn', args: [message, ...args], meta: {} });\n },\n error: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.error(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'error', args: [message, ...args], meta: {} });\n },\n success: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.success(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'success', args: [message, ...args], meta: {} });\n },\n log: ({ level, args, meta }: LogWithMeta) => {\n try {\n originLogger.log({ level, args, meta });\n } catch {\n // ignore\n }\n sendTypedLogV2({ level, args, meta: meta ?? ({} as LogMeta) });\n },\n});\n\nexport const interceptors: LogInterceptor[] = [typedLogInterceptor];\n","interface CollectLogRequest {\n level: string;\n message: string;\n time: string; // ISO String\n source?: string; // Log Source string\n user_id: string; // User ID\n tenant_id: string; // Tenant ID\n app_id: string; // App ID\n}\n\ninterface LogEntry {\n id: string;\n level: string;\n message: string;\n source?: string;\n timestamp: number;\n}\n\ninterface BatchLoggerConfig {\n /** 用户ID */\n userId: string;\n /** 租户ID */\n tenantId: string;\n /** 应用ID */\n appId: string;\n /** 后端接收日志的接口地址,默认为/dev/logs/collect */\n endpoint?: string;\n /** 达到此数量时触发刷新 */\n sizeThreshold?: number;\n /** 自动刷新的时间间隔(毫秒) */\n flushInterval?: number;\n /** 最大重试次数 */\n maxRetries?: number;\n /** 重试延迟(毫秒) */\n retryDelay?: number;\n /** 自定义请求头 */\n headers?: Record<string, string>;\n}\n\nexport class BatchLogger {\n private config: Required<BatchLoggerConfig>;\n private logQueue: LogEntry[] = [];\n private flushTimer: NodeJS.Timeout | null = null;\n private isProcessing = false;\n\n private originConsole: Console;\n\n constructor(console: Console, config?: BatchLoggerConfig) {\n this.originConsole = { ...console };\n const {\n userId = '',\n tenantId = '',\n appId = '',\n } = (window || {}) as {\n userId?: string;\n tenantId?: string;\n appId?: string;\n };\n this.config = {\n userId,\n tenantId,\n appId,\n // 需要加请求路径前缀\n endpoint: (process.env.CLIENT_BASE_PATH || '') + '/dev/logs/collect-batch',\n sizeThreshold: 20,\n flushInterval: 1000,\n maxRetries: 3,\n retryDelay: 500,\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(config || {}),\n };\n\n this.startFlushTimer();\n this.setupBeforeUnloadHandler();\n }\n\n /**\n * 批量记录日志(对外暴露的唯一方法)\n */\n batchLog(level: string, message: string, source?: string): void {\n const logEntry: LogEntry = {\n id: this.generateId(),\n level,\n message,\n source,\n timestamp: Date.now(),\n };\n\n // 直接添加日志,不进行合并\n this.logQueue.push(logEntry);\n\n // 如果队列达到批处理阈值,立即刷新\n if (this.logQueue.length >= this.config.sizeThreshold) {\n this.flush();\n }\n }\n\n\n\n /**\n * 刷新日志队列,全部发送\n */\n async flush(): Promise<void> {\n if (this.isProcessing || this.logQueue.length === 0) {\n return;\n }\n\n this.isProcessing = true;\n const logsToSend = this.logQueue.splice(0, this.logQueue.length);\n\n try {\n await this.sendBatch(logsToSend);\n } catch (error) {\n // 发送失败时,将日志重新加入队列\n this.logQueue.unshift(...logsToSend);\n } finally {\n this.isProcessing = false;\n }\n }\n\n /**\n * 发送日志批次到后端\n */\n private async sendBatch(logs: LogEntry[]): Promise<void> {\n // 将LogEntry转换为CollectLogRequest格式\n const collectLogs: CollectLogRequest[] = logs.map(log => ({\n level: log.level,\n message: log.message,\n time: new Date(log.timestamp).toISOString(),\n source: log.source,\n user_id: this.config.userId,\n tenant_id: this.config.tenantId,\n app_id: this.config.appId,\n }));\n\n let retries = 0;\n\n while (retries <= this.config.maxRetries) {\n try {\n await this.execFetch(this.config.endpoint, {\n method: 'POST',\n headers: this.config.headers,\n body: JSON.stringify(collectLogs),\n });\n return;\n } catch (error) {\n retries++;\n\n if (retries > this.config.maxRetries) {\n this.originConsole.error(\n `Failed to send logs (attempt ${retries}), retrying in ${this.config.retryDelay}ms...`,\n );\n } else {\n this.originConsole.warn(\n `Failed to send logs (attempt ${retries}), retrying in ${this.config.retryDelay}ms...`,\n );\n }\n\n await this.delay(this.config.retryDelay * retries); // 指数退避\n }\n }\n }\n\n /**\n * 执行实际的fetch请求\n */\n private async execFetch(\n url: string,\n options: RequestInit,\n ): Promise<Response> {\n return fetch(url, options);\n }\n\n /**\n * 启动自动刷新定时器\n */\n private startFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = setInterval(() => {\n if (this.logQueue.length > 0) {\n this.flush();\n }\n }, this.config.flushInterval);\n }\n\n /**\n * 设置页面卸载时的处理\n */\n private setupBeforeUnloadHandler(): void {\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', () => {\n this.flush().finally(() => {\n this.destroy();\n });\n });\n }\n }\n\n /**\n * 延迟函数\n */\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n /**\n * 生成唯一ID\n */\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * 销毁资源\n */\n async destroy(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n // 发送剩余的日志\n if (this.logQueue.length > 0) {\n await this.flush();\n }\n }\n\n /**\n * 获取队列大小\n */\n getQueueSize(): number {\n return this.logQueue.length;\n }\n\n /**\n * 更新配置\n */\n updateConfig(newConfig: Partial<BatchLoggerConfig>): void {\n this.config = { ...this.config, ...newConfig };\n\n // 重新启动定时器\n this.startFlushTimer();\n }\n}\n\nlet defaultBatchLogger: BatchLogger | null = null;\n\nexport function getBatchLogger() {\n return defaultBatchLogger;\n}\n\nexport function initBatchLogger(\n oldConsole: Console,\n config?: BatchLoggerConfig,\n): void {\n defaultBatchLogger = new BatchLogger(oldConsole, config);\n}\n\n/** 记录日志进行批量同步 */\nexport function batchLogInfo(\n level: string,\n message: string,\n source?: string,\n): void {\n if (!defaultBatchLogger) {\n return;\n }\n defaultBatchLogger.batchLog(level, message, source);\n}\n\nexport function destroyBatchLogger(): void {\n if (defaultBatchLogger) {\n defaultBatchLogger.destroy();\n defaultBatchLogger = null;\n }\n}\n\n/**\n * 是否启用批量上报。三条件全部满足才开:\n * 1. 非生产构建(dev / 沙箱 dev server);\n * 2. 浏览器环境;\n * 3. 沙箱注入了 MIAODA_APP_TYPE(妙搭应用场景)—— 未注入的普通应用不上报。\n *\n * `process.env.*` 在 lite 的 dist 里保留字面量(tsup 不替换),由下游 app 用\n * coding-preset-vite-react 编译期 define 替换;未注入 MIAODA_APP_TYPE 时被 define 成字面\n * undefined,故 `!!` 即可——不关心具体 app type,有值即开、无值即关。与 capabilityClient /\n * Safety 的「编译期 define → 顶层读 env」同款。\n *\n * 抽成纯函数是为了能单测覆盖各分支:模块顶层副作用无法在不违反「禁 vi.resetModules + 动态\n * import 重载」规范的前提下直接测。\n */\nexport function shouldEnableBatchLogger(): boolean {\n return (\n process.env.NODE_ENV !== 'production' &&\n typeof window !== 'undefined' &&\n !!process.env.MIAODA_APP_TYPE\n );\n}\n\n// 模块加载时自动初始化\nif (shouldEnableBatchLogger()) {\n defaultBatchLogger = new BatchLogger(console);\n}","/**\n * Iframe Bridge Runtime(lite)\n *\n * 开发环境下连接妙搭外壳(父页面),建立 penpal 双向通信。\n * 跟 toolkit 版本一致,只是 childApi 是 lite 的 slim 版(去掉 apiProxy/getSourceMap)。\n */\n\nimport { connectToParent } from 'penpal';\n\nimport { resolveParentOrigin, submitPostMessage } from '../utils/postMessage';\nimport { batchLogInfo } from '../logger/batch-logger';\nimport { ParentApi } from '../types/iframe-events';\nimport { childApi } from '../components/AppContainer/utils/childApi';\n\nasync function connectParent(): Promise<void> {\n submitPostMessage({ type: 'PreviewReady', data: {} });\n batchLogInfo(\n 'info',\n JSON.stringify({\n type: 'PreviewReady',\n timestamp: Date.now(),\n url: window.location.href,\n })\n );\n\n const parentOrigin = resolveParentOrigin();\n if (!parentOrigin) return;\n\n const connection = connectToParent<ParentApi>({\n parentOrigin,\n methods: {\n ...childApi,\n },\n });\n\n await connection.promise;\n}\n\n/**\n * 初始化 iframe bridge(仅 dev + 仅 iframe 嵌入场景)\n */\nexport function initIframeBridge(): void {\n if (window.parent === window) return;\n connectParent();\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * @internal\n * 处理 className 与 tailwind-merge\n */\nexport function clsxWithTw(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * @internal\n * 当前是否是预览态\n */\nexport function isPreview() {\n return window.IS_MIAODA_PREVIEW;\n}\n\n/**\n * @internal\n * 标准化基础路径,确保路径格式一致\n * 移除末尾的斜杠,确保路径不以斜杠结尾\n */\nexport function normalizeBasePath(basePath?: string): string {\n if (!basePath || basePath === '/') {\n return '';\n }\n // 移除末尾的斜杠\n return basePath.replace(/\\/+$/, '');\n}\n\n// 获取 ws 路径\nexport function getWsPath(): string {\n const rawBasePath = process.env.CLIENT_BASE_PATH || '/';\n const normalizedBasePath = rawBasePath.startsWith('/')\n ? rawBasePath\n : `/${rawBasePath}`;\n const basePathWithoutTrailingSlash = normalizedBasePath.endsWith('/')\n ? normalizedBasePath.slice(0, -1)\n : normalizedBasePath;\n\n return `${basePathWithoutTrailingSlash}/ws`;\n}\n\n/** 判断是否是沙箱模式 */\nexport function isSparkRuntime() {\n // 兼容全栈模式标记(通过构建方式注入)\n return window._IS_Spark_RUNTIME ?? process.env.runtimeMode === 'fullstack';\n}","import { normalizeBasePath } from '../../../utils/utils';\nimport { ChildApi } from '../../../types/iframe-events';\nimport { AppInfoPayload } from '../../../types/common';\n\n/**\n * Slim 版 childApi(jsPage):\n * - 砍掉 toolkit 的 apiProxy(jsPage 纯前端无 server,不需要 API 代理)\n * - 砍掉 getSourceMap(Vite dev 直接是源码路径;prod 用浏览器原生 sourcemap)\n * - 保留 getRoutes + updateAppInfo\n */\nasync function getRoutes() {\n let routes: Array<{ path: string }> = [{ path: '/' }];\n try {\n const basePath = normalizeBasePath(process.env.CLIENT_BASE_PATH);\n const res = await fetch(`${basePath}/routes.json`);\n routes = await res.json();\n } catch (error) {\n console.warn('get routes.json error', error);\n }\n return routes;\n}\n\nexport const childApi: ChildApi = {\n getRoutes,\n updateAppInfo: (appInfo: AppInfoPayload) => {\n dispatchEvent(new CustomEvent('MiaoDaMetaInfoChanged', { detail: appInfo }));\n },\n};\n","/**\n * Client Toolkit Lite Runtime\n *\n * 精简版全局初始化逻辑,可通过构建工具自动注入或 AppContainer 导入触发\n *\n * 执行顺序:\n * 1. React DevTools Hook(必须在 React 加载之前)\n * 2. Axios 配置(仅 CSRF token 注入)\n * 3. 可观测初始化(OpenTelemetry traces/logs/metrics)\n * 4. Logger 模块 side-effect(dev 下注册 interceptErrors)\n * 5. Iframe Bridge(仅 dev + iframe 嵌入)\n *\n * 不包含 server-log SSE:jsPage 是纯前端,没有\"业务后端日志\"概念。\n */\n\n// 0. React DevTools Hook(必须在 React 加载之前执行)\nimport './react-devtools-hook';\n\n// 1. Axios 配置(精简版:仅 CSRF + 基础拦截器)\nimport { initAxiosConfig } from '../utils/axiosConfig';\n\n// 2. 可观测初始化(对齐 toolkit:runtime 加载即启动,不依赖 AppContainer 挂载)\nimport { initObservable } from './observable';\n\n// 3. 触发 logger 模块的 side-effect(dev 下注册 interceptErrors)\nimport '../logger';\n\n// 4. dev-only:iframe penpal bridge\nimport { initIframeBridge } from './iframe-bridge';\n\n// ============================================\n// 防重复初始化标志位\n// ============================================\n\ndeclare global {\n interface Window {\n __FULLSTACK_RUNTIME_INITIALIZED__?: boolean;\n }\n}\n\nif (!window.__FULLSTACK_RUNTIME_INITIALIZED__) {\n window.__FULLSTACK_RUNTIME_INITIALIZED__ = true;\n\n initAxiosConfig();\n // 内部 try/catch,SDK 启动失败不阻断渲染\n initObservable();\n\n if (process.env.NODE_ENV !== 'production') {\n initIframeBridge();\n }\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { getAppId } from '../../utils/getAppId';\nimport { getEnv } from '../../utils/getEnv';\nimport { getInitialInfo } from '../../utils/getInitialInfo';\nimport { getTenantInfo } from '../../utils/getTenantInfo';\nimport { useIsMobile } from '../../hooks';\nimport { t } from '../../locales';\n\n// ── defensive reset (prevents host page CSS from leaking in) ────\n\nconst resetBase: React.CSSProperties = {\n boxSizing: 'border-box',\n margin: 0,\n padding: 0,\n border: 'none',\n background: 'none',\n font: 'inherit',\n color: 'inherit',\n textAlign: 'left',\n textDecoration: 'none',\n textTransform: 'none',\n letterSpacing: 'normal',\n wordSpacing: 'normal',\n lineHeight: 'normal',\n verticalAlign: 'baseline',\n listStyle: 'none',\n};\n\n// ── inline style constants ──────────────────────────────────────\n\nconst FONT_FAMILY = \"'PingFang SC', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\";\nconst Z_BADGE = 10000000;\nconst Z_OVERLAY = 10000001;\n\nconst LOGO_URL = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodalogo.svg';\n// Cover URLs 通过 locale 机制获取,支持中英文不同封面\nconst getCoverUrl = () => t('safety.cover.pc');\nconst getCoverMobileUrl = () => t('safety.cover.mobile');\nconst ICON_COMPANY_URL = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/icon/icon_company_outlined.svg';\nconst ICON_AI_URL = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/icon/icon_efficiency-ai_outlined.svg';\nconst ICON_FEEDBACK_URL = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/miaoda-ui/icon_feedback_outlined.png';\nconst LANDING_URL = 'https://miaoda.feishu.cn/landing';\n\n// 「投诉与举报」跳转:飞书风控举报中心(tns),链接口径与豆包水印完全一致。\n// 环境用 getEnv()(读 globalThis.ENVIRONMENT,由服务端 view-context 注入,并带域名兜底)——\n// 普通妙搭应用不走 coding preset,process.env.FORCE_FRAMEWORK_ENVIRONMENT 不会被注入,\n// 不能像豆包水印那样用它;getEnv() 才是普通应用稳定的环境来源。\nconst REPORT_DOMAIN: Record<ReturnType<typeof getEnv>, string> = {\n BOE: 'tns.feishu-boe.cn',\n PRE: 'tns.feishu-pre.cn',\n ONLINE: 'tns.feishu.cn',\n};\n\n/** 打开「投诉与举报」页:scene/entity_type 固定,entity_id 取当前妙搭 appId,域名按环境选。 */\nconst openReport = (): void => {\n const params = JSON.stringify({\n scene: 'miaoda_app_report',\n entity_id: getAppId() ?? '',\n entity_type: 'miaoda_app',\n extra: '',\n });\n const url = `https://${REPORT_DOMAIN[getEnv()]}/cust/lark_report/?type=common¶ms=${encodeURIComponent(\n params,\n )}&lang=zh-CN`;\n window.open(url, '_blank', 'noopener,noreferrer');\n};\n\nconst badgeBase: React.CSSProperties = {\n ...resetBase,\n position: 'fixed',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n border: '1px solid rgba(255,255,255,0.1)',\n padding: '6px 10px',\n background: '#1f2329',\n boxShadow: '0 6px 12px 0 rgba(65,68,74,0.04), 0 8px 24px 8px rgba(65,68,74,0.04)',\n borderRadius: 6,\n fontFamily: FONT_FAMILY,\n fontSize: 12,\n lineHeight: '20px',\n zIndex: Z_BADGE,\n cursor: 'pointer',\n};\n\nconst badgeDesktop: React.CSSProperties = { ...badgeBase, right: 12, bottom: 12 };\nconst badgeMobile: React.CSSProperties = { ...badgeBase, right: 12, bottom: 80 };\n\nconst logoStyle: React.CSSProperties = { flexShrink: 0, width: 16, height: 16 };\n\nconst badgeTextStyle: React.CSSProperties = {\n flexShrink: 0,\n margin: 0,\n color: '#EBEBEB',\n};\n\n// ── desktop popover styles ──────────────────────────────────────\n\nconst popoverContent: React.CSSProperties = {\n ...resetBase,\n overflow: 'hidden',\n borderRadius: 12,\n width: 286,\n boxShadow: '0 6px 12px 0 rgba(65,68,74,0.04), 0 8px 24px 0 rgba(65,68,74,0.04)',\n zIndex: Z_OVERLAY,\n};\n\nconst popoverInner: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n background: '#1A1A1A',\n};\n\nconst popoverCover: React.CSSProperties = { width: 286, height: 128, cursor: 'pointer', display: 'block' };\n\nconst popoverBody: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'flex-end',\n gap: 12,\n border: '1px solid rgba(255,255,255,0.05)',\n padding: '11px 15px 15px 14px',\n borderRadius: '12px 12px 0 0',\n fontFamily: FONT_FAMILY,\n fontSize: 12,\n lineHeight: '20px',\n color: '#a6a6a6',\n background: '#1f2021',\n};\n\nconst infoRow: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n alignSelf: 'stretch',\n};\n\nconst infoIcon: React.CSSProperties = { flexShrink: 0, width: 12, height: 12 };\nconst infoIconMobile: React.CSSProperties = { flexShrink: 0, width: 14, height: 14 };\n\nconst infoText: React.CSSProperties = { margin: 0, color: '#a6a6a6', flexShrink: 0 };\n\nconst btnRow: React.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 8,\n width: '100%',\n alignSelf: 'stretch',\n};\n\nconst btnBase: React.CSSProperties = {\n ...resetBase,\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: 34,\n borderRadius: 8,\n borderWidth: '0.5px',\n borderStyle: 'solid',\n borderColor: 'rgba(255,255,255,0.11)',\n background: 'rgba(255,255,255,0.03)',\n color: '#ebebeb',\n cursor: 'pointer',\n fontSize: 12,\n fontFamily: FONT_FAMILY,\n transition: 'background 0.15s ease, border-color 0.15s ease',\n};\n\nconst btnHovered: React.CSSProperties = {\n background: 'rgba(255,255,255,0.08)',\n borderColor: 'rgba(255,255,255,0.2)',\n};\n\n// ── mobile sheet styles ─────────────────────────────────────────\n\nconst overlayStyle: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n zIndex: Z_OVERLAY,\n background: 'rgba(0,0,0,0.5)',\n};\n\nconst sheetContent: React.CSSProperties = {\n position: 'fixed',\n inset: 'auto 0 0 0',\n zIndex: Z_OVERLAY + 1,\n outline: 'none',\n};\n\nconst sheetInner: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n background: '#fff',\n overflow: 'hidden',\n borderRadius: '16px 16px 0 0',\n position: 'relative',\n};\n\nconst sheetCloseBtn: React.CSSProperties = {\n position: 'absolute',\n top: 8,\n left: 16,\n width: 24,\n height: 24,\n color: '#2B2F36',\n cursor: 'pointer',\n background: 'none',\n border: 'none',\n padding: 0,\n};\n\nconst sheetCover: React.CSSProperties = { width: '100%', display: 'block', cursor: 'pointer' };\n\nconst sheetBody: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n justifyContent: 'center',\n alignItems: 'flex-end',\n gap: 16,\n padding: '16px 20px 48px',\n fontFamily: FONT_FAMILY,\n fontSize: 12,\n lineHeight: '20px',\n color: '#a6a6a6',\n};\n\nconst sheetInfoText: React.CSSProperties = { margin: 0, color: '#646A73', fontSize: 14, flexShrink: 0 };\n\nconst mobileBtnRow: React.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 16,\n alignSelf: 'stretch',\n};\n\nconst mobileBtnBase: React.CSSProperties = {\n ...resetBase,\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 99,\n fontSize: 18,\n fontFamily: FONT_FAMILY,\n padding: '12px 0',\n cursor: 'pointer',\n};\n\nconst mobileBtnOutline: React.CSSProperties = {\n ...mobileBtnBase,\n border: '0.5px solid #D0D3D6',\n background: '#fff',\n color: '#1F2329',\n};\n\nconst mobileBtnFilled: React.CSSProperties = {\n ...mobileBtnBase,\n border: '0.5px solid #000',\n background: '#000',\n color: '#fff',\n};\n\n// ── HoverButton helper ──────────────────────────────────────────\n\nconst HoverButton: React.FC<{\n style: React.CSSProperties;\n onClick: (e: React.MouseEvent) => void;\n children: React.ReactNode;\n 'data-custom-element'?: string;\n}> = ({ style, onClick, children, ...rest }) => {\n const [hovered, setHovered] = useState(false);\n return (\n <div\n style={{\n ...style,\n ...(hovered ? btnHovered : {}),\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onClick={onClick}\n {...rest}\n >\n {children}\n </div>\n );\n};\n\n// ── X icon (inline SVG, replaces lucide-react dependency) ───────\n\nconst XIcon: React.FC<{ style?: React.CSSProperties; onClick?: () => void }> = ({ style, onClick }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={style}\n onClick={onClick}\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n);\n\n// ── main component ──────────────────────────────────────────────\n\nconst Safety = () => {\n const HasClosedKey = `miaoda-creatByMiaodo-has-closed-${getAppId()}`;\n const [visible, setVisible] = useState(\n !window.localStorage?.getItem(HasClosedKey),\n );\n const [open, setOpen] = useState(false);\n const isMobile = useIsMobile();\n const [userinfo, setUserinfo] = useState<{ id?: number; name?: string } | null>(null);\n const [isInternetVisible, setIsInternetVisible] = useState(false);\n const [showBadge, setShowBadge] = useState(true);\n const [badgeLoaded, setBadgeLoaded] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n // 非 production 不渲染徽标,直接不发接口。\n // 注意 gate 必须在 effect 内部:render 期的 early-return 在 hooks 之后执行,\n // 拦不住已经发出的请求。(AppType=7 这道 gate 在 AppContainer 上层,Safety 压根不挂载)\n if (process.env.NODE_ENV !== 'production') return;\n\n // 复用带缓存去重的 util:tenant_info / get_published 整个会话各只发一次,\n // 不受 StrictMode 双跑或组件重复挂载影响(get_published 与 getAppInfo/getDataloom 共享)。\n getTenantInfo()\n .then(data => {\n setUserinfo(data?.tenant_info ?? null);\n setIsInternetVisible(!!data?.is_internet_visible);\n })\n .catch(() => {});\n\n getInitialInfo()\n .then(info => {\n const badge = info?.app_info?.show_badge;\n setShowBadge(badge !== false);\n })\n .catch(() => {\n setShowBadge(true);\n })\n .finally(() => {\n setBadgeLoaded(true);\n });\n }, []);\n\n useEffect(() => {\n if (isMobile) {\n const link = document.createElement('link');\n link.rel = 'preload';\n link.as = 'image';\n link.href = getCoverMobileUrl();\n document.head.appendChild(link);\n }\n }, [isMobile]);\n\n if (process.env.NODE_ENV !== 'production') return null;\n if (!badgeLoaded) return null;\n if (!showBadge) return null;\n if (!visible) return null;\n\n // ── mobile: bottom sheet ────────────────────────────────────\n if (isMobile) {\n return (\n <DialogPrimitive.Root open={open} onOpenChange={setOpen}>\n <DialogPrimitive.Trigger asChild>\n <div style={badgeMobile} onClick={() => setOpen(true)}>\n <img src={LOGO_URL} style={logoStyle} />\n <p style={{ ...badgeTextStyle, minWidth: 28 }}>{t('safety.badge.label')}</p>\n </div>\n </DialogPrimitive.Trigger>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay style={overlayStyle} />\n <DialogPrimitive.Content style={sheetContent} aria-describedby={undefined}>\n <DialogPrimitive.Title style={{ position: 'absolute', clip: 'rect(0 0 0 0)' }}>\n {t('safety.badge.builtWith')}\n </DialogPrimitive.Title>\n <div style={sheetInner}>\n <XIcon style={sheetCloseBtn} onClick={() => setOpen(false)} />\n <img\n src={getCoverMobileUrl()}\n alt=\"\"\n style={sheetCover}\n onClick={() => window.open(LANDING_URL, '_blank')}\n />\n <div style={sheetBody}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, alignSelf: 'stretch' }}>\n {isInternetVisible && (\n <div style={infoRow}>\n <img src={ICON_COMPANY_URL} style={infoIconMobile} />\n <p style={sheetInfoText}>{t('safety.tenant.operated', { name: userinfo?.name ?? '' })}</p>\n </div>\n )}\n <div style={infoRow}>\n <img src={ICON_AI_URL} style={infoIconMobile} />\n <p style={sheetInfoText}>{t('safety.ai.disclaimer')}</p>\n </div>\n <div\n style={{ ...infoRow, cursor: 'pointer' }}\n data-custom-element=\"safety-report\"\n onClick={openReport}\n >\n <img src={ICON_FEEDBACK_URL} style={infoIconMobile} />\n <p\n style={{\n ...sheetInfoText,\n cursor: 'pointer',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n }}\n >\n {t('safety.report')}\n </p>\n </div>\n </div>\n <div style={mobileBtnRow}>\n <div\n style={mobileBtnOutline}\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setOpen(false);\n setTimeout(() => setVisible(false), 200);\n window.localStorage?.setItem(HasClosedKey, 'true');\n }}\n >\n {t('safety.button.dontShowAgain')}\n </div>\n <div\n style={mobileBtnFilled}\n onClick={() => window.open(LANDING_URL, '_blank')}\n >\n {t('safety.button.learnMore')}\n </div>\n </div>\n </div>\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n }\n\n // ── desktop: popover on hover ───────────────────────────────\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild>\n <div\n style={badgeDesktop}\n onMouseEnter={() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setOpen(true);\n }}\n onMouseLeave={() => {\n timeoutRef.current = setTimeout(() => setOpen(false), 100);\n }}\n >\n <img src={LOGO_URL} style={logoStyle} />\n <p style={{ ...badgeTextStyle, minWidth: 60 }}>{t('safety.badge.builtWith')}</p>\n </div>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n style={popoverContent}\n side=\"top\"\n align=\"end\"\n sideOffset={8}\n onMouseEnter={() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setOpen(true);\n }}\n onMouseLeave={() => {\n timeoutRef.current = setTimeout(() => setOpen(false), 100);\n }}\n >\n <div style={popoverInner}>\n <img\n src={getCoverUrl()}\n alt=\"\"\n style={popoverCover}\n onClick={() => window.open(LANDING_URL, '_blank')}\n />\n <div style={popoverBody}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, alignSelf: 'stretch' }}>\n {isInternetVisible && (\n <div style={infoRow}>\n <img src={ICON_COMPANY_URL} style={infoIcon} />\n <p style={infoText}>{t('safety.tenant.operated', { name: userinfo?.name ?? '' })}</p>\n </div>\n )}\n <div style={infoRow}>\n <img src={ICON_AI_URL} style={infoIcon} />\n <p style={infoText}>{t('safety.ai.disclaimer')}</p>\n </div>\n <div\n style={{ ...infoRow, cursor: 'pointer' }}\n data-custom-element=\"safety-report\"\n onClick={openReport}\n >\n <img src={ICON_FEEDBACK_URL} style={infoIcon} />\n <p\n style={{\n ...infoText,\n cursor: 'pointer',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n }}\n >\n {t('safety.report')}\n </p>\n </div>\n </div>\n <div style={btnRow}>\n <HoverButton\n style={btnBase}\n data-custom-element=\"safety-close\"\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setVisible(false);\n window.localStorage?.setItem(HasClosedKey, 'true');\n }}\n >\n {t('safety.button.dontShowAgain')}\n </HoverButton>\n <HoverButton\n style={btnBase}\n data-custom-element=\"safety-more\"\n onClick={() => window.open(LANDING_URL, '_blank')}\n >\n {t('safety.button.learnMore')}\n </HoverButton>\n </div>\n </div>\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n};\n\nexport default Safety;\n","/* eslint-disable */\n/**\n * 获取应用 ID\n */\nexport function getAppId(): string | null {\n const windowAppId = (window as any).appId || null;\n return windowAppId;\n}\n","export function getEnv(): 'BOE' | 'PRE' | 'ONLINE' {\n switch((globalThis as any).ENVIRONMENT) {\n case 'staging':\n return 'BOE';\n case 'gray':\n return 'PRE';\n case 'online':\n return 'ONLINE';\n default:\n break;\n\n }\n const { origin } = window.location;\n // 线上环境\n if (origin.includes('feishuapp.cn') || origin.includes('miaoda.feishuapp.net') || origin.includes('aiforce.cloud') || origin.includes('aiforce.run')) {\n return 'ONLINE';\n // PRE 环境\n } else if (origin.includes('fsapp.kundou.cn') || origin.includes('miaoda-pre.feishuapp.net') || origin.includes('aiforce-pre.bytedance.net') || origin.includes('aiforce-pre-preview.bytedance.net') || origin.includes('aiforce-pre.cloud') || origin.includes('aiforce-pre.run')) {\n return 'PRE';\n // BOE 环境\n } else {\n return 'BOE';\n }\n}\n","import { getAppId } from './getAppId';\nimport { getCsrfToken } from './getCsrfToken';\nimport { isNewPathEnabled } from './apiPath';\n\ninterface AppRuntimeExtra {\n token?: string;\n url?: string;\n bucket?: BucketConfig;\n}\ninterface AppRuntimePublished {\n app_name?: string;\n css_urls?: string[];\n js_urls?: string[];\n app_avatar?: string;\n app_description?: string;\n /** 是否展示「由妙搭搭建」徽标;后端缺省视为 true */\n show_badge?: boolean;\n}\ninterface BucketConfig {\n default_bucket_id?: string;\n}\n\n/**\n * 从API获取已发布的应用信息(仅全栈沙箱模式下使用)\n */\nasync function getAppPublished(): Promise<\n | {\n app_info?: AppRuntimePublished;\n app_runtime_extra?: AppRuntimeExtra;\n }\n | undefined\n> {\n try {\n // 构建请求头\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Kunlun-Token': window.token,\n 'x-miaoda-token': window.MIAODA_BUILTIN_TTT,\n 'X-Suda-Csrf-Token': getCsrfToken(),\n };\n const appId = getAppId();\n const path = isNewPathEnabled()\n ? `/app/${appId}/__runtime__/api/v1/studio/get_published`\n : `/spark/b/${appId}/get_published`;\n const url = `${window.location.origin}${path}`;\n // 发起fetch请求\n const response = await fetch(url, {\n method: 'GET',\n headers,\n credentials: 'include', // 包含cookies\n });\n\n // 解析响应数据\n const res = await response.json();\n if (res.code === 0 || res.status_code === '0') {\n return res.data;\n }\n console.error('Error fetching published app info:', res);\n } catch (error) {\n console.error('Error fetching published app info:', error);\n }\n return undefined;\n}\n// 存储的公共信息\nlet initialInfo:\n | {\n app_info?: AppRuntimePublished;\n app_runtime_extra?: AppRuntimeExtra;\n }\n | undefined;\n\n// 缓存进行中的 Promise,防止并发调用发起多个重复请求\nlet pendingPromise: Promise<typeof initialInfo> | null = null;\n\n/** 获取应用初始化信息(仅全栈沙箱模式下使用) */\nexport function getInitialInfo(refresh = false): Promise<typeof initialInfo> {\n if (initialInfo && !refresh) {\n return Promise.resolve(initialInfo);\n }\n if (pendingPromise && !refresh) {\n return pendingPromise;\n }\n pendingPromise = getAppPublished()\n .then(info => {\n initialInfo = info;\n if (initialInfo) {\n window._bucket_id =\n initialInfo.app_runtime_extra?.bucket?.default_bucket_id;\n }\n return initialInfo;\n })\n .finally(() => {\n pendingPromise = null;\n });\n return pendingPromise;\n}\n","import { getAppId } from './getAppId';\nimport { getCsrfToken } from './getCsrfToken';\nimport { isNewPathEnabled } from './apiPath';\n\ninterface TenantInfo {\n id?: number;\n name?: string;\n}\n\ninterface TenantInfoPayload {\n tenant_info?: TenantInfo;\n is_internet_visible?: boolean;\n}\n\n/**\n * 拉取租户信息(仅供「由妙搭搭建」徽标展示用)。\n */\nasync function fetchTenantInfo(): Promise<TenantInfoPayload | undefined> {\n try {\n const appId = getAppId();\n const path = isNewPathEnabled()\n ? `/app/${appId}/__runtime__/api/v1/studio/tenant_info`\n : `/spark/b/${appId}/tenant_info`;\n const response = await fetch(`${window.location.origin}${path}`, {\n method: 'GET',\n headers: { 'X-Suda-Csrf-Token': getCsrfToken() ?? '' },\n credentials: 'include',\n });\n const res = await response.json();\n return res?.data;\n } catch {\n return undefined;\n }\n}\n\n// 缓存结果,避免重复展示场景重复请求\nlet tenantInfo: TenantInfoPayload | undefined;\n// 缓存进行中的 Promise,防止并发调用(含 StrictMode 双跑)发起多个重复请求\nlet pendingPromise: Promise<TenantInfoPayload | undefined> | null = null;\n\n/** 获取租户信息(带结果缓存 + 并发去重,整个会话只发一次 tenant_info) */\nexport function getTenantInfo(): Promise<TenantInfoPayload | undefined> {\n if (tenantInfo) {\n return Promise.resolve(tenantInfo);\n }\n if (pendingPromise) {\n return pendingPromise;\n }\n pendingPromise = fetchTenantInfo()\n .then(info => {\n tenantInfo = info;\n return tenantInfo;\n })\n .finally(() => {\n pendingPromise = null;\n });\n return pendingPromise;\n}\n","import { useEffect, useState } from 'react';\nimport { AppInfoPayload } from '../types/common';\nimport { getAppInfo } from '../integrations/getAppInfo';\n\nexport const useAppInfo = () => {\n const [appInfo, setAppInfo] = useState<Partial<AppInfoPayload>>({});\n\n useEffect(() => {\n const updateDomInfo = (info: AppInfoPayload) => {\n if (info.name) {\n document.title = info.name;\n const meta = document.querySelector(\"meta[property='og:title']\") as HTMLMetaElement;\n if (meta) {\n meta.content = info.name;\n }\n }\n if (info.avatar) {\n let link = document.querySelector(\"link[rel~='icon']\") as HTMLLinkElement;\n if (!link) {\n link = document.createElement('link');\n link.rel = 'icon';\n document.head.appendChild(link);\n }\n link.href = info.avatar;\n const meta = document.querySelector(\"meta[property='og:image']\") as HTMLMetaElement;\n if (meta) {\n meta.content = info.avatar;\n }\n }\n if (info.description) {\n const meta = document.querySelector(\"meta[property='og:description']\") as HTMLMetaElement;\n if (meta) {\n meta.content = info.description;\n }\n const metaDom = document.querySelector(\"meta[name='description']\") as HTMLMetaElement;\n if (metaDom) {\n metaDom.content = info.description;\n }\n }\n }\n\n const handleMetaInfoChanged = async (info?: AppInfoPayload, refresh = true) => {\n if (!info) {\n info = await getAppInfo(refresh);\n }\n updateDomInfo(info);\n setAppInfo(prev => ({ ...prev, ...info }));\n };\n handleMetaInfoChanged(undefined, false);\n const onUpdate = (e: Event) => {\n const info = (e as CustomEvent<AppInfoPayload>).detail;\n handleMetaInfoChanged(info);\n };\n window.addEventListener('MiaoDaMetaInfoChanged', onUpdate);\n return () => {\n window.removeEventListener('MiaoDaMetaInfoChanged', onUpdate);\n };\n }, []);\n\n return {\n ...appInfo,\n appName: appInfo.name,\n appLogo: appInfo.avatar,\n };\n};\n","/* eslint-disable */\nimport { AppInfoPayload } from '../types/common';\nimport { getInitialInfo } from '../utils/getInitialInfo';\nimport { isSparkRuntime } from '../utils/utils';\n\nexport async function getAppInfo(refresh = false): Promise<AppInfoPayload> {\n let appInfo = typeof window !== 'undefined' ? (window as any)._appInfo : undefined;\n if ((!appInfo || refresh) && isSparkRuntime()) {\n const info = (await getInitialInfo(refresh))?.app_info;\n appInfo = {\n name: info?.app_name || '',\n avatar: info?.app_avatar || '',\n description: info?.app_description || '',\n };\n if (appInfo.name) {\n appInfo.name = appInfo.name.trim();\n }\n\n if (typeof window !== 'undefined') {\n (window as any)._appInfo = appInfo;\n }\n }\n return appInfo ?? {};\n}\n","import { useEffect, useState } from 'react';\nimport { authClient } from '@lark-apaas/auth-sdk';\nimport { IUserProfile } from '../types/udt-types';\nimport { getCurrentUserProfile } from '../integrations/getCurrentUserProfile';\nimport { isSparkRuntime } from '../utils/utils';\n\n/**\n * 从 name 数组中获取用户名称\n * 优先选择 language_code 为 2052(简体中文)的数据,如果匹配不到则取第一个\n */\nfunction getNameFromArray(\n nameArray?: Array<{ language_code?: number; text?: string }>,\n): string | undefined {\n if (!nameArray || nameArray.length === 0) {\n return undefined;\n }\n const chineseName = nameArray.find((item) => item.language_code === 2052);\n return chineseName?.text ?? nameArray[0]?.text;\n}\n\nexport interface ICompatibilityUserProfile extends IUserProfile {\n /**\n * @deprecated please use `name`\n */\n userName: string;\n /**\n * @deprecated please use `avatar`\n */\n userAvatar: string;\n}\n\nfunction getCompatibilityUserProfile(): ICompatibilityUserProfile {\n const userInfo = getCurrentUserProfile();\n return {\n ...userInfo,\n // 兼容处理\n userName: userInfo.name,\n userAvatar: userInfo.avatar,\n };\n}\n\nexport const useCurrentUserProfile = () => {\n const [userInfo, setUserInfo] = useState<ICompatibilityUserProfile>(() =>\n getCompatibilityUserProfile(),\n );\n\n // 事件驱动,从 window 上取值\n useEffect(() => {\n let cancelled = false;\n\n const fetchAndSetUserInfo = async () => {\n const result = await authClient.session.getUserInfo();\n if (cancelled) return;\n const info = result?.data?.user_info;\n const userName = getNameFromArray(info?.name);\n const newUserInfo: ICompatibilityUserProfile = {\n user_id: info?.user_id?.toString() ?? '',\n email: info?.email ?? '',\n name: userName ?? '',\n avatar: info?.avatar?.image?.large ?? '',\n userName: userName ?? '',\n userAvatar: info?.avatar?.image?.large ?? '',\n };\n if (process.env.NODE_ENV === 'development') {\n console.log('MiaoDaMetaInfoChanged', newUserInfo);\n }\n setUserInfo(newUserInfo);\n };\n\n let handleMetaInfoChanged: () => void;\n if (isSparkRuntime()) {\n fetchAndSetUserInfo();\n handleMetaInfoChanged = () => { fetchAndSetUserInfo(); };\n } else {\n handleMetaInfoChanged = () => {\n if (process.env.NODE_ENV === 'development') {\n console.log('MiaoDaMetaInfoChanged', getCompatibilityUserProfile());\n }\n setUserInfo(getCompatibilityUserProfile());\n };\n }\n\n window.addEventListener('MiaoDaMetaInfoChanged', handleMetaInfoChanged);\n return () => {\n cancelled = true;\n window.removeEventListener(\n 'MiaoDaMetaInfoChanged',\n handleMetaInfoChanged,\n );\n };\n }, []);\n\n return userInfo;\n};\n","/* eslint-disable */\nimport { IUserProfile } from '../types/udt-types';\n\nexport function getCurrentUserProfile(): IUserProfile {\n return (window as any)._userInfo || {};\n}\n\n/**\n * @deprecated 请使用 getCurrentUserProfile 代替\n */\nexport const getUserInfo = getCurrentUserProfile;\n","import React from 'react';\nimport { debounce } from 'lodash';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean>(\n window.innerWidth < MOBILE_BREAKPOINT\n );\n\n React.useEffect(() => {\n const handleResize = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n\n const debouncedHandleResize = debounce(handleResize, 200);\n\n window.addEventListener('resize', debouncedHandleResize);\n\n // Set initial value\n handleResize();\n\n return () => {\n window.removeEventListener('resize', debouncedHandleResize);\n debouncedHandleResize.cancel(); // Cancel any pending execution on unmount\n };\n }, []);\n\n return isMobile;\n}\n","import { useState } from 'react';\nimport { authClient } from '@lark-apaas/auth-sdk';\n\nexport function useLogout() {\n const [isLoading, setIsLoading] = useState(false);\n async function handlerLogout() {\n if (process.env.NODE_ENV !== 'production') {\n console.log('只有生产环境才执行登出');\n return;\n }\n setIsLoading(true);\n try {\n await authClient.session.signOut();\n } catch (error) {\n console.error('登出失败', error);\n } finally {\n setIsLoading(false);\n }\n }\n\n return {\n handlerLogout,\n isLoading,\n };\n}\n","/**\n * 中英文文案源(统一管理)。\n *\n * 每条文案同时包含 zh 和 en,方便对照和维护。\n * Key 规则:`{组件}.{区域}.{标识}`\n * 文案来源:https://bytedance.larkoffice.com/wiki/BJCQwv9auiP9erkudMfcVIIGnRg\n */\n\nconst messages: Record<string, { zh: string; en: string }> = {\n // ── Index / 通用 ──────────────────────────────────────────────\n 'index.rateLimitError': {\n zh: '应用额度已耗尽,请联系应用开发者',\n en: 'Application quota exhausted, please contact the app developer',\n },\n // ── Safety 组件 ──────────────────────────────────────────────\n 'safety.badge.label': {\n zh: '妙搭',\n en: 'Spark',\n },\n 'safety.badge.builtWith': {\n zh: '由妙搭搭建',\n en: 'Built with Spark',\n },\n 'safety.ai.disclaimer': {\n zh: '包含 AI 生成内容,请注意甄别',\n en: 'AI-generated content. Use with care.',\n },\n 'safety.tenant.operated': {\n zh: '{name}运营',\n en: 'Operated by {name}',\n },\n 'safety.button.dontShowAgain': {\n zh: '不再展示',\n en: \"Don't show again\",\n },\n 'safety.button.learnMore': {\n zh: '了解更多',\n en: 'Learn more',\n },\n 'safety.report': {\n zh: '投诉与举报',\n en: 'Report',\n },\n 'safety.cover.pc': {\n zh: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover.png',\n en: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover-weben.png',\n },\n 'safety.cover.mobile': {\n zh: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover-mobile.png',\n en: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover-mobileen.png',\n },\n};\n\nexport default messages;\n","/**\n * 统一的语言判断方法。\n *\n * 生产环境(`process.env.NODE_ENV === 'production'`):\n * 只看浏览器容器语言(navigator.language)。\n *\n * 非生产环境(沙箱预览场景):\n * 优先级 query > localStorage > navigator。\n * URL query `locale`(值为 `zh_CN` / `en_US`)由宿主平台(miaoda)\n * 通过 iframe src 透传,确保产物内的语言与宿主一致;\n * 读到 query 时会同步写入 localStorage,便于后续无 query 的跳转/刷新场景使用。\n *\n * 返回标准化 locale code:'zh' | 'en'。\n * 目前只区分中英文,未来扩展时在此调整。\n */\n\nexport type Locale = 'zh' | 'en';\n\nconst STORAGE_KEY = 'miaoda:preview-locale';\n\nfunction toLocale(value: string | null | undefined): Locale {\n const lang = value ?? 'zh';\n return lang.toLowerCase().startsWith('zh') ? 'zh' : 'en';\n}\n\nfunction readLocaleFromQuery(): string | null {\n if (typeof window === 'undefined') return null;\n try {\n const value = new URLSearchParams(window.location.search).get('locale');\n return value && value.length > 0 ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction readLocaleFromStorage(): string | null {\n if (typeof window === 'undefined') return null;\n try {\n const value = window.localStorage?.getItem(STORAGE_KEY);\n return value && value.length > 0 ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction writeLocaleToStorage(value: string): void {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage?.setItem(STORAGE_KEY, value);\n } catch {\n // ignore(隐私模式 / 配额满等)\n }\n}\n\nexport function getLocale(): Locale {\n // 生产环境只信任容器语言,不受 query/localStorage 影响\n if (process.env.NODE_ENV === 'production') {\n return toLocale(navigator.language);\n }\n\n const fromQuery = readLocaleFromQuery();\n if (fromQuery) {\n writeLocaleToStorage(fromQuery);\n return toLocale(fromQuery);\n }\n\n const fromStorage = readLocaleFromStorage();\n if (fromStorage) return toLocale(fromStorage);\n\n return toLocale(navigator.language);\n}\n","import messages from './messages';\nimport { getLocale } from '../utils/locale';\nimport type { Locale } from '../utils/locale';\n\n/**\n * 获取当前语言环境下的翻译文案。\n *\n * 支持 `{key}` 形式的变量替换:\n * ```ts\n * t('safety.tenant.operated', { name: '字节' })\n * // zh → \"字节运营\"\n * // en → \"Operated by 字节\"\n * ```\n *\n * 如果 key 不存在,fallback 到中文;中文也没有则返回 key 本身。\n */\nexport function t(key: string, params?: Record<string, string>): string {\n const locale = getLocale();\n const entry = messages[key];\n let text = entry?.[locale] ?? entry?.zh ?? key;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n}\n\nexport { getLocale } from '../utils/locale';\nexport type { Locale } from '../utils/locale';\n","import React, { useRef, useState } from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { DOUBAO_LOGO_SRC, DOUBAO_PILL_MOBILE_PNG } from './doubao-watermark-asset';\nimport { getAppId } from '../../utils/getAppId';\nimport { useIsMobile } from '../../hooks';\n\n// 豆包来源值(对齐 app_meta.source / AppSource_Doubao)。\n// 经沙箱/编译注入 MIAODA_APP_SOURCE,coding preset 的 define 透传到 process.env。\n// 浏览器里 process.env 必然是字符串(即使语义是数字)。\nconst DOUBAO_SOURCE = '5';\n\n// 「投诉与举报」入口开关:后端举报链接(tns 风控举报中心)已就绪,开启举报入口。\nconst REPORT_ENABLED = true;\n\nconst BRAND_TEXT = '豆包 AI 生成';\nconst POWERED_BY_TEXT = '由飞书妙搭提供支持';\nconst FONT_FAMILY = \"'PingFang SC', -apple-system, BlinkMacSystemFont, sans-serif\";\n\n// 投影 token(对齐设计稿 effects):药丸更厚、卡片更浅。\nconst PILL_SHADOW =\n '0px 8px 32px rgba(0,0,0,0.08), 0px 4px 16px rgba(0,0,0,0.04), 0px 2px 4px rgba(0,0,0,0.02)';\nconst CARD_SHADOW =\n '0px 4px 16px rgba(0,0,0,0.03), 0px 4px 10px rgba(0,0,0,0.03), 0px 2px 4px rgba(0,0,0,0.02)';\n\n// 「投诉与举报」跳转:飞书风控举报中心(tns),域名随部署环境。\n// 环境取构建期注入的 process.env.FORCE_FRAMEWORK_ENVIRONMENT(沙箱原值 boe/pre/online,\n// 与豆包 gate 的 MIAODA_APP_SOURCE 一样由 preset define 注入,预打包层也已覆盖)。\n// 映射与服务端 mapToWindowEnvironment 同口径:boe→BOE,pre→PRE,其余(含 online)→线上。\nconst reportDomainByEnv = (env: string | undefined): string => {\n if (env === 'boe') return 'tns.feishu-boe.cn';\n if (env === 'pre') return 'tns.feishu-pre.cn';\n return 'tns.feishu.cn';\n};\n\n/**\n * 打开「投诉与举报」页:scene/entity_type 固定,entity_id 取当前妙搭 appId(getAppId →\n * window.appId,水印仅豆包应用展示,此时必有 appId),域名按环境选,params 整体 encode。\n */\nexport const openDoubaoReport = (): void => {\n const params = JSON.stringify({\n scene: 'miaoda_app_report',\n entity_id: getAppId() ?? '',\n entity_type: 'miaoda_app',\n extra: '',\n });\n const domain = reportDomainByEnv(process.env.FORCE_FRAMEWORK_ENVIRONMENT);\n const url = `https://${domain}/cust/lark_report/?type=common¶ms=${encodeURIComponent(\n params,\n )}&lang=zh-CN`;\n window.open(url, '_blank', 'noopener,noreferrer');\n};\n\n// 「投诉与举报」图标(DBX icon_feedback_outlined,16×16)。内联矢量、随 currentColor 着色,\n// 高分屏清晰、无需额外 CDN 依赖。\nexport const FeedbackIcon: React.FC = () => (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ display: 'block', flexShrink: 0 }}\n >\n <path\n d=\"M12.6667 2H3.33333V14H6.66667V15.3334H3.33333C2.59695 15.3334 2 14.7364 2 14V2C2 1.26364 2.59695 0.666687 3.33333 0.666687H12.6667C13.403 0.666687 14 1.26364 14 2V7.33335H12.6667V2Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M5.33333 4.66669C4.96514 4.66669 4.66667 4.96516 4.66667 5.33335C4.66667 5.70154 4.96514 6 5.33333 6H10.6667C11.0349 6 11.3333 5.70154 11.3333 5.33335C11.3333 4.96516 11.0349 4.66669 10.6667 4.66669H5.33333Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M4.66667 8.33335C4.66667 7.96516 4.96514 7.66669 5.33333 7.66669H8C8.36819 7.66669 8.66667 7.96516 8.66667 8.33335C8.66667 8.70154 8.36819 9 8 9H5.33333C4.96514 9 4.66667 8.70154 4.66667 8.33335Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M13.5523 8.70017C13.9428 8.30964 14.576 8.30964 14.9665 8.70017C15.357 9.09069 15.357 9.72386 14.9665 10.1144L14.2594 10.8215L12.8452 9.40728L13.5523 8.70017Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12.1381 10.1144L13.5523 11.5286L10.2309 14.85C10.0916 14.9892 9.91229 15.0815 9.71798 15.1138L8.45737 15.3234C8.42136 15.3294 8.38467 15.3177 8.35885 15.2918C8.33271 15.2657 8.32099 15.2284 8.32749 15.192L8.55128 13.9374C8.58465 13.7502 8.6746 13.5779 8.80901 13.4435L12.1381 10.1144Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n// 关闭叉(DBX icon_close_outlined)。内联 + currentColor:深色药丸里白 50%、白卡片里黑,\n// 一份资源随上下文着色(CDN 版固定 white@0.5,贴到白卡片上会看不见)。\nexport const CloseIcon: React.FC<{ size: number }> = ({ size }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ display: 'block', flexShrink: 0 }}\n >\n <path\n d=\"M8.08312 8.08298C8.2384 7.92769 8.23953 7.67705 8.08424 7.52176L5.3625 4.80002L8.08422 2.07829C8.23951 1.92301 8.23839 1.67236 8.0831 1.51708C7.92781 1.36179 7.67717 1.36066 7.52188 1.51595C7.36659 1.67124 4.80016 4.23767 4.80016 4.23767L2.07841 1.51593C1.92313 1.36064 1.67248 1.36177 1.5172 1.51705C1.36191 1.67234 1.36078 1.92298 1.51607 2.07827L4.23782 4.80002L1.51605 7.52178C1.36076 7.67707 1.36189 7.92771 1.51718 8.083C1.67246 8.23829 1.92311 8.23941 2.07839 8.08412L4.80016 5.36236L7.5219 8.0841C7.67719 8.23939 7.92783 8.23826 8.08312 8.08298Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n// 豆包头像(圆形)。钉死尺寸盖过宿主 Tailwind preflight 的 `img{max-width:100%;height:auto}`。\nexport const Avatar: React.FC<{ size: number }> = ({ size }) => (\n <img\n src={DOUBAO_LOGO_SRC}\n width={size}\n height={size}\n alt=\"\"\n style={{\n width: size,\n height: size,\n maxWidth: 'none',\n maxHeight: 'none',\n borderRadius: 100,\n flexShrink: 0,\n display: 'block',\n }}\n />\n);\n\n// 收起态深色药丸:头像 +「豆包AI」+(桌面端可选)关闭叉。\nexport const Pill: React.FC<{ variant: 'desktop' | 'mobile'; onClose?: () => void }> = ({\n variant,\n onClose,\n}) => {\n const isDesktop = variant === 'desktop';\n return (\n <div\n style={{\n boxSizing: 'border-box',\n display: 'inline-flex',\n alignItems: 'center',\n gap: isDesktop ? 4 : 6,\n padding: isDesktop ? '6px 12px 6px 8px' : '4px 12px 4px 8px',\n background: '#363636',\n border: '0.5px solid rgba(255,255,255,0.1)',\n borderRadius: 100,\n boxShadow: PILL_SHADOW,\n cursor: 'pointer',\n }}\n >\n <Avatar size={isDesktop ? 16 : 18} />\n <span\n style={{\n fontFamily: FONT_FAMILY,\n fontSize: isDesktop ? 12 : 14,\n lineHeight: isDesktop ? '18px' : '22px',\n color: 'rgba(255,255,255,0.85)',\n whiteSpace: 'nowrap',\n }}\n >\n {BRAND_TEXT}\n </span>\n {/* 关闭叉仅桌面端;移动端「不再展示」放在 tap 菜单里 */}\n {isDesktop && onClose && (\n <span\n role=\"button\"\n aria-label=\"关闭\"\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n cursor: 'pointer',\n flexShrink: 0,\n color: 'rgba(255,255,255,0.5)', // 深色药丸上的白 50% 叉\n }}\n >\n <CloseIcon size={10} />\n </span>\n )}\n </div>\n );\n};\n\n// 菜单行:图标(feedback / close 均为内联 currentColor SVG)+ 文案,r6 + hover 浅灰。\nexport const MenuRow: React.FC<{\n icon: 'feedback' | 'close';\n label: string;\n fontSize: number;\n onClick?: () => void;\n}> = ({ icon, label, fontSize, onClick }) => {\n const [hover, setHover] = useState(false);\n return (\n <div\n role=\"menuitem\"\n data-label={label}\n onClick={onClick}\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n style={{\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '4px 10px',\n borderRadius: 6,\n cursor: 'pointer',\n color: '#000000',\n background: hover ? 'rgba(0,0,0,0.04)' : 'transparent',\n }}\n >\n <span style={{ display: 'inline-flex', width: 16, height: 16, flexShrink: 0, color: '#000000' }}>\n {icon === 'feedback' ? <FeedbackIcon /> : <CloseIcon size={16} />}\n </span>\n <span\n style={{\n fontFamily: FONT_FAMILY,\n fontSize,\n lineHeight: `${fontSize + 8}px`,\n color: '#000000',\n whiteSpace: 'nowrap',\n }}\n >\n {label}\n </span>\n </div>\n );\n};\n\ntype MenuItem = { icon: 'feedback' | 'close'; label: string; onClick?: () => void };\n\n// 展开态白色卡片:菜单行 + 底部「由飞书妙搭提供支持」灰条。\nexport const MenuCard: React.FC<{\n items: MenuItem[];\n fontSize: number;\n footerFontSize: number;\n minWidth: number;\n style?: React.CSSProperties;\n}> = ({ items, fontSize, footerFontSize, minWidth, style }) => (\n <div\n style={{\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n minWidth,\n background: '#ffffff',\n border: '0.5px solid rgba(0,0,0,0.1)',\n borderRadius: 10,\n boxShadow: CARD_SHADOW,\n overflow: 'hidden',\n // radix Content 打开时获取焦点,去掉浏览器默认 focus 描边\n outline: 'none',\n ...style,\n }}\n >\n {items.length > 0 && (\n <div style={{ boxSizing: 'border-box', padding: 4 }}>\n {items.map((it) => (\n <MenuRow key={it.label} icon={it.icon} label={it.label} fontSize={fontSize} onClick={it.onClick} />\n ))}\n </div>\n )}\n <div\n style={{\n boxSizing: 'border-box',\n background: '#f9f9f9',\n padding: '8px 14px',\n fontFamily: FONT_FAMILY,\n fontSize: footerFontSize,\n lineHeight: `${footerFontSize + 8}px`,\n color: 'rgba(0,0,0,0.35)',\n whiteSpace: 'nowrap',\n }}\n >\n {POWERED_BY_TEXT}\n </div>\n </div>\n);\n\n/**\n * 移动端豆包水印:收起态深色药丸(头像 +「豆包AI」),tap 在上方弹白色卡片菜单\n * (投诉与举报[受 REPORT_ENABLED 控制] / 不再展示 / 由飞书妙搭提供支持)。点外部自动关(radix 内建)。\n */\nconst MobileWatermark: React.FC<{ onDontShow: () => void }> = ({ onDontShow }) => {\n const [open, setOpen] = useState(false);\n const items: MenuItem[] = [];\n if (REPORT_ENABLED) {\n items.push({ icon: 'feedback', label: '投诉与举报', onClick: openDoubaoReport });\n }\n items.push({\n icon: 'close',\n label: '不再展示',\n onClick: () => {\n setOpen(false);\n onDontShow();\n },\n });\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild>\n <div\n data-custom-element=\"doubao-watermark-mobile\"\n style={{\n position: 'fixed',\n right: 12,\n bottom: 12,\n width: 122,\n height: 30,\n zIndex: 9999,\n cursor: 'pointer',\n }}\n >\n {/* 收起药丸用 3× PNG(避免滤镜 SVG 在高分屏发糊)。canvas 166×94 含投影留白,\n 负偏移让可见药丸 122×30 精确贴边;钉死尺寸盖过宿主 Tailwind preflight 压缩。 */}\n <img\n src={DOUBAO_PILL_MOBILE_PNG}\n width={166}\n height={94}\n alt=\"豆包 AI 生成\"\n style={{\n position: 'absolute',\n right: -12,\n bottom: -40,\n width: 166,\n height: 94,\n maxWidth: 'none',\n maxHeight: 'none',\n display: 'block',\n pointerEvents: 'none',\n }}\n />\n </div>\n </PopoverPrimitive.Trigger>\n {/* tap 浮层菜单:radix Portal 经 createPortal 渲染,SSR(renderToStaticMarkup)\n 下不产出 markup、点击事件也无法在 SSR 触发,故本块无法被现有测试覆盖,v8 ignore。\n 药丸本体 + isMobile 分支已被单测覆盖。 */}\n {/* v8 ignore start */}\n <PopoverPrimitive.Portal>\n {/* radix Content 打开时自动获取焦点,会带浏览器默认 focus 描边 —— 必须在 Content 本身\n (被聚焦的元素)去掉,仅在内层 MenuCard 去掉不生效。 */}\n <PopoverPrimitive.Content side=\"top\" align=\"end\" sideOffset={8} style={{ outline: 'none' }}>\n <MenuCard items={items} fontSize={16} footerFontSize={14} minWidth={160} />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n {/* v8 ignore stop */}\n </PopoverPrimitive.Root>\n );\n};\n\n/**\n * 豆包水印:仅当应用来源为豆包时,在视口右下角展示收起态药丸(头像 +「豆包AI」)。\n *\n * 设计稿:Figma 1582:41560(桌面)/ 1582:41777(移动)。\n * - 药丸 / 卡片本体用代码画(投影走 CSS box-shadow、图标用无滤镜小 SVG),高分屏清晰。\n * - 桌面端点关闭叉 → 隐藏整个水印;hover 徽标 → 上方弹白色卡片(投诉与举报 + 由飞书妙搭提供支持)。\n * - 移动端 tap 徽标 → 上方弹卡片(投诉与举报 / 不再展示 / 由飞书妙搭提供支持)。\n * - 「投诉与举报」点击跳飞书风控举报中心(tns,域名随环境);后端链接未就绪时由 REPORT_ENABLED 整体隐藏。\n * - 不加 NODE_ENV 判断——预览态与运行态都要展示。\n */\nconst Watermark: React.FC = () => {\n const [closed, setClosed] = useState(false);\n const [open, setOpen] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isMobile = useIsMobile();\n\n if (String(process.env.MIAODA_APP_SOURCE) !== DOUBAO_SOURCE) return null;\n if (closed) return null;\n\n if (isMobile) {\n return <MobileWatermark onDontShow={() => setClosed(true)} />;\n }\n\n // hover 开关:交互态在 SSR 下不可达,v8 ignore。\n /* v8 ignore start */\n const enter = () => {\n if (timer.current) clearTimeout(timer.current);\n setOpen(true);\n };\n const leave = () => {\n timer.current = setTimeout(() => setOpen(false), 100);\n };\n /* v8 ignore stop */\n\n const desktopItems: MenuItem[] = [];\n if (REPORT_ENABLED) {\n desktopItems.push({ icon: 'feedback', label: '投诉与举报', onClick: openDoubaoReport });\n }\n\n return (\n <div\n data-custom-element=\"doubao-watermark\"\n onMouseEnter={enter}\n onMouseLeave={leave}\n style={{\n position: 'fixed',\n right: 12,\n bottom: 12,\n zIndex: 9999,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n gap: 8,\n }}\n >\n {/* hover 卡片:投诉与举报[受 REPORT_ENABLED 控制] + 由飞书妙搭提供支持。\n 交互态(open=true)在 SSR 下不可达,故 v8 ignore(与 openDoubaoReport 单测互补)。 */}\n {/* v8 ignore start */}\n {open && (\n <MenuCard items={desktopItems} fontSize={14} footerFontSize={12} minWidth={144} />\n )}\n {/* v8 ignore stop */}\n\n <Pill variant=\"desktop\" onClose={() => setClosed(true)} />\n </div>\n );\n};\n\nexport default Watermark;\n","// 豆包水印 CDN 资源(Eden)。设计稿:Figma 1582:41560(桌面)/ 1582:41777(移动)。\n// 均为无滤镜矢量 SVG(高分屏清晰);药丸 / 菜单卡片本体改为代码绘制,不再贴带滤镜的整图 SVG。\n/* eslint-disable */\nconst CDN = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/miaoda-ui';\n\n// 豆包头像(圆形,桌面 16 / 移动 18px;内嵌 120px 位图,缩放显示过采样清晰)\nexport const DOUBAO_LOGO_SRC = `${CDN}/setting_voice.svg`;\n// 移动端收起药丸:3× PNG(canvas 166×94,可见药丸 122×30)。用 PNG 而非带滤镜的 SVG ——\n// 后者经 <img> 加载会在高分屏被按 1× 栅格化再放大发糊;高分 PNG 按物理像素显示清晰。\nexport const DOUBAO_PILL_MOBILE_PNG = `${CDN}/Frame%202147223991%20(3).png`;\n// 关闭叉改为组件内联 SVG(currentColor 随上下文着白/黑),不再走 CDN(CDN 版固定 white@0.5)。\n","import React from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\nlet defaultQueryClient: QueryClient | null = null;\n\nconst getDefaultQueryClient = () => {\n if (!defaultQueryClient) {\n defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n refetchOnWindowFocus: false,\n },\n mutations: {\n retry: 1,\n },\n },\n });\n }\n return defaultQueryClient;\n};\n\nexport type QueryProviderProps = {\n children: React.ReactNode;\n client?: QueryClient;\n};\n\nconst QueryProvider: React.FC<QueryProviderProps> = ({ children, client }) => {\n const qc = client ?? getDefaultQueryClient();\n return <QueryClientProvider client={qc}>{children}</QueryClientProvider>;\n};\n\nexport default QueryProvider;\nexport { getDefaultQueryClient };\n\n","import { useEffect, useCallback, useRef, useMemo, createElement } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { useUpdatingRef } from '../../hooks/useUpdatingRef';\nimport { submitPostMessage } from '../../utils/postMessage';\n\n// 注意:connectParent 和 connectDevServer 已移至 runtime/iframe-bridge.ts\n\nenum RouteMessageType {\n RouteChange = 'RouteChange',\n RouteBack = 'RouteBack',\n RouteForward = 'RouteForward',\n}\n\nfunction isRouteMessageType(type: string): type is RouteMessageType {\n return Object.values(RouteMessageType).includes(type as RouteMessageType);\n}\n\nexport default function IframeBridge() {\n const location = useLocation();\n const navigate = useNavigate();\n const navigateRef = useUpdatingRef(navigate);\n type NavigateArg = Parameters<typeof navigate>[0];\n const isActive = useRef(false);\n\n const historyBack = useCallback(\n (_payload: NavigateArg) => {\n navigateRef.current(-1);\n isActive.current = true;\n },\n [navigateRef]\n );\n\n const historyForward = useCallback(\n (_payload: NavigateArg) => {\n navigateRef.current(1);\n isActive.current = true;\n },\n [navigateRef]\n );\n\n const operatorMessage = useMemo<\n Record<RouteMessageType, (payload: NavigateArg) => void>\n >(\n () => ({\n [RouteMessageType.RouteBack]: historyBack,\n [RouteMessageType.RouteForward]: historyForward,\n [RouteMessageType.RouteChange]: navigateRef.current,\n }),\n [historyBack, historyForward, navigateRef]\n );\n\n useEffect(() => {\n if (isActive.current) {\n isActive.current = false;\n return;\n }\n submitPostMessage({\n type: 'ChildLocationChange',\n data: location,\n });\n }, [location]);\n\n const handleMessage = useCallback(\n (event: MessageEvent) => {\n const data: { type?: unknown; data?: unknown } = event.data ?? {};\n if (typeof data.type === 'string' && isRouteMessageType(data.type)) {\n operatorMessage[data.type](data.data as NavigateArg);\n }\n },\n [operatorMessage]\n );\n\n useEffect(() => {\n (window as unknown as Window).addEventListener('message', handleMessage);\n\n return () => {\n (window as unknown as Window).removeEventListener(\n 'message',\n handleMessage\n );\n };\n }, [handleMessage]);\n\n // 用 createElement 而不是 JSX:避开 esbuild classic JSX transform 需要 React 在\n // scope 的问题(lite 的 tsconfig 是 react-jsx 自动模式,typecheck 不需要 React\n // import,但 tsup/esbuild 默认 classic transform 编译成 React.createElement,\n // 没 React import 就 runtime 报 ReferenceError)\n return createElement('div', { style: { display: 'none' } });\n}\n","import { useRef } from 'react';\nexport function useUpdatingRef<T>(value: T) {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n","import md5 from 'blueimp-md5';\nimport sha1 from 'crypto-js/sha1';\nimport { isMobile } from '../../../utils/deviceType';\nimport { getEnv } from '../../../utils/getEnv';\nimport { getLarkUserInfo } from './getLarkUser';\n\nimport { type TrackParams } from '../../../types/tea';\n\nconst saltA = '08a441';\nconst saltB = '42b91e';\nexport const encryptTea = (message: any): string => {\n const msgString = String(message);\n return sha1(saltA + md5(msgString + saltB)).toString();\n};\n\nlet teaInstance = false;\n\n/**\n * 初始化Tea 客户端\n * @export\n */\nexport async function createTracker(): Promise<void> {\n const { data } = await getLarkUserInfo();\n const { tenantID, userID} = data || {};\n const userIDEncrypt = userID && userID !== '0' ? encryptTea(userID) : undefined;\n const tenantIDEncrypt = tenantID && tenantID !== '0' ? encryptTea(tenantID) : undefined;\n\n window.collectEvent?.('init', {\n app_id: 788827,\n channel: 'cn',\n disable_auto_pv: false,\n enable_ab_test: false,\n enable_debug: false,\n enable_stay_duration: true, // 上报页面停留时间\n reportTime: 1000, // 事件上报异步队列的时间间隔\n });\n\n window.collectEvent?.('config', {\n user_unique_id: userIDEncrypt,\n device_type: isMobile() ? 'mobile' : 'pc',\n evtParams: {\n open_from: new URLSearchParams(window.location.search).get('open-from') ?? undefined,\n env: getEnv(),\n user_id: userIDEncrypt,\n tenant_id: tenantIDEncrypt,\n },\n });\n teaInstance = true;\n\n window.collectEvent?.('start');\n}\n\nexport const reportTeaEvent = async ({ trackKey, trackParams = {}}: TrackParams): Promise<void> => {\n try {\n if (!teaInstance) {\n teaInstance = true;\n await createTracker();\n }\n\n window.collectEvent?.(trackKey, trackParams);\n } catch (err) {\n // 静默,不影响业务\n console.error(err); // eslint-disable-line no-restricted-syntax\n }\n};\n","export const isIpad = (): boolean => {\n const _isIpad =\n /iPad|Tab|Tablet/i.test(navigator.userAgent) && navigator.maxTouchPoints && navigator.maxTouchPoints > 1;\n\n return Boolean(_isIpad);\n};\n\nexport const isMobile = (): boolean => {\n const isPhone =\n /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i.test(\n navigator.userAgent\n );\n\n return isPhone || isIpad();\n};\n\nexport const isIOS = (): boolean => {\n if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {\n return true;\n }\n return false;\n};\n","import { getAppId } from '../../../utils/getAppId';\nimport { getCsrfToken } from '../../../utils/getCsrfToken';\nimport { isNewPathEnabled } from '../../../utils/apiPath';\n\nexport async function getLarkUserInfo() {\n const appId = getAppId();\n if (!appId) {\n return {\n code: 1,\n msg: 'appId is required',\n data: {},\n };\n }\n\n const url = isNewPathEnabled()\n ? `/app/${appId}/__runtime__/api/v1/studio/lark/user_info`\n : `/spark/b/${appId}/lark/user_info`;\n\n const response = await fetch(url, {\n headers: {\n 'X-Suda-Csrf-Token': getCsrfToken() ?? '',\n },\n });\n\n return await response.json();\n}\n","export interface TrackParams {\n trackKey: TrackKey;\n trackParams?: Record<string, unknown>;\n}\n\nexport enum TrackKey {\n VIEW = 'aily_agent_artifact_page_view',\n}\n","import React from 'react';\n\nconst Welcome: React.FC<{\n title?: string;\n description?: string;\n}> = ({ title = '页面待开发', description = '页面暂未开发,请耐心等待...' }) => {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: 'calc(100vh - 64px)',\n padding: '0 24px',\n textAlign: 'center',\n }}\n >\n <img\n style={{ borderRadius: 6, marginBottom: 24 }}\n width=\"320\"\n height=\"200\"\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/miao/welcome.svg\"\n alt=\"Welcome\"\n />\n <div style={{ fontSize: 16, fontWeight: 500, lineHeight: '24px', marginBottom: 4, color: '#1f2329' }}>\n {title}\n </div>\n <div style={{ fontSize: 16, lineHeight: '24px', color: '#8f959e', maxWidth: 480 }}>\n {description}\n </div>\n </div>\n );\n};\n\nexport default Welcome;\n","import React from 'react';\n\nconst PagePlaceholder: React.FC<{\n title?: string;\n description?: string;\n}> = ({ title = '页面待开发', description = '页面暂未开发,请耐心等待...' }) => {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0 24px',\n width: '100%',\n height: 'calc(100vh - 64px)',\n textAlign: 'center',\n }}\n >\n <img\n style={{ borderRadius: '6px', marginBottom: '24px' }}\n width=\"320\"\n height=\"200\"\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/miao/welcome.svg\"\n alt=\"Welcome\"\n />\n <div style={{ fontSize: '16px', fontWeight: 500, marginBottom: '4px', lineHeight: '24px' }}>\n {title}\n </div>\n <div\n style={{\n color: '#6b7280',\n fontSize: '16px',\n lineHeight: '24px',\n maxWidth: '480px',\n overflow: 'hidden',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n }}\n >\n {description}\n </div>\n </div>\n );\n};\n\nexport default PagePlaceholder;\n","import React, { useEffect } from 'react';\nimport { logger } from '../../logger';\nimport { getHmrApi } from '../../utils/hmr-api';\nimport { submitPostMessage } from '../../utils/postMessage';\n\n/**\n * ErrorBoundary fallback 组件。\n *\n * 链路:业务代码 throw → react-error-boundary 捕获 → 渲染本组件\n * → submitPostMessage({ type: 'RenderError' }) 通知妙搭外壳\n * → logger.log meta.repairMessage 让外壳 sandbox-console 弹「一键修复」\n *\n * HMR 恢复策略按构建工具区分:\n * - **vite**: ErrorBoundary 状态下 React Refresh family map 找不到 fiber,\n * resetErrorBoundary 让 children 重新 mount 时 import 仍是旧引用 → 死循环。\n * vite 模式(检测到 window.__VITE_HMR__)必须 `window.location.reload()`\n * 才能让模块图完整重载(这是 vite 官方对 ErrorBoundary 场景的 recommended fallback)。\n * - **webpack/rspack**: 模块 cache 可被 HMR 直接替换,resetErrorBoundary 让 children\n * 重新 mount 时 import 拿到新版本 → 正常恢复,不需要 reload。\n */\nconst ErrorRender: React.FC<{\n error: unknown;\n resetErrorBoundary?: (...args: unknown[]) => void;\n}> = (props) => {\n const { error, resetErrorBoundary } = props;\n\n useEffect(() => {\n if (error) {\n submitPostMessage({\n type: 'RenderError',\n data: error,\n });\n logger.log({\n level: 'error',\n args: ['Render Error', error],\n meta: {\n type: 'render-error',\n repairMessage: '页面渲染时报错,请根据错误信息修复对应页面的代码',\n },\n });\n }\n }, [error]);\n\n useEffect(() => {\n if (!resetErrorBoundary) return;\n const hmr = getHmrApi();\n if (!hmr) return;\n\n return hmr.onSuccess(() => {\n // vite 下 ErrorBoundary 状态下模块图无法更新,必须整页 reload;\n // webpack/rspack 下 resetErrorBoundary 即可让 children 重新 mount 拿到新模块。\n const isVite =\n typeof window !== 'undefined' && Boolean(window.__VITE_HMR__);\n if (isVite) {\n window.location.reload();\n } else {\n resetErrorBoundary();\n }\n });\n }, [resetErrorBoundary]);\n\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-white\">\n <div className=\"flex flex-col justify-center items-center text-center\">\n <img\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/template/illustration_empty_negative_error.svg\"\n alt=\"render error\"\n className=\"mb-3 w-[100px]\"\n />\n <p className=\"text-l/[22px] text-[14px] text-[#1F2329] font-medium\">\n 页面出错了\n </p>\n </div>\n </div>\n );\n};\n\nexport default ErrorRender;\n","import React, { forwardRef, useEffect, useState } from 'react';\nimport { NavLink, type NavLinkProps } from 'react-router-dom';\n\nexport interface ActiveLinkProps extends Omit<NavLinkProps, 'to'> {\n to: string;\n}\n\n/**\n * ActiveLink 组件\n *\n * 替换 react-router-dom 的 NavLink,扩展支持 hash 路由跳转和激活态功能\n *\n * @example\n * // 普通路由跳转\n * <ActiveLink to=\"/dashboard\">Dashboard</ActiveLink>\n *\n * // hash 路由跳转\n * <ActiveLink to=\"#section1\">Section 1</ActiveLink>\n *\n * // 使用函数式 className 显示激活态\n * <ActiveLink\n * to=\"#features\"\n * className={({isActive}) => isActive ? 'active' : ''}\n * >\n * Features\n * </ActiveLink>\n */\n\nexport const ActiveLink = forwardRef<HTMLAnchorElement, ActiveLinkProps>(\n ({ to, onClick, className, style, children, ...rest }, ref) => {\n const [currentHash, setCurrentHash] = useState(() =>\n typeof window !== 'undefined' ? window.location.hash : ''\n );\n\n // 检测是否为 hash 路由\n const isHashRoute = typeof to === 'string' && to.startsWith('#');\n\n // 监听 hash 变化\n useEffect(() => {\n if (!isHashRoute) return;\n\n const handleHashChange = () => {\n setCurrentHash(window.location.hash);\n };\n\n window.addEventListener('hashchange', handleHashChange);\n return () => window.removeEventListener('hashchange', handleHashChange);\n }, [isHashRoute]);\n\n // 计算激活态\n const isActive = isHashRoute && currentHash === to;\n\n // 如果是普通路由,使用 NavLink\n if (!isHashRoute) {\n return (\n <NavLink\n ref={ref}\n to={to}\n onClick={onClick}\n className={className}\n style={style}\n {...rest}\n >\n {children}\n </NavLink>\n );\n }\n\n // 处理 hash 路由点击事件\n const handleHashClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n // 先调用用户自定义的 onClick\n onClick?.(e);\n\n // 如果用户在 onClick 中调用了 preventDefault,则不执行默认行为\n if (e.defaultPrevented) {\n return;\n }\n\n // 阻止默认的锚点跳转行为\n e.preventDefault();\n\n const targetId = to.slice(1); // \"#home\" -> \"home\"\n const targetElement = document.getElementById(targetId);\n\n // 使用 pushState 更新 URL,保留历史记录且避免浏览器默认的瞬间跳转\n history.pushState(null, '', to);\n\n // 立即更新内部状态以确保 UI 及时响应\n setCurrentHash(to);\n\n // 手动触发 hashchange 事件以通知其他组件\n window.dispatchEvent(new Event('hashchange'));\n\n // 平滑滚动到目标元素\n if (targetElement && typeof targetElement.scrollIntoView === 'function') {\n targetElement.scrollIntoView({ behavior: 'smooth' });\n }\n };\n\n // 处理 className(支持函数和字符串)\n const computedClassName =\n typeof className === 'function'\n ? className({ isActive, isPending: false, isTransitioning: false })\n : className;\n\n // 处理 style(支持函数和对象)\n const computedStyle =\n typeof style === 'function'\n ? style({ isActive, isPending: false, isTransitioning: false })\n : style;\n\n // 处理 children(支持函数和 ReactNode)\n const computedChildren =\n typeof children === 'function'\n ? children({ isActive, isPending: false, isTransitioning: false })\n : children;\n\n return (\n <a\n ref={ref}\n href={to}\n onClick={handleHashClick}\n className={computedClassName}\n style={computedStyle}\n {...rest}\n >\n {computedChildren}\n </a>\n );\n }\n);\n\nActiveLink.displayName = 'ActiveLink';\n","/* eslint-disable */\nimport * as React from 'react';\nimport {\n NavLink as OriginalNavLink,\n useLocation,\n useNavigate,\n type NavLinkProps,\n} from 'react-router-dom';\n\n/**\n * Enhanced NavLink component that extends react-router-dom's NavLink\n * with support for hash links (anchor navigation) and smooth scrolling.\n */\nconst NavLink = React.forwardRef<HTMLAnchorElement, NavLinkProps>(\n ({ to, children, className, style, ...props }, ref) => {\n const isHashLink = typeof to === 'string' && to.startsWith('#');\n const location = useLocation();\n const navigate = useNavigate();\n\n if (isHashLink) {\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n const element = document.querySelector(to as string);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth' });\n }\n navigate(to as string);\n };\n\n const isActive = location.hash === to;\n\n const renderProps = {\n isActive,\n isPending: false,\n isTransitioning: false,\n };\n\n const resolvedClassName =\n typeof className === 'function' ? className(renderProps) : className;\n const resolvedStyle =\n typeof style === 'function' ? style(renderProps) : style;\n\n const {\n caseSensitive,\n end,\n replace,\n state,\n preventScrollReset,\n relative,\n viewTransition,\n ...restProps\n } = props;\n\n return (\n <a\n href={to as string}\n onClick={handleClick}\n ref={ref}\n className={resolvedClassName}\n style={resolvedStyle}\n {...restProps}\n >\n {typeof children === 'function' ? children(renderProps) : children}\n </a>\n );\n }\n\n return (\n <OriginalNavLink\n to={to}\n ref={ref}\n className={className}\n style={style}\n onClick={() =>\n (document.getElementById('rootContainer') || window)?.scrollTo({\n top: 0,\n behavior: 'smooth',\n })\n }\n {...props}\n >\n {children}\n </OriginalNavLink>\n );\n },\n);\n\nNavLink.displayName = 'NavLink';\n\nexport { NavLink };\nexport type { NavLinkProps };\n","import React from 'react';\nimport { Link as RouterLink } from 'react-router-dom';\n\nexport interface UniversalLinkProps\n extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {\n /** 链接目标:内部路由、hash 锚点或外部 URL */\n to: string;\n}\n\n/** 是否为内部路由(非 hash、非外链) */\nfunction isInternalRoute(to: string): boolean {\n return !to.startsWith('#') && !to.startsWith('http://') && !to.startsWith('https://') && !to.startsWith('//');\n}\n\n/** 是否为外部链接 */\nfunction isExternalLink(to: string): boolean {\n return to.startsWith('http://') || to.startsWith('https://') || to.startsWith('//');\n}\n\n/**\n * 统一的链接组件,用于替换原生 <a> 标签\n * - 内部路由(/dashboard)→ react-router Link\n * - Hash 锚点(#section)→ <a>\n * - 外链(https://...)→ <a target=\"_blank\">\n */\nexport const UniversalLink = React.forwardRef<HTMLAnchorElement, UniversalLinkProps>(\n function UniversalLink({ to, ...props }, ref) {\n // 内部路由\n if (isInternalRoute(to)) {\n return <RouterLink to={to} ref={ref} {...props} />;\n }\n\n // Hash 链接 & 外部链接\n return (\n <a\n href={to}\n ref={ref}\n {...props}\n {...(isExternalLink(to) && {\n target: props.target ?? '_blank',\n rel: props.rel ?? 'noopener noreferrer',\n })}\n />\n );\n }\n);\n","import { getAppId } from './getAppId';\n\n/**\n * 获取当前 appId 对应的命名空间前缀\n * 格式:__miaoda_<appId>__:\n * 若 appId 为 null,则使用 __global__\n */\nfunction getPrefix(): string {\n const appId = getAppId();\n const namespace = appId || '__global__';\n return `__miaoda_${namespace}__:`;\n}\n\n/**\n * 获取当前 appId 范围内的所有 key(已去前缀)\n */\nfunction getScopedKeys(): string[] {\n const prefix = getPrefix();\n const keys: string[] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && key.startsWith(prefix)) {\n keys.push(key.substring(prefix.length));\n }\n }\n\n return keys;\n}\n\n/**\n * 按 appId 隔离的 localStorage 封装\n * API 与原生 localStorage 保持一致\n */\nexport const scopedStorage: Storage = {\n /**\n * 获取指定 key 的值\n */\n getItem(key: string): string | null {\n const prefixedKey = getPrefix() + key;\n return localStorage.getItem(prefixedKey);\n },\n\n /**\n * 设置指定 key 的值\n */\n setItem(key: string, value: string): void {\n const prefixedKey = getPrefix() + key;\n localStorage.setItem(prefixedKey, value);\n },\n\n /**\n * 删除指定 key\n */\n removeItem(key: string): void {\n const prefixedKey = getPrefix() + key;\n localStorage.removeItem(prefixedKey);\n },\n\n /**\n * 清空当前 appId 范围内的所有 key\n * 不影响其他 app 和无前缀的 key\n */\n clear(): void {\n const prefix = getPrefix();\n const keysToRemove: string[] = [];\n\n // 收集需要删除的 key\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && key.startsWith(prefix)) {\n keysToRemove.push(key);\n }\n }\n\n // 删除收集到的 key\n keysToRemove.forEach(key => localStorage.removeItem(key));\n },\n\n /**\n * 返回当前 appId 范围内第 index 个 key(去前缀后的原始 key)\n */\n key(index: number): string | null {\n const keys = getScopedKeys();\n return keys[index] || null;\n },\n\n /**\n * 返回当前 appId 范围内的 key 数量\n */\n get length(): number {\n return getScopedKeys().length;\n },\n};\n","/**\n * 复制字符串到剪切板\n * @param text 要复制的文本\n * @returns Promise<boolean> 复制是否成功\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n // 优先使用现代的 Clipboard API\n if (navigator.clipboard && window.isSecureContext) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n\n // 降级方案:使用传统的 execCommand 方法\n return fallbackCopyToClipboard(text);\n } catch (error) {\n // 执行navigator.clipboard.writeText失败时,降级方案\n return fallbackCopyToClipboard(text);\n }\n}\n\n/**\n * 降级复制方案(兼容旧浏览器)\n * @param text 要复制的文本\n * @returns boolean 复制是否成功\n */\nfunction fallbackCopyToClipboard(text: string): boolean {\n try {\n // 创建临时的 textarea 元素\n const textArea = document.createElement('textarea');\n textArea.value = text;\n\n // 设置样式,使其不可见\n textArea.style.position = 'fixed';\n textArea.style.left = '-999999px';\n textArea.style.top = '-999999px';\n textArea.setAttribute('readonly', '');\n\n // 添加到 DOM\n document.body.appendChild(textArea);\n\n // 选中文本\n textArea.focus();\n textArea.select();\n\n // 执行复制命令\n const successful = document.execCommand('copy');\n\n // 清理:移除临时元素\n document.body.removeChild(textArea);\n\n return successful;\n } catch (error) {\n console.error('降级复制方案失败:', error);\n return false;\n }\n}\n","import { normalizeBasePath } from './utils';\n\n/**\n * 确保路径包含 CLIENT_BASE_PATH 前缀\n */\nfunction ensureBasePath(pathname: string, basePath: string): string {\n if (!basePath) return pathname;\n if (pathname.startsWith(basePath)) return pathname;\n return `${basePath}${pathname.startsWith('/') ? '' : '/'}${pathname}`;\n}\n\n/**\n * 解析应用内路径,自动补全 CLIENT_BASE_PATH 前缀,返回完整 URL\n * 适用于生成分享链接、二维码等需要完整 URL 的场景\n *\n * - 相对路径:补全前缀 + 当前域名\n * - 当前域名的完整 URL:修正路径部分,补全前缀\n * - 其他域名的 URL:原样返回,不做处理\n *\n * @param path - 应用内相对路径或完整 URL\n * @returns 完整的 URL 字符串\n *\n * @example\n * // 假设 CLIENT_BASE_PATH = '/app/abc',当前域名为 https://example.com\n *\n * resolveAppUrl('/detail/123')\n * // => 'https://example.com/app/abc/detail/123'\n *\n * resolveAppUrl('https://example.com/detail/123')\n * // => 'https://example.com/app/abc/detail/123'\n *\n * resolveAppUrl('https://example.com/app/abc/detail/123')\n * // => 'https://example.com/app/abc/detail/123' (已有前缀,不重复添加)\n *\n * resolveAppUrl('https://other-site.com/page')\n * // => 'https://other-site.com/page' (非当前域名,原样返回)\n */\nexport function resolveAppUrl(path: string): string {\n const basePath = normalizeBasePath(process.env.CLIENT_BASE_PATH);\n\n // 尝试解析为完整 URL\n try {\n const url = new URL(path);\n // 非当前域名,原样返回\n if (url.origin !== window.location.origin) {\n return path;\n }\n // 当前域名,修正路径\n url.pathname = ensureBasePath(url.pathname, basePath);\n return url.toString();\n } catch {\n // 不是完整 URL,当作相对路径处理\n }\n\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const resolvedPath = ensureBasePath(normalizedPath, basePath);\n return `${window.location.origin}${resolvedPath}`;\n}\n","/**\n * @internal\n */\nexport function getEnvPath() {\n return window.IS_MIAODA_PREVIEW ? 'feida_preview' : 'feida_runtime';\n}\n","import axios, { AxiosInstance } from 'axios';\nimport { initAxiosConfig } from './axiosConfig';\n\nlet axiosInstance: AxiosInstance | undefined;\n\n/** 显示 toast 提示(兼容 PC/移动端) */\nfunction showToast(message: string, duration = 3000): Promise<void> {\n return new Promise(resolve => {\n const toast = document.createElement('div');\n\n const iconSvg = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8 1.333a6.667 6.667 0 1 1 0 13.334A6.667 6.667 0 0 1 8 1.333ZM8 10a.667.667 0 1 0 0 1.333A.667.667 0 0 0 8 10Zm0-5.333a.667.667 0 0 0-.667.666v3.334a.667.667 0 0 0 1.334 0V5.333A.667.667 0 0 0 8 4.667Z\" fill=\"#ff811a\"/>\n </svg>`;\n\n const iconWrapper = document.createElement('span');\n iconWrapper.innerHTML = iconSvg;\n Object.assign(iconWrapper.style, {\n display: 'flex',\n alignItems: 'center',\n marginRight: '8px',\n flexShrink: '0',\n });\n\n const textWrapper = document.createElement('span');\n textWrapper.textContent = message;\n\n toast.appendChild(iconWrapper);\n toast.appendChild(textWrapper);\n\n Object.assign(toast.style, {\n position: 'fixed',\n top: '20%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n display: 'flex',\n alignItems: 'center',\n padding: '12px 16px',\n backgroundColor: '#fff',\n color: '#1f2329',\n border: '1px solid #dee0e3',\n borderRadius: '6px',\n fontSize: '14px',\n lineHeight: '1.5',\n zIndex: '99999',\n maxWidth: '80vw',\n wordBreak: 'break-word',\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.03), 0 3px 6px rgba(0, 0, 0, 0.05), 0 6px 18px rgba(0, 0, 0, 0.03)',\n opacity: '0',\n transition: 'opacity 0.3s ease',\n });\n\n document.body.appendChild(toast);\n\n requestAnimationFrame(() => {\n toast.style.opacity = '1';\n });\n\n setTimeout(() => {\n toast.style.opacity = '0';\n setTimeout(() => {\n document.body.removeChild(toast);\n resolve();\n }, 300);\n }, duration);\n });\n}\n\ndeclare module 'axios' {\n export interface AxiosRequestConfig {\n meta?: {\n autoJumpToLogin?: boolean;\n };\n }\n}\n\n/** 获取axios实例 */\nexport function getAxiosForBackend() {\n if (!axiosInstance) {\n axiosInstance = axios.create({\n baseURL: process.env.CLIENT_BASE_PATH || '/',\n });\n axiosInstance.interceptors.response.use(\n null,\n err => {\n if (err.config.meta?.autoJumpToLogin !== false) {\n const loginUrl = err.response?.headers?.['x-login-url'];\n if (loginUrl) {\n showToast('需要登录后才能执行操作,将自动跳转登录页', 3000).then(() => {\n window.location.href = loginUrl;\n });\n }\n }\n return Promise.reject(err);\n });\n initAxiosConfig(axiosInstance);\n }\n return axiosInstance;\n}\n\nexport const axiosForBackend = getAxiosForBackend();\n","\nexport interface UrlParts {\n baseUrl: string;\n workspace: string;\n}\n\n/**\n * @internal\n */\nexport function splitWorkspaceUrl(fullUrl: string): UrlParts {\n try {\n // https://www.suda.com/suda/api/v1/workspaces/:workspace_id\n const url = new URL(fullUrl);\n const pathParts = url.pathname.split('/');\n\n // 找到 workspaces 位置\n const workspacesIndex = pathParts.findIndex(part => part === 'workspaces');\n if (workspacesIndex === -1) {\n throw new Error('Invalid workspace URL format');\n }\n\n const basePathParts = pathParts.slice(0, workspacesIndex);\n const workspace = pathParts[workspacesIndex + 1];\n\n return {\n baseUrl: `${url.origin}${basePathParts.join('/')}`,\n workspace,\n };\n } catch (error) {\n console.error('Error splitting workspace URL:', error);\n }\n return {\n baseUrl: fullUrl,\n // 兜底给一个,不要给空字符串,不然 createClient 都直接挂了,页面会白屏,体感不太好\n workspace: 'workspace',\n };\n}\n","import { splitWorkspaceUrl } from '../utils/url';\nimport { createClient } from '@lark-apaas/dataloom';\nimport { authClient } from '@lark-apaas/auth-sdk';\nimport { getAppId } from '../utils/getAppId';\nimport { getInitialInfo } from '../utils/getInitialInfo';\n\nconst createDataLoomClient = (url?: string, pat?: string) => {\n const { baseUrl } = url ? splitWorkspaceUrl(url) : { baseUrl: '' };\n const appId = getAppId() ?? '';\n return createClient(baseUrl, pat ?? '', {\n global: {\n enableDataloomLog: process.env.NODE_ENV !== 'production',\n requestRateLimit: process.env.NODE_ENV !== 'production' ? 100 : undefined,\n brandName: 'miaoda',\n appId,\n accountServices: {\n user: authClient.user,\n session: authClient.session,\n },\n },\n });\n};\n\nlet dataloom: ReturnType<typeof createDataLoomClient> | null = null;\n// 缓存进行中的 Promise,防止并发调用创建多个实例\nlet pendingPromise: Promise<ReturnType<typeof createDataLoomClient>> | null = null;\n\n/** 获取dataloom实例 */\nexport function getDataloom(): Promise<ReturnType<typeof createDataLoomClient>> {\n if (dataloom) {\n return Promise.resolve(dataloom);\n }\n if (pendingPromise) {\n return pendingPromise;\n }\n pendingPromise = getInitialInfo()\n .then(info => {\n const DATALOOM_CLIENT_URL = info?.app_runtime_extra?.url;\n const DATALOOM_PAT = info?.app_runtime_extra?.token;\n dataloom = createDataLoomClient(DATALOOM_CLIENT_URL, DATALOOM_PAT);\n return dataloom;\n })\n .finally(() => {\n pendingPromise = null;\n });\n return pendingPromise;\n}\n","import { createClient } from '@lark-apaas/client-capability';\nimport { normalizeBasePath } from '../utils/utils';\nimport { getAppId } from '../utils/getAppId';\nimport { logger } from '../logger';\nimport { showToast } from '../components/ui/toast';\nimport { t } from '../locales';\n\n/**\n * 调用平台 capability(插件能力)的客户端实例。\n *\n * 业务用法(**SDK 没有 invoke 方法,是 `load(id).call(action, params)`**):\n *\n * import { capabilityClient } from '@lark-apaas/client-toolkit-lite';\n *\n * // action 名取自 capability JSON 的 actions[].action 字段\n * const result = await capabilityClient\n * .load('text_to_image_quality_1')\n * .call('generateImage', { prompt: '一只猫' });\n *\n * 漏传 action 名(`call({ prompt: '...' })`)会把 params 对象当成 action 字符串,\n * 服务端拿到 `{ action: { prompt: '...' }, params: {} }` 后续校验失败。\n *\n * 是否启用 central 链路由 `MIAODA_APP_ARCH_TYPE` 环境变量决定,preset 编译期透传到\n * 浏览器侧的 `process.env.MIAODA_APP_ARCH_TYPE`:\n * - '2' / '3' / '4'(jsPage / SimpleHtml / Html,纯前端应用)→ 启用 central,\n * 走 plugin_server 4 端点(预览态 body 携带 capability config,运行态走中心 store)\n * - '1'(全栈)/ 未注入 / '0' → 不启用,走老 SDK 行为直接打用户应用\n *\n * 方案文档: https://bytedance.larkoffice.com/wiki/WtW5wJ7wli9BImkExyJcjR5znfx\n */\nconst _appId = getAppId();\n\n// preset 编译期 define 注入;undefined / '1' / '0' 都走老链路\nconst _archType = process.env.MIAODA_APP_ARCH_TYPE;\nconst _isFrontendOnly = _archType === '2' || _archType === '3' || _archType === '4';\n\nexport const capabilityClient = createClient({\n baseURL: normalizeBasePath(process.env.CLIENT_BASE_PATH ?? '/'),\n acquireUploadUrl: `/app/${_appId}/__runtime__/api/v1/studio/plugins/tmp_files/acquire_upload_url`,\n acquireDownloadUrl: `/app/${_appId}/__runtime__/api/v1/studio/plugins/tmp_files/acquire_download_url`,\n fetchOptions: {\n headers: {\n 'X-Suda-Csrf-Token':\n (window as { csrfToken?: string }).csrfToken ?? '',\n },\n },\n logger,\n onRateLimitError: () => {\n showToast(t('index.rateLimitError'));\n },\n ...(_isFrontendOnly\n ? {\n central: {\n enabled: true,\n // window.appId 由妙搭沙箱 / 线上环境注入;非妙搭场景下 capability 调用本身不可用\n appId: _appId ?? '',\n },\n }\n : {}),\n});\n","/** 显示 toast 提示(兼容 PC/移动端) */\nexport function showToast(message: string, duration = 3000): Promise<void> {\n return new Promise(resolve => {\n // 创建 toast 容器\n const toast = document.createElement('div');\n\n // 橙色警告图标 SVG\n const iconSvg = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8 1.333a6.667 6.667 0 1 1 0 13.334A6.667 6.667 0 0 1 8 1.333ZM8 10a.667.667 0 1 0 0 1.333A.667.667 0 0 0 8 10Zm0-5.333a.667.667 0 0 0-.667.666v3.334a.667.667 0 0 0 1.334 0V5.333A.667.667 0 0 0 8 4.667Z\" fill=\"#ff811a\"/>\n </svg>`;\n\n // 创建图标容器\n const iconWrapper = document.createElement('span');\n iconWrapper.innerHTML = iconSvg;\n Object.assign(iconWrapper.style, {\n display: 'flex',\n alignItems: 'center',\n marginRight: '8px',\n flexShrink: '0',\n });\n\n // 创建文字容器\n const textWrapper = document.createElement('span');\n textWrapper.textContent = message;\n\n toast.appendChild(iconWrapper);\n toast.appendChild(textWrapper);\n\n // 样式设置\n Object.assign(toast.style, {\n position: 'fixed',\n top: '32px',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n display: 'flex',\n alignItems: 'center',\n padding: '12px 16px',\n backgroundColor: '#fff',\n color: '#1f2329',\n border: '1px solid #dee0e3',\n borderRadius: '6px',\n fontSize: '14px',\n lineHeight: '1.5',\n zIndex: '99999',\n maxWidth: '80vw',\n wordBreak: 'break-word',\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.03), 0 3px 6px rgba(0, 0, 0, 0.05), 0 6px 18px rgba(0, 0, 0, 0.03)',\n opacity: '0',\n transition: 'opacity 0.3s ease',\n });\n\n document.body.appendChild(toast);\n\n // 淡入\n requestAnimationFrame(() => {\n toast.style.opacity = '1';\n });\n\n // 定时淡出并移除\n setTimeout(() => {\n toast.style.opacity = '0';\n setTimeout(() => {\n document.body.removeChild(toast);\n resolve();\n }, 300);\n }, duration);\n });\n}\n","import { observable } from '@lark-apaas/observable-web';\n\n/**\n * 核心 Trace 方法:用于执行并追踪异步函数。\n * 使用代理模式而非直接 bind,确保在调用时获取最新的 observable 实例状态。\n */\nexport const trace = (...args: Parameters<typeof observable.trace>) =>\n observable.trace(...args);\n\nexport default {\n trace,\n};\n","// 头像 Avatar 图\nexport const avatarImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/1.jpg';\nexport const avatarImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/2.jpg';\nexport const avatarImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/3.jpg';\nexport const avatarImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/4.jpg';\nexport const avatarImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/5.jpg';\nexport const avatarImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/6.jpg';\nexport const avatarImg7 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/7.jpg';\nexport const avatarImg8 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/8.jpg';\nexport const avatarImg9 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/9.jpg';\nexport const avatarImg10 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/10.jpg';\nexport const avatarImg11 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/11.jpg';\n","// Banner 图 technology 类型\nexport const techBannerImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/1.jpg';\nexport const techBannerImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/2.jpg';\nexport const techBannerImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/3.jpg';\nexport const techBannerImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/4.jpg';\nexport const techBannerImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/5.jpg';\nexport const techBannerImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/6.jpg';\nexport const techBannerImg7 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/7.jpg';\nexport const techBannerImg8 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/8.jpg';\n\n// Banner 图 professional 类型\nexport const professionalBannerImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/1.jpg';\nexport const professionalBannerImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/2.jpg';\nexport const professionalBannerImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/3.jpg';\nexport const professionalBannerImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/4.jpg';\nexport const professionalBannerImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/5.jpg';\nexport const professionalBannerImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/6.jpg';\nexport const professionalBannerImg7 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/7.jpg';\nexport const professionalBannerImg8 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/8.jpg';\n\n// Banner 图 minimalism 类型\nexport const minimalismBannerImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/1.jpg';\nexport const minimalismBannerImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/2.jpg';\nexport const minimalismBannerImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/3.jpg';\nexport const minimalismBannerImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/4.jpg';\nexport const minimalismBannerImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/5.jpg';\nexport const minimalismBannerImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/6.jpg';\nexport const minimalismBannerImg7 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/7.jpg';\nexport const minimalismBannerImg8 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/8.jpg';\n","// Cover 图 office\nexport const officeCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/1.jpg';\nexport const officeCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/2.jpg';\nexport const officeCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/3.jpg';\nexport const officeCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/4.jpg';\nexport const officeCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/5.jpg';\nexport const officeCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/6.jpg';\n\n// Cover 图 architecture\nexport const architectureCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/1.jpg';\nexport const architectureCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/2.jpg';\nexport const architectureCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/3.jpg';\nexport const architectureCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/4.jpg';\nexport const architectureCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/5.jpg';\nexport const architectureCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/6.jpg';\n\n// Cover 图 appeal-clothing\nexport const appealClothingCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/1.jpg';\nexport const appealClothingCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/2.jpg';\nexport const appealClothingCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/3.jpg';\nexport const appealClothingCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/4.jpg';\nexport const appealClothingCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/5.jpg';\nexport const appealClothingCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/6.jpg';\n\n// Cover 图 scenery\nexport const sceneryCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/1.jpg';\nexport const sceneryCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/2.jpg';\nexport const sceneryCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/3.jpg';\nexport const sceneryCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/4.jpg';\nexport const sceneryCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/5.jpg';\nexport const sceneryCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/6.jpg';\n\n// Cover 图 technology-internet\nexport const technologyInternetCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/1.jpg';\nexport const technologyInternetCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/2.jpg';\nexport const technologyInternetCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/3.jpg';\nexport const technologyInternetCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/4.jpg';\nexport const technologyInternetCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/5.jpg';\nexport const technologyInternetCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/6.jpg';\n\n// Cover 图 abstract-art-3d-rendering\nexport const abstractArt3dRenderingCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/1.jpg';\nexport const abstractArt3dRenderingCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/2.jpg';\nexport const abstractArt3dRenderingCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/3.jpg';\nexport const abstractArt3dRenderingCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/4.jpg';\nexport const abstractArt3dRenderingCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/5.jpg';\nexport const abstractArt3dRenderingCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/6.jpg';\n"],"mappings":"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X;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,cACX;AACK,IAAMC,cACX;;;ACtBF;;;;;;;;;;;;;;;;;;;;;;;;;;;AACO,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AAGK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AAGK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;;;ACpDF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACO,IAAMC,kBACX;AACK,IAAMC,kBACX;AACK,IAAMC,kBACX;AACK,IAAMC,kBACX;AACK,IAAMC,kBACX;AACK,IAAMC,kBACX;AAGK,IAAMC,wBACX;AACK,IAAMC,wBACX;AACK,IAAMC,wBACX;AACK,IAAMC,wBACX;AACK,IAAMC,wBACX;AACK,IAAMC,wBACX;AAGK,IAAMC,0BACX;AACK,IAAMC,0BACX;AACK,IAAMC,0BACX;AACK,IAAMC,0BACX;AACK,IAAMC,0BACX;AACK,IAAMC,0BACX;AAGK,IAAMC,mBACX;AACK,IAAMC,mBACX;AACK,IAAMC,mBACX;AACK,IAAMC,mBACX;AACK,IAAMC,mBACX;AACK,IAAMC,mBACX;AAGK,IAAMC,8BACX;AACK,IAAMC,8BACX;AACK,IAAMC,8BACX;AACK,IAAMC,8BACX;AACK,IAAMC,8BACX;AACK,IAAMC,8BACX;AAGK,IAAMC,kCACX;AACK,IAAMC,kCACX;AACK,IAAMC,kCACX;AACK,IAAMC,kCACX;AACK,IAAMC,kCACX;AACK,IAAMC,kCACX;","names":["NavLink","import_react","window","process","env","NODE_ENV","__REACT_DEVTOOLS_GLOBAL_HOOK__","renderers","Map","supportsFiber","inject","renderer","id","size","set","onCommitFiberRoot","onCommitFiberUnmount","hook","originalInject","bind","has","getCsrfToken","cookieName","cookies","document","cookie","split","name","value","decodeURIComponent","window","csrfToken","initAxiosConfig","axiosInstance","axios","interceptors","request","use","config","csrfToken","getCsrfToken","headers","window","location","pathname","error","Promise","reject","response","process","env","NODE_ENV","console","warn","method","toUpperCase","url","message","isNewPathEnabled","basePath","process","env","CLIENT_BASE_PATH","test","initObservable","appId","window","observable","start","serviceName","env","process","NODE_ENV","AppEnv","Dev","Prod","collectorUrl","isNewPathEnabled","log","trace","metric","time","error","console","import_observable_web","createWebpackHmrApi","hot","onSuccess","callback","lastStatus","handler","status","e","console","error","addStatusHandler","removeStatusHandler","onError","Error","getHmrApi","process","env","NODE_ENV","webpackHot","module","window","__VITE_HMR__","PARENT_ORIGIN_KEY","getParentOriginFromParams","params","URLSearchParams","window","location","search","origin","get","sessionStorage","setItem","getItem","undefined","getLegacyParentOrigin","includes","resolveParentOrigin","document","referrer","referrerOrigin","URL","startsWith","paramOrigin","process","env","FORCE_FRAMEWORK_DOMAIN_MAIN","submitPostMessage","message","targetOrigin","parentOrigin","parent","postMessage","e","console","error","LOG_LEVELS","isLogLevel","value","includes","devServerDisconnectInfo","retryCount","processDevServerLog","log","devFlag","includes","time","Date","now","submitPostMessage","type","data","status","slardar","sendEvent","name","metrics","categories","hmrFlag","startTime","duration","listenModuleHmr","hmr","getHmrApi","onSuccess","onError","error","console","warn","String","PROXY_CONSOLE_METHOD","interceptErrors","window","addEventListener","event","logger","reason","forEach","method","originalMethod","args","level","first","startsWith","isLogLevel","safeStringify","obj","seen","Set","JSON","stringify","_key","value","has","add","toString","Date","toISOString","Map","Object","fromEntries","Array","from","Error","name","message","stack","clear","processLogParams","args","map","arg","String","mapLogLevel","level","BatchLogger","config","logQueue","flushTimer","isProcessing","originConsole","console","userId","tenantId","appId","window","endpoint","process","env","CLIENT_BASE_PATH","sizeThreshold","flushInterval","maxRetries","retryDelay","headers","startFlushTimer","setupBeforeUnloadHandler","batchLog","level","message","source","logEntry","id","generateId","timestamp","Date","now","push","length","flush","logsToSend","splice","sendBatch","error","unshift","logs","collectLogs","map","log","time","toISOString","user_id","tenant_id","app_id","retries","execFetch","method","body","JSON","stringify","warn","delay","url","options","fetch","clearInterval","setInterval","addEventListener","finally","destroy","ms","Promise","resolve","setTimeout","Math","random","toString","substr","getQueueSize","updateConfig","newConfig","defaultBatchLogger","batchLogInfo","level","message","source","defaultBatchLogger","batchLog","shouldEnableBatchLogger","process","env","NODE_ENV","window","MIAODA_APP_TYPE","defaultBatchLogger","BatchLogger","console","mapStacktrace","stacktrace","map","frame","functionName","fileName","lineNumber","columnNumber","reportStacktraceParseError","e","context","window","parent","submitPostMessage","type","payload","error","Error","message","String","getStacktrace","StackTrace","get","errorReplacer","_key","value","stack","name","generateLogId","crypto","randomUUID","Date","now","Math","random","toString","slice","lastLogInfo","sendSelectedLog","logWithoutID","log","id","newParts","i","args","length","item","newError","meta","fromError","push","frames","firstFrameIndex","findIndex","includes","skipFrame","undefined","logJSON","JSON","stringify","logForDedup","logContentForDedup","content","count","isDuplicate","duplicateCount","duplicateOfId","updatedJSON","batchLogInfo","sendTypedLogV2","logWithMeta","level","typedLogInterceptor","originLogger","debug","info","warn","success","interceptors","shouldReportToObservable","process","env","NODE_ENV","ORDERED_LEVELS","defaultConfig","showLevel","showTimestamp","level","prefix","config","configureLogger","options","shouldLog","indexOf","getFormattedPrefix","parts","push","toUpperCase","logger","debug","message","args","console","log","info","observable","processLogParams","join","warn","error","success","mapLogLevel","window","__RUNTIME_LOGGER__","get","interceptor","interceptors","interceptLogs","clsxWithTw","inputs","twMerge","clsx","isPreview","window","IS_MIAODA_PREVIEW","normalizeBasePath","basePath","replace","getWsPath","rawBasePath","process","env","CLIENT_BASE_PATH","normalizedBasePath","startsWith","basePathWithoutTrailingSlash","endsWith","slice","isSparkRuntime","_IS_Spark_RUNTIME","runtimeMode","getRoutes","routes","path","basePath","normalizeBasePath","process","env","CLIENT_BASE_PATH","res","fetch","json","error","console","warn","childApi","updateAppInfo","appInfo","dispatchEvent","CustomEvent","detail","connectParent","submitPostMessage","type","data","batchLogInfo","JSON","stringify","timestamp","Date","now","url","window","location","href","parentOrigin","resolveParentOrigin","connection","connectToParent","methods","childApi","promise","initIframeBridge","parent","window","__FULLSTACK_RUNTIME_INITIALIZED__","initAxiosConfig","initObservable","process","env","NODE_ENV","initIframeBridge","import_react","getAppId","windowAppId","window","appId","getEnv","globalThis","ENVIRONMENT","origin","window","location","includes","getAppPublished","headers","window","token","MIAODA_BUILTIN_TTT","getCsrfToken","appId","getAppId","path","isNewPathEnabled","url","location","origin","response","fetch","method","credentials","res","json","code","status_code","data","console","error","undefined","initialInfo","pendingPromise","getInitialInfo","refresh","Promise","resolve","then","info","_bucket_id","app_runtime_extra","bucket","default_bucket_id","finally","fetchTenantInfo","appId","getAppId","path","isNewPathEnabled","response","fetch","window","location","origin","method","headers","getCsrfToken","credentials","res","json","data","undefined","tenantInfo","pendingPromise","getTenantInfo","Promise","resolve","then","info","finally","getAppInfo","refresh","appInfo","window","_appInfo","undefined","isSparkRuntime","info","getInitialInfo","app_info","name","app_name","avatar","app_avatar","description","app_description","trim","useAppInfo","appInfo","setAppInfo","useState","useEffect","updateDomInfo","info","name","document","title","meta","querySelector","content","avatar","link","createElement","rel","head","appendChild","href","description","metaDom","handleMetaInfoChanged","refresh","getAppInfo","prev","undefined","onUpdate","e","detail","window","addEventListener","removeEventListener","appName","appLogo","import_react","getCurrentUserProfile","window","_userInfo","getNameFromArray","nameArray","length","undefined","chineseName","find","item","language_code","text","getCompatibilityUserProfile","userInfo","getCurrentUserProfile","userName","name","userAvatar","avatar","useCurrentUserProfile","setUserInfo","useState","useEffect","cancelled","fetchAndSetUserInfo","result","authClient","session","getUserInfo","info","data","user_info","newUserInfo","user_id","toString","email","image","large","process","env","NODE_ENV","console","log","handleMetaInfoChanged","isSparkRuntime","window","addEventListener","removeEventListener","import_react","MOBILE_BREAKPOINT","useIsMobile","isMobile","setIsMobile","React","useState","window","innerWidth","useEffect","handleResize","debouncedHandleResize","debounce","addEventListener","removeEventListener","cancel","import_react","import_auth_sdk","useLogout","isLoading","setIsLoading","useState","handlerLogout","process","env","NODE_ENV","console","log","authClient","session","signOut","error","messages","zh","en","STORAGE_KEY","toLocale","value","lang","toLowerCase","startsWith","readLocaleFromQuery","window","URLSearchParams","location","search","get","length","readLocaleFromStorage","localStorage","getItem","writeLocaleToStorage","setItem","getLocale","process","env","NODE_ENV","navigator","language","fromQuery","fromStorage","t","key","params","locale","getLocale","entry","messages","text","zh","k","v","Object","entries","replace","resetBase","boxSizing","margin","padding","border","background","font","color","textAlign","textDecoration","textTransform","letterSpacing","wordSpacing","lineHeight","verticalAlign","listStyle","FONT_FAMILY","Z_BADGE","Z_OVERLAY","LOGO_URL","getCoverUrl","t","getCoverMobileUrl","ICON_COMPANY_URL","ICON_AI_URL","ICON_FEEDBACK_URL","LANDING_URL","REPORT_DOMAIN","BOE","PRE","ONLINE","openReport","params","JSON","stringify","scene","entity_id","getAppId","entity_type","extra","url","getEnv","encodeURIComponent","window","open","badgeBase","position","display","alignItems","gap","boxShadow","borderRadius","fontFamily","fontSize","zIndex","cursor","badgeDesktop","right","bottom","badgeMobile","logoStyle","flexShrink","width","height","badgeTextStyle","popoverContent","overflow","popoverInner","flexDirection","popoverCover","popoverBody","justifyContent","infoRow","alignSelf","infoIcon","infoIconMobile","infoText","btnRow","btnBase","flex","borderWidth","borderStyle","borderColor","transition","btnHovered","overlayStyle","inset","sheetContent","outline","sheetInner","sheetCloseBtn","top","left","sheetCover","sheetBody","sheetInfoText","mobileBtnRow","mobileBtnBase","mobileBtnOutline","mobileBtnFilled","HoverButton","style","onClick","children","rest","hovered","setHovered","useState","React","div","onMouseEnter","onMouseLeave","XIcon","svg","xmlns","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","path","d","Safety","HasClosedKey","visible","setVisible","localStorage","getItem","setOpen","isMobile","useIsMobile","userinfo","setUserinfo","isInternetVisible","setIsInternetVisible","showBadge","setShowBadge","badgeLoaded","setBadgeLoaded","timeoutRef","useRef","useEffect","process","env","NODE_ENV","getTenantInfo","then","data","tenant_info","is_internet_visible","catch","getInitialInfo","info","badge","app_info","show_badge","finally","link","document","createElement","rel","as","href","head","appendChild","Root","onOpenChange","Trigger","asChild","img","src","p","minWidth","Portal","Overlay","Content","aria-describedby","undefined","Title","clip","alt","name","data-custom-element","textUnderlineOffset","e","stopPropagation","preventDefault","setTimeout","setItem","current","clearTimeout","side","align","sideOffset","import_react","PopoverPrimitive","CDN","DOUBAO_LOGO_SRC","DOUBAO_PILL_MOBILE_PNG","DOUBAO_SOURCE","REPORT_ENABLED","BRAND_TEXT","POWERED_BY_TEXT","FONT_FAMILY","PILL_SHADOW","CARD_SHADOW","reportDomainByEnv","env","openDoubaoReport","params","JSON","stringify","scene","entity_id","getAppId","entity_type","extra","domain","process","FORCE_FRAMEWORK_ENVIRONMENT","url","encodeURIComponent","window","open","FeedbackIcon","React","svg","width","height","viewBox","fill","xmlns","style","display","flexShrink","path","d","CloseIcon","size","Avatar","img","src","DOUBAO_LOGO_SRC","alt","maxWidth","maxHeight","borderRadius","Pill","variant","onClose","isDesktop","div","boxSizing","alignItems","gap","padding","background","border","boxShadow","cursor","span","fontFamily","fontSize","lineHeight","color","whiteSpace","role","aria-label","onClick","e","stopPropagation","MenuRow","icon","label","hover","setHover","useState","data-label","onMouseEnter","onMouseLeave","MenuCard","items","footerFontSize","minWidth","flexDirection","overflow","outline","length","map","it","key","MobileWatermark","onDontShow","setOpen","push","Root","onOpenChange","Trigger","asChild","data-custom-element","position","right","bottom","zIndex","DOUBAO_PILL_MOBILE_PNG","pointerEvents","Portal","Content","side","align","sideOffset","Watermark","closed","setClosed","timer","useRef","isMobile","useIsMobile","String","MIAODA_APP_SOURCE","enter","current","clearTimeout","leave","setTimeout","desktopItems","import_react","defaultQueryClient","getDefaultQueryClient","QueryClient","defaultOptions","queries","retry","refetchOnWindowFocus","mutations","QueryProvider","children","client","qc","React","QueryClientProvider","import_react","import_react","useUpdatingRef","value","ref","useRef","current","RouteMessageType","isRouteMessageType","type","Object","values","includes","IframeBridge","location","useLocation","navigate","useNavigate","navigateRef","useUpdatingRef","isActive","useRef","historyBack","useCallback","_payload","current","historyForward","operatorMessage","useMemo","useEffect","submitPostMessage","data","handleMessage","event","window","addEventListener","removeEventListener","createElement","style","display","isIpad","_isIpad","test","navigator","userAgent","maxTouchPoints","Boolean","isMobile","isPhone","isIOS","getLarkUserInfo","appId","getAppId","code","msg","data","url","isNewPathEnabled","response","fetch","headers","getCsrfToken","json","saltA","saltB","encryptTea","message","msgString","String","sha1","md5","toString","teaInstance","createTracker","data","getLarkUserInfo","tenantID","userID","userIDEncrypt","undefined","tenantIDEncrypt","window","collectEvent","app_id","channel","disable_auto_pv","enable_ab_test","enable_debug","enable_stay_duration","reportTime","user_unique_id","device_type","isMobile","evtParams","open_from","URLSearchParams","location","search","get","env","getEnv","user_id","tenant_id","reportTeaEvent","trackKey","trackParams","err","console","error","TrackKey","AppContainer","children","useAppInfo","useEffect","process","env","NODE_ENV","reportTeaEvent","trackKey","TrackKey","VIEW","trackParams","artifact_uid","getAppId","agent_id","url","window","location","href","React","String","MIAODA_APP_TYPE","Safety","MiaodaInspector","IframeBridge","Watermark","QueryProvider","import_react","Welcome","title","description","React","div","style","display","flexDirection","alignItems","justifyContent","width","height","padding","textAlign","img","borderRadius","marginBottom","src","alt","fontSize","fontWeight","lineHeight","color","maxWidth","import_react","PagePlaceholder","title","description","React","div","style","display","flexDirection","alignItems","justifyContent","padding","width","height","textAlign","img","borderRadius","marginBottom","src","alt","fontSize","fontWeight","lineHeight","color","maxWidth","overflow","WebkitLineClamp","WebkitBoxOrient","import_react","ErrorRender","props","error","resetErrorBoundary","useEffect","submitPostMessage","type","data","logger","log","level","args","meta","repairMessage","hmr","getHmrApi","onSuccess","isVite","window","Boolean","__VITE_HMR__","location","reload","React","div","className","img","src","alt","p","import_react","import_react_router_dom","ActiveLink","forwardRef","to","onClick","className","style","children","rest","ref","currentHash","setCurrentHash","useState","window","location","hash","isHashRoute","startsWith","useEffect","handleHashChange","addEventListener","removeEventListener","isActive","React","NavLink","handleHashClick","e","defaultPrevented","preventDefault","targetId","slice","targetElement","document","getElementById","history","pushState","dispatchEvent","Event","scrollIntoView","behavior","computedClassName","isPending","isTransitioning","computedStyle","computedChildren","a","href","displayName","React","import_react_router_dom","NavLink","React","forwardRef","to","children","className","style","props","ref","isHashLink","startsWith","location","useLocation","navigate","useNavigate","handleClick","e","preventDefault","element","document","querySelector","scrollIntoView","behavior","isActive","hash","renderProps","isPending","isTransitioning","resolvedClassName","resolvedStyle","caseSensitive","end","replace","state","preventScrollReset","relative","viewTransition","restProps","a","href","onClick","OriginalNavLink","getElementById","window","scrollTo","top","displayName","import_react","import_react_router_dom","isInternalRoute","to","startsWith","isExternalLink","UniversalLink","React","forwardRef","props","ref","RouterLink","a","href","target","rel","getPrefix","appId","getAppId","namespace","getScopedKeys","prefix","keys","i","localStorage","length","key","startsWith","push","substring","scopedStorage","getItem","prefixedKey","setItem","value","removeItem","clear","keysToRemove","forEach","index","copyToClipboard","text","navigator","clipboard","window","isSecureContext","writeText","fallbackCopyToClipboard","error","textArea","document","createElement","value","style","position","left","top","setAttribute","body","appendChild","focus","select","successful","execCommand","removeChild","console","ensureBasePath","pathname","basePath","startsWith","resolveAppUrl","path","normalizeBasePath","process","env","CLIENT_BASE_PATH","url","URL","origin","window","location","toString","normalizedPath","resolvedPath","getEnvPath","window","IS_MIAODA_PREVIEW","import_axios","axiosInstance","showToast","message","duration","Promise","resolve","toast","document","createElement","iconSvg","iconWrapper","innerHTML","Object","assign","style","display","alignItems","marginRight","flexShrink","textWrapper","textContent","appendChild","position","top","left","transform","padding","backgroundColor","color","border","borderRadius","fontSize","lineHeight","zIndex","maxWidth","wordBreak","boxShadow","opacity","transition","body","requestAnimationFrame","setTimeout","removeChild","getAxiosForBackend","axios","create","baseURL","process","env","CLIENT_BASE_PATH","interceptors","response","use","err","config","meta","autoJumpToLogin","loginUrl","headers","then","window","location","href","reject","initAxiosConfig","axiosForBackend","splitWorkspaceUrl","fullUrl","url","URL","pathParts","pathname","split","workspacesIndex","findIndex","part","Error","basePathParts","slice","workspace","baseUrl","origin","join","error","console","import_auth_sdk","createDataLoomClient","url","pat","baseUrl","splitWorkspaceUrl","appId","getAppId","createClient","global","enableDataloomLog","process","env","NODE_ENV","requestRateLimit","undefined","brandName","accountServices","user","authClient","session","dataloom","pendingPromise","getDataloom","Promise","resolve","getInitialInfo","then","info","DATALOOM_CLIENT_URL","app_runtime_extra","DATALOOM_PAT","token","finally","showToast","message","duration","Promise","resolve","toast","document","createElement","iconSvg","iconWrapper","innerHTML","Object","assign","style","display","alignItems","marginRight","flexShrink","textWrapper","textContent","appendChild","position","top","left","transform","padding","backgroundColor","color","border","borderRadius","fontSize","lineHeight","zIndex","maxWidth","wordBreak","boxShadow","opacity","transition","body","requestAnimationFrame","setTimeout","removeChild","_appId","getAppId","_archType","process","env","MIAODA_APP_ARCH_TYPE","_isFrontendOnly","capabilityClient","createClient","baseURL","normalizeBasePath","CLIENT_BASE_PATH","acquireUploadUrl","acquireDownloadUrl","fetchOptions","headers","window","csrfToken","logger","onRateLimitError","showToast","t","central","enabled","appId","import_observable_web","trace","args","observable","avatarImg1","avatarImg2","avatarImg3","avatarImg4","avatarImg5","avatarImg6","avatarImg7","avatarImg8","avatarImg9","avatarImg10","avatarImg11","techBannerImg1","techBannerImg2","techBannerImg3","techBannerImg4","techBannerImg5","techBannerImg6","techBannerImg7","techBannerImg8","professionalBannerImg1","professionalBannerImg2","professionalBannerImg3","professionalBannerImg4","professionalBannerImg5","professionalBannerImg6","professionalBannerImg7","professionalBannerImg8","minimalismBannerImg1","minimalismBannerImg2","minimalismBannerImg3","minimalismBannerImg4","minimalismBannerImg5","minimalismBannerImg6","minimalismBannerImg7","minimalismBannerImg8","officeCoverImg1","officeCoverImg2","officeCoverImg3","officeCoverImg4","officeCoverImg5","officeCoverImg6","architectureCoverImg1","architectureCoverImg2","architectureCoverImg3","architectureCoverImg4","architectureCoverImg5","architectureCoverImg6","appealClothingCoverImg1","appealClothingCoverImg2","appealClothingCoverImg3","appealClothingCoverImg4","appealClothingCoverImg5","appealClothingCoverImg6","sceneryCoverImg1","sceneryCoverImg2","sceneryCoverImg3","sceneryCoverImg4","sceneryCoverImg5","sceneryCoverImg6","technologyInternetCoverImg1","technologyInternetCoverImg2","technologyInternetCoverImg3","technologyInternetCoverImg4","technologyInternetCoverImg5","technologyInternetCoverImg6","abstractArt3dRenderingCoverImg1","abstractArt3dRenderingCoverImg2","abstractArt3dRenderingCoverImg3","abstractArt3dRenderingCoverImg4","abstractArt3dRenderingCoverImg5","abstractArt3dRenderingCoverImg6"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/AppContainer/index.tsx","../src/runtime/react-devtools-hook.ts","../src/utils/axiosConfig.ts","../src/utils/getCsrfToken.ts","../src/runtime/observable.ts","../src/utils/apiPath.ts","../src/logger/logger.ts","../src/logger/intercept-global-error.ts","../src/utils/hmr-api.ts","../src/utils/postMessage.ts","../src/logger/log-types.ts","../src/utils/safeStringify.ts","../src/logger/selected-logs.ts","../src/logger/batch-logger.ts","../src/runtime/iframe-bridge.ts","../src/utils/utils.ts","../src/components/AppContainer/utils/childApi.ts","../src/runtime/index.ts","../src/components/AppContainer/safety.tsx","../src/utils/getAppId.ts","../src/utils/getEnv.ts","../src/utils/getInitialInfo.ts","../src/utils/getTenantInfo.ts","../src/hooks/useAppInfo.tsx","../src/integrations/getAppInfo.ts","../src/hooks/useCurrentUserProfile.tsx","../src/integrations/getCurrentUserProfile.ts","../src/hooks/useIsMobile.ts","../src/hooks/useLogout.ts","../src/locales/messages.ts","../src/utils/locale.ts","../src/locales/index.ts","../src/components/AppContainer/Watermark.tsx","../src/components/AppContainer/doubao-watermark-asset.ts","../src/components/QueryProvider/index.tsx","../src/components/AppContainer/IframeBridge.tsx","../src/hooks/useUpdatingRef.ts","../src/components/AppContainer/utils/tea.ts","../src/utils/deviceType.ts","../src/components/AppContainer/utils/getLarkUser.ts","../src/types/tea.ts","../src/components/Welcome/index.tsx","../src/components/PagePlaceholder/index.tsx","../src/components/ErrorRender/index.tsx","../src/route-components/ActiveLink.tsx","../src/route-components/NavLink.tsx","../src/route-components/UniversalLink.tsx","../src/utils/scopedStorage.ts","../src/utils/copyToClipboard.ts","../src/utils/resolveAppUrl.ts","../src/utils/getEnvPath.ts","../src/utils/getAxiosForBackend.ts","../src/utils/url.ts","../src/integrations/dataloom.ts","../src/integrations/capabilityClient.ts","../src/components/ui/toast.tsx","../src/trace/index.ts","../src/constants/img-resources/avatar.ts","../src/constants/img-resources/banner.ts","../src/constants/img-resources/cover.ts"],"sourcesContent":["// Components\nexport { default as AppContainer } from './components/AppContainer';\nexport { default as QueryProvider } from './components/QueryProvider';\nexport { default as Welcome } from './components/Welcome';\nexport { default as PagePlaceholder } from './components/PagePlaceholder';\nexport { default as ErrorRender } from './components/ErrorRender';\n\n// Route Components\nexport { ActiveLink } from './route-components/ActiveLink';\nexport { NavLink } from './route-components/NavLink';\nexport { UniversalLink } from './route-components/UniversalLink';\n\n// Hooks\nexport { useAppInfo } from './hooks/useAppInfo';\nexport { useCurrentUserProfile } from './hooks/useCurrentUserProfile';\nexport { useIsMobile } from './hooks/useIsMobile';\nexport { useLogout } from './hooks/useLogout';\n\n// Utils\nexport { clsxWithTw, isPreview, normalizeBasePath, getWsPath } from './utils/utils';\nexport { getAppId } from './utils/getAppId';\nexport { getCsrfToken } from './utils/getCsrfToken';\nexport { scopedStorage } from './utils/scopedStorage';\nexport { copyToClipboard } from './utils/copyToClipboard';\nexport { isIpad, isMobile, isIOS } from './utils/deviceType';\nexport { resolveAppUrl } from './utils/resolveAppUrl';\nexport { getEnvPath } from './utils/getEnvPath';\nexport { safeStringify } from './utils/safeStringify';\nexport { getAxiosForBackend, axiosForBackend } from './utils/getAxiosForBackend';\nexport { initAxiosConfig } from './utils/axiosConfig';\n\n// Integrations\nexport { getAppInfo } from './integrations/getAppInfo';\nexport { getCurrentUserProfile } from './integrations/getCurrentUserProfile';\nexport { getDataloom } from './integrations/dataloom';\nexport { capabilityClient } from './integrations/capabilityClient';\n\n// Logger\nexport { logger } from './logger';\nexport type { LogLevel, LogWithMeta } from './logger/log-types';\n\n// Observability\nexport { trace } from './trace';\nexport { initObservable } from './runtime/observable';\n\n// Types\nexport type { AppInfoPayload } from './types/common';\nexport type { IUserProfile, IJson, IFileAttachment } from './types/udt-types';\nexport type { TrackParams } from './types/tea';\nexport { TrackKey } from './types/tea';\n\n// Tea\nexport { reportTeaEvent } from './components/AppContainer/utils/tea';\n\n// Constants\nexport * as avatarImages from './constants/img-resources/avatar';\nexport * as bannerImages from './constants/img-resources/banner';\nexport * as coverImages from './constants/img-resources/cover';\n","import React, { useEffect } from 'react';\nimport { MiaodaInspector } from '@lark-apaas/miaoda-inspector';\n\n// 兼容性:确保 runtime 被加载\n// runtime 内部有防重复机制(__FULLSTACK_RUNTIME_INITIALIZED__),不会重复执行\nimport '../../runtime';\n\nimport Safety from './safety';\nimport Watermark from './Watermark';\nimport QueryProvider from '../QueryProvider';\nimport IframeBridge from './IframeBridge';\nimport { useAppInfo } from '../../hooks';\nimport { reportTeaEvent } from './utils/tea';\nimport { TrackKey } from '../../types/tea';\nimport { getAppId } from '../../utils/getAppId';\n\ninterface AppContainerProps {\n children: React.ReactNode;\n}\n\nconst AppContainer: React.FC<AppContainerProps> = ({ children }) => {\n useAppInfo();\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'production') {\n reportTeaEvent({\n trackKey: TrackKey.VIEW,\n trackParams: {\n artifact_uid: getAppId(),\n agent_id: 'agent_miaoda',\n url: window.location.href,\n },\n });\n }\n }, []);\n\n return (\n <>\n {/* AppType=7 是 jsPage MODERN_APP,不显示「由妙搭搭建」徽标。\n AppType 由沙箱注入 MIAODA_APP_TYPE 环境变量,preset 顶层 define 透传给客户端。\n 在此 gate(而非 Safety 内部),jsPage 下 Safety 整个不挂载,省掉 effect/fetch/render。\n process.env 在浏览器是 undefined,env 必然是字符串(即使语义是数字)。 */}\n {String(process.env.MIAODA_APP_TYPE) !== '7' && <Safety />}\n {process.env.NODE_ENV !== 'production' && <MiaodaInspector />}\n {process.env.NODE_ENV !== 'production' && <IframeBridge />}\n <Watermark />\n <QueryProvider>\n {children}\n </QueryProvider>\n </>\n );\n};\n\nexport default AppContainer;\n","/* eslint-disable */\n/**\n * Inject minimal __REACT_DEVTOOLS_GLOBAL_HOOK__ before React loads.\n * React checks for this hook during module initialization and registers its\n * renderer via hook.inject(). This gives us access to renderer.overrideProps()\n * for live component prop modification in the inspector.\n *\n * Must execute before React's module-level code runs.\n *\n * When react-refresh-runtime runs first (as an rspack runtime module),\n * it may create __REACT_DEVTOOLS_GLOBAL_HOOK__ with an inject() that\n * doesn't populate the renderers Map. We patch the existing hook to\n * ensure renderers are always tracked.\n */\n\nexport {};\n\ndeclare global {\n interface Window {\n __REACT_DEVTOOLS_GLOBAL_HOOK__?: any;\n }\n}\n\nif (typeof window !== 'undefined' && process.env.NODE_ENV !== 'production') {\n if (!window.__REACT_DEVTOOLS_GLOBAL_HOOK__) {\n // No hook yet — create a minimal one\n window.__REACT_DEVTOOLS_GLOBAL_HOOK__ = {\n renderers: new Map(),\n supportsFiber: true,\n inject(renderer: any) {\n const id = this.renderers.size + 1;\n this.renderers.set(id, renderer);\n return id;\n },\n onCommitFiberRoot() {},\n onCommitFiberUnmount() {},\n };\n } else {\n // Hook already exists (react-refresh, React DevTools extension, etc.)\n // Ensure renderers Map and inject() both work correctly.\n const hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n if (!(hook.renderers instanceof Map)) {\n hook.renderers = new Map();\n }\n\n const originalInject =\n typeof hook.inject === 'function' ? hook.inject.bind(hook) : null;\n\n hook.inject = function (renderer: any) {\n const id = originalInject\n ? originalInject(renderer)\n : hook.renderers.size + 1;\n if (id != null && !hook.renderers.has(id)) {\n hook.renderers.set(id, renderer);\n }\n return id;\n };\n }\n}\n","import axios, { type AxiosInstance } from 'axios';\nimport { getCsrfToken } from './getCsrfToken';\n\n/**\n * 精简版 Axios 配置\n * 仅注入 CSRF token 和基础拦截器,不包含 observable/slardar/trace\n */\nexport function initAxiosConfig(axiosInstance?: AxiosInstance): void {\n if (!axiosInstance) {\n axiosInstance = axios;\n }\n // 请求拦截器:注入 CSRF token\n axiosInstance.interceptors.request.use(\n (config) => {\n const csrfToken = getCsrfToken();\n if (csrfToken) {\n config.headers['X-Suda-Csrf-Token'] = csrfToken;\n }\n\n // 注入当前页面路由\n if (typeof window !== 'undefined') {\n config.headers['X-Page-Route'] = window.location.pathname;\n }\n\n return config;\n },\n (error) => Promise.reject(error),\n );\n\n // 响应拦截器:开发环境日志\n axiosInstance.interceptors.response.use(\n (response) => response,\n (error) => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[axios]', error.config?.method?.toUpperCase(), error.config?.url, error.message);\n }\n return Promise.reject(error);\n },\n );\n}\n","/**\n * 获取cookie中存放的suda-csrf-token值\n * @returns {string | null} - suda-csrf-token的值,如果不存在则返回null\n */\nexport function getCsrfToken() {\n const cookieName = 'suda-csrf-token';\n\n // 从document.cookie中获取所有cookie\n const cookies = document.cookie.split('; ');\n\n // 查找指定name的cookie\n for (const cookie of cookies) {\n const [name, value] = cookie.split('=');\n if (name === cookieName) {\n // 解码cookie值\n return decodeURIComponent(value);\n }\n }\n\n // 如果没有找到,则从window上获取(全栈模式下,window上会有这个值)\n return window.csrfToken ?? null;\n}\n","import { observable, AppEnv } from '@lark-apaas/observable-web';\nimport { isNewPathEnabled } from '../utils/apiPath';\n\n/**\n * 初始化 OpenTelemetry 可观测(traces / logs / metrics)。\n * 从老 client-toolkit 搬过来——逻辑保持一致:\n * - serviceName 固定 \"app\"\n * - dev / prod 区分 AppEnv\n * - collector URL 区分新旧 path 形态(/app/:appId vs /spark/app/:appId)\n *\n * 内部 try/catch 吞错——SDK 启动失败不应阻断应用渲染。\n */\nexport const initObservable = (): void => {\n try {\n const appId = (window as unknown as { appId: string }).appId;\n observable.start({\n serviceName: 'app',\n env: process.env.NODE_ENV === 'development' ? AppEnv.Dev : AppEnv.Prod,\n collectorUrl: isNewPathEnabled()\n ? {\n log: `/app/${appId}/__runtime__/api/v1/observability/logs/collect`,\n trace: `/app/${appId}/__runtime__/api/v1/observability/traces/collect`,\n metric: `/app/${appId}/__runtime__/api/v1/observability/metrics/collect`,\n time: `/app/${appId}/__runtime__/api/v1/observability/current_server_timestamp`,\n }\n : {\n log: `/spark/app/${appId}/runtime/api/v1/observability/logs/collect`,\n trace: `/spark/app/${appId}/runtime/api/v1/observability/traces/collect`,\n metric: `/spark/app/${appId}/runtime/api/v1/observability/metrics/collect`,\n time: `/spark/api/v1/observability/app/${appId}/current_server_timestamp`,\n },\n });\n } catch (error) {\n console.error('Failed to start WebObservableSdk:', error);\n }\n};\n","/**\n * 判断当前是否启用新的路径规范\n * 新路径规范:CLIENT_BASE_PATH 以 /app/:appId 格式开头\n */\nexport function isNewPathEnabled(): boolean {\n const basePath = process.env.CLIENT_BASE_PATH || '/';\n return /^\\/app\\/[^/]/.test(basePath);\n}\n","import { observable } from '@lark-apaas/observable-web';\nimport { interceptErrors as interceptLogs } from './intercept-global-error';\nimport { LogLevel, LogWithMeta } from './log-types';\nimport { processLogParams, mapLogLevel } from '../utils/safeStringify';\nimport { interceptors } from './selected-logs';\n\n/**\n * lite 版 logger:\n * - 跟老 toolkit 一样的语义(debug/info/warn/error/success + 通用 log())\n * - 生产环境通过 observable.log 上报到 OpenTelemetry\n * - dev 环境调 interceptErrors,监听全局 error/unhandledrejection、devServer 状态\n * - 末尾通过 interceptors 链路包一层 typedLogInterceptor:任何 logger 顶层方法调用\n * 都会同步 postMessage `SELECTED_LOG`(typedLogV2 格式)给妙搭外壳,level==='error'\n * 时妙搭 sandbox-console 把它计入 errorCount → 显示「一键修复」按钮\n */\n\nexport type LogInterceptor = (originLogger: typeof logger) => typeof logger;\n\nconst shouldReportToObservable = process.env.NODE_ENV === 'production';\n\ninterface LoggerConfig {\n /** 是否显示日志级别前缀 */\n showLevel?: boolean;\n /** 是否显示时间戳 */\n showTimestamp?: boolean;\n /** 日志级别 */\n level?: LogLevel;\n /** 配置前缀字符串 */\n prefix?: string;\n}\n\nconst ORDERED_LEVELS: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n\nconst defaultConfig: Required<LoggerConfig> = {\n showLevel: false,\n showTimestamp: false,\n level: 'info',\n prefix: '',\n};\n\nlet config: Required<LoggerConfig> = { ...defaultConfig };\n\nfunction configureLogger(options: LoggerConfig) {\n config = { ...defaultConfig, ...options };\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return ORDERED_LEVELS.indexOf(level) >= ORDERED_LEVELS.indexOf(config.level);\n}\n\nfunction getFormattedPrefix(level: LogLevel): string[] {\n const parts: string[] = [];\n if (config.prefix) {\n parts.push(`[${config.prefix}]`);\n }\n if (config.showLevel) {\n parts.push(`[${level.toUpperCase()}]`);\n }\n return parts;\n}\n\n// 默认配置 logger,import 即生效\nconfigureLogger({\n showLevel: true,\n showTimestamp: false,\n level: process.env.NODE_ENV === 'development' ? 'debug' : 'error',\n prefix: 'MiaoDa',\n});\n\nexport let logger = {\n debug(message: unknown, ...args: unknown[]) {\n if (shouldLog('debug')) {\n console.log(...getFormattedPrefix('debug'), message, ...args);\n }\n },\n info(message: unknown, ...args: unknown[]) {\n if (shouldLog('info')) {\n console.log(...getFormattedPrefix('info'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('INFO', processLogParams([message, ...args]).join(' '));\n }\n },\n warn(message: unknown, ...args: unknown[]) {\n if (shouldLog('warn')) {\n console.log(...getFormattedPrefix('warn'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('WARN', processLogParams([message, ...args]).join(' '));\n }\n },\n error(message: unknown, ...args: unknown[]) {\n if (shouldLog('error')) {\n console.error(...getFormattedPrefix('error'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('ERROR', processLogParams([message, ...args]).join(' '));\n }\n },\n success(message: unknown, ...args: unknown[]) {\n if (shouldLog('info')) {\n console.log(...getFormattedPrefix('success'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('INFO', processLogParams([message, ...args]).join(' '));\n }\n },\n log({ level, args }: LogWithMeta) {\n if (shouldLog(level)) {\n console.log(...getFormattedPrefix(level), ...args);\n }\n if (shouldReportToObservable && level !== 'debug') {\n observable.log(mapLogLevel(level), processLogParams(args).join(' '));\n }\n },\n};\n\nif (process.env.NODE_ENV !== 'production') {\n // 在 window 上挂内置 logger,用于收集 ErrorBoundary 之外的运行时报错\n (window as unknown as { __RUNTIME_LOGGER__?: unknown }).__RUNTIME_LOGGER__ = {\n get() {\n return logger;\n },\n };\n}\n\n// 应用 interceptors 链:包一层 typedLogInterceptor,让所有 logger 方法都发 SELECTED_LOG\nfor (const interceptor of interceptors) {\n logger = interceptor(logger);\n}\n\nif (process.env.NODE_ENV !== 'production') {\n interceptLogs();\n}\n","import { slardar } from '@lark-apaas/internal-slardar';\nimport { getHmrApi } from '../utils/hmr-api';\nimport { submitPostMessage } from '../utils/postMessage';\nimport { isLogLevel, LogLevel } from './log-types';\nimport { logger } from './logger';\n\n/**\n * lite 版 intercept-global-error:\n * - 拦截全局 error / unhandledrejection → logger.error 上报\n * - 监听 HMR 成功/失败 → postMessage 通知妙搭外壳 + Slardar 埋点\n * - 监听 console 输出里的 devServer 断连/重连关键词 → postMessage 通知外壳 + Slardar 埋点\n */\n\n/** 记录 devServer 断开时间 */\nlet devServerDisconnectInfo: { time: number } | null = null;\nlet retryCount = 0;\n\nfunction processDevServerLog(log: string) {\n if (!log) return;\n const devFlag = log.includes('[webpack-dev-server]') || log.includes('[vite]');\n // 检测断连\n if (devFlag && log.includes('Disconnected')) {\n const time = Date.now();\n devServerDisconnectInfo = { time };\n submitPostMessage({\n type: 'DevServerMessage',\n data: {\n type: 'devServer-status',\n status: 'disconnected',\n },\n });\n slardar.sendEvent({\n name: 'sandbox-devServer',\n metrics: { time },\n categories: {\n type: 'disconnected',\n },\n });\n return;\n }\n if (!devServerDisconnectInfo) {\n return;\n }\n // 检测重连尝试\n if (devFlag && log.includes('Trying to reconnect')) {\n if (retryCount) {\n // 已经重连过一次还没成功,记为 reconnect-failed\n slardar.sendEvent({\n name: 'sandbox-devServer',\n metrics: { retryCount: retryCount + 1 },\n categories: {\n type: 'reconnect-failed',\n },\n });\n }\n retryCount++;\n return;\n }\n // 检测重连成功\n const hmrFlag = log.includes('[HMR]');\n if (\n hmrFlag ||\n (devFlag &&\n (log.includes('Socket connected') ||\n log.includes('App updated') ||\n log.includes('App hot update') ||\n log.includes('connected')))\n ) {\n submitPostMessage({\n type: 'DevServerMessage',\n data: {\n type: 'devServer-status',\n status: 'connected',\n },\n });\n const startTime = devServerDisconnectInfo.time;\n const duration = Date.now() - startTime;\n slardar.sendEvent({\n name: 'sandbox-devServer',\n metrics: { startTime, duration },\n categories: {\n type: 'devServer-reconnected',\n },\n });\n devServerDisconnectInfo = null;\n retryCount = 0;\n }\n}\n\n/**\n * 监听模块热更:\n * - 热更应用成功 → postMessage 通知主应用更新完成\n * - 热更失败 → console.warn + Slardar 埋点\n */\nfunction listenModuleHmr() {\n const hmr = getHmrApi();\n if (hmr) {\n hmr.onSuccess(() => {\n submitPostMessage({\n type: 'DevServerMessage',\n data: {\n type: 'devServer-status',\n status: 'hmr-apply-success',\n },\n });\n });\n\n hmr.onError((error) => {\n console.warn('hmr apply failed', error);\n slardar.sendEvent({\n name: 'sandbox-devServer',\n categories: {\n type: 'hmr-apply-failed',\n error: String(error),\n },\n });\n });\n }\n}\n\nconst PROXY_CONSOLE_METHOD = ['log', 'info', 'warn', 'error'] as const;\n\n/** 当前只有开发态会执行此操作 */\nexport function interceptErrors() {\n window.addEventListener('error', (event) => {\n logger.error(event.error);\n });\n\n window.addEventListener('unhandledrejection', (event) => {\n logger.error(event.reason);\n });\n\n listenModuleHmr();\n\n PROXY_CONSOLE_METHOD.forEach((method) => {\n const originalMethod = window.console[method];\n window.console[method] = (...args: unknown[]) => {\n originalMethod(...args);\n const level: LogLevel = method === 'log' ? 'info' : (method as LogLevel);\n const first = args[0];\n // 检测 devServer 断连/重连\n if (typeof first === 'string') {\n processDevServerLog(first);\n }\n // 转发特定 prefix 日志给妙搭外壳(典型场景:dataloom 报错)\n if (\n typeof first === 'string' &&\n first.startsWith('[Dataloom]') &&\n isLogLevel(level)\n ) {\n logger.log({ level, args });\n submitPostMessage({\n type: 'Console',\n method,\n data: args as unknown as Record<string, unknown>,\n });\n }\n };\n });\n}\n","/**\n * 统一 HMR API\n *\n * 提供统一的 HMR 成功/失败回调接口,屏蔽 Webpack 和 Vite 的差异。\n *\n * - Webpack/Rspack: 通过 import.meta.webpackHot 或 module.hot\n * - Vite: 通过 error-overlay 注入的 window.__VITE_HMR__\n *\n * @see docs/RFC_HMR_API.md\n */\n\nexport interface HmrApi {\n /**\n * 注册 HMR 更新前回调(模块替换之前触发)\n * @param callback 回调函数\n * @returns cleanup 函数,用于取消注册\n */\n onBeforeApply?(callback: () => void): () => void;\n\n /**\n * 注册 HMR 成功回调\n * @param callback 成功回调函数\n * @returns cleanup 函数,用于取消注册\n */\n onSuccess(callback: () => void): () => void;\n\n /**\n * 注册 HMR 失败回调\n * @param callback 失败回调函数,参数为错误信息\n * @returns cleanup 函数,用于取消注册\n */\n onError(callback: (error: unknown) => void): () => void;\n}\n\ndeclare global {\n interface Window {\n __VITE_HMR__?: Required<HmrApi>;\n }\n}\n\ninterface WebpackHot {\n addStatusHandler(handler: (status: string) => void): void;\n removeStatusHandler(handler: (status: string) => void): void;\n}\n\n/**\n * 创建 Webpack/Rspack HMR 适配器\n */\nfunction createWebpackHmrApi(hot: WebpackHot): HmrApi {\n return {\n onSuccess(callback) {\n let lastStatus: string | null = null;\n const handler = (status: string) => {\n // apply -> idle 转换表示 HMR 成功\n if (status === 'idle' && lastStatus === 'apply') {\n try {\n callback();\n } catch (e) {\n console.error('[HMR] Success callback error:', e);\n }\n }\n lastStatus = status;\n };\n hot.addStatusHandler(handler);\n return () => hot.removeStatusHandler(handler);\n },\n\n onError(callback) {\n const handler = (status: string) => {\n // fail 或 abort 表示 HMR 失败\n if (status === 'fail' || status === 'abort') {\n try {\n callback(new Error(`HMR ${status}`));\n } catch (e) {\n console.error('[HMR] Error callback error:', e);\n }\n }\n };\n hot.addStatusHandler(handler);\n return () => hot.removeStatusHandler(handler);\n },\n };\n}\n\n/**\n * 获取 HMR API 实例\n *\n * 自动检测当前构建工具(Webpack/Vite)并返回对应实现:\n * - Webpack/Rspack: 使用内置适配器\n * - Vite: 使用 error-overlay 注入的 window.__VITE_HMR__\n *\n * @returns HmrApi 实例,如果不在开发环境或不支持 HMR 则返回 null\n */\nexport function getHmrApi(): HmrApi | null {\n if (process.env.NODE_ENV === 'production') return null;\n\n // Webpack/Rspack (import.meta.webpackHot)\n // @ts-ignore - Webpack HMR API\n if (import.meta.webpackHot) {\n // @ts-ignore\n return createWebpackHmrApi(import.meta.webpackHot);\n }\n\n // Legacy webpack (module.hot)\n // @ts-ignore\n if (typeof module !== 'undefined' && module.hot) {\n // @ts-ignore\n return createWebpackHmrApi(module.hot);\n }\n\n // Vite (通过 error-overlay 注入)\n if (window.__VITE_HMR__) {\n return window.__VITE_HMR__;\n }\n\n return null;\n}\n","import type { IncomingMessage, OutgoingMessage } from '../types/iframe-events';\n\nconst PARENT_ORIGIN_KEY = '__parentOrigin';\n\nfunction getParentOriginFromParams(): string | undefined {\n try {\n const params = new URLSearchParams(window.location.search);\n const origin = params.get(PARENT_ORIGIN_KEY);\n if (origin) {\n sessionStorage.setItem(PARENT_ORIGIN_KEY, origin);\n return origin;\n }\n } catch {\n // URL 解析失败时忽略\n }\n try {\n return sessionStorage.getItem(PARENT_ORIGIN_KEY) || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getLegacyParentOrigin(): string {\n const { origin } = window.location;\n if (origin.includes('force.feishuapp.net')) {\n return 'https://force.feishu.cn';\n }\n if (origin.includes('force-pre.feishuapp.net')) {\n return 'https://force.feishu-pre.cn';\n }\n if (origin.includes('force.byted.org')) {\n return 'https://force.feishu-boe.cn';\n }\n if (origin.includes('feishuapp.cn') || origin.includes('miaoda.feishuapp.net')) {\n return 'https://miaoda.feishu.cn';\n }\n if (origin.includes('fsapp.kundou.cn') || origin.includes('miaoda-pre.feishuapp.net')) {\n return 'https://miaoda.feishu-pre.cn';\n }\n return 'https://miaoda.feishu-boe.cn';\n}\n\nexport function resolveParentOrigin(): string {\n // 本地开发:父页面为 localhost / 127.0.0.1 时,使用 referrer 真实 origin 作为 targetOrigin\n try {\n if (document.referrer) {\n const referrerOrigin = new URL(document.referrer).origin;\n if (\n referrerOrigin.startsWith('http://localhost') ||\n referrerOrigin.startsWith('http://127.0.0.1')\n ) {\n return referrerOrigin;\n }\n }\n } catch {\n // referrer 为空或无效时忽略,走正常环境匹配逻辑\n }\n\n // 父页面运行时通过 URL 参数传入\n const paramOrigin = getParentOriginFromParams();\n if (paramOrigin) return paramOrigin;\n\n return process.env?.FORCE_FRAMEWORK_DOMAIN_MAIN ?? getLegacyParentOrigin();\n}\n\nexport function submitPostMessage<T extends OutgoingMessage>(\n message: T,\n targetOrigin?: string\n): void {\n try {\n const parentOrigin = resolveParentOrigin();\n const origin = targetOrigin ?? parentOrigin;\n if (!origin) return;\n window.parent.postMessage(message, origin);\n } catch (e) {\n console.error('postMessage error', e);\n }\n}\n\nexport function isOutgoingMessage<T extends OutgoingMessage['type']>(\n msg: OutgoingMessage,\n type: T\n): msg is Extract<OutgoingMessage, { type: T }> {\n return msg.type === type;\n}\n\nexport function isIncomingMessage<T extends IncomingMessage['type']>(\n msg: IncomingMessage,\n type: T\n): msg is Extract<IncomingMessage, { type: T }> {\n return msg.type === type;\n}\n","/**\n * Logger 类型定义。\n *\n * 跟老 toolkit 相比,lite 砍掉了 zod schema 校验,改成纯 TS 类型——\n * intercept-global-error 不再走 levelSchema.safeParse 那条分支,\n * 而是直接用 LOG_LEVELS 字面量数组 includes 判断。\n */\n\nexport const LOG_LEVELS = ['debug', 'info', 'warn', 'error', 'success'] as const;\nexport type LogLevel = (typeof LOG_LEVELS)[number];\n\nexport function isLogLevel(value: unknown): value is LogLevel {\n return typeof value === 'string' && (LOG_LEVELS as readonly string[]).includes(value);\n}\n\nexport interface LogStackFrame {\n functionName: string;\n fileName: string;\n lineNumber: number;\n columnNumber: number;\n}\n\nexport interface LogMeta {\n stacktrace?: LogStackFrame[];\n logTraceID?: string;\n skipFrame?: number;\n noStacktrace?: boolean;\n repairMessage?: string;\n /** 预留字段,用于分类日志 */\n type?: string;\n /** 日志去重相关字段 */\n isDuplicate?: boolean;\n duplicateCount?: number;\n duplicateOfId?: string;\n}\n\nexport interface LogWithMeta {\n level: LogLevel;\n args: unknown[];\n meta?: LogMeta;\n}\n\nexport interface SelectedLog {\n type: 'typedLogV2';\n level: LogLevel;\n id: string;\n args: unknown[];\n meta: LogMeta;\n}\n","import type { LogLevel } from '../logger/log-types';\n\n// 安全的 JSON.stringify 实现\nexport function safeStringify(obj: unknown): string {\n const seen = new Set<object>();\n\n try {\n return JSON.stringify(obj, (_key, value) => {\n // 处理循环引用\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) {\n return '[Circular]';\n }\n seen.add(value);\n }\n\n // 处理 BigInt\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n // 处理 Date\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n // 处理 Map\n if (value instanceof Map) {\n return Object.fromEntries(value);\n }\n\n // 处理 Set\n if (value instanceof Set) {\n return Array.from(value);\n }\n\n // 处理 Error(safeStringify 默认会丢失 name/message/stack)\n if (value instanceof Error) {\n return {\n name: value.name,\n message: value.message,\n stack: value.stack,\n };\n }\n\n // 处理 undefined\n if (typeof value === 'undefined') {\n return 'undefined';\n }\n\n // 处理 Symbol\n if (typeof value === 'symbol') {\n return value.toString();\n }\n\n return value;\n });\n } catch {\n return '';\n } finally {\n seen.clear();\n }\n}\n\n/** 把任意 log 参数(可能含 Error/对象/循环引用)转成可序列化的字符串数组 */\nexport function processLogParams(args: unknown[]): string[] {\n return args.map((arg) => {\n if (typeof arg === 'string') return arg;\n if (arg instanceof Error) {\n return `${arg.name}: ${arg.message}\\n${arg.stack ?? ''}`;\n }\n if (typeof arg === 'object' && arg !== null) {\n return safeStringify(arg);\n }\n return String(arg);\n });\n}\n\n/** logger.log({ level }) → observable.log 的等级字符串 */\nexport function mapLogLevel(level: LogLevel): 'INFO' | 'WARN' | 'ERROR' {\n if (level === 'warn') return 'WARN';\n if (level === 'error') return 'ERROR';\n return 'INFO';\n}\n","/**\n * Selected logs interceptor 链。\n *\n * 跟老 toolkit 对齐:把 logger 顶层 6 个方法(debug/info/warn/error/success/log)\n * 都包一层 typedLogInterceptor,每次调用同步发 `SELECTED_LOG` postMessage 给妙搭外壳。\n * 妙搭 sandbox-console 监听 SELECTED_LOG,把 level==='error' 的计入 errorCount,\n * 进而显示\"一键修复\"按钮。\n *\n * 与老 toolkit 的差异:\n * - 砍掉了 webpack 模式专用的 parseSourceMap / source-map WASM / SourceMapConsumer 链路\n * (老 toolkit 里 parseSourceMap 是 dead code 无人调用;lite 跑在 vite 上也不需要)\n * - 保留 stacktrace-js:StackTrace.fromError 把 Error.stack 字符串解析成结构化 frames;\n * vite dev 模式下 stack 已经是源码路径,结构化后 sandbox-console 显示更友好\n */\n\nimport StackTrace from 'stacktrace-js';\nimport { batchLogInfo } from './batch-logger';\nimport { submitPostMessage } from '../utils/postMessage';\nimport {\n LogMeta,\n LogStackFrame,\n LogWithMeta,\n SelectedLog,\n} from './log-types';\nimport type { LogInterceptor } from './logger';\n\n/**\n * 把 stacktrace-js 的 StackFrame[] 转成本仓 LogStackFrame schema 格式。\n */\nfunction mapStacktrace(stacktrace: StackTrace.StackFrame[]): LogStackFrame[] {\n return stacktrace.map((frame) => ({\n functionName: frame.functionName || '',\n fileName: frame.fileName || '',\n lineNumber: frame.lineNumber || 0,\n columnNumber: frame.columnNumber || 0,\n }));\n}\n\n/**\n * stacktrace 解析失败时上报给外壳,外壳可用于诊断 sourcemap 加载/解析问题。\n */\nfunction reportStacktraceParseError(e: unknown, context: string): void {\n if (window.parent === window) return;\n try {\n submitPostMessage({\n type: 'STACKTRACE_PARSE_ERROR',\n payload: {\n error: e instanceof Error ? e.message : String(e),\n context,\n },\n });\n } catch {\n // ignore\n }\n}\n\n/**\n * 拿当前调用栈(filter 由调用方处理)。\n * 主 toolkit 在 sendSelectedLog 末尾若 meta.stacktrace 缺失会调一次。\n */\nexport async function getStacktrace(): Promise<LogStackFrame[]> {\n const stacktrace = await StackTrace.get();\n return mapStacktrace(stacktrace);\n}\n\n/**\n * 序列化 Error 实例为 {message, stack, name}。\n * Error 默认属性不可枚举,直接 JSON.stringify 会输出 `{}` 丢信息。\n */\nfunction errorReplacer(_key: string, value: unknown) {\n if (value instanceof Error) {\n return {\n message: value.message,\n stack: value.stack,\n name: value.name,\n };\n }\n return value;\n}\n\nfunction generateLogId(): string {\n try {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n } catch {\n // ignore — fall through to fallback\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/** 保存上一次的日志内容用于去重 */\nlet lastLogInfo: { content: string; id: string; count: number } | null = null;\n\n/**\n * 发送一条 SelectedLog 到妙搭外壳。\n *\n * 包含:\n * - args 里的 Error 实例展开为 [message, errorObj](与老 toolkit 一致)\n * - meta.skipFrame 默认 2(让外壳跳过 logger 自己的栈帧)\n * - 与上一条内容完全一样时设 meta.isDuplicate / duplicateCount / duplicateOfId\n * - 同时走 batchLogInfo 批量通道 + window.parent.postMessage SELECTED_LOG\n */\nasync function sendSelectedLog(logWithoutID: Omit<SelectedLog, 'id'>) {\n try {\n const log: SelectedLog = {\n ...logWithoutID,\n id: generateLogId(),\n };\n\n const newParts: unknown[] = [];\n for (let i = 0; i < log.args.length; i++) {\n const item = log.args[i];\n if (item instanceof Error) {\n const newError = {\n message: item.message,\n stack: item.stack,\n name: item.name,\n };\n // 首个 Error 优先用其 stack 反查到结构化 frames,覆盖 meta.stacktrace\n if (!log.meta.stacktrace) {\n try {\n const stacktrace = await StackTrace.fromError(item);\n log.meta.stacktrace = mapStacktrace(stacktrace);\n } catch (e) {\n reportStacktraceParseError(e, 'StackTrace.fromError');\n }\n }\n newParts.push(newError.message, newError);\n } else {\n newParts.push(item);\n }\n }\n log.args = newParts;\n\n // 兜底:args 里没有 Error 时拿当前调用栈\n if (!log.meta.stacktrace) {\n try {\n const frames = await getStacktrace();\n // 过滤本 logger 内部的栈帧(避免噪音)\n const firstFrameIndex = frames.findIndex(\n (frame) => !frame.fileName.includes('client-toolkit-lite/dist/logger'),\n );\n log.meta.stacktrace = firstFrameIndex === -1 ? [] : frames.slice(firstFrameIndex);\n } catch (e) {\n reportStacktraceParseError(e, 'getStacktrace');\n }\n }\n\n if (log.meta.skipFrame === undefined) {\n log.meta.skipFrame = 2;\n }\n\n const logJSON = JSON.stringify(log, errorReplacer);\n\n // 去重:以去掉 id 的版本做比较\n const logForDedup = { ...log };\n delete (logForDedup as Partial<SelectedLog>).id;\n const logContentForDedup = JSON.stringify(logForDedup, errorReplacer);\n\n if (lastLogInfo && lastLogInfo.content === logContentForDedup) {\n lastLogInfo.count++;\n log.meta.isDuplicate = true;\n log.meta.duplicateCount = lastLogInfo.count;\n log.meta.duplicateOfId = lastLogInfo.id;\n const updatedJSON = JSON.stringify(log, errorReplacer);\n try {\n batchLogInfo('info', updatedJSON);\n } catch {\n // ignore\n }\n if (window.parent !== window) {\n try {\n submitPostMessage({ type: 'SELECTED_LOG', payload: updatedJSON });\n } catch {\n // ignore\n }\n }\n return;\n }\n\n lastLogInfo = {\n content: logContentForDedup,\n id: log.id,\n count: 1,\n };\n\n try {\n batchLogInfo('info', logJSON);\n } catch {\n // ignore\n }\n if (window.parent !== window) {\n try {\n submitPostMessage({ type: 'SELECTED_LOG', payload: logJSON });\n } catch {\n // ignore\n }\n }\n } catch {\n // sendSelectedLog 失败不应影响业务\n }\n}\n\nfunction sendTypedLogV2(logWithMeta: LogWithMeta) {\n // sendSelectedLog 是 async(stacktrace 解析需要异步),但调用方不关心结果,\n // 用 void 忽略 Promise,避免 unhandled rejection 噪音\n void sendSelectedLog({\n type: 'typedLogV2',\n level: logWithMeta.level,\n args: logWithMeta.args,\n meta: logWithMeta.meta ?? {},\n });\n}\n\n/**\n * 拦截 logger 的 6 个方法(debug/info/warn/error/success/log),\n * 在调用原方法的同时同步 sendTypedLogV2 到妙搭外壳。\n */\nconst typedLogInterceptor: LogInterceptor = (originLogger) => ({\n debug: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.debug(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'info', args: [message, ...args], meta: {} });\n },\n info: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.info(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'info', args: [message, ...args], meta: {} });\n },\n warn: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.warn(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'warn', args: [message, ...args], meta: {} });\n },\n error: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.error(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'error', args: [message, ...args], meta: {} });\n },\n success: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.success(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'success', args: [message, ...args], meta: {} });\n },\n log: ({ level, args, meta }: LogWithMeta) => {\n try {\n originLogger.log({ level, args, meta });\n } catch {\n // ignore\n }\n sendTypedLogV2({ level, args, meta: meta ?? ({} as LogMeta) });\n },\n});\n\nexport const interceptors: LogInterceptor[] = [typedLogInterceptor];\n","interface CollectLogRequest {\n level: string;\n message: string;\n time: string; // ISO String\n source?: string; // Log Source string\n user_id: string; // User ID\n tenant_id: string; // Tenant ID\n app_id: string; // App ID\n}\n\ninterface LogEntry {\n id: string;\n level: string;\n message: string;\n source?: string;\n timestamp: number;\n}\n\ninterface BatchLoggerConfig {\n /** 用户ID */\n userId: string;\n /** 租户ID */\n tenantId: string;\n /** 应用ID */\n appId: string;\n /** 后端接收日志的接口地址,默认为/dev/logs/collect */\n endpoint?: string;\n /** 达到此数量时触发刷新 */\n sizeThreshold?: number;\n /** 自动刷新的时间间隔(毫秒) */\n flushInterval?: number;\n /** 最大重试次数 */\n maxRetries?: number;\n /** 重试延迟(毫秒) */\n retryDelay?: number;\n /** 自定义请求头 */\n headers?: Record<string, string>;\n}\n\nexport class BatchLogger {\n private config: Required<BatchLoggerConfig>;\n private logQueue: LogEntry[] = [];\n private flushTimer: NodeJS.Timeout | null = null;\n private isProcessing = false;\n\n private originConsole: Console;\n\n constructor(console: Console, config?: BatchLoggerConfig) {\n this.originConsole = { ...console };\n const {\n userId = '',\n tenantId = '',\n appId = '',\n } = (window || {}) as {\n userId?: string;\n tenantId?: string;\n appId?: string;\n };\n this.config = {\n userId,\n tenantId,\n appId,\n // 需要加请求路径前缀\n endpoint: (process.env.CLIENT_BASE_PATH || '') + '/dev/logs/collect-batch',\n sizeThreshold: 20,\n flushInterval: 1000,\n maxRetries: 3,\n retryDelay: 500,\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(config || {}),\n };\n\n this.startFlushTimer();\n this.setupBeforeUnloadHandler();\n }\n\n /**\n * 批量记录日志(对外暴露的唯一方法)\n */\n batchLog(level: string, message: string, source?: string): void {\n const logEntry: LogEntry = {\n id: this.generateId(),\n level,\n message,\n source,\n timestamp: Date.now(),\n };\n\n // 直接添加日志,不进行合并\n this.logQueue.push(logEntry);\n\n // 如果队列达到批处理阈值,立即刷新\n if (this.logQueue.length >= this.config.sizeThreshold) {\n this.flush();\n }\n }\n\n\n\n /**\n * 刷新日志队列,全部发送\n */\n async flush(): Promise<void> {\n if (this.isProcessing || this.logQueue.length === 0) {\n return;\n }\n\n this.isProcessing = true;\n const logsToSend = this.logQueue.splice(0, this.logQueue.length);\n\n try {\n await this.sendBatch(logsToSend);\n } catch (error) {\n // 发送失败时,将日志重新加入队列\n this.logQueue.unshift(...logsToSend);\n } finally {\n this.isProcessing = false;\n }\n }\n\n /**\n * 发送日志批次到后端\n */\n private async sendBatch(logs: LogEntry[]): Promise<void> {\n // 将LogEntry转换为CollectLogRequest格式\n const collectLogs: CollectLogRequest[] = logs.map(log => ({\n level: log.level,\n message: log.message,\n time: new Date(log.timestamp).toISOString(),\n source: log.source,\n user_id: this.config.userId,\n tenant_id: this.config.tenantId,\n app_id: this.config.appId,\n }));\n\n let retries = 0;\n\n while (retries <= this.config.maxRetries) {\n try {\n await this.execFetch(this.config.endpoint, {\n method: 'POST',\n headers: this.config.headers,\n body: JSON.stringify(collectLogs),\n });\n return;\n } catch (error) {\n retries++;\n\n if (retries > this.config.maxRetries) {\n this.originConsole.error(\n `Failed to send logs (attempt ${retries}), retrying in ${this.config.retryDelay}ms...`,\n );\n } else {\n this.originConsole.warn(\n `Failed to send logs (attempt ${retries}), retrying in ${this.config.retryDelay}ms...`,\n );\n }\n\n await this.delay(this.config.retryDelay * retries); // 指数退避\n }\n }\n }\n\n /**\n * 执行实际的fetch请求\n */\n private async execFetch(\n url: string,\n options: RequestInit,\n ): Promise<Response> {\n return fetch(url, options);\n }\n\n /**\n * 启动自动刷新定时器\n */\n private startFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = setInterval(() => {\n if (this.logQueue.length > 0) {\n this.flush();\n }\n }, this.config.flushInterval);\n }\n\n /**\n * 设置页面卸载时的处理\n */\n private setupBeforeUnloadHandler(): void {\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', () => {\n this.flush().finally(() => {\n this.destroy();\n });\n });\n }\n }\n\n /**\n * 延迟函数\n */\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n /**\n * 生成唯一ID\n */\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * 销毁资源\n */\n async destroy(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n // 发送剩余的日志\n if (this.logQueue.length > 0) {\n await this.flush();\n }\n }\n\n /**\n * 获取队列大小\n */\n getQueueSize(): number {\n return this.logQueue.length;\n }\n\n /**\n * 更新配置\n */\n updateConfig(newConfig: Partial<BatchLoggerConfig>): void {\n this.config = { ...this.config, ...newConfig };\n\n // 重新启动定时器\n this.startFlushTimer();\n }\n}\n\nlet defaultBatchLogger: BatchLogger | null = null;\n\nexport function getBatchLogger() {\n return defaultBatchLogger;\n}\n\nexport function initBatchLogger(\n oldConsole: Console,\n config?: BatchLoggerConfig,\n): void {\n defaultBatchLogger = new BatchLogger(oldConsole, config);\n}\n\n/** 记录日志进行批量同步 */\nexport function batchLogInfo(\n level: string,\n message: string,\n source?: string,\n): void {\n if (!defaultBatchLogger) {\n return;\n }\n defaultBatchLogger.batchLog(level, message, source);\n}\n\nexport function destroyBatchLogger(): void {\n if (defaultBatchLogger) {\n defaultBatchLogger.destroy();\n defaultBatchLogger = null;\n }\n}\n\n/**\n * 是否启用批量上报。三条件全部满足才开:\n * 1. 非生产构建(dev / 沙箱 dev server);\n * 2. 浏览器环境;\n * 3. 沙箱注入了 MIAODA_APP_TYPE(妙搭应用场景)—— 未注入的普通应用不上报。\n *\n * `process.env.*` 在 lite 的 dist 里保留字面量(tsup 不替换),由下游 app 用\n * coding-preset-vite-react 编译期 define 替换;未注入 MIAODA_APP_TYPE 时被 define 成字面\n * undefined,故 `!!` 即可——不关心具体 app type,有值即开、无值即关。与 capabilityClient /\n * Safety 的「编译期 define → 顶层读 env」同款。\n *\n * 抽成纯函数是为了能单测覆盖各分支:模块顶层副作用无法在不违反「禁 vi.resetModules + 动态\n * import 重载」规范的前提下直接测。\n */\nexport function shouldEnableBatchLogger(): boolean {\n return (\n process.env.NODE_ENV !== 'production' &&\n typeof window !== 'undefined' &&\n !!process.env.MIAODA_APP_TYPE\n );\n}\n\n// 模块加载时自动初始化\nif (shouldEnableBatchLogger()) {\n defaultBatchLogger = new BatchLogger(console);\n}","/**\n * Iframe Bridge Runtime(lite)\n *\n * 开发环境下连接妙搭外壳(父页面),建立 penpal 双向通信。\n * 跟 toolkit 版本一致,只是 childApi 是 lite 的 slim 版(去掉 apiProxy/getSourceMap)。\n */\n\nimport { connectToParent } from 'penpal';\n\nimport { resolveParentOrigin, submitPostMessage } from '../utils/postMessage';\nimport { batchLogInfo } from '../logger/batch-logger';\nimport { ParentApi } from '../types/iframe-events';\nimport { childApi } from '../components/AppContainer/utils/childApi';\n\nasync function connectParent(): Promise<void> {\n submitPostMessage({ type: 'PreviewReady', data: {} });\n batchLogInfo(\n 'info',\n JSON.stringify({\n type: 'PreviewReady',\n timestamp: Date.now(),\n url: window.location.href,\n })\n );\n\n const parentOrigin = resolveParentOrigin();\n if (!parentOrigin) return;\n\n const connection = connectToParent<ParentApi>({\n parentOrigin,\n methods: {\n ...childApi,\n },\n });\n\n await connection.promise;\n}\n\n/**\n * 初始化 iframe bridge(仅 dev + 仅 iframe 嵌入场景)\n */\nexport function initIframeBridge(): void {\n if (window.parent === window) return;\n connectParent();\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * @internal\n * 处理 className 与 tailwind-merge\n */\nexport function clsxWithTw(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * @internal\n * 当前是否是预览态\n */\nexport function isPreview() {\n return window.IS_MIAODA_PREVIEW;\n}\n\n/**\n * @internal\n * 标准化基础路径,确保路径格式一致\n * 移除末尾的斜杠,确保路径不以斜杠结尾\n */\nexport function normalizeBasePath(basePath?: string): string {\n if (!basePath || basePath === '/') {\n return '';\n }\n // 移除末尾的斜杠\n return basePath.replace(/\\/+$/, '');\n}\n\n// 获取 ws 路径\nexport function getWsPath(): string {\n const rawBasePath = process.env.CLIENT_BASE_PATH || '/';\n const normalizedBasePath = rawBasePath.startsWith('/')\n ? rawBasePath\n : `/${rawBasePath}`;\n const basePathWithoutTrailingSlash = normalizedBasePath.endsWith('/')\n ? normalizedBasePath.slice(0, -1)\n : normalizedBasePath;\n\n return `${basePathWithoutTrailingSlash}/ws`;\n}\n\n/** 判断是否是沙箱模式 */\nexport function isSparkRuntime() {\n // 兼容全栈模式标记(通过构建方式注入)\n return window._IS_Spark_RUNTIME ?? process.env.runtimeMode === 'fullstack';\n}","import { normalizeBasePath } from '../../../utils/utils';\nimport { ChildApi } from '../../../types/iframe-events';\nimport { AppInfoPayload } from '../../../types/common';\n\n/**\n * Slim 版 childApi(jsPage):\n * - 砍掉 toolkit 的 apiProxy(jsPage 纯前端无 server,不需要 API 代理)\n * - 砍掉 getSourceMap(Vite dev 直接是源码路径;prod 用浏览器原生 sourcemap)\n * - 保留 getRoutes + updateAppInfo\n */\nasync function getRoutes() {\n let routes: Array<{ path: string }> = [{ path: '/' }];\n try {\n const basePath = normalizeBasePath(process.env.CLIENT_BASE_PATH);\n const res = await fetch(`${basePath}/routes.json`);\n routes = await res.json();\n } catch (error) {\n console.warn('get routes.json error', error);\n }\n return routes;\n}\n\nexport const childApi: ChildApi = {\n getRoutes,\n updateAppInfo: (appInfo: AppInfoPayload) => {\n dispatchEvent(new CustomEvent('MiaoDaMetaInfoChanged', { detail: appInfo }));\n },\n};\n","/**\n * Client Toolkit Lite Runtime\n *\n * 精简版全局初始化逻辑,可通过构建工具自动注入或 AppContainer 导入触发\n *\n * 执行顺序:\n * 1. React DevTools Hook(必须在 React 加载之前)\n * 2. Axios 配置(仅 CSRF token 注入)\n * 3. 可观测初始化(OpenTelemetry traces/logs/metrics)\n * 4. Logger 模块 side-effect(dev 下注册 interceptErrors)\n * 5. Iframe Bridge(仅 dev + iframe 嵌入)\n *\n * 不包含 server-log SSE:jsPage 是纯前端,没有\"业务后端日志\"概念。\n */\n\n// 0. React DevTools Hook(必须在 React 加载之前执行)\nimport './react-devtools-hook';\n\n// 1. Axios 配置(精简版:仅 CSRF + 基础拦截器)\nimport { initAxiosConfig } from '../utils/axiosConfig';\n\n// 2. 可观测初始化(对齐 toolkit:runtime 加载即启动,不依赖 AppContainer 挂载)\nimport { initObservable } from './observable';\n\n// 3. 触发 logger 模块的 side-effect(dev 下注册 interceptErrors)\nimport '../logger';\n\n// 4. dev-only:iframe penpal bridge\nimport { initIframeBridge } from './iframe-bridge';\n\n// ============================================\n// 防重复初始化标志位\n// ============================================\n\ndeclare global {\n interface Window {\n __FULLSTACK_RUNTIME_INITIALIZED__?: boolean;\n }\n}\n\nif (!window.__FULLSTACK_RUNTIME_INITIALIZED__) {\n window.__FULLSTACK_RUNTIME_INITIALIZED__ = true;\n\n initAxiosConfig();\n // 内部 try/catch,SDK 启动失败不阻断渲染\n initObservable();\n\n if (process.env.NODE_ENV !== 'production') {\n initIframeBridge();\n }\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { getAppId } from '../../utils/getAppId';\nimport { getEnv } from '../../utils/getEnv';\nimport { getInitialInfo } from '../../utils/getInitialInfo';\nimport { getTenantInfo } from '../../utils/getTenantInfo';\nimport { useIsMobile } from '../../hooks';\nimport { t } from '../../locales';\n\n// ── defensive reset (prevents host page CSS from leaking in) ────\n\nconst resetBase: React.CSSProperties = {\n boxSizing: 'border-box',\n margin: 0,\n padding: 0,\n border: 'none',\n background: 'none',\n font: 'inherit',\n color: 'inherit',\n textAlign: 'left',\n textDecoration: 'none',\n textTransform: 'none',\n letterSpacing: 'normal',\n wordSpacing: 'normal',\n lineHeight: 'normal',\n verticalAlign: 'baseline',\n listStyle: 'none',\n};\n\n// ── inline style constants ──────────────────────────────────────\n\nconst FONT_FAMILY = \"'PingFang SC', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\";\nconst Z_BADGE = 10000000;\nconst Z_OVERLAY = 10000001;\n\nconst LOGO_URL = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodalogo.svg';\n// Cover URLs 通过 locale 机制获取,支持中英文不同封面\nconst getCoverUrl = () => t('safety.cover.pc');\nconst getCoverMobileUrl = () => t('safety.cover.mobile');\nconst ICON_COMPANY_URL = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/icon/icon_company_outlined.svg';\nconst ICON_AI_URL = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/icon/icon_efficiency-ai_outlined.svg';\nconst ICON_FEEDBACK_URL = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/miaoda-ui/icon_feedback_outlined.png';\nconst LANDING_URL = 'https://miaoda.feishu.cn/landing';\n\n// 「投诉与举报」跳转:飞书风控举报中心(tns),链接口径与豆包水印完全一致。\n// 环境用 getEnv()(读 globalThis.ENVIRONMENT,由服务端 view-context 注入,并带域名兜底)——\n// 普通妙搭应用不走 coding preset,process.env.FORCE_FRAMEWORK_ENVIRONMENT 不会被注入,\n// 不能像豆包水印那样用它;getEnv() 才是普通应用稳定的环境来源。\nconst REPORT_DOMAIN: Record<ReturnType<typeof getEnv>, string> = {\n BOE: 'tns.feishu-boe.cn',\n PRE: 'tns.feishu-pre.cn',\n ONLINE: 'tns.feishu.cn',\n};\n\n/** 打开「投诉与举报」页:scene/entity_type 固定,entity_id 取当前妙搭 appId,域名按环境选。 */\nexport const openReport = (): void => {\n const params = JSON.stringify({\n scene: 'miaoda_app_report',\n entity_id: getAppId() ?? '',\n entity_type: 'miaoda_app',\n extra: '',\n });\n const url = `https://${REPORT_DOMAIN[getEnv()]}/cust/lark_report/?type=common¶ms=${encodeURIComponent(\n params,\n )}&lang=zh-CN`;\n window.open(url, '_blank', 'noopener,noreferrer');\n};\n\nconst badgeBase: React.CSSProperties = {\n ...resetBase,\n position: 'fixed',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n border: '1px solid rgba(255,255,255,0.1)',\n padding: '6px 10px',\n background: '#1f2329',\n boxShadow: '0 6px 12px 0 rgba(65,68,74,0.04), 0 8px 24px 8px rgba(65,68,74,0.04)',\n borderRadius: 6,\n fontFamily: FONT_FAMILY,\n fontSize: 12,\n lineHeight: '20px',\n zIndex: Z_BADGE,\n cursor: 'pointer',\n};\n\nconst badgeDesktop: React.CSSProperties = { ...badgeBase, right: 12, bottom: 12 };\nconst badgeMobile: React.CSSProperties = { ...badgeBase, right: 12, bottom: 80 };\n\nconst logoStyle: React.CSSProperties = { flexShrink: 0, width: 16, height: 16 };\n\nconst badgeTextStyle: React.CSSProperties = {\n flexShrink: 0,\n margin: 0,\n color: '#EBEBEB',\n};\n\n// ── desktop popover styles ──────────────────────────────────────\n\nconst popoverContent: React.CSSProperties = {\n ...resetBase,\n overflow: 'hidden',\n borderRadius: 12,\n width: 286,\n boxShadow: '0 6px 12px 0 rgba(65,68,74,0.04), 0 8px 24px 0 rgba(65,68,74,0.04)',\n zIndex: Z_OVERLAY,\n};\n\nconst popoverInner: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n background: '#1A1A1A',\n};\n\nconst popoverCover: React.CSSProperties = { width: 286, height: 128, cursor: 'pointer', display: 'block' };\n\nconst popoverBody: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'flex-end',\n gap: 12,\n border: '1px solid rgba(255,255,255,0.05)',\n padding: '11px 15px 15px 14px',\n borderRadius: '12px 12px 0 0',\n fontFamily: FONT_FAMILY,\n fontSize: 12,\n lineHeight: '20px',\n color: '#a6a6a6',\n background: '#1f2021',\n};\n\nconst infoRow: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n alignSelf: 'stretch',\n};\n\nconst infoIcon: React.CSSProperties = { flexShrink: 0, width: 12, height: 12 };\nconst infoIconMobile: React.CSSProperties = { flexShrink: 0, width: 14, height: 14 };\n\nconst infoText: React.CSSProperties = { margin: 0, color: '#a6a6a6', flexShrink: 0 };\n\nconst btnRow: React.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 8,\n width: '100%',\n alignSelf: 'stretch',\n};\n\nconst btnBase: React.CSSProperties = {\n ...resetBase,\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: 34,\n borderRadius: 8,\n borderWidth: '0.5px',\n borderStyle: 'solid',\n borderColor: 'rgba(255,255,255,0.11)',\n background: 'rgba(255,255,255,0.03)',\n color: '#ebebeb',\n cursor: 'pointer',\n fontSize: 12,\n fontFamily: FONT_FAMILY,\n transition: 'background 0.15s ease, border-color 0.15s ease',\n};\n\nconst btnHovered: React.CSSProperties = {\n background: 'rgba(255,255,255,0.08)',\n borderColor: 'rgba(255,255,255,0.2)',\n};\n\n// ── mobile sheet styles ─────────────────────────────────────────\n\nconst overlayStyle: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n zIndex: Z_OVERLAY,\n background: 'rgba(0,0,0,0.5)',\n};\n\nconst sheetContent: React.CSSProperties = {\n position: 'fixed',\n inset: 'auto 0 0 0',\n zIndex: Z_OVERLAY + 1,\n outline: 'none',\n};\n\nconst sheetInner: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n background: '#fff',\n overflow: 'hidden',\n borderRadius: '16px 16px 0 0',\n position: 'relative',\n};\n\nconst sheetCloseBtn: React.CSSProperties = {\n position: 'absolute',\n top: 8,\n left: 16,\n width: 24,\n height: 24,\n color: '#2B2F36',\n cursor: 'pointer',\n background: 'none',\n border: 'none',\n padding: 0,\n};\n\nconst sheetCover: React.CSSProperties = { width: '100%', display: 'block', cursor: 'pointer' };\n\nconst sheetBody: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n justifyContent: 'center',\n alignItems: 'flex-end',\n gap: 16,\n padding: '16px 20px 48px',\n fontFamily: FONT_FAMILY,\n fontSize: 12,\n lineHeight: '20px',\n color: '#a6a6a6',\n};\n\nconst sheetInfoText: React.CSSProperties = { margin: 0, color: '#646A73', fontSize: 14, flexShrink: 0 };\n\nconst mobileBtnRow: React.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 16,\n alignSelf: 'stretch',\n};\n\nconst mobileBtnBase: React.CSSProperties = {\n ...resetBase,\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 99,\n fontSize: 18,\n fontFamily: FONT_FAMILY,\n padding: '12px 0',\n cursor: 'pointer',\n};\n\nconst mobileBtnOutline: React.CSSProperties = {\n ...mobileBtnBase,\n border: '0.5px solid #D0D3D6',\n background: '#fff',\n color: '#1F2329',\n};\n\nconst mobileBtnFilled: React.CSSProperties = {\n ...mobileBtnBase,\n border: '0.5px solid #000',\n background: '#000',\n color: '#fff',\n};\n\n// ── HoverButton helper ──────────────────────────────────────────\n\nconst HoverButton: React.FC<{\n style: React.CSSProperties;\n onClick: (e: React.MouseEvent) => void;\n children: React.ReactNode;\n 'data-custom-element'?: string;\n}> = ({ style, onClick, children, ...rest }) => {\n const [hovered, setHovered] = useState(false);\n return (\n <div\n style={{\n ...style,\n ...(hovered ? btnHovered : {}),\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onClick={onClick}\n {...rest}\n >\n {children}\n </div>\n );\n};\n\n// ── X icon (inline SVG, replaces lucide-react dependency) ───────\n\nconst XIcon: React.FC<{ style?: React.CSSProperties; onClick?: () => void }> = ({ style, onClick }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={style}\n onClick={onClick}\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n);\n\n// ── main component ──────────────────────────────────────────────\n\nconst Safety = () => {\n const HasClosedKey = `miaoda-creatByMiaodo-has-closed-${getAppId()}`;\n const [visible, setVisible] = useState(\n !window.localStorage?.getItem(HasClosedKey),\n );\n const [open, setOpen] = useState(false);\n const isMobile = useIsMobile();\n const [userinfo, setUserinfo] = useState<{ id?: number; name?: string } | null>(null);\n const [isInternetVisible, setIsInternetVisible] = useState(false);\n const [showBadge, setShowBadge] = useState(true);\n const [badgeLoaded, setBadgeLoaded] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n // 非 production 不渲染徽标,直接不发接口。\n // 注意 gate 必须在 effect 内部:render 期的 early-return 在 hooks 之后执行,\n // 拦不住已经发出的请求。(AppType=7 这道 gate 在 AppContainer 上层,Safety 压根不挂载)\n if (process.env.NODE_ENV !== 'production') return;\n\n // 复用带缓存去重的 util:tenant_info / get_published 整个会话各只发一次,\n // 不受 StrictMode 双跑或组件重复挂载影响(get_published 与 getAppInfo/getDataloom 共享)。\n getTenantInfo()\n .then(data => {\n setUserinfo(data?.tenant_info ?? null);\n setIsInternetVisible(!!data?.is_internet_visible);\n })\n .catch(() => {});\n\n getInitialInfo()\n .then(info => {\n const badge = info?.app_info?.show_badge;\n setShowBadge(badge !== false);\n })\n .catch(() => {\n setShowBadge(true);\n })\n .finally(() => {\n setBadgeLoaded(true);\n });\n }, []);\n\n useEffect(() => {\n if (isMobile) {\n const link = document.createElement('link');\n link.rel = 'preload';\n link.as = 'image';\n link.href = getCoverMobileUrl();\n document.head.appendChild(link);\n }\n }, [isMobile]);\n\n if (process.env.NODE_ENV !== 'production') return null;\n if (!badgeLoaded) return null;\n if (!showBadge) return null;\n if (!visible) return null;\n\n // ── mobile: bottom sheet ────────────────────────────────────\n if (isMobile) {\n return (\n <DialogPrimitive.Root open={open} onOpenChange={setOpen}>\n <DialogPrimitive.Trigger asChild>\n <div style={badgeMobile} onClick={() => setOpen(true)}>\n <img src={LOGO_URL} style={logoStyle} />\n <p style={{ ...badgeTextStyle, minWidth: 28 }}>{t('safety.badge.label')}</p>\n </div>\n </DialogPrimitive.Trigger>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay style={overlayStyle} />\n <DialogPrimitive.Content style={sheetContent} aria-describedby={undefined}>\n <DialogPrimitive.Title style={{ position: 'absolute', clip: 'rect(0 0 0 0)' }}>\n {t('safety.badge.builtWith')}\n </DialogPrimitive.Title>\n <div style={sheetInner}>\n <XIcon style={sheetCloseBtn} onClick={() => setOpen(false)} />\n <img\n src={getCoverMobileUrl()}\n alt=\"\"\n style={sheetCover}\n onClick={() => window.open(LANDING_URL, '_blank')}\n />\n <div style={sheetBody}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, alignSelf: 'stretch' }}>\n {isInternetVisible && (\n <div style={infoRow}>\n <img src={ICON_COMPANY_URL} style={infoIconMobile} />\n <p style={sheetInfoText}>{t('safety.tenant.operated', { name: userinfo?.name ?? '' })}</p>\n </div>\n )}\n <div style={infoRow}>\n <img src={ICON_AI_URL} style={infoIconMobile} />\n <p style={sheetInfoText}>{t('safety.ai.disclaimer')}</p>\n </div>\n {/* 投诉与举报:radix Dialog Portal 内容,SSR / 本包测试harness(嵌套 React 无法用 RTL)\n 均不可达;跳转逻辑 openReport 已单测覆盖。v8 ignore(同豆包水印 Portal 内容)。 */}\n {/* v8 ignore start */}\n <div\n style={{ ...infoRow, cursor: 'pointer' }}\n data-custom-element=\"safety-report\"\n onClick={openReport}\n >\n <img src={ICON_FEEDBACK_URL} style={infoIconMobile} />\n <p\n style={{\n ...sheetInfoText,\n cursor: 'pointer',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n }}\n >\n {t('safety.report')}\n </p>\n </div>\n {/* v8 ignore stop */}\n </div>\n <div style={mobileBtnRow}>\n <div\n style={mobileBtnOutline}\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setOpen(false);\n setTimeout(() => setVisible(false), 200);\n window.localStorage?.setItem(HasClosedKey, 'true');\n }}\n >\n {t('safety.button.dontShowAgain')}\n </div>\n <div\n style={mobileBtnFilled}\n onClick={() => window.open(LANDING_URL, '_blank')}\n >\n {t('safety.button.learnMore')}\n </div>\n </div>\n </div>\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n }\n\n // ── desktop: popover on hover ───────────────────────────────\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild>\n <div\n style={badgeDesktop}\n onMouseEnter={() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setOpen(true);\n }}\n onMouseLeave={() => {\n timeoutRef.current = setTimeout(() => setOpen(false), 100);\n }}\n >\n <img src={LOGO_URL} style={logoStyle} />\n <p style={{ ...badgeTextStyle, minWidth: 60 }}>{t('safety.badge.builtWith')}</p>\n </div>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n style={popoverContent}\n side=\"top\"\n align=\"end\"\n sideOffset={8}\n onMouseEnter={() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setOpen(true);\n }}\n onMouseLeave={() => {\n timeoutRef.current = setTimeout(() => setOpen(false), 100);\n }}\n >\n <div style={popoverInner}>\n <img\n src={getCoverUrl()}\n alt=\"\"\n style={popoverCover}\n onClick={() => window.open(LANDING_URL, '_blank')}\n />\n <div style={popoverBody}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, alignSelf: 'stretch' }}>\n {isInternetVisible && (\n <div style={infoRow}>\n <img src={ICON_COMPANY_URL} style={infoIcon} />\n <p style={infoText}>{t('safety.tenant.operated', { name: userinfo?.name ?? '' })}</p>\n </div>\n )}\n <div style={infoRow}>\n <img src={ICON_AI_URL} style={infoIcon} />\n <p style={infoText}>{t('safety.ai.disclaimer')}</p>\n </div>\n {/* 投诉与举报:radix Popover Portal 内容,SSR / 本包测试harness(嵌套 React 无法用 RTL)\n 均不可达;跳转逻辑 openReport 已单测覆盖。v8 ignore(同豆包水印 Portal 内容)。 */}\n {/* v8 ignore start */}\n <div\n style={{ ...infoRow, cursor: 'pointer' }}\n data-custom-element=\"safety-report\"\n onClick={openReport}\n >\n <img src={ICON_FEEDBACK_URL} style={infoIcon} />\n <p\n style={{\n ...infoText,\n cursor: 'pointer',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n }}\n >\n {t('safety.report')}\n </p>\n </div>\n {/* v8 ignore stop */}\n </div>\n <div style={btnRow}>\n <HoverButton\n style={btnBase}\n data-custom-element=\"safety-close\"\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setVisible(false);\n window.localStorage?.setItem(HasClosedKey, 'true');\n }}\n >\n {t('safety.button.dontShowAgain')}\n </HoverButton>\n <HoverButton\n style={btnBase}\n data-custom-element=\"safety-more\"\n onClick={() => window.open(LANDING_URL, '_blank')}\n >\n {t('safety.button.learnMore')}\n </HoverButton>\n </div>\n </div>\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n};\n\nexport default Safety;\n","/* eslint-disable */\n/**\n * 获取应用 ID\n */\nexport function getAppId(): string | null {\n const windowAppId = (window as any).appId || null;\n return windowAppId;\n}\n","export function getEnv(): 'BOE' | 'PRE' | 'ONLINE' {\n switch((globalThis as any).ENVIRONMENT) {\n case 'staging':\n return 'BOE';\n case 'gray':\n return 'PRE';\n case 'online':\n return 'ONLINE';\n default:\n break;\n\n }\n const { origin } = window.location;\n // 线上环境\n if (origin.includes('feishuapp.cn') || origin.includes('miaoda.feishuapp.net') || origin.includes('aiforce.cloud') || origin.includes('aiforce.run')) {\n return 'ONLINE';\n // PRE 环境\n } else if (origin.includes('fsapp.kundou.cn') || origin.includes('miaoda-pre.feishuapp.net') || origin.includes('aiforce-pre.bytedance.net') || origin.includes('aiforce-pre-preview.bytedance.net') || origin.includes('aiforce-pre.cloud') || origin.includes('aiforce-pre.run')) {\n return 'PRE';\n // BOE 环境\n } else {\n return 'BOE';\n }\n}\n","import { getAppId } from './getAppId';\nimport { getCsrfToken } from './getCsrfToken';\nimport { isNewPathEnabled } from './apiPath';\n\ninterface AppRuntimeExtra {\n token?: string;\n url?: string;\n bucket?: BucketConfig;\n}\ninterface AppRuntimePublished {\n app_name?: string;\n css_urls?: string[];\n js_urls?: string[];\n app_avatar?: string;\n app_description?: string;\n /** 是否展示「由妙搭搭建」徽标;后端缺省视为 true */\n show_badge?: boolean;\n}\ninterface BucketConfig {\n default_bucket_id?: string;\n}\n\n/**\n * 从API获取已发布的应用信息(仅全栈沙箱模式下使用)\n */\nasync function getAppPublished(): Promise<\n | {\n app_info?: AppRuntimePublished;\n app_runtime_extra?: AppRuntimeExtra;\n }\n | undefined\n> {\n try {\n // 构建请求头\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Kunlun-Token': window.token,\n 'x-miaoda-token': window.MIAODA_BUILTIN_TTT,\n 'X-Suda-Csrf-Token': getCsrfToken(),\n };\n const appId = getAppId();\n const path = isNewPathEnabled()\n ? `/app/${appId}/__runtime__/api/v1/studio/get_published`\n : `/spark/b/${appId}/get_published`;\n const url = `${window.location.origin}${path}`;\n // 发起fetch请求\n const response = await fetch(url, {\n method: 'GET',\n headers,\n credentials: 'include', // 包含cookies\n });\n\n // 解析响应数据\n const res = await response.json();\n if (res.code === 0 || res.status_code === '0') {\n return res.data;\n }\n console.error('Error fetching published app info:', res);\n } catch (error) {\n console.error('Error fetching published app info:', error);\n }\n return undefined;\n}\n// 存储的公共信息\nlet initialInfo:\n | {\n app_info?: AppRuntimePublished;\n app_runtime_extra?: AppRuntimeExtra;\n }\n | undefined;\n\n// 缓存进行中的 Promise,防止并发调用发起多个重复请求\nlet pendingPromise: Promise<typeof initialInfo> | null = null;\n\n/** 获取应用初始化信息(仅全栈沙箱模式下使用) */\nexport function getInitialInfo(refresh = false): Promise<typeof initialInfo> {\n if (initialInfo && !refresh) {\n return Promise.resolve(initialInfo);\n }\n if (pendingPromise && !refresh) {\n return pendingPromise;\n }\n pendingPromise = getAppPublished()\n .then(info => {\n initialInfo = info;\n if (initialInfo) {\n window._bucket_id =\n initialInfo.app_runtime_extra?.bucket?.default_bucket_id;\n }\n return initialInfo;\n })\n .finally(() => {\n pendingPromise = null;\n });\n return pendingPromise;\n}\n","import { getAppId } from './getAppId';\nimport { getCsrfToken } from './getCsrfToken';\nimport { isNewPathEnabled } from './apiPath';\n\ninterface TenantInfo {\n id?: number;\n name?: string;\n}\n\ninterface TenantInfoPayload {\n tenant_info?: TenantInfo;\n is_internet_visible?: boolean;\n}\n\n/**\n * 拉取租户信息(仅供「由妙搭搭建」徽标展示用)。\n */\nasync function fetchTenantInfo(): Promise<TenantInfoPayload | undefined> {\n try {\n const appId = getAppId();\n const path = isNewPathEnabled()\n ? `/app/${appId}/__runtime__/api/v1/studio/tenant_info`\n : `/spark/b/${appId}/tenant_info`;\n const response = await fetch(`${window.location.origin}${path}`, {\n method: 'GET',\n headers: { 'X-Suda-Csrf-Token': getCsrfToken() ?? '' },\n credentials: 'include',\n });\n const res = await response.json();\n return res?.data;\n } catch {\n return undefined;\n }\n}\n\n// 缓存结果,避免重复展示场景重复请求\nlet tenantInfo: TenantInfoPayload | undefined;\n// 缓存进行中的 Promise,防止并发调用(含 StrictMode 双跑)发起多个重复请求\nlet pendingPromise: Promise<TenantInfoPayload | undefined> | null = null;\n\n/** 获取租户信息(带结果缓存 + 并发去重,整个会话只发一次 tenant_info) */\nexport function getTenantInfo(): Promise<TenantInfoPayload | undefined> {\n if (tenantInfo) {\n return Promise.resolve(tenantInfo);\n }\n if (pendingPromise) {\n return pendingPromise;\n }\n pendingPromise = fetchTenantInfo()\n .then(info => {\n tenantInfo = info;\n return tenantInfo;\n })\n .finally(() => {\n pendingPromise = null;\n });\n return pendingPromise;\n}\n","import { useEffect, useState } from 'react';\nimport { AppInfoPayload } from '../types/common';\nimport { getAppInfo } from '../integrations/getAppInfo';\n\nexport const useAppInfo = () => {\n const [appInfo, setAppInfo] = useState<Partial<AppInfoPayload>>({});\n\n useEffect(() => {\n const updateDomInfo = (info: AppInfoPayload) => {\n if (info.name) {\n document.title = info.name;\n const meta = document.querySelector(\"meta[property='og:title']\") as HTMLMetaElement;\n if (meta) {\n meta.content = info.name;\n }\n }\n if (info.avatar) {\n let link = document.querySelector(\"link[rel~='icon']\") as HTMLLinkElement;\n if (!link) {\n link = document.createElement('link');\n link.rel = 'icon';\n document.head.appendChild(link);\n }\n link.href = info.avatar;\n const meta = document.querySelector(\"meta[property='og:image']\") as HTMLMetaElement;\n if (meta) {\n meta.content = info.avatar;\n }\n }\n if (info.description) {\n const meta = document.querySelector(\"meta[property='og:description']\") as HTMLMetaElement;\n if (meta) {\n meta.content = info.description;\n }\n const metaDom = document.querySelector(\"meta[name='description']\") as HTMLMetaElement;\n if (metaDom) {\n metaDom.content = info.description;\n }\n }\n }\n\n const handleMetaInfoChanged = async (info?: AppInfoPayload, refresh = true) => {\n if (!info) {\n info = await getAppInfo(refresh);\n }\n updateDomInfo(info);\n setAppInfo(prev => ({ ...prev, ...info }));\n };\n handleMetaInfoChanged(undefined, false);\n const onUpdate = (e: Event) => {\n const info = (e as CustomEvent<AppInfoPayload>).detail;\n handleMetaInfoChanged(info);\n };\n window.addEventListener('MiaoDaMetaInfoChanged', onUpdate);\n return () => {\n window.removeEventListener('MiaoDaMetaInfoChanged', onUpdate);\n };\n }, []);\n\n return {\n ...appInfo,\n appName: appInfo.name,\n appLogo: appInfo.avatar,\n };\n};\n","/* eslint-disable */\nimport { AppInfoPayload } from '../types/common';\nimport { getInitialInfo } from '../utils/getInitialInfo';\nimport { isSparkRuntime } from '../utils/utils';\n\nexport async function getAppInfo(refresh = false): Promise<AppInfoPayload> {\n let appInfo = typeof window !== 'undefined' ? (window as any)._appInfo : undefined;\n if ((!appInfo || refresh) && isSparkRuntime()) {\n const info = (await getInitialInfo(refresh))?.app_info;\n appInfo = {\n name: info?.app_name || '',\n avatar: info?.app_avatar || '',\n description: info?.app_description || '',\n };\n if (appInfo.name) {\n appInfo.name = appInfo.name.trim();\n }\n\n if (typeof window !== 'undefined') {\n (window as any)._appInfo = appInfo;\n }\n }\n return appInfo ?? {};\n}\n","import { useEffect, useState } from 'react';\nimport { authClient } from '@lark-apaas/auth-sdk';\nimport { IUserProfile } from '../types/udt-types';\nimport { getCurrentUserProfile } from '../integrations/getCurrentUserProfile';\nimport { isSparkRuntime } from '../utils/utils';\n\n/**\n * 从 name 数组中获取用户名称\n * 优先选择 language_code 为 2052(简体中文)的数据,如果匹配不到则取第一个\n */\nfunction getNameFromArray(\n nameArray?: Array<{ language_code?: number; text?: string }>,\n): string | undefined {\n if (!nameArray || nameArray.length === 0) {\n return undefined;\n }\n const chineseName = nameArray.find((item) => item.language_code === 2052);\n return chineseName?.text ?? nameArray[0]?.text;\n}\n\nexport interface ICompatibilityUserProfile extends IUserProfile {\n /**\n * @deprecated please use `name`\n */\n userName: string;\n /**\n * @deprecated please use `avatar`\n */\n userAvatar: string;\n}\n\nfunction getCompatibilityUserProfile(): ICompatibilityUserProfile {\n const userInfo = getCurrentUserProfile();\n return {\n ...userInfo,\n // 兼容处理\n userName: userInfo.name,\n userAvatar: userInfo.avatar,\n };\n}\n\nexport const useCurrentUserProfile = () => {\n const [userInfo, setUserInfo] = useState<ICompatibilityUserProfile>(() =>\n getCompatibilityUserProfile(),\n );\n\n // 事件驱动,从 window 上取值\n useEffect(() => {\n let cancelled = false;\n\n const fetchAndSetUserInfo = async () => {\n const result = await authClient.session.getUserInfo();\n if (cancelled) return;\n const info = result?.data?.user_info;\n const userName = getNameFromArray(info?.name);\n const newUserInfo: ICompatibilityUserProfile = {\n user_id: info?.user_id?.toString() ?? '',\n email: info?.email ?? '',\n name: userName ?? '',\n avatar: info?.avatar?.image?.large ?? '',\n userName: userName ?? '',\n userAvatar: info?.avatar?.image?.large ?? '',\n };\n if (process.env.NODE_ENV === 'development') {\n console.log('MiaoDaMetaInfoChanged', newUserInfo);\n }\n setUserInfo(newUserInfo);\n };\n\n let handleMetaInfoChanged: () => void;\n if (isSparkRuntime()) {\n fetchAndSetUserInfo();\n handleMetaInfoChanged = () => { fetchAndSetUserInfo(); };\n } else {\n handleMetaInfoChanged = () => {\n if (process.env.NODE_ENV === 'development') {\n console.log('MiaoDaMetaInfoChanged', getCompatibilityUserProfile());\n }\n setUserInfo(getCompatibilityUserProfile());\n };\n }\n\n window.addEventListener('MiaoDaMetaInfoChanged', handleMetaInfoChanged);\n return () => {\n cancelled = true;\n window.removeEventListener(\n 'MiaoDaMetaInfoChanged',\n handleMetaInfoChanged,\n );\n };\n }, []);\n\n return userInfo;\n};\n","/* eslint-disable */\nimport { IUserProfile } from '../types/udt-types';\n\nexport function getCurrentUserProfile(): IUserProfile {\n return (window as any)._userInfo || {};\n}\n\n/**\n * @deprecated 请使用 getCurrentUserProfile 代替\n */\nexport const getUserInfo = getCurrentUserProfile;\n","import React from 'react';\nimport { debounce } from 'lodash';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean>(\n window.innerWidth < MOBILE_BREAKPOINT\n );\n\n React.useEffect(() => {\n const handleResize = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n\n const debouncedHandleResize = debounce(handleResize, 200);\n\n window.addEventListener('resize', debouncedHandleResize);\n\n // Set initial value\n handleResize();\n\n return () => {\n window.removeEventListener('resize', debouncedHandleResize);\n debouncedHandleResize.cancel(); // Cancel any pending execution on unmount\n };\n }, []);\n\n return isMobile;\n}\n","import { useState } from 'react';\nimport { authClient } from '@lark-apaas/auth-sdk';\n\nexport function useLogout() {\n const [isLoading, setIsLoading] = useState(false);\n async function handlerLogout() {\n if (process.env.NODE_ENV !== 'production') {\n console.log('只有生产环境才执行登出');\n return;\n }\n setIsLoading(true);\n try {\n await authClient.session.signOut();\n } catch (error) {\n console.error('登出失败', error);\n } finally {\n setIsLoading(false);\n }\n }\n\n return {\n handlerLogout,\n isLoading,\n };\n}\n","/**\n * 中英文文案源(统一管理)。\n *\n * 每条文案同时包含 zh 和 en,方便对照和维护。\n * Key 规则:`{组件}.{区域}.{标识}`\n * 文案来源:https://bytedance.larkoffice.com/wiki/BJCQwv9auiP9erkudMfcVIIGnRg\n */\n\nconst messages: Record<string, { zh: string; en: string }> = {\n // ── Index / 通用 ──────────────────────────────────────────────\n 'index.rateLimitError': {\n zh: '应用额度已耗尽,请联系应用开发者',\n en: 'Application quota exhausted, please contact the app developer',\n },\n // ── Safety 组件 ──────────────────────────────────────────────\n 'safety.badge.label': {\n zh: '妙搭',\n en: 'Spark',\n },\n 'safety.badge.builtWith': {\n zh: '由妙搭搭建',\n en: 'Built with Spark',\n },\n 'safety.ai.disclaimer': {\n zh: '包含 AI 生成内容,请注意甄别',\n en: 'AI-generated content. Use with care.',\n },\n 'safety.tenant.operated': {\n zh: '{name}运营',\n en: 'Operated by {name}',\n },\n 'safety.button.dontShowAgain': {\n zh: '不再展示',\n en: \"Don't show again\",\n },\n 'safety.button.learnMore': {\n zh: '了解更多',\n en: 'Learn more',\n },\n 'safety.report': {\n zh: '投诉与举报',\n en: 'Report',\n },\n 'safety.cover.pc': {\n zh: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover.png',\n en: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover-weben.png',\n },\n 'safety.cover.mobile': {\n zh: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover-mobile.png',\n en: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover-mobileen.png',\n },\n};\n\nexport default messages;\n","/**\n * 统一的语言判断方法。\n *\n * 生产环境(`process.env.NODE_ENV === 'production'`):\n * 只看浏览器容器语言(navigator.language)。\n *\n * 非生产环境(沙箱预览场景):\n * 优先级 query > localStorage > navigator。\n * URL query `locale`(值为 `zh_CN` / `en_US`)由宿主平台(miaoda)\n * 通过 iframe src 透传,确保产物内的语言与宿主一致;\n * 读到 query 时会同步写入 localStorage,便于后续无 query 的跳转/刷新场景使用。\n *\n * 返回标准化 locale code:'zh' | 'en'。\n * 目前只区分中英文,未来扩展时在此调整。\n */\n\nexport type Locale = 'zh' | 'en';\n\nconst STORAGE_KEY = 'miaoda:preview-locale';\n\nfunction toLocale(value: string | null | undefined): Locale {\n const lang = value ?? 'zh';\n return lang.toLowerCase().startsWith('zh') ? 'zh' : 'en';\n}\n\nfunction readLocaleFromQuery(): string | null {\n if (typeof window === 'undefined') return null;\n try {\n const value = new URLSearchParams(window.location.search).get('locale');\n return value && value.length > 0 ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction readLocaleFromStorage(): string | null {\n if (typeof window === 'undefined') return null;\n try {\n const value = window.localStorage?.getItem(STORAGE_KEY);\n return value && value.length > 0 ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction writeLocaleToStorage(value: string): void {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage?.setItem(STORAGE_KEY, value);\n } catch {\n // ignore(隐私模式 / 配额满等)\n }\n}\n\nexport function getLocale(): Locale {\n // 生产环境只信任容器语言,不受 query/localStorage 影响\n if (process.env.NODE_ENV === 'production') {\n return toLocale(navigator.language);\n }\n\n const fromQuery = readLocaleFromQuery();\n if (fromQuery) {\n writeLocaleToStorage(fromQuery);\n return toLocale(fromQuery);\n }\n\n const fromStorage = readLocaleFromStorage();\n if (fromStorage) return toLocale(fromStorage);\n\n return toLocale(navigator.language);\n}\n","import messages from './messages';\nimport { getLocale } from '../utils/locale';\nimport type { Locale } from '../utils/locale';\n\n/**\n * 获取当前语言环境下的翻译文案。\n *\n * 支持 `{key}` 形式的变量替换:\n * ```ts\n * t('safety.tenant.operated', { name: '字节' })\n * // zh → \"字节运营\"\n * // en → \"Operated by 字节\"\n * ```\n *\n * 如果 key 不存在,fallback 到中文;中文也没有则返回 key 本身。\n */\nexport function t(key: string, params?: Record<string, string>): string {\n const locale = getLocale();\n const entry = messages[key];\n let text = entry?.[locale] ?? entry?.zh ?? key;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n}\n\nexport { getLocale } from '../utils/locale';\nexport type { Locale } from '../utils/locale';\n","import React, { useRef, useState } from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { DOUBAO_LOGO_SRC, DOUBAO_PILL_MOBILE_PNG } from './doubao-watermark-asset';\nimport { getAppId } from '../../utils/getAppId';\nimport { useIsMobile } from '../../hooks';\n\n// 豆包来源值(对齐 app_meta.source / AppSource_Doubao)。\n// 经沙箱/编译注入 MIAODA_APP_SOURCE,coding preset 的 define 透传到 process.env。\n// 浏览器里 process.env 必然是字符串(即使语义是数字)。\nconst DOUBAO_SOURCE = '5';\n\n// 「投诉与举报」入口开关:后端举报链接(tns 风控举报中心)已就绪,开启举报入口。\nconst REPORT_ENABLED = true;\n\nconst BRAND_TEXT = '豆包 AI 生成';\nconst POWERED_BY_TEXT = '由飞书妙搭提供支持';\nconst FONT_FAMILY = \"'PingFang SC', -apple-system, BlinkMacSystemFont, sans-serif\";\n\n// 投影 token(对齐设计稿 effects):药丸更厚、卡片更浅。\nconst PILL_SHADOW =\n '0px 8px 32px rgba(0,0,0,0.08), 0px 4px 16px rgba(0,0,0,0.04), 0px 2px 4px rgba(0,0,0,0.02)';\nconst CARD_SHADOW =\n '0px 4px 16px rgba(0,0,0,0.03), 0px 4px 10px rgba(0,0,0,0.03), 0px 2px 4px rgba(0,0,0,0.02)';\n\n// 「投诉与举报」跳转:飞书风控举报中心(tns),域名随部署环境。\n// 环境取构建期注入的 process.env.FORCE_FRAMEWORK_ENVIRONMENT(沙箱原值 boe/pre/online,\n// 与豆包 gate 的 MIAODA_APP_SOURCE 一样由 preset define 注入,预打包层也已覆盖)。\n// 映射与服务端 mapToWindowEnvironment 同口径:boe→BOE,pre→PRE,其余(含 online)→线上。\nconst reportDomainByEnv = (env: string | undefined): string => {\n if (env === 'boe') return 'tns.feishu-boe.cn';\n if (env === 'pre') return 'tns.feishu-pre.cn';\n return 'tns.feishu.cn';\n};\n\n/**\n * 打开「投诉与举报」页:scene/entity_type 固定,entity_id 取当前妙搭 appId(getAppId →\n * window.appId,水印仅豆包应用展示,此时必有 appId),域名按环境选,params 整体 encode。\n */\nexport const openDoubaoReport = (): void => {\n const params = JSON.stringify({\n scene: 'miaoda_app_report',\n entity_id: getAppId() ?? '',\n entity_type: 'miaoda_app',\n extra: '',\n });\n const domain = reportDomainByEnv(process.env.FORCE_FRAMEWORK_ENVIRONMENT);\n const url = `https://${domain}/cust/lark_report/?type=common¶ms=${encodeURIComponent(\n params,\n )}&lang=zh-CN`;\n window.open(url, '_blank', 'noopener,noreferrer');\n};\n\n// 「投诉与举报」图标(DBX icon_feedback_outlined,16×16)。内联矢量、随 currentColor 着色,\n// 高分屏清晰、无需额外 CDN 依赖。\nexport const FeedbackIcon: React.FC = () => (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ display: 'block', flexShrink: 0 }}\n >\n <path\n d=\"M12.6667 2H3.33333V14H6.66667V15.3334H3.33333C2.59695 15.3334 2 14.7364 2 14V2C2 1.26364 2.59695 0.666687 3.33333 0.666687H12.6667C13.403 0.666687 14 1.26364 14 2V7.33335H12.6667V2Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M5.33333 4.66669C4.96514 4.66669 4.66667 4.96516 4.66667 5.33335C4.66667 5.70154 4.96514 6 5.33333 6H10.6667C11.0349 6 11.3333 5.70154 11.3333 5.33335C11.3333 4.96516 11.0349 4.66669 10.6667 4.66669H5.33333Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M4.66667 8.33335C4.66667 7.96516 4.96514 7.66669 5.33333 7.66669H8C8.36819 7.66669 8.66667 7.96516 8.66667 8.33335C8.66667 8.70154 8.36819 9 8 9H5.33333C4.96514 9 4.66667 8.70154 4.66667 8.33335Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M13.5523 8.70017C13.9428 8.30964 14.576 8.30964 14.9665 8.70017C15.357 9.09069 15.357 9.72386 14.9665 10.1144L14.2594 10.8215L12.8452 9.40728L13.5523 8.70017Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12.1381 10.1144L13.5523 11.5286L10.2309 14.85C10.0916 14.9892 9.91229 15.0815 9.71798 15.1138L8.45737 15.3234C8.42136 15.3294 8.38467 15.3177 8.35885 15.2918C8.33271 15.2657 8.32099 15.2284 8.32749 15.192L8.55128 13.9374C8.58465 13.7502 8.6746 13.5779 8.80901 13.4435L12.1381 10.1144Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n// 关闭叉(DBX icon_close_outlined)。内联 + currentColor:深色药丸里白 50%、白卡片里黑,\n// 一份资源随上下文着色(CDN 版固定 white@0.5,贴到白卡片上会看不见)。\nexport const CloseIcon: React.FC<{ size: number }> = ({ size }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ display: 'block', flexShrink: 0 }}\n >\n <path\n d=\"M8.08312 8.08298C8.2384 7.92769 8.23953 7.67705 8.08424 7.52176L5.3625 4.80002L8.08422 2.07829C8.23951 1.92301 8.23839 1.67236 8.0831 1.51708C7.92781 1.36179 7.67717 1.36066 7.52188 1.51595C7.36659 1.67124 4.80016 4.23767 4.80016 4.23767L2.07841 1.51593C1.92313 1.36064 1.67248 1.36177 1.5172 1.51705C1.36191 1.67234 1.36078 1.92298 1.51607 2.07827L4.23782 4.80002L1.51605 7.52178C1.36076 7.67707 1.36189 7.92771 1.51718 8.083C1.67246 8.23829 1.92311 8.23941 2.07839 8.08412L4.80016 5.36236L7.5219 8.0841C7.67719 8.23939 7.92783 8.23826 8.08312 8.08298Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n// 豆包头像(圆形)。钉死尺寸盖过宿主 Tailwind preflight 的 `img{max-width:100%;height:auto}`。\nexport const Avatar: React.FC<{ size: number }> = ({ size }) => (\n <img\n src={DOUBAO_LOGO_SRC}\n width={size}\n height={size}\n alt=\"\"\n style={{\n width: size,\n height: size,\n maxWidth: 'none',\n maxHeight: 'none',\n borderRadius: 100,\n flexShrink: 0,\n display: 'block',\n }}\n />\n);\n\n// 收起态深色药丸:头像 +「豆包AI」+(桌面端可选)关闭叉。\nexport const Pill: React.FC<{ variant: 'desktop' | 'mobile'; onClose?: () => void }> = ({\n variant,\n onClose,\n}) => {\n const isDesktop = variant === 'desktop';\n return (\n <div\n style={{\n boxSizing: 'border-box',\n display: 'inline-flex',\n alignItems: 'center',\n gap: isDesktop ? 4 : 6,\n padding: isDesktop ? '6px 12px 6px 8px' : '4px 12px 4px 8px',\n background: '#363636',\n border: '0.5px solid rgba(255,255,255,0.1)',\n borderRadius: 100,\n boxShadow: PILL_SHADOW,\n cursor: 'pointer',\n }}\n >\n <Avatar size={isDesktop ? 16 : 18} />\n <span\n style={{\n fontFamily: FONT_FAMILY,\n fontSize: isDesktop ? 12 : 14,\n lineHeight: isDesktop ? '18px' : '22px',\n color: 'rgba(255,255,255,0.85)',\n whiteSpace: 'nowrap',\n }}\n >\n {BRAND_TEXT}\n </span>\n {/* 关闭叉仅桌面端;移动端「不再展示」放在 tap 菜单里 */}\n {isDesktop && onClose && (\n <span\n role=\"button\"\n aria-label=\"关闭\"\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n cursor: 'pointer',\n flexShrink: 0,\n color: 'rgba(255,255,255,0.5)', // 深色药丸上的白 50% 叉\n }}\n >\n <CloseIcon size={10} />\n </span>\n )}\n </div>\n );\n};\n\n// 菜单行:图标(feedback / close 均为内联 currentColor SVG)+ 文案,r6 + hover 浅灰。\nexport const MenuRow: React.FC<{\n icon: 'feedback' | 'close';\n label: string;\n fontSize: number;\n onClick?: () => void;\n}> = ({ icon, label, fontSize, onClick }) => {\n const [hover, setHover] = useState(false);\n return (\n <div\n role=\"menuitem\"\n data-label={label}\n onClick={onClick}\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n style={{\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '4px 10px',\n borderRadius: 6,\n cursor: 'pointer',\n color: '#000000',\n background: hover ? 'rgba(0,0,0,0.04)' : 'transparent',\n }}\n >\n <span style={{ display: 'inline-flex', width: 16, height: 16, flexShrink: 0, color: '#000000' }}>\n {icon === 'feedback' ? <FeedbackIcon /> : <CloseIcon size={16} />}\n </span>\n <span\n style={{\n fontFamily: FONT_FAMILY,\n fontSize,\n lineHeight: `${fontSize + 8}px`,\n color: '#000000',\n whiteSpace: 'nowrap',\n }}\n >\n {label}\n </span>\n </div>\n );\n};\n\ntype MenuItem = { icon: 'feedback' | 'close'; label: string; onClick?: () => void };\n\n// 展开态白色卡片:菜单行 + 底部「由飞书妙搭提供支持」灰条。\nexport const MenuCard: React.FC<{\n items: MenuItem[];\n fontSize: number;\n footerFontSize: number;\n minWidth: number;\n style?: React.CSSProperties;\n}> = ({ items, fontSize, footerFontSize, minWidth, style }) => (\n <div\n style={{\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n minWidth,\n background: '#ffffff',\n border: '0.5px solid rgba(0,0,0,0.1)',\n borderRadius: 10,\n boxShadow: CARD_SHADOW,\n overflow: 'hidden',\n // radix Content 打开时获取焦点,去掉浏览器默认 focus 描边\n outline: 'none',\n ...style,\n }}\n >\n {items.length > 0 && (\n <div style={{ boxSizing: 'border-box', padding: 4 }}>\n {items.map((it) => (\n <MenuRow key={it.label} icon={it.icon} label={it.label} fontSize={fontSize} onClick={it.onClick} />\n ))}\n </div>\n )}\n <div\n style={{\n boxSizing: 'border-box',\n background: '#f9f9f9',\n padding: '8px 14px',\n fontFamily: FONT_FAMILY,\n fontSize: footerFontSize,\n lineHeight: `${footerFontSize + 8}px`,\n color: 'rgba(0,0,0,0.35)',\n whiteSpace: 'nowrap',\n }}\n >\n {POWERED_BY_TEXT}\n </div>\n </div>\n);\n\n/**\n * 移动端豆包水印:收起态深色药丸(头像 +「豆包AI」),tap 在上方弹白色卡片菜单\n * (投诉与举报[受 REPORT_ENABLED 控制] / 不再展示 / 由飞书妙搭提供支持)。点外部自动关(radix 内建)。\n */\nconst MobileWatermark: React.FC<{ onDontShow: () => void }> = ({ onDontShow }) => {\n const [open, setOpen] = useState(false);\n const items: MenuItem[] = [];\n if (REPORT_ENABLED) {\n items.push({ icon: 'feedback', label: '投诉与举报', onClick: openDoubaoReport });\n }\n items.push({\n icon: 'close',\n label: '不再展示',\n onClick: () => {\n setOpen(false);\n onDontShow();\n },\n });\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild>\n <div\n data-custom-element=\"doubao-watermark-mobile\"\n style={{\n position: 'fixed',\n right: 12,\n bottom: 12,\n width: 122,\n height: 30,\n zIndex: 9999,\n cursor: 'pointer',\n }}\n >\n {/* 收起药丸用 3× PNG(避免滤镜 SVG 在高分屏发糊)。canvas 166×94 含投影留白,\n 负偏移让可见药丸 122×30 精确贴边;钉死尺寸盖过宿主 Tailwind preflight 压缩。 */}\n <img\n src={DOUBAO_PILL_MOBILE_PNG}\n width={166}\n height={94}\n alt=\"豆包 AI 生成\"\n style={{\n position: 'absolute',\n right: -12,\n bottom: -40,\n width: 166,\n height: 94,\n maxWidth: 'none',\n maxHeight: 'none',\n display: 'block',\n pointerEvents: 'none',\n }}\n />\n </div>\n </PopoverPrimitive.Trigger>\n {/* tap 浮层菜单:radix Portal 经 createPortal 渲染,SSR(renderToStaticMarkup)\n 下不产出 markup、点击事件也无法在 SSR 触发,故本块无法被现有测试覆盖,v8 ignore。\n 药丸本体 + isMobile 分支已被单测覆盖。 */}\n {/* v8 ignore start */}\n <PopoverPrimitive.Portal>\n {/* radix Content 打开时自动获取焦点,会带浏览器默认 focus 描边 —— 必须在 Content 本身\n (被聚焦的元素)去掉,仅在内层 MenuCard 去掉不生效。 */}\n <PopoverPrimitive.Content side=\"top\" align=\"end\" sideOffset={8} style={{ outline: 'none' }}>\n <MenuCard items={items} fontSize={16} footerFontSize={14} minWidth={160} />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n {/* v8 ignore stop */}\n </PopoverPrimitive.Root>\n );\n};\n\n/**\n * 豆包水印:仅当应用来源为豆包时,在视口右下角展示收起态药丸(头像 +「豆包AI」)。\n *\n * 设计稿:Figma 1582:41560(桌面)/ 1582:41777(移动)。\n * - 药丸 / 卡片本体用代码画(投影走 CSS box-shadow、图标用无滤镜小 SVG),高分屏清晰。\n * - 桌面端点关闭叉 → 隐藏整个水印;hover 徽标 → 上方弹白色卡片(投诉与举报 + 由飞书妙搭提供支持)。\n * - 移动端 tap 徽标 → 上方弹卡片(投诉与举报 / 不再展示 / 由飞书妙搭提供支持)。\n * - 「投诉与举报」点击跳飞书风控举报中心(tns,域名随环境);后端链接未就绪时由 REPORT_ENABLED 整体隐藏。\n * - 不加 NODE_ENV 判断——预览态与运行态都要展示。\n */\nconst Watermark: React.FC = () => {\n const [closed, setClosed] = useState(false);\n const [open, setOpen] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isMobile = useIsMobile();\n\n if (String(process.env.MIAODA_APP_SOURCE) !== DOUBAO_SOURCE) return null;\n if (closed) return null;\n\n if (isMobile) {\n return <MobileWatermark onDontShow={() => setClosed(true)} />;\n }\n\n // hover 开关:交互态在 SSR 下不可达,v8 ignore。\n /* v8 ignore start */\n const enter = () => {\n if (timer.current) clearTimeout(timer.current);\n setOpen(true);\n };\n const leave = () => {\n timer.current = setTimeout(() => setOpen(false), 100);\n };\n /* v8 ignore stop */\n\n const desktopItems: MenuItem[] = [];\n if (REPORT_ENABLED) {\n desktopItems.push({ icon: 'feedback', label: '投诉与举报', onClick: openDoubaoReport });\n }\n\n return (\n <div\n data-custom-element=\"doubao-watermark\"\n onMouseEnter={enter}\n onMouseLeave={leave}\n style={{\n position: 'fixed',\n right: 12,\n bottom: 12,\n zIndex: 9999,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n gap: 8,\n }}\n >\n {/* hover 卡片:投诉与举报[受 REPORT_ENABLED 控制] + 由飞书妙搭提供支持。\n 交互态(open=true)在 SSR 下不可达,故 v8 ignore(与 openDoubaoReport 单测互补)。 */}\n {/* v8 ignore start */}\n {open && (\n <MenuCard items={desktopItems} fontSize={14} footerFontSize={12} minWidth={144} />\n )}\n {/* v8 ignore stop */}\n\n <Pill variant=\"desktop\" onClose={() => setClosed(true)} />\n </div>\n );\n};\n\nexport default Watermark;\n","// 豆包水印 CDN 资源(Eden)。设计稿:Figma 1582:41560(桌面)/ 1582:41777(移动)。\n// 均为无滤镜矢量 SVG(高分屏清晰);药丸 / 菜单卡片本体改为代码绘制,不再贴带滤镜的整图 SVG。\n/* eslint-disable */\nconst CDN = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/miaoda-ui';\n\n// 豆包头像(圆形,桌面 16 / 移动 18px;内嵌 120px 位图,缩放显示过采样清晰)\nexport const DOUBAO_LOGO_SRC = `${CDN}/setting_voice.svg`;\n// 移动端收起药丸:3× PNG(canvas 166×94,可见药丸 122×30)。用 PNG 而非带滤镜的 SVG ——\n// 后者经 <img> 加载会在高分屏被按 1× 栅格化再放大发糊;高分 PNG 按物理像素显示清晰。\nexport const DOUBAO_PILL_MOBILE_PNG = `${CDN}/Frame%202147223991%20(3).png`;\n// 关闭叉改为组件内联 SVG(currentColor 随上下文着白/黑),不再走 CDN(CDN 版固定 white@0.5)。\n","import React from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\nlet defaultQueryClient: QueryClient | null = null;\n\nconst getDefaultQueryClient = () => {\n if (!defaultQueryClient) {\n defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n refetchOnWindowFocus: false,\n },\n mutations: {\n retry: 1,\n },\n },\n });\n }\n return defaultQueryClient;\n};\n\nexport type QueryProviderProps = {\n children: React.ReactNode;\n client?: QueryClient;\n};\n\nconst QueryProvider: React.FC<QueryProviderProps> = ({ children, client }) => {\n const qc = client ?? getDefaultQueryClient();\n return <QueryClientProvider client={qc}>{children}</QueryClientProvider>;\n};\n\nexport default QueryProvider;\nexport { getDefaultQueryClient };\n\n","import { useEffect, useCallback, useRef, useMemo, createElement } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { useUpdatingRef } from '../../hooks/useUpdatingRef';\nimport { submitPostMessage } from '../../utils/postMessage';\n\n// 注意:connectParent 和 connectDevServer 已移至 runtime/iframe-bridge.ts\n\nenum RouteMessageType {\n RouteChange = 'RouteChange',\n RouteBack = 'RouteBack',\n RouteForward = 'RouteForward',\n}\n\nfunction isRouteMessageType(type: string): type is RouteMessageType {\n return Object.values(RouteMessageType).includes(type as RouteMessageType);\n}\n\nexport default function IframeBridge() {\n const location = useLocation();\n const navigate = useNavigate();\n const navigateRef = useUpdatingRef(navigate);\n type NavigateArg = Parameters<typeof navigate>[0];\n const isActive = useRef(false);\n\n const historyBack = useCallback(\n (_payload: NavigateArg) => {\n navigateRef.current(-1);\n isActive.current = true;\n },\n [navigateRef]\n );\n\n const historyForward = useCallback(\n (_payload: NavigateArg) => {\n navigateRef.current(1);\n isActive.current = true;\n },\n [navigateRef]\n );\n\n const operatorMessage = useMemo<\n Record<RouteMessageType, (payload: NavigateArg) => void>\n >(\n () => ({\n [RouteMessageType.RouteBack]: historyBack,\n [RouteMessageType.RouteForward]: historyForward,\n [RouteMessageType.RouteChange]: navigateRef.current,\n }),\n [historyBack, historyForward, navigateRef]\n );\n\n useEffect(() => {\n if (isActive.current) {\n isActive.current = false;\n return;\n }\n submitPostMessage({\n type: 'ChildLocationChange',\n data: location,\n });\n }, [location]);\n\n const handleMessage = useCallback(\n (event: MessageEvent) => {\n const data: { type?: unknown; data?: unknown } = event.data ?? {};\n if (typeof data.type === 'string' && isRouteMessageType(data.type)) {\n operatorMessage[data.type](data.data as NavigateArg);\n }\n },\n [operatorMessage]\n );\n\n useEffect(() => {\n (window as unknown as Window).addEventListener('message', handleMessage);\n\n return () => {\n (window as unknown as Window).removeEventListener(\n 'message',\n handleMessage\n );\n };\n }, [handleMessage]);\n\n // 用 createElement 而不是 JSX:避开 esbuild classic JSX transform 需要 React 在\n // scope 的问题(lite 的 tsconfig 是 react-jsx 自动模式,typecheck 不需要 React\n // import,但 tsup/esbuild 默认 classic transform 编译成 React.createElement,\n // 没 React import 就 runtime 报 ReferenceError)\n return createElement('div', { style: { display: 'none' } });\n}\n","import { useRef } from 'react';\nexport function useUpdatingRef<T>(value: T) {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n","import md5 from 'blueimp-md5';\nimport sha1 from 'crypto-js/sha1';\nimport { isMobile } from '../../../utils/deviceType';\nimport { getEnv } from '../../../utils/getEnv';\nimport { getLarkUserInfo } from './getLarkUser';\n\nimport { type TrackParams } from '../../../types/tea';\n\nconst saltA = '08a441';\nconst saltB = '42b91e';\nexport const encryptTea = (message: any): string => {\n const msgString = String(message);\n return sha1(saltA + md5(msgString + saltB)).toString();\n};\n\nlet teaInstance = false;\n\n/**\n * 初始化Tea 客户端\n * @export\n */\nexport async function createTracker(): Promise<void> {\n const { data } = await getLarkUserInfo();\n const { tenantID, userID} = data || {};\n const userIDEncrypt = userID && userID !== '0' ? encryptTea(userID) : undefined;\n const tenantIDEncrypt = tenantID && tenantID !== '0' ? encryptTea(tenantID) : undefined;\n\n window.collectEvent?.('init', {\n app_id: 788827,\n channel: 'cn',\n disable_auto_pv: false,\n enable_ab_test: false,\n enable_debug: false,\n enable_stay_duration: true, // 上报页面停留时间\n reportTime: 1000, // 事件上报异步队列的时间间隔\n });\n\n window.collectEvent?.('config', {\n user_unique_id: userIDEncrypt,\n device_type: isMobile() ? 'mobile' : 'pc',\n evtParams: {\n open_from: new URLSearchParams(window.location.search).get('open-from') ?? undefined,\n env: getEnv(),\n user_id: userIDEncrypt,\n tenant_id: tenantIDEncrypt,\n },\n });\n teaInstance = true;\n\n window.collectEvent?.('start');\n}\n\nexport const reportTeaEvent = async ({ trackKey, trackParams = {}}: TrackParams): Promise<void> => {\n try {\n if (!teaInstance) {\n teaInstance = true;\n await createTracker();\n }\n\n window.collectEvent?.(trackKey, trackParams);\n } catch (err) {\n // 静默,不影响业务\n console.error(err); // eslint-disable-line no-restricted-syntax\n }\n};\n","export const isIpad = (): boolean => {\n const _isIpad =\n /iPad|Tab|Tablet/i.test(navigator.userAgent) && navigator.maxTouchPoints && navigator.maxTouchPoints > 1;\n\n return Boolean(_isIpad);\n};\n\nexport const isMobile = (): boolean => {\n const isPhone =\n /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i.test(\n navigator.userAgent\n );\n\n return isPhone || isIpad();\n};\n\nexport const isIOS = (): boolean => {\n if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {\n return true;\n }\n return false;\n};\n","import { getAppId } from '../../../utils/getAppId';\nimport { getCsrfToken } from '../../../utils/getCsrfToken';\nimport { isNewPathEnabled } from '../../../utils/apiPath';\n\nexport async function getLarkUserInfo() {\n const appId = getAppId();\n if (!appId) {\n return {\n code: 1,\n msg: 'appId is required',\n data: {},\n };\n }\n\n const url = isNewPathEnabled()\n ? `/app/${appId}/__runtime__/api/v1/studio/lark/user_info`\n : `/spark/b/${appId}/lark/user_info`;\n\n const response = await fetch(url, {\n headers: {\n 'X-Suda-Csrf-Token': getCsrfToken() ?? '',\n },\n });\n\n return await response.json();\n}\n","export interface TrackParams {\n trackKey: TrackKey;\n trackParams?: Record<string, unknown>;\n}\n\nexport enum TrackKey {\n VIEW = 'aily_agent_artifact_page_view',\n}\n","import React from 'react';\n\nconst Welcome: React.FC<{\n title?: string;\n description?: string;\n}> = ({ title = '页面待开发', description = '页面暂未开发,请耐心等待...' }) => {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: 'calc(100vh - 64px)',\n padding: '0 24px',\n textAlign: 'center',\n }}\n >\n <img\n style={{ borderRadius: 6, marginBottom: 24 }}\n width=\"320\"\n height=\"200\"\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/miao/welcome.svg\"\n alt=\"Welcome\"\n />\n <div style={{ fontSize: 16, fontWeight: 500, lineHeight: '24px', marginBottom: 4, color: '#1f2329' }}>\n {title}\n </div>\n <div style={{ fontSize: 16, lineHeight: '24px', color: '#8f959e', maxWidth: 480 }}>\n {description}\n </div>\n </div>\n );\n};\n\nexport default Welcome;\n","import React from 'react';\n\nconst PagePlaceholder: React.FC<{\n title?: string;\n description?: string;\n}> = ({ title = '页面待开发', description = '页面暂未开发,请耐心等待...' }) => {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0 24px',\n width: '100%',\n height: 'calc(100vh - 64px)',\n textAlign: 'center',\n }}\n >\n <img\n style={{ borderRadius: '6px', marginBottom: '24px' }}\n width=\"320\"\n height=\"200\"\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/miao/welcome.svg\"\n alt=\"Welcome\"\n />\n <div style={{ fontSize: '16px', fontWeight: 500, marginBottom: '4px', lineHeight: '24px' }}>\n {title}\n </div>\n <div\n style={{\n color: '#6b7280',\n fontSize: '16px',\n lineHeight: '24px',\n maxWidth: '480px',\n overflow: 'hidden',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n }}\n >\n {description}\n </div>\n </div>\n );\n};\n\nexport default PagePlaceholder;\n","import React, { useEffect } from 'react';\nimport { logger } from '../../logger';\nimport { getHmrApi } from '../../utils/hmr-api';\nimport { submitPostMessage } from '../../utils/postMessage';\n\n/**\n * ErrorBoundary fallback 组件。\n *\n * 链路:业务代码 throw → react-error-boundary 捕获 → 渲染本组件\n * → submitPostMessage({ type: 'RenderError' }) 通知妙搭外壳\n * → logger.log meta.repairMessage 让外壳 sandbox-console 弹「一键修复」\n *\n * HMR 恢复策略按构建工具区分:\n * - **vite**: ErrorBoundary 状态下 React Refresh family map 找不到 fiber,\n * resetErrorBoundary 让 children 重新 mount 时 import 仍是旧引用 → 死循环。\n * vite 模式(检测到 window.__VITE_HMR__)必须 `window.location.reload()`\n * 才能让模块图完整重载(这是 vite 官方对 ErrorBoundary 场景的 recommended fallback)。\n * - **webpack/rspack**: 模块 cache 可被 HMR 直接替换,resetErrorBoundary 让 children\n * 重新 mount 时 import 拿到新版本 → 正常恢复,不需要 reload。\n */\nconst ErrorRender: React.FC<{\n error: unknown;\n resetErrorBoundary?: (...args: unknown[]) => void;\n}> = (props) => {\n const { error, resetErrorBoundary } = props;\n\n useEffect(() => {\n if (error) {\n submitPostMessage({\n type: 'RenderError',\n data: error,\n });\n logger.log({\n level: 'error',\n args: ['Render Error', error],\n meta: {\n type: 'render-error',\n repairMessage: '页面渲染时报错,请根据错误信息修复对应页面的代码',\n },\n });\n }\n }, [error]);\n\n useEffect(() => {\n if (!resetErrorBoundary) return;\n const hmr = getHmrApi();\n if (!hmr) return;\n\n return hmr.onSuccess(() => {\n // vite 下 ErrorBoundary 状态下模块图无法更新,必须整页 reload;\n // webpack/rspack 下 resetErrorBoundary 即可让 children 重新 mount 拿到新模块。\n const isVite =\n typeof window !== 'undefined' && Boolean(window.__VITE_HMR__);\n if (isVite) {\n window.location.reload();\n } else {\n resetErrorBoundary();\n }\n });\n }, [resetErrorBoundary]);\n\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-white\">\n <div className=\"flex flex-col justify-center items-center text-center\">\n <img\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/template/illustration_empty_negative_error.svg\"\n alt=\"render error\"\n className=\"mb-3 w-[100px]\"\n />\n <p className=\"text-l/[22px] text-[14px] text-[#1F2329] font-medium\">\n 页面出错了\n </p>\n </div>\n </div>\n );\n};\n\nexport default ErrorRender;\n","import React, { forwardRef, useEffect, useState } from 'react';\nimport { NavLink, type NavLinkProps } from 'react-router-dom';\n\nexport interface ActiveLinkProps extends Omit<NavLinkProps, 'to'> {\n to: string;\n}\n\n/**\n * ActiveLink 组件\n *\n * 替换 react-router-dom 的 NavLink,扩展支持 hash 路由跳转和激活态功能\n *\n * @example\n * // 普通路由跳转\n * <ActiveLink to=\"/dashboard\">Dashboard</ActiveLink>\n *\n * // hash 路由跳转\n * <ActiveLink to=\"#section1\">Section 1</ActiveLink>\n *\n * // 使用函数式 className 显示激活态\n * <ActiveLink\n * to=\"#features\"\n * className={({isActive}) => isActive ? 'active' : ''}\n * >\n * Features\n * </ActiveLink>\n */\n\nexport const ActiveLink = forwardRef<HTMLAnchorElement, ActiveLinkProps>(\n ({ to, onClick, className, style, children, ...rest }, ref) => {\n const [currentHash, setCurrentHash] = useState(() =>\n typeof window !== 'undefined' ? window.location.hash : ''\n );\n\n // 检测是否为 hash 路由\n const isHashRoute = typeof to === 'string' && to.startsWith('#');\n\n // 监听 hash 变化\n useEffect(() => {\n if (!isHashRoute) return;\n\n const handleHashChange = () => {\n setCurrentHash(window.location.hash);\n };\n\n window.addEventListener('hashchange', handleHashChange);\n return () => window.removeEventListener('hashchange', handleHashChange);\n }, [isHashRoute]);\n\n // 计算激活态\n const isActive = isHashRoute && currentHash === to;\n\n // 如果是普通路由,使用 NavLink\n if (!isHashRoute) {\n return (\n <NavLink\n ref={ref}\n to={to}\n onClick={onClick}\n className={className}\n style={style}\n {...rest}\n >\n {children}\n </NavLink>\n );\n }\n\n // 处理 hash 路由点击事件\n const handleHashClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n // 先调用用户自定义的 onClick\n onClick?.(e);\n\n // 如果用户在 onClick 中调用了 preventDefault,则不执行默认行为\n if (e.defaultPrevented) {\n return;\n }\n\n // 阻止默认的锚点跳转行为\n e.preventDefault();\n\n const targetId = to.slice(1); // \"#home\" -> \"home\"\n const targetElement = document.getElementById(targetId);\n\n // 使用 pushState 更新 URL,保留历史记录且避免浏览器默认的瞬间跳转\n history.pushState(null, '', to);\n\n // 立即更新内部状态以确保 UI 及时响应\n setCurrentHash(to);\n\n // 手动触发 hashchange 事件以通知其他组件\n window.dispatchEvent(new Event('hashchange'));\n\n // 平滑滚动到目标元素\n if (targetElement && typeof targetElement.scrollIntoView === 'function') {\n targetElement.scrollIntoView({ behavior: 'smooth' });\n }\n };\n\n // 处理 className(支持函数和字符串)\n const computedClassName =\n typeof className === 'function'\n ? className({ isActive, isPending: false, isTransitioning: false })\n : className;\n\n // 处理 style(支持函数和对象)\n const computedStyle =\n typeof style === 'function'\n ? style({ isActive, isPending: false, isTransitioning: false })\n : style;\n\n // 处理 children(支持函数和 ReactNode)\n const computedChildren =\n typeof children === 'function'\n ? children({ isActive, isPending: false, isTransitioning: false })\n : children;\n\n return (\n <a\n ref={ref}\n href={to}\n onClick={handleHashClick}\n className={computedClassName}\n style={computedStyle}\n {...rest}\n >\n {computedChildren}\n </a>\n );\n }\n);\n\nActiveLink.displayName = 'ActiveLink';\n","/* eslint-disable */\nimport * as React from 'react';\nimport {\n NavLink as OriginalNavLink,\n useLocation,\n useNavigate,\n type NavLinkProps,\n} from 'react-router-dom';\n\n/**\n * Enhanced NavLink component that extends react-router-dom's NavLink\n * with support for hash links (anchor navigation) and smooth scrolling.\n */\nconst NavLink = React.forwardRef<HTMLAnchorElement, NavLinkProps>(\n ({ to, children, className, style, ...props }, ref) => {\n const isHashLink = typeof to === 'string' && to.startsWith('#');\n const location = useLocation();\n const navigate = useNavigate();\n\n if (isHashLink) {\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n const element = document.querySelector(to as string);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth' });\n }\n navigate(to as string);\n };\n\n const isActive = location.hash === to;\n\n const renderProps = {\n isActive,\n isPending: false,\n isTransitioning: false,\n };\n\n const resolvedClassName =\n typeof className === 'function' ? className(renderProps) : className;\n const resolvedStyle =\n typeof style === 'function' ? style(renderProps) : style;\n\n const {\n caseSensitive,\n end,\n replace,\n state,\n preventScrollReset,\n relative,\n viewTransition,\n ...restProps\n } = props;\n\n return (\n <a\n href={to as string}\n onClick={handleClick}\n ref={ref}\n className={resolvedClassName}\n style={resolvedStyle}\n {...restProps}\n >\n {typeof children === 'function' ? children(renderProps) : children}\n </a>\n );\n }\n\n return (\n <OriginalNavLink\n to={to}\n ref={ref}\n className={className}\n style={style}\n onClick={() =>\n (document.getElementById('rootContainer') || window)?.scrollTo({\n top: 0,\n behavior: 'smooth',\n })\n }\n {...props}\n >\n {children}\n </OriginalNavLink>\n );\n },\n);\n\nNavLink.displayName = 'NavLink';\n\nexport { NavLink };\nexport type { NavLinkProps };\n","import React from 'react';\nimport { Link as RouterLink } from 'react-router-dom';\n\nexport interface UniversalLinkProps\n extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {\n /** 链接目标:内部路由、hash 锚点或外部 URL */\n to: string;\n}\n\n/** 是否为内部路由(非 hash、非外链) */\nfunction isInternalRoute(to: string): boolean {\n return !to.startsWith('#') && !to.startsWith('http://') && !to.startsWith('https://') && !to.startsWith('//');\n}\n\n/** 是否为外部链接 */\nfunction isExternalLink(to: string): boolean {\n return to.startsWith('http://') || to.startsWith('https://') || to.startsWith('//');\n}\n\n/**\n * 统一的链接组件,用于替换原生 <a> 标签\n * - 内部路由(/dashboard)→ react-router Link\n * - Hash 锚点(#section)→ <a>\n * - 外链(https://...)→ <a target=\"_blank\">\n */\nexport const UniversalLink = React.forwardRef<HTMLAnchorElement, UniversalLinkProps>(\n function UniversalLink({ to, ...props }, ref) {\n // 内部路由\n if (isInternalRoute(to)) {\n return <RouterLink to={to} ref={ref} {...props} />;\n }\n\n // Hash 链接 & 外部链接\n return (\n <a\n href={to}\n ref={ref}\n {...props}\n {...(isExternalLink(to) && {\n target: props.target ?? '_blank',\n rel: props.rel ?? 'noopener noreferrer',\n })}\n />\n );\n }\n);\n","import { getAppId } from './getAppId';\n\n/**\n * 获取当前 appId 对应的命名空间前缀\n * 格式:__miaoda_<appId>__:\n * 若 appId 为 null,则使用 __global__\n */\nfunction getPrefix(): string {\n const appId = getAppId();\n const namespace = appId || '__global__';\n return `__miaoda_${namespace}__:`;\n}\n\n/**\n * 获取当前 appId 范围内的所有 key(已去前缀)\n */\nfunction getScopedKeys(): string[] {\n const prefix = getPrefix();\n const keys: string[] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && key.startsWith(prefix)) {\n keys.push(key.substring(prefix.length));\n }\n }\n\n return keys;\n}\n\n/**\n * 按 appId 隔离的 localStorage 封装\n * API 与原生 localStorage 保持一致\n */\nexport const scopedStorage: Storage = {\n /**\n * 获取指定 key 的值\n */\n getItem(key: string): string | null {\n const prefixedKey = getPrefix() + key;\n return localStorage.getItem(prefixedKey);\n },\n\n /**\n * 设置指定 key 的值\n */\n setItem(key: string, value: string): void {\n const prefixedKey = getPrefix() + key;\n localStorage.setItem(prefixedKey, value);\n },\n\n /**\n * 删除指定 key\n */\n removeItem(key: string): void {\n const prefixedKey = getPrefix() + key;\n localStorage.removeItem(prefixedKey);\n },\n\n /**\n * 清空当前 appId 范围内的所有 key\n * 不影响其他 app 和无前缀的 key\n */\n clear(): void {\n const prefix = getPrefix();\n const keysToRemove: string[] = [];\n\n // 收集需要删除的 key\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && key.startsWith(prefix)) {\n keysToRemove.push(key);\n }\n }\n\n // 删除收集到的 key\n keysToRemove.forEach(key => localStorage.removeItem(key));\n },\n\n /**\n * 返回当前 appId 范围内第 index 个 key(去前缀后的原始 key)\n */\n key(index: number): string | null {\n const keys = getScopedKeys();\n return keys[index] || null;\n },\n\n /**\n * 返回当前 appId 范围内的 key 数量\n */\n get length(): number {\n return getScopedKeys().length;\n },\n};\n","/**\n * 复制字符串到剪切板\n * @param text 要复制的文本\n * @returns Promise<boolean> 复制是否成功\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n // 优先使用现代的 Clipboard API\n if (navigator.clipboard && window.isSecureContext) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n\n // 降级方案:使用传统的 execCommand 方法\n return fallbackCopyToClipboard(text);\n } catch (error) {\n // 执行navigator.clipboard.writeText失败时,降级方案\n return fallbackCopyToClipboard(text);\n }\n}\n\n/**\n * 降级复制方案(兼容旧浏览器)\n * @param text 要复制的文本\n * @returns boolean 复制是否成功\n */\nfunction fallbackCopyToClipboard(text: string): boolean {\n try {\n // 创建临时的 textarea 元素\n const textArea = document.createElement('textarea');\n textArea.value = text;\n\n // 设置样式,使其不可见\n textArea.style.position = 'fixed';\n textArea.style.left = '-999999px';\n textArea.style.top = '-999999px';\n textArea.setAttribute('readonly', '');\n\n // 添加到 DOM\n document.body.appendChild(textArea);\n\n // 选中文本\n textArea.focus();\n textArea.select();\n\n // 执行复制命令\n const successful = document.execCommand('copy');\n\n // 清理:移除临时元素\n document.body.removeChild(textArea);\n\n return successful;\n } catch (error) {\n console.error('降级复制方案失败:', error);\n return false;\n }\n}\n","import { normalizeBasePath } from './utils';\n\n/**\n * 确保路径包含 CLIENT_BASE_PATH 前缀\n */\nfunction ensureBasePath(pathname: string, basePath: string): string {\n if (!basePath) return pathname;\n if (pathname.startsWith(basePath)) return pathname;\n return `${basePath}${pathname.startsWith('/') ? '' : '/'}${pathname}`;\n}\n\n/**\n * 解析应用内路径,自动补全 CLIENT_BASE_PATH 前缀,返回完整 URL\n * 适用于生成分享链接、二维码等需要完整 URL 的场景\n *\n * - 相对路径:补全前缀 + 当前域名\n * - 当前域名的完整 URL:修正路径部分,补全前缀\n * - 其他域名的 URL:原样返回,不做处理\n *\n * @param path - 应用内相对路径或完整 URL\n * @returns 完整的 URL 字符串\n *\n * @example\n * // 假设 CLIENT_BASE_PATH = '/app/abc',当前域名为 https://example.com\n *\n * resolveAppUrl('/detail/123')\n * // => 'https://example.com/app/abc/detail/123'\n *\n * resolveAppUrl('https://example.com/detail/123')\n * // => 'https://example.com/app/abc/detail/123'\n *\n * resolveAppUrl('https://example.com/app/abc/detail/123')\n * // => 'https://example.com/app/abc/detail/123' (已有前缀,不重复添加)\n *\n * resolveAppUrl('https://other-site.com/page')\n * // => 'https://other-site.com/page' (非当前域名,原样返回)\n */\nexport function resolveAppUrl(path: string): string {\n const basePath = normalizeBasePath(process.env.CLIENT_BASE_PATH);\n\n // 尝试解析为完整 URL\n try {\n const url = new URL(path);\n // 非当前域名,原样返回\n if (url.origin !== window.location.origin) {\n return path;\n }\n // 当前域名,修正路径\n url.pathname = ensureBasePath(url.pathname, basePath);\n return url.toString();\n } catch {\n // 不是完整 URL,当作相对路径处理\n }\n\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const resolvedPath = ensureBasePath(normalizedPath, basePath);\n return `${window.location.origin}${resolvedPath}`;\n}\n","/**\n * @internal\n */\nexport function getEnvPath() {\n return window.IS_MIAODA_PREVIEW ? 'feida_preview' : 'feida_runtime';\n}\n","import axios, { AxiosInstance } from 'axios';\nimport { initAxiosConfig } from './axiosConfig';\n\nlet axiosInstance: AxiosInstance | undefined;\n\n/** 显示 toast 提示(兼容 PC/移动端) */\nfunction showToast(message: string, duration = 3000): Promise<void> {\n return new Promise(resolve => {\n const toast = document.createElement('div');\n\n const iconSvg = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8 1.333a6.667 6.667 0 1 1 0 13.334A6.667 6.667 0 0 1 8 1.333ZM8 10a.667.667 0 1 0 0 1.333A.667.667 0 0 0 8 10Zm0-5.333a.667.667 0 0 0-.667.666v3.334a.667.667 0 0 0 1.334 0V5.333A.667.667 0 0 0 8 4.667Z\" fill=\"#ff811a\"/>\n </svg>`;\n\n const iconWrapper = document.createElement('span');\n iconWrapper.innerHTML = iconSvg;\n Object.assign(iconWrapper.style, {\n display: 'flex',\n alignItems: 'center',\n marginRight: '8px',\n flexShrink: '0',\n });\n\n const textWrapper = document.createElement('span');\n textWrapper.textContent = message;\n\n toast.appendChild(iconWrapper);\n toast.appendChild(textWrapper);\n\n Object.assign(toast.style, {\n position: 'fixed',\n top: '20%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n display: 'flex',\n alignItems: 'center',\n padding: '12px 16px',\n backgroundColor: '#fff',\n color: '#1f2329',\n border: '1px solid #dee0e3',\n borderRadius: '6px',\n fontSize: '14px',\n lineHeight: '1.5',\n zIndex: '99999',\n maxWidth: '80vw',\n wordBreak: 'break-word',\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.03), 0 3px 6px rgba(0, 0, 0, 0.05), 0 6px 18px rgba(0, 0, 0, 0.03)',\n opacity: '0',\n transition: 'opacity 0.3s ease',\n });\n\n document.body.appendChild(toast);\n\n requestAnimationFrame(() => {\n toast.style.opacity = '1';\n });\n\n setTimeout(() => {\n toast.style.opacity = '0';\n setTimeout(() => {\n document.body.removeChild(toast);\n resolve();\n }, 300);\n }, duration);\n });\n}\n\ndeclare module 'axios' {\n export interface AxiosRequestConfig {\n meta?: {\n autoJumpToLogin?: boolean;\n };\n }\n}\n\n/** 获取axios实例 */\nexport function getAxiosForBackend() {\n if (!axiosInstance) {\n axiosInstance = axios.create({\n baseURL: process.env.CLIENT_BASE_PATH || '/',\n });\n axiosInstance.interceptors.response.use(\n null,\n err => {\n if (err.config.meta?.autoJumpToLogin !== false) {\n const loginUrl = err.response?.headers?.['x-login-url'];\n if (loginUrl) {\n showToast('需要登录后才能执行操作,将自动跳转登录页', 3000).then(() => {\n window.location.href = loginUrl;\n });\n }\n }\n return Promise.reject(err);\n });\n initAxiosConfig(axiosInstance);\n }\n return axiosInstance;\n}\n\nexport const axiosForBackend = getAxiosForBackend();\n","\nexport interface UrlParts {\n baseUrl: string;\n workspace: string;\n}\n\n/**\n * @internal\n */\nexport function splitWorkspaceUrl(fullUrl: string): UrlParts {\n try {\n // https://www.suda.com/suda/api/v1/workspaces/:workspace_id\n const url = new URL(fullUrl);\n const pathParts = url.pathname.split('/');\n\n // 找到 workspaces 位置\n const workspacesIndex = pathParts.findIndex(part => part === 'workspaces');\n if (workspacesIndex === -1) {\n throw new Error('Invalid workspace URL format');\n }\n\n const basePathParts = pathParts.slice(0, workspacesIndex);\n const workspace = pathParts[workspacesIndex + 1];\n\n return {\n baseUrl: `${url.origin}${basePathParts.join('/')}`,\n workspace,\n };\n } catch (error) {\n console.error('Error splitting workspace URL:', error);\n }\n return {\n baseUrl: fullUrl,\n // 兜底给一个,不要给空字符串,不然 createClient 都直接挂了,页面会白屏,体感不太好\n workspace: 'workspace',\n };\n}\n","import { splitWorkspaceUrl } from '../utils/url';\nimport { createClient } from '@lark-apaas/dataloom';\nimport { authClient } from '@lark-apaas/auth-sdk';\nimport { getAppId } from '../utils/getAppId';\nimport { getInitialInfo } from '../utils/getInitialInfo';\n\nconst createDataLoomClient = (url?: string, pat?: string) => {\n const { baseUrl } = url ? splitWorkspaceUrl(url) : { baseUrl: '' };\n const appId = getAppId() ?? '';\n return createClient(baseUrl, pat ?? '', {\n global: {\n enableDataloomLog: process.env.NODE_ENV !== 'production',\n requestRateLimit: process.env.NODE_ENV !== 'production' ? 100 : undefined,\n brandName: 'miaoda',\n appId,\n accountServices: {\n user: authClient.user,\n session: authClient.session,\n },\n },\n });\n};\n\nlet dataloom: ReturnType<typeof createDataLoomClient> | null = null;\n// 缓存进行中的 Promise,防止并发调用创建多个实例\nlet pendingPromise: Promise<ReturnType<typeof createDataLoomClient>> | null = null;\n\n/** 获取dataloom实例 */\nexport function getDataloom(): Promise<ReturnType<typeof createDataLoomClient>> {\n if (dataloom) {\n return Promise.resolve(dataloom);\n }\n if (pendingPromise) {\n return pendingPromise;\n }\n pendingPromise = getInitialInfo()\n .then(info => {\n const DATALOOM_CLIENT_URL = info?.app_runtime_extra?.url;\n const DATALOOM_PAT = info?.app_runtime_extra?.token;\n dataloom = createDataLoomClient(DATALOOM_CLIENT_URL, DATALOOM_PAT);\n return dataloom;\n })\n .finally(() => {\n pendingPromise = null;\n });\n return pendingPromise;\n}\n","import { createClient } from '@lark-apaas/client-capability';\nimport { normalizeBasePath } from '../utils/utils';\nimport { getAppId } from '../utils/getAppId';\nimport { logger } from '../logger';\nimport { showToast } from '../components/ui/toast';\nimport { t } from '../locales';\n\n/**\n * 调用平台 capability(插件能力)的客户端实例。\n *\n * 业务用法(**SDK 没有 invoke 方法,是 `load(id).call(action, params)`**):\n *\n * import { capabilityClient } from '@lark-apaas/client-toolkit-lite';\n *\n * // action 名取自 capability JSON 的 actions[].action 字段\n * const result = await capabilityClient\n * .load('text_to_image_quality_1')\n * .call('generateImage', { prompt: '一只猫' });\n *\n * 漏传 action 名(`call({ prompt: '...' })`)会把 params 对象当成 action 字符串,\n * 服务端拿到 `{ action: { prompt: '...' }, params: {} }` 后续校验失败。\n *\n * 是否启用 central 链路由 `MIAODA_APP_ARCH_TYPE` 环境变量决定,preset 编译期透传到\n * 浏览器侧的 `process.env.MIAODA_APP_ARCH_TYPE`:\n * - '2' / '3' / '4'(jsPage / SimpleHtml / Html,纯前端应用)→ 启用 central,\n * 走 plugin_server 4 端点(预览态 body 携带 capability config,运行态走中心 store)\n * - '1'(全栈)/ 未注入 / '0' → 不启用,走老 SDK 行为直接打用户应用\n *\n * 方案文档: https://bytedance.larkoffice.com/wiki/WtW5wJ7wli9BImkExyJcjR5znfx\n */\nconst _appId = getAppId();\n\n// preset 编译期 define 注入;undefined / '1' / '0' 都走老链路\nconst _archType = process.env.MIAODA_APP_ARCH_TYPE;\nconst _isFrontendOnly = _archType === '2' || _archType === '3' || _archType === '4';\n\nexport const capabilityClient = createClient({\n baseURL: normalizeBasePath(process.env.CLIENT_BASE_PATH ?? '/'),\n acquireUploadUrl: `/app/${_appId}/__runtime__/api/v1/studio/plugins/tmp_files/acquire_upload_url`,\n acquireDownloadUrl: `/app/${_appId}/__runtime__/api/v1/studio/plugins/tmp_files/acquire_download_url`,\n fetchOptions: {\n headers: {\n 'X-Suda-Csrf-Token':\n (window as { csrfToken?: string }).csrfToken ?? '',\n },\n },\n logger,\n onRateLimitError: () => {\n showToast(t('index.rateLimitError'));\n },\n ...(_isFrontendOnly\n ? {\n central: {\n enabled: true,\n // window.appId 由妙搭沙箱 / 线上环境注入;非妙搭场景下 capability 调用本身不可用\n appId: _appId ?? '',\n },\n }\n : {}),\n});\n","/** 显示 toast 提示(兼容 PC/移动端) */\nexport function showToast(message: string, duration = 3000): Promise<void> {\n return new Promise(resolve => {\n // 创建 toast 容器\n const toast = document.createElement('div');\n\n // 橙色警告图标 SVG\n const iconSvg = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8 1.333a6.667 6.667 0 1 1 0 13.334A6.667 6.667 0 0 1 8 1.333ZM8 10a.667.667 0 1 0 0 1.333A.667.667 0 0 0 8 10Zm0-5.333a.667.667 0 0 0-.667.666v3.334a.667.667 0 0 0 1.334 0V5.333A.667.667 0 0 0 8 4.667Z\" fill=\"#ff811a\"/>\n </svg>`;\n\n // 创建图标容器\n const iconWrapper = document.createElement('span');\n iconWrapper.innerHTML = iconSvg;\n Object.assign(iconWrapper.style, {\n display: 'flex',\n alignItems: 'center',\n marginRight: '8px',\n flexShrink: '0',\n });\n\n // 创建文字容器\n const textWrapper = document.createElement('span');\n textWrapper.textContent = message;\n\n toast.appendChild(iconWrapper);\n toast.appendChild(textWrapper);\n\n // 样式设置\n Object.assign(toast.style, {\n position: 'fixed',\n top: '32px',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n display: 'flex',\n alignItems: 'center',\n padding: '12px 16px',\n backgroundColor: '#fff',\n color: '#1f2329',\n border: '1px solid #dee0e3',\n borderRadius: '6px',\n fontSize: '14px',\n lineHeight: '1.5',\n zIndex: '99999',\n maxWidth: '80vw',\n wordBreak: 'break-word',\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.03), 0 3px 6px rgba(0, 0, 0, 0.05), 0 6px 18px rgba(0, 0, 0, 0.03)',\n opacity: '0',\n transition: 'opacity 0.3s ease',\n });\n\n document.body.appendChild(toast);\n\n // 淡入\n requestAnimationFrame(() => {\n toast.style.opacity = '1';\n });\n\n // 定时淡出并移除\n setTimeout(() => {\n toast.style.opacity = '0';\n setTimeout(() => {\n document.body.removeChild(toast);\n resolve();\n }, 300);\n }, duration);\n });\n}\n","import { observable } from '@lark-apaas/observable-web';\n\n/**\n * 核心 Trace 方法:用于执行并追踪异步函数。\n * 使用代理模式而非直接 bind,确保在调用时获取最新的 observable 实例状态。\n */\nexport const trace = (...args: Parameters<typeof observable.trace>) =>\n observable.trace(...args);\n\nexport default {\n trace,\n};\n","// 头像 Avatar 图\nexport const avatarImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/1.jpg';\nexport const avatarImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/2.jpg';\nexport const avatarImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/3.jpg';\nexport const avatarImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/4.jpg';\nexport const avatarImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/5.jpg';\nexport const avatarImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/6.jpg';\nexport const avatarImg7 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/7.jpg';\nexport const avatarImg8 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/8.jpg';\nexport const avatarImg9 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/9.jpg';\nexport const avatarImg10 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/10.jpg';\nexport const avatarImg11 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/11.jpg';\n","// Banner 图 technology 类型\nexport const techBannerImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/1.jpg';\nexport const techBannerImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/2.jpg';\nexport const techBannerImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/3.jpg';\nexport const techBannerImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/4.jpg';\nexport const techBannerImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/5.jpg';\nexport const techBannerImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/6.jpg';\nexport const techBannerImg7 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/7.jpg';\nexport const techBannerImg8 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/8.jpg';\n\n// Banner 图 professional 类型\nexport const professionalBannerImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/1.jpg';\nexport const professionalBannerImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/2.jpg';\nexport const professionalBannerImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/3.jpg';\nexport const professionalBannerImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/4.jpg';\nexport const professionalBannerImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/5.jpg';\nexport const professionalBannerImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/6.jpg';\nexport const professionalBannerImg7 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/7.jpg';\nexport const professionalBannerImg8 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/8.jpg';\n\n// Banner 图 minimalism 类型\nexport const minimalismBannerImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/1.jpg';\nexport const minimalismBannerImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/2.jpg';\nexport const minimalismBannerImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/3.jpg';\nexport const minimalismBannerImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/4.jpg';\nexport const minimalismBannerImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/5.jpg';\nexport const minimalismBannerImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/6.jpg';\nexport const minimalismBannerImg7 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/7.jpg';\nexport const minimalismBannerImg8 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/8.jpg';\n","// Cover 图 office\nexport const officeCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/1.jpg';\nexport const officeCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/2.jpg';\nexport const officeCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/3.jpg';\nexport const officeCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/4.jpg';\nexport const officeCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/5.jpg';\nexport const officeCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/6.jpg';\n\n// Cover 图 architecture\nexport const architectureCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/1.jpg';\nexport const architectureCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/2.jpg';\nexport const architectureCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/3.jpg';\nexport const architectureCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/4.jpg';\nexport const architectureCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/5.jpg';\nexport const architectureCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/6.jpg';\n\n// Cover 图 appeal-clothing\nexport const appealClothingCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/1.jpg';\nexport const appealClothingCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/2.jpg';\nexport const appealClothingCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/3.jpg';\nexport const appealClothingCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/4.jpg';\nexport const appealClothingCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/5.jpg';\nexport const appealClothingCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/6.jpg';\n\n// Cover 图 scenery\nexport const sceneryCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/1.jpg';\nexport const sceneryCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/2.jpg';\nexport const sceneryCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/3.jpg';\nexport const sceneryCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/4.jpg';\nexport const sceneryCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/5.jpg';\nexport const sceneryCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/6.jpg';\n\n// Cover 图 technology-internet\nexport const technologyInternetCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/1.jpg';\nexport const technologyInternetCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/2.jpg';\nexport const technologyInternetCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/3.jpg';\nexport const technologyInternetCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/4.jpg';\nexport const technologyInternetCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/5.jpg';\nexport const technologyInternetCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/6.jpg';\n\n// Cover 图 abstract-art-3d-rendering\nexport const abstractArt3dRenderingCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/1.jpg';\nexport const abstractArt3dRenderingCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/2.jpg';\nexport const abstractArt3dRenderingCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/3.jpg';\nexport const abstractArt3dRenderingCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/4.jpg';\nexport const abstractArt3dRenderingCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/5.jpg';\nexport const abstractArt3dRenderingCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/6.jpg';\n"],"mappings":"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X;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,cACX;AACK,IAAMC,cACX;;;ACtBF;;;;;;;;;;;;;;;;;;;;;;;;;;;AACO,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AAGK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AAGK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;;;ACpDF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACO,IAAMC,kBACX;AACK,IAAMC,kBACX;AACK,IAAMC,kBACX;AACK,IAAMC,kBACX;AACK,IAAMC,kBACX;AACK,IAAMC,kBACX;AAGK,IAAMC,wBACX;AACK,IAAMC,wBACX;AACK,IAAMC,wBACX;AACK,IAAMC,wBACX;AACK,IAAMC,wBACX;AACK,IAAMC,wBACX;AAGK,IAAMC,0BACX;AACK,IAAMC,0BACX;AACK,IAAMC,0BACX;AACK,IAAMC,0BACX;AACK,IAAMC,0BACX;AACK,IAAMC,0BACX;AAGK,IAAMC,mBACX;AACK,IAAMC,mBACX;AACK,IAAMC,mBACX;AACK,IAAMC,mBACX;AACK,IAAMC,mBACX;AACK,IAAMC,mBACX;AAGK,IAAMC,8BACX;AACK,IAAMC,8BACX;AACK,IAAMC,8BACX;AACK,IAAMC,8BACX;AACK,IAAMC,8BACX;AACK,IAAMC,8BACX;AAGK,IAAMC,kCACX;AACK,IAAMC,kCACX;AACK,IAAMC,kCACX;AACK,IAAMC,kCACX;AACK,IAAMC,kCACX;AACK,IAAMC,kCACX;","names":["NavLink","import_react","window","process","env","NODE_ENV","__REACT_DEVTOOLS_GLOBAL_HOOK__","renderers","Map","supportsFiber","inject","renderer","id","size","set","onCommitFiberRoot","onCommitFiberUnmount","hook","originalInject","bind","has","getCsrfToken","cookieName","cookies","document","cookie","split","name","value","decodeURIComponent","window","csrfToken","initAxiosConfig","axiosInstance","axios","interceptors","request","use","config","csrfToken","getCsrfToken","headers","window","location","pathname","error","Promise","reject","response","process","env","NODE_ENV","console","warn","method","toUpperCase","url","message","isNewPathEnabled","basePath","process","env","CLIENT_BASE_PATH","test","initObservable","appId","window","observable","start","serviceName","env","process","NODE_ENV","AppEnv","Dev","Prod","collectorUrl","isNewPathEnabled","log","trace","metric","time","error","console","import_observable_web","createWebpackHmrApi","hot","onSuccess","callback","lastStatus","handler","status","e","console","error","addStatusHandler","removeStatusHandler","onError","Error","getHmrApi","process","env","NODE_ENV","webpackHot","module","window","__VITE_HMR__","PARENT_ORIGIN_KEY","getParentOriginFromParams","params","URLSearchParams","window","location","search","origin","get","sessionStorage","setItem","getItem","undefined","getLegacyParentOrigin","includes","resolveParentOrigin","document","referrer","referrerOrigin","URL","startsWith","paramOrigin","process","env","FORCE_FRAMEWORK_DOMAIN_MAIN","submitPostMessage","message","targetOrigin","parentOrigin","parent","postMessage","e","console","error","LOG_LEVELS","isLogLevel","value","includes","devServerDisconnectInfo","retryCount","processDevServerLog","log","devFlag","includes","time","Date","now","submitPostMessage","type","data","status","slardar","sendEvent","name","metrics","categories","hmrFlag","startTime","duration","listenModuleHmr","hmr","getHmrApi","onSuccess","onError","error","console","warn","String","PROXY_CONSOLE_METHOD","interceptErrors","window","addEventListener","event","logger","reason","forEach","method","originalMethod","args","level","first","startsWith","isLogLevel","safeStringify","obj","seen","Set","JSON","stringify","_key","value","has","add","toString","Date","toISOString","Map","Object","fromEntries","Array","from","Error","name","message","stack","clear","processLogParams","args","map","arg","String","mapLogLevel","level","BatchLogger","config","logQueue","flushTimer","isProcessing","originConsole","console","userId","tenantId","appId","window","endpoint","process","env","CLIENT_BASE_PATH","sizeThreshold","flushInterval","maxRetries","retryDelay","headers","startFlushTimer","setupBeforeUnloadHandler","batchLog","level","message","source","logEntry","id","generateId","timestamp","Date","now","push","length","flush","logsToSend","splice","sendBatch","error","unshift","logs","collectLogs","map","log","time","toISOString","user_id","tenant_id","app_id","retries","execFetch","method","body","JSON","stringify","warn","delay","url","options","fetch","clearInterval","setInterval","addEventListener","finally","destroy","ms","Promise","resolve","setTimeout","Math","random","toString","substr","getQueueSize","updateConfig","newConfig","defaultBatchLogger","batchLogInfo","level","message","source","defaultBatchLogger","batchLog","shouldEnableBatchLogger","process","env","NODE_ENV","window","MIAODA_APP_TYPE","defaultBatchLogger","BatchLogger","console","mapStacktrace","stacktrace","map","frame","functionName","fileName","lineNumber","columnNumber","reportStacktraceParseError","e","context","window","parent","submitPostMessage","type","payload","error","Error","message","String","getStacktrace","StackTrace","get","errorReplacer","_key","value","stack","name","generateLogId","crypto","randomUUID","Date","now","Math","random","toString","slice","lastLogInfo","sendSelectedLog","logWithoutID","log","id","newParts","i","args","length","item","newError","meta","fromError","push","frames","firstFrameIndex","findIndex","includes","skipFrame","undefined","logJSON","JSON","stringify","logForDedup","logContentForDedup","content","count","isDuplicate","duplicateCount","duplicateOfId","updatedJSON","batchLogInfo","sendTypedLogV2","logWithMeta","level","typedLogInterceptor","originLogger","debug","info","warn","success","interceptors","shouldReportToObservable","process","env","NODE_ENV","ORDERED_LEVELS","defaultConfig","showLevel","showTimestamp","level","prefix","config","configureLogger","options","shouldLog","indexOf","getFormattedPrefix","parts","push","toUpperCase","logger","debug","message","args","console","log","info","observable","processLogParams","join","warn","error","success","mapLogLevel","window","__RUNTIME_LOGGER__","get","interceptor","interceptors","interceptLogs","clsxWithTw","inputs","twMerge","clsx","isPreview","window","IS_MIAODA_PREVIEW","normalizeBasePath","basePath","replace","getWsPath","rawBasePath","process","env","CLIENT_BASE_PATH","normalizedBasePath","startsWith","basePathWithoutTrailingSlash","endsWith","slice","isSparkRuntime","_IS_Spark_RUNTIME","runtimeMode","getRoutes","routes","path","basePath","normalizeBasePath","process","env","CLIENT_BASE_PATH","res","fetch","json","error","console","warn","childApi","updateAppInfo","appInfo","dispatchEvent","CustomEvent","detail","connectParent","submitPostMessage","type","data","batchLogInfo","JSON","stringify","timestamp","Date","now","url","window","location","href","parentOrigin","resolveParentOrigin","connection","connectToParent","methods","childApi","promise","initIframeBridge","parent","window","__FULLSTACK_RUNTIME_INITIALIZED__","initAxiosConfig","initObservable","process","env","NODE_ENV","initIframeBridge","import_react","getAppId","windowAppId","window","appId","getEnv","globalThis","ENVIRONMENT","origin","window","location","includes","getAppPublished","headers","window","token","MIAODA_BUILTIN_TTT","getCsrfToken","appId","getAppId","path","isNewPathEnabled","url","location","origin","response","fetch","method","credentials","res","json","code","status_code","data","console","error","undefined","initialInfo","pendingPromise","getInitialInfo","refresh","Promise","resolve","then","info","_bucket_id","app_runtime_extra","bucket","default_bucket_id","finally","fetchTenantInfo","appId","getAppId","path","isNewPathEnabled","response","fetch","window","location","origin","method","headers","getCsrfToken","credentials","res","json","data","undefined","tenantInfo","pendingPromise","getTenantInfo","Promise","resolve","then","info","finally","getAppInfo","refresh","appInfo","window","_appInfo","undefined","isSparkRuntime","info","getInitialInfo","app_info","name","app_name","avatar","app_avatar","description","app_description","trim","useAppInfo","appInfo","setAppInfo","useState","useEffect","updateDomInfo","info","name","document","title","meta","querySelector","content","avatar","link","createElement","rel","head","appendChild","href","description","metaDom","handleMetaInfoChanged","refresh","getAppInfo","prev","undefined","onUpdate","e","detail","window","addEventListener","removeEventListener","appName","appLogo","import_react","getCurrentUserProfile","window","_userInfo","getNameFromArray","nameArray","length","undefined","chineseName","find","item","language_code","text","getCompatibilityUserProfile","userInfo","getCurrentUserProfile","userName","name","userAvatar","avatar","useCurrentUserProfile","setUserInfo","useState","useEffect","cancelled","fetchAndSetUserInfo","result","authClient","session","getUserInfo","info","data","user_info","newUserInfo","user_id","toString","email","image","large","process","env","NODE_ENV","console","log","handleMetaInfoChanged","isSparkRuntime","window","addEventListener","removeEventListener","import_react","MOBILE_BREAKPOINT","useIsMobile","isMobile","setIsMobile","React","useState","window","innerWidth","useEffect","handleResize","debouncedHandleResize","debounce","addEventListener","removeEventListener","cancel","import_react","import_auth_sdk","useLogout","isLoading","setIsLoading","useState","handlerLogout","process","env","NODE_ENV","console","log","authClient","session","signOut","error","messages","zh","en","STORAGE_KEY","toLocale","value","lang","toLowerCase","startsWith","readLocaleFromQuery","window","URLSearchParams","location","search","get","length","readLocaleFromStorage","localStorage","getItem","writeLocaleToStorage","setItem","getLocale","process","env","NODE_ENV","navigator","language","fromQuery","fromStorage","t","key","params","locale","getLocale","entry","messages","text","zh","k","v","Object","entries","replace","resetBase","boxSizing","margin","padding","border","background","font","color","textAlign","textDecoration","textTransform","letterSpacing","wordSpacing","lineHeight","verticalAlign","listStyle","FONT_FAMILY","Z_BADGE","Z_OVERLAY","LOGO_URL","getCoverUrl","t","getCoverMobileUrl","ICON_COMPANY_URL","ICON_AI_URL","ICON_FEEDBACK_URL","LANDING_URL","REPORT_DOMAIN","BOE","PRE","ONLINE","openReport","params","JSON","stringify","scene","entity_id","getAppId","entity_type","extra","url","getEnv","encodeURIComponent","window","open","badgeBase","position","display","alignItems","gap","boxShadow","borderRadius","fontFamily","fontSize","zIndex","cursor","badgeDesktop","right","bottom","badgeMobile","logoStyle","flexShrink","width","height","badgeTextStyle","popoverContent","overflow","popoverInner","flexDirection","popoverCover","popoverBody","justifyContent","infoRow","alignSelf","infoIcon","infoIconMobile","infoText","btnRow","btnBase","flex","borderWidth","borderStyle","borderColor","transition","btnHovered","overlayStyle","inset","sheetContent","outline","sheetInner","sheetCloseBtn","top","left","sheetCover","sheetBody","sheetInfoText","mobileBtnRow","mobileBtnBase","mobileBtnOutline","mobileBtnFilled","HoverButton","style","onClick","children","rest","hovered","setHovered","useState","React","div","onMouseEnter","onMouseLeave","XIcon","svg","xmlns","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","path","d","Safety","HasClosedKey","visible","setVisible","localStorage","getItem","setOpen","isMobile","useIsMobile","userinfo","setUserinfo","isInternetVisible","setIsInternetVisible","showBadge","setShowBadge","badgeLoaded","setBadgeLoaded","timeoutRef","useRef","useEffect","process","env","NODE_ENV","getTenantInfo","then","data","tenant_info","is_internet_visible","catch","getInitialInfo","info","badge","app_info","show_badge","finally","link","document","createElement","rel","as","href","head","appendChild","Root","onOpenChange","Trigger","asChild","img","src","p","minWidth","Portal","Overlay","Content","aria-describedby","undefined","Title","clip","alt","name","data-custom-element","textUnderlineOffset","e","stopPropagation","preventDefault","setTimeout","setItem","current","clearTimeout","side","align","sideOffset","import_react","PopoverPrimitive","CDN","DOUBAO_LOGO_SRC","DOUBAO_PILL_MOBILE_PNG","DOUBAO_SOURCE","REPORT_ENABLED","BRAND_TEXT","POWERED_BY_TEXT","FONT_FAMILY","PILL_SHADOW","CARD_SHADOW","reportDomainByEnv","env","openDoubaoReport","params","JSON","stringify","scene","entity_id","getAppId","entity_type","extra","domain","process","FORCE_FRAMEWORK_ENVIRONMENT","url","encodeURIComponent","window","open","FeedbackIcon","React","svg","width","height","viewBox","fill","xmlns","style","display","flexShrink","path","d","CloseIcon","size","Avatar","img","src","DOUBAO_LOGO_SRC","alt","maxWidth","maxHeight","borderRadius","Pill","variant","onClose","isDesktop","div","boxSizing","alignItems","gap","padding","background","border","boxShadow","cursor","span","fontFamily","fontSize","lineHeight","color","whiteSpace","role","aria-label","onClick","e","stopPropagation","MenuRow","icon","label","hover","setHover","useState","data-label","onMouseEnter","onMouseLeave","MenuCard","items","footerFontSize","minWidth","flexDirection","overflow","outline","length","map","it","key","MobileWatermark","onDontShow","setOpen","push","Root","onOpenChange","Trigger","asChild","data-custom-element","position","right","bottom","zIndex","DOUBAO_PILL_MOBILE_PNG","pointerEvents","Portal","Content","side","align","sideOffset","Watermark","closed","setClosed","timer","useRef","isMobile","useIsMobile","String","MIAODA_APP_SOURCE","enter","current","clearTimeout","leave","setTimeout","desktopItems","import_react","defaultQueryClient","getDefaultQueryClient","QueryClient","defaultOptions","queries","retry","refetchOnWindowFocus","mutations","QueryProvider","children","client","qc","React","QueryClientProvider","import_react","import_react","useUpdatingRef","value","ref","useRef","current","RouteMessageType","isRouteMessageType","type","Object","values","includes","IframeBridge","location","useLocation","navigate","useNavigate","navigateRef","useUpdatingRef","isActive","useRef","historyBack","useCallback","_payload","current","historyForward","operatorMessage","useMemo","useEffect","submitPostMessage","data","handleMessage","event","window","addEventListener","removeEventListener","createElement","style","display","isIpad","_isIpad","test","navigator","userAgent","maxTouchPoints","Boolean","isMobile","isPhone","isIOS","getLarkUserInfo","appId","getAppId","code","msg","data","url","isNewPathEnabled","response","fetch","headers","getCsrfToken","json","saltA","saltB","encryptTea","message","msgString","String","sha1","md5","toString","teaInstance","createTracker","data","getLarkUserInfo","tenantID","userID","userIDEncrypt","undefined","tenantIDEncrypt","window","collectEvent","app_id","channel","disable_auto_pv","enable_ab_test","enable_debug","enable_stay_duration","reportTime","user_unique_id","device_type","isMobile","evtParams","open_from","URLSearchParams","location","search","get","env","getEnv","user_id","tenant_id","reportTeaEvent","trackKey","trackParams","err","console","error","TrackKey","AppContainer","children","useAppInfo","useEffect","process","env","NODE_ENV","reportTeaEvent","trackKey","TrackKey","VIEW","trackParams","artifact_uid","getAppId","agent_id","url","window","location","href","React","String","MIAODA_APP_TYPE","Safety","MiaodaInspector","IframeBridge","Watermark","QueryProvider","import_react","Welcome","title","description","React","div","style","display","flexDirection","alignItems","justifyContent","width","height","padding","textAlign","img","borderRadius","marginBottom","src","alt","fontSize","fontWeight","lineHeight","color","maxWidth","import_react","PagePlaceholder","title","description","React","div","style","display","flexDirection","alignItems","justifyContent","padding","width","height","textAlign","img","borderRadius","marginBottom","src","alt","fontSize","fontWeight","lineHeight","color","maxWidth","overflow","WebkitLineClamp","WebkitBoxOrient","import_react","ErrorRender","props","error","resetErrorBoundary","useEffect","submitPostMessage","type","data","logger","log","level","args","meta","repairMessage","hmr","getHmrApi","onSuccess","isVite","window","Boolean","__VITE_HMR__","location","reload","React","div","className","img","src","alt","p","import_react","import_react_router_dom","ActiveLink","forwardRef","to","onClick","className","style","children","rest","ref","currentHash","setCurrentHash","useState","window","location","hash","isHashRoute","startsWith","useEffect","handleHashChange","addEventListener","removeEventListener","isActive","React","NavLink","handleHashClick","e","defaultPrevented","preventDefault","targetId","slice","targetElement","document","getElementById","history","pushState","dispatchEvent","Event","scrollIntoView","behavior","computedClassName","isPending","isTransitioning","computedStyle","computedChildren","a","href","displayName","React","import_react_router_dom","NavLink","React","forwardRef","to","children","className","style","props","ref","isHashLink","startsWith","location","useLocation","navigate","useNavigate","handleClick","e","preventDefault","element","document","querySelector","scrollIntoView","behavior","isActive","hash","renderProps","isPending","isTransitioning","resolvedClassName","resolvedStyle","caseSensitive","end","replace","state","preventScrollReset","relative","viewTransition","restProps","a","href","onClick","OriginalNavLink","getElementById","window","scrollTo","top","displayName","import_react","import_react_router_dom","isInternalRoute","to","startsWith","isExternalLink","UniversalLink","React","forwardRef","props","ref","RouterLink","a","href","target","rel","getPrefix","appId","getAppId","namespace","getScopedKeys","prefix","keys","i","localStorage","length","key","startsWith","push","substring","scopedStorage","getItem","prefixedKey","setItem","value","removeItem","clear","keysToRemove","forEach","index","copyToClipboard","text","navigator","clipboard","window","isSecureContext","writeText","fallbackCopyToClipboard","error","textArea","document","createElement","value","style","position","left","top","setAttribute","body","appendChild","focus","select","successful","execCommand","removeChild","console","ensureBasePath","pathname","basePath","startsWith","resolveAppUrl","path","normalizeBasePath","process","env","CLIENT_BASE_PATH","url","URL","origin","window","location","toString","normalizedPath","resolvedPath","getEnvPath","window","IS_MIAODA_PREVIEW","import_axios","axiosInstance","showToast","message","duration","Promise","resolve","toast","document","createElement","iconSvg","iconWrapper","innerHTML","Object","assign","style","display","alignItems","marginRight","flexShrink","textWrapper","textContent","appendChild","position","top","left","transform","padding","backgroundColor","color","border","borderRadius","fontSize","lineHeight","zIndex","maxWidth","wordBreak","boxShadow","opacity","transition","body","requestAnimationFrame","setTimeout","removeChild","getAxiosForBackend","axios","create","baseURL","process","env","CLIENT_BASE_PATH","interceptors","response","use","err","config","meta","autoJumpToLogin","loginUrl","headers","then","window","location","href","reject","initAxiosConfig","axiosForBackend","splitWorkspaceUrl","fullUrl","url","URL","pathParts","pathname","split","workspacesIndex","findIndex","part","Error","basePathParts","slice","workspace","baseUrl","origin","join","error","console","import_auth_sdk","createDataLoomClient","url","pat","baseUrl","splitWorkspaceUrl","appId","getAppId","createClient","global","enableDataloomLog","process","env","NODE_ENV","requestRateLimit","undefined","brandName","accountServices","user","authClient","session","dataloom","pendingPromise","getDataloom","Promise","resolve","getInitialInfo","then","info","DATALOOM_CLIENT_URL","app_runtime_extra","DATALOOM_PAT","token","finally","showToast","message","duration","Promise","resolve","toast","document","createElement","iconSvg","iconWrapper","innerHTML","Object","assign","style","display","alignItems","marginRight","flexShrink","textWrapper","textContent","appendChild","position","top","left","transform","padding","backgroundColor","color","border","borderRadius","fontSize","lineHeight","zIndex","maxWidth","wordBreak","boxShadow","opacity","transition","body","requestAnimationFrame","setTimeout","removeChild","_appId","getAppId","_archType","process","env","MIAODA_APP_ARCH_TYPE","_isFrontendOnly","capabilityClient","createClient","baseURL","normalizeBasePath","CLIENT_BASE_PATH","acquireUploadUrl","acquireDownloadUrl","fetchOptions","headers","window","csrfToken","logger","onRateLimitError","showToast","t","central","enabled","appId","import_observable_web","trace","args","observable","avatarImg1","avatarImg2","avatarImg3","avatarImg4","avatarImg5","avatarImg6","avatarImg7","avatarImg8","avatarImg9","avatarImg10","avatarImg11","techBannerImg1","techBannerImg2","techBannerImg3","techBannerImg4","techBannerImg5","techBannerImg6","techBannerImg7","techBannerImg8","professionalBannerImg1","professionalBannerImg2","professionalBannerImg3","professionalBannerImg4","professionalBannerImg5","professionalBannerImg6","professionalBannerImg7","professionalBannerImg8","minimalismBannerImg1","minimalismBannerImg2","minimalismBannerImg3","minimalismBannerImg4","minimalismBannerImg5","minimalismBannerImg6","minimalismBannerImg7","minimalismBannerImg8","officeCoverImg1","officeCoverImg2","officeCoverImg3","officeCoverImg4","officeCoverImg5","officeCoverImg6","architectureCoverImg1","architectureCoverImg2","architectureCoverImg3","architectureCoverImg4","architectureCoverImg5","architectureCoverImg6","appealClothingCoverImg1","appealClothingCoverImg2","appealClothingCoverImg3","appealClothingCoverImg4","appealClothingCoverImg5","appealClothingCoverImg6","sceneryCoverImg1","sceneryCoverImg2","sceneryCoverImg3","sceneryCoverImg4","sceneryCoverImg5","sceneryCoverImg6","technologyInternetCoverImg1","technologyInternetCoverImg2","technologyInternetCoverImg3","technologyInternetCoverImg4","technologyInternetCoverImg5","technologyInternetCoverImg6","abstractArt3dRenderingCoverImg1","abstractArt3dRenderingCoverImg2","abstractArt3dRenderingCoverImg3","abstractArt3dRenderingCoverImg4","abstractArt3dRenderingCoverImg5","abstractArt3dRenderingCoverImg6"]}
|