@lark-apaas/client-toolkit-lite 1.1.35 → 1.1.36-beta.0
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 +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +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/watermark-variant.ts","../src/components/AppContainer/Watermark.tsx","../src/components/AppContainer/doubao-watermark-asset.ts","../src/utils/getAppId.ts","../src/utils/getEnv.ts","../src/utils/getInitialInfo.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/components/AppContainer/standalone.ts","../src/components/QueryProvider/index.tsx","../src/components/AppContainer/IframeBridge.tsx","../src/hooks/useUpdatingRef.ts","../src/components/AppContainer/use-page-screenshot.ts","../src/components/AppContainer/utils/tea.ts","../src/utils/deviceType.ts","../src/components/AppContainer/utils/getLarkUser.ts","../src/components/AppContainer/utils/slardar.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/integrations/dataloom.ts","../src/integrations/capabilityClient.ts","../src/components/ui/toast.tsx","../src/locales/messages.ts","../src/utils/locale.ts","../src/locales/index.ts","../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 Watermark from './Watermark';\nimport { isStandaloneBuild } from './standalone';\nimport QueryProvider from '../QueryProvider';\nimport IframeBridge from './IframeBridge';\nimport { usePageScreenshot } from './use-page-screenshot';\nimport { useAppInfo } from '../../hooks';\nimport { reportTeaEvent } from './utils/tea';\nimport { reportAppFirstRender } from './utils/slardar';\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 usePageScreenshot();\n\n const standalone = isStandaloneBuild();\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 reportAppFirstRender();\n }\n }, []);\n\n return (\n <>\n {!standalone && <Watermark />}\n {process.env.NODE_ENV !== 'production' && <MiaodaInspector />}\n {process.env.NODE_ENV !== 'production' && <IframeBridge />}\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 // 检测断连。Vite 的文案:\n // 首次建链失败 → `[vite] WebSocket closed without opened.`\n // 连上后断线 → `[vite] server connection lost. Polling for restart...`\n const viteConnectFailed = log.includes('WebSocket closed without opened');\n const viteConnectionLost = log.includes('server connection lost');\n if (\n devFlag &&\n (log.includes('Disconnected') || viteConnectFailed || viteConnectionLost)\n ) {\n // Vite 的建链失败日志由 watchdog 心跳(5s/次)反复触发,断连态内只上报一次\n if (devServerDisconnectInfo) return;\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 // 仅 Vite:close 分支由 isOpened 区分两种情况。首次建链失败须手动刷新才恢复,\n // 断线有探活轮询多数能自愈,分开统计\n ...(viteConnectFailed\n ? { reason: 'connect-failed' }\n : viteConnectionLost\n ? { reason: 'connection-lost' }\n : {}),\n },\n });\n return;\n }\n // 带结尾句号,避开 `[vite] connected from window` 和 'disconnected'\n const viteConnected = log.includes('[vite] connected.');\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 viteConnected))\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 // 仅 Vite:`[vite] connected.` 在连接建立时打,duration 是真实重连耗时。\n // 聚合 duration 时按本字段筛选\n ...(viteConnected ? { reason: 'connected' } : {}),\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 断连/重连。Vite 走 `console.error('[vite]', err)`,\n // 错误内容在 args[1],合并所有参数后再匹配\n if (typeof first === 'string') {\n processDevServerLog(\n args\n .map((a) =>\n typeof a === 'string' ? a : a instanceof Error ? a.message : ''\n )\n .join(' ')\n );\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\nexport function 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 参数传入(兼容豆包链路 parentOrigin 后门)\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 \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\nfunction getBrowserTransportLevel(level: LogWithMeta['level']): LogWithMeta['level'] {\n return level === 'success' ? 'info' : level;\n}\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(getBrowserTransportLevel(log.level), 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(getBrowserTransportLevel(log.level), 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","/** 保留既有 Source 判断,CreatedVia 补充豆包创建来源。 */\nexport function getWatermarkVariant(\n source: unknown,\n createdVia: string | undefined\n): 'doubao' | 'miaoda' {\n const origin = (createdVia ?? '').trim().toLowerCase();\n return String(source) === '5' ||\n origin === 'doubao' ||\n origin.startsWith('doubao_')\n ? 'doubao'\n : 'miaoda';\n}\n\n/** 新 SDK 搭配旧 preset 时,新变量可能未被替换,浏览器也可能没有 process。 */\nexport function readWatermarkCreatedVia(): string | undefined {\n try {\n // 保持直接访问,供 Vite / Rspack 的 define 在构建时替换。\n return process.env.MIAODA_APP_CREATED_VIA;\n } catch {\n return undefined;\n }\n}\n","import { getWatermarkVariant, readWatermarkCreatedVia } from './watermark-variant';\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { DOUBAO_LOGO_SRC, DOUBAO_BRAND_TEXT_SRC, MIAODA_LOGO_SRC } from './doubao-watermark-asset';\nimport { getAppId } from '../../utils/getAppId';\nimport { getEnv } from '../../utils/getEnv';\nimport { getInitialInfo } from '../../utils/getInitialInfo';\nimport { useIsMobile } from '../../hooks';\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\n// ── variant 配置 ───────────────────────────────────────────────────\n\ntype WatermarkVariant = 'doubao' | 'miaoda';\n\nconst VARIANT: WatermarkVariant = getWatermarkVariant(\n process.env.MIAODA_APP_SOURCE,\n readWatermarkCreatedVia(),\n);\n\nconst VARIANT_CONFIG = {\n doubao: {\n brandText: '豆包工作 AI 生成',\n logoSrc: DOUBAO_LOGO_SRC,\n downloadUrl: 'https://ugapk.com/FCtLH',\n },\n miaoda: {\n brandText: '妙搭生成',\n logoSrc: MIAODA_LOGO_SRC,\n landingUrl: 'https://miaoda.feishu.cn/landing',\n },\n} as const;\n\nconst REPORT_ENABLED = true;\nconst FONT_FAMILY = \"'PingFang SC', -apple-system, BlinkMacSystemFont, sans-serif\";\nconst DOUBAO_FONT_FAMILY = \"'Doubao Sans', 'PingFang SC', -apple-system, BlinkMacSystemFont, sans-serif\";\n\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\nconst HOST_TAG = 'miaoda-watermark';\n\n// ── 举报链接 ────────────────────────────────────────────────────\n\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 if (env) return 'tns.feishu.cn';\n const runtimeEnv = getEnv();\n if (runtimeEnv === 'BOE') return 'tns.feishu-boe.cn';\n if (runtimeEnv === 'PRE') return 'tns.feishu-pre.cn';\n return 'tns.feishu.cn';\n};\n\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 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// ── icon 组件 ───────────────────────────────────────────────────\n\nexport const FeedbackIcon: React.FC = () => (\n <svg width={16} height={16} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ display: 'block', flexShrink: 0 }}>\n <path 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\" fill=\"currentColor\" />\n <path 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\" fill=\"currentColor\" />\n <path 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\" fill=\"currentColor\" />\n <path 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\" fill=\"currentColor\" />\n <path 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\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const CloseIcon: React.FC<{ size: number }> = ({ size }) => (\n <svg width={size} height={size} viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ display: 'block', flexShrink: 0 }}>\n <path 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\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const DownloadIcon: React.FC = () => (\n <svg width={16} height={16} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ display: 'block', flexShrink: 0 }}>\n <path d=\"M11.9922 1.99221C12.5445 1.98895 12.9958 2.43407 12.999 2.98634L13.0762 16.1943L14.6387 14.6328L17.8926 11.3789C18.2831 10.9884 18.9171 10.9885 19.3076 11.3789C19.6977 11.7695 19.6979 12.4026 19.3076 12.793L16.0527 16.0479L12.7979 19.3018C12.7111 19.3884 12.6098 19.4566 12.5 19.5059H20.375C20.9271 19.5059 21.3748 19.9538 21.375 20.5059C21.375 21.0581 20.9273 21.5059 20.375 21.5059H3.625C3.07272 21.5059 2.625 21.0581 2.625 20.5059C2.62523 19.9538 3.07286 19.5059 3.625 19.5059H11.6816C11.572 19.4566 11.4704 19.3884 11.3838 19.3018L4.87402 12.793C4.48372 12.4026 4.4839 11.7694 4.87402 11.3789C5.26452 10.9884 5.89756 10.9885 6.28809 11.3789L11.0762 16.166L10.999 2.99806C10.9958 2.44603 11.4402 1.99582 11.9922 1.99221Z\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const EfficiencyIcon: React.FC = () => (\n <svg width={16} height={16} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ display: 'block', flexShrink: 0 }}>\n <path d=\"M2.0754 7.57153C2.23188 9.44922 3.49231 11.053 5.27982 11.6488C5.31351 11.6601 5.33994 11.6865 5.35117 11.7202L5.72076 12.8289C5.88752 13.3292 6.3557 13.6667 6.88304 13.6667H9.11696C9.6443 13.6667 10.1125 13.3292 10.2792 12.8289L10.6488 11.7202C10.6601 11.6865 10.6865 11.6601 10.7202 11.6488C12.5077 11.053 13.7681 9.44922 13.9246 7.57153L14 6.66667C14 3.35296 11.3137 0.666668 8 0.666668C4.68629 0.666668 2 3.35296 2 6.66667L2.0754 7.57153ZM9.38392 11.2985L9.03899 12.3333H6.96101L6.61608 11.2985C6.47214 10.8667 6.13328 10.5279 5.70146 10.3839C4.41995 9.95675 3.51631 8.80696 3.40413 7.4608L3.33362 6.61462C3.36152 4.06127 5.44004 2 8 2C10.56 2 12.6385 4.06127 12.6664 6.61462L12.5959 7.4608C12.4837 8.80696 11.5801 9.95675 10.2985 10.3839C9.86672 10.5279 9.52786 10.8667 9.38392 11.2985Z\" fill=\"currentColor\" />\n <path d=\"M6.66667 14.3333C6.29848 14.3333 6 14.6318 6 15C6 15.3682 6.29848 15.6667 6.66667 15.6667H9.33333C9.70152 15.6667 10 15.3682 10 15C10 14.6318 9.70152 14.3333 9.33333 14.3333H6.66667Z\" fill=\"currentColor\" />\n <path d=\"M8.00864 4.13208L5.44578 6.94049C5.20258 7.18228 5.37835 7.56531 5.74361 7.58951L7.2181 7.6872L7.21814 9.60852C7.21814 9.96788 7.72139 10.1366 7.99168 9.86792C8.26197 9.59921 10.5545 7.05951 10.5545 7.05951C10.7977 6.81772 10.622 6.43469 10.2567 6.41049L8.78222 6.3128L8.78219 4.39148C8.78218 4.03212 8.27893 3.86336 8.00864 4.13208Z\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const ReportIcon: React.FC = () => (\n <svg width={16} height={16} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ display: 'block', flexShrink: 0 }}>\n <path d=\"M7.13397 2.5C7.51887 1.83333 8.48113 1.83333 8.86603 2.5L14.0622 11.5C14.4471 12.1667 13.966 13 13.1962 13H2.80385C2.03405 13 1.55292 12.1667 1.93782 11.5L7.13397 2.5Z\" stroke=\"currentColor\" strokeWidth={1.2} fill=\"none\" />\n <path d=\"M8 6.16667V8.83333\" stroke=\"currentColor\" strokeWidth={1.2} strokeLinecap=\"round\" />\n <circle cx={8} cy={10.6667} r={0.6667} fill=\"currentColor\" />\n </svg>\n);\n\nexport const DoubaoCloseIcon: React.FC = () => (\n <svg width={12} height={12} viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ display: 'block', flexShrink: 0 }}>\n <path d=\"M9.91685 2.08234C10.2097 2.37519 10.2096 2.8501 9.91685 3.143L7.06253 5.99732L9.91858 8.85337C10.2114 9.14627 10.2115 9.62115 9.91858 9.91403C9.62568 10.2068 9.15076 10.2068 8.85792 9.91403L6.00187 7.05798L3.14444 9.91541C2.85155 10.2083 2.37667 10.2083 2.08378 9.91541C1.791 9.62251 1.79093 9.14761 2.08378 8.85475L4.94121 5.99732L2.08551 3.14162C1.79267 2.84878 1.79278 2.37387 2.08551 2.08096C2.3784 1.78807 2.85327 1.78807 3.14617 2.08096L6.00187 4.93666L8.85619 2.08234C9.14906 1.78961 9.62399 1.7896 9.91685 2.08234Z\" fill=\"white\" fillOpacity={0.3} />\n </svg>\n);\n\n// ── icon 映射 ───────────────────────────────────────────────────\n\ntype IconType = 'feedback' | 'close' | 'download' | 'efficiency' | 'report';\n\nconst IconMap: Record<IconType, React.FC> = {\n feedback: FeedbackIcon,\n report: ReportIcon,\n close: () => <CloseIcon size={16} />,\n download: DownloadIcon,\n efficiency: EfficiencyIcon,\n};\n\n// ── pill(药丸) ────────────────────────────────────────────────\n\nexport const BrandLogo: React.FC<{ src: string; size: number }> = ({ src, size }) => (\n <img\n src={src}\n width={size}\n height={size}\n alt=\"\"\n style={{ width: size, height: size, borderRadius: 100, flexShrink: 0, display: 'block' }}\n />\n);\n\nexport const Pill: React.FC<{\n platform: 'desktop' | 'mobile';\n brandText: string;\n logoSrc: string;\n variant?: WatermarkVariant;\n onClose?: () => void;\n showClose?: boolean;\n}> = ({ platform, brandText, logoSrc, variant, onClose, showClose = false }) => {\n const isDesktop = platform === 'desktop';\n const isDoubao = variant === 'doubao';\n const pillStyle: React.CSSProperties = isDoubao\n ? {\n boxSizing: 'border-box',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '6px 8px',\n background: 'rgba(77,77,77,0.7)',\n borderRadius: 6,\n cursor: 'pointer',\n }\n : {\n boxSizing: 'border-box',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: isDesktop ? '6px 12px 6px 8px' : '5px 12px 5px 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 return (\n <div style={pillStyle}>\n {!isDoubao && <BrandLogo src={logoSrc} size={16} />}\n {isDoubao ? (\n <img\n src={DOUBAO_BRAND_TEXT_SRC}\n alt={brandText}\n draggable={false}\n style={{ height: isDesktop ? 12 : 14, width: 'auto', display: 'block', flexShrink: 0 }}\n />\n ) : (\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 {brandText}\n </span>\n )}\n {isDesktop && onClose && showClose && (\n <span\n role=\"button\"\n aria-label=\"关闭\"\n onClick={(e) => { e.stopPropagation(); onClose(); }}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n cursor: 'pointer',\n flexShrink: 0,\n ...(isDoubao ? {} : { color: 'rgba(255,255,255,0.5)' }),\n }}\n >\n {isDoubao ? <DoubaoCloseIcon /> : <CloseIcon size={10} />}\n </span>\n )}\n </div>\n );\n};\n\n// ── 菜单行 ──────────────────────────────────────────────────────\n\nexport const MenuRow: React.FC<{\n icon: IconType;\n label: string;\n fontSize: number;\n onClick?: () => void;\n}> = ({ icon, label, fontSize, onClick }) => {\n const [hover, setHover] = useState(false);\n const rowRef = useRef<HTMLDivElement | null>(null);\n useEffect(() => {\n const el = rowRef.current;\n if (!el) return;\n const enter = () => setHover(true);\n const leave = () => setHover(false);\n el.addEventListener('mouseenter', enter);\n el.addEventListener('mouseleave', leave);\n return () => { el.removeEventListener('mouseenter', enter); el.removeEventListener('mouseleave', leave); };\n }, []);\n const Icon = IconMap[icon];\n return (\n <div\n ref={rowRef}\n role=\"menuitem\"\n data-label={label}\n onClick={onClick}\n style={{\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n minHeight: 38,\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 />\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: IconType; label: string; onClick?: () => void };\n\n// ── 菜单卡片 ────────────────────────────────────────────────────\n\nexport const MenuCard: React.FC<{\n items: MenuItem[];\n extraItems?: MenuItem[];\n fontSize: number;\n minWidth: number;\n itemGap?: number;\n style?: React.CSSProperties;\n}> = ({ items, extraItems, fontSize, minWidth, itemGap = 0, 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 outline: 'none',\n ...style,\n }}\n >\n {items.length > 0 && (\n <div style={{ boxSizing: 'border-box', padding: 4, display: 'flex', flexDirection: 'column', gap: itemGap }}>\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 {extraItems && extraItems.length > 0 && (\n <>\n <div style={{ height: 1, background: 'rgba(0,0,0,0.08)', margin: '0 10px' }} />\n <div style={{ boxSizing: 'border-box', padding: 4 }}>\n {extraItems.map((it) => (\n <MenuRow key={it.label} icon={it.icon} label={it.label} fontSize={fontSize} onClick={it.onClick} />\n ))}\n </div>\n </>\n )}\n </div>\n);\n\n// ── 移动端水印 ──────────────────────────────────────────────────\n\nconst MobileWatermark: React.FC<{\n variant: WatermarkVariant;\n onDontShow: () => void;\n portalContainer: HTMLElement | null;\n}> = ({ variant, onDontShow, portalContainer }) => {\n const [open, setOpen] = useState(false);\n const config = VARIANT_CONFIG[variant];\n\n const items: MenuItem[] = [];\n if (variant === 'miaoda') {\n items.push({\n icon: 'efficiency',\n label: '了解妙搭',\n onClick: () => window.open(VARIANT_CONFIG.miaoda.landingUrl, '_blank', 'noopener,noreferrer'),\n });\n }\n if (REPORT_ENABLED) {\n items.push({ icon: variant === 'doubao' ? 'report' : 'feedback', label: '投诉与举报', onClick: openReport });\n }\n const extraItems: MenuItem[] = [{\n icon: 'close',\n label: '不再展示',\n onClick: () => { setOpen(false); onDontShow(); },\n }];\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild>\n <div data-custom-element={`${variant}-watermark-mobile`} style={{ cursor: 'pointer' }}>\n <Pill platform=\"mobile\" brandText={config.brandText} logoSrc={config.logoSrc} variant={variant} />\n </div>\n </PopoverPrimitive.Trigger>\n {/* v8 ignore start */}\n <PopoverPrimitive.Portal container={portalContainer as HTMLElement | undefined}>\n <PopoverPrimitive.Content side=\"top\" align=\"end\" sideOffset={8} style={{ outline: 'none' }}>\n <MenuCard items={items} extraItems={extraItems} fontSize={16} minWidth={160} />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n {/* v8 ignore stop */}\n </PopoverPrimitive.Root>\n );\n};\n\n// ── shadow root 内自治 UI ───────────────────────────────────────\n\nconst ShadowRootUI: React.FC<{ shadowRoot: ShadowRoot }> = ({ shadowRoot }) => {\n const appId = getAppId();\n const storageKey = `miaoda-creatByMiaodo-has-closed-${appId}`;\n const [closed, setClosed] = useState(() => {\n try { return !!window.localStorage?.getItem(storageKey); } catch { return false; }\n });\n const [showBadge, setShowBadge] = useState(true);\n const [loaded, setLoaded] = useState(false);\n const isMobile = useIsMobile();\n\n useEffect(() => {\n getInitialInfo()\n .then(info => {\n const badge = info?.app_info?.show_badge;\n setShowBadge(badge !== false);\n })\n .catch(() => { setShowBadge(true); })\n .finally(() => { setLoaded(true); });\n }, []);\n\n if (!loaded) return null;\n if (!showBadge) return null;\n if (closed) return null;\n return (\n <WatermarkContent\n variant={VARIANT}\n isMobile={isMobile}\n onClose={() => {\n setClosed(true);\n try { window.localStorage?.setItem(storageKey, 'true'); } catch { /* noop */ }\n }}\n portalContainer={shadowRoot as unknown as HTMLElement}\n />\n );\n};\n\n// ── 桌面 / 移动端内容 ──────────────────────────────────────────\n\nconst WatermarkContent: React.FC<{\n variant: WatermarkVariant;\n isMobile: boolean;\n onClose: () => void;\n portalContainer: HTMLElement | null;\n}> = ({ variant, isMobile, onClose, portalContainer }) => {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const config = VARIANT_CONFIG[variant];\n\n // 桌面端 hover: 原生 mouseenter/mouseleave(独立 React root 下合成事件不工作)\n useEffect(() => {\n if (isMobile) return;\n const el = containerRef.current;\n if (!el) return;\n let leaveTimer: ReturnType<typeof setTimeout> | null = null;\n const enter = () => { if (leaveTimer) clearTimeout(leaveTimer); setOpen(true); };\n const leave = () => { leaveTimer = setTimeout(() => setOpen(false), 100); };\n el.addEventListener('mouseenter', enter);\n el.addEventListener('mouseleave', leave);\n return () => {\n if (leaveTimer) clearTimeout(leaveTimer);\n el.removeEventListener('mouseenter', enter);\n el.removeEventListener('mouseleave', leave);\n };\n }, [isMobile]);\n\n if (isMobile) {\n return <MobileWatermark variant={variant} onDontShow={onClose} portalContainer={portalContainer} />;\n }\n\n const desktopItems: MenuItem[] = [];\n if (variant === 'doubao') {\n desktopItems.push({\n icon: 'download',\n label: '下载豆包工作',\n onClick: () => window.open(VARIANT_CONFIG.doubao.downloadUrl, '_blank', 'noopener,noreferrer'),\n });\n } else {\n desktopItems.push({\n icon: 'efficiency',\n label: '了解妙搭',\n onClick: () => window.open(VARIANT_CONFIG.miaoda.landingUrl, '_blank', 'noopener,noreferrer'),\n });\n }\n if (REPORT_ENABLED) {\n desktopItems.push({ icon: variant === 'doubao' ? 'report' : 'feedback', label: '投诉与举报', onClick: openReport });\n }\n\n return (\n <div\n ref={containerRef}\n data-custom-element={`${variant}-watermark`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n gap: 8,\n }}\n >\n {open && <MenuCard items={desktopItems} fontSize={14} minWidth={160} itemGap={8} />}\n <Pill\n platform=\"desktop\"\n brandText={config.brandText}\n logoSrc={config.logoSrc}\n variant={variant}\n onClose={onClose}\n showClose={open}\n />\n </div>\n );\n};\n\n// ── 主组件(Shadow DOM 隔离 + 独立 React root) ────────────────\n\nconst Watermark: React.FC = () => {\n const hostRef = useRef<HTMLElement | null>(null);\n const rootRef = useRef<Root | null>(null);\n\n useIsomorphicLayoutEffect(() => {\n if (!hostRef.current) return;\n const host = hostRef.current;\n const shadow = host.shadowRoot ?? host.attachShadow({ mode: 'open' });\n\n const wrapper = document.createElement('div');\n shadow.appendChild(wrapper);\n const root = createRoot(wrapper);\n rootRef.current = root;\n root.render(<ShadowRootUI shadowRoot={shadow} />);\n return () => {\n const oldRoot = root;\n const oldWrapper = wrapper;\n queueMicrotask(() => { oldRoot.unmount(); oldWrapper.remove(); });\n rootRef.current = null;\n };\n }, []);\n\n if (process.env.NODE_ENV !== 'production') return null;\n\n const hostStyle: React.CSSProperties = {\n all: 'initial',\n position: 'fixed',\n right: 12,\n bottom: 12,\n zIndex: 2147483647,\n display: 'block',\n width: 'auto',\n height: 'auto',\n };\n\n return React.createElement(HOST_TAG, { ref: hostRef, style: hostStyle });\n};\n\nexport default Watermark;\n","const CDN = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp';\n\nexport const DOUBAO_LOGO_SRC = `${CDN}/miaoda-ui/doubao.svg`;\nexport const DOUBAO_BRAND_TEXT_SRC = `${CDN}/miaoda-ui/Doubao_watermark_aigc.svg`;\nexport const MIAODA_LOGO_SRC = `${CDN}/logo/miaodalogo.svg`;\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 { 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 * 是否为 standalone 导出构建(`miaoda app pack --mode standalone`)。\n *\n * standalone 产物脱离妙搭平台、以 `file://` 离线打开,平台徽标(Safety「由妙搭搭建」/\n * 豆包水印)在这里既无意义也无从校验 —— 它们的显隐判据全是 **fail-open** 的:\n * `showBadge` 拿不到平台数据就默认 true、接口失败也 catch 成 true,于是离线产物里\n * 徽标必然出现,还附带两个必然失败的 `tenant_info` / `get_published` 请求。\n * 所以 gate 在挂载处,让整棵子树不渲染,连 effect 里的请求一起省掉。\n *\n * `MIAODA_BUILD_TARGET` 由构建 preset 在 standalone 模式下 define 注入。\n *\n * **必须 try/catch**:客户端 bundle 里没有 `process` 全局,所有 `process.env.X` 全靠\n * 构建期 define 做字符串替换。若应用升级了本 SDK 却仍用**旧版 preset**(不认识这个 key),\n * 该表达式不会被替换,运行时直接 `ReferenceError: process is not defined` 把整个应用打挂。\n * 防御口径:try/catch 兜底旧 preset 不替换该 key 的场景。\n */\nexport const isStandaloneBuild = (): boolean => {\n try {\n return process.env.MIAODA_BUILD_TARGET === 'standalone';\n } catch {\n return false;\n }\n};\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 { useEffect } from 'react';\nimport { clearNetworkIdle, networkIdleCallback } from 'network-idle';\nimport { submitPostMessage } from '../../utils/postMessage';\nimport { normalizeBasePath } from '../../utils/utils';\n\n/** 开发态首屏封面:保持与 client-toolkit 的 PageScreenshot 协议一致。 */\nexport function usePageScreenshot(): void {\n useEffect(() => {\n if (process.env.NODE_ENV !== 'development') return;\n\n let cancelled = false;\n const basePath = normalizeBasePath(process.env.CLIENT_BASE_PATH);\n const id = networkIdleCallback(() => {\n if (cancelled) return;\n void (async () => {\n // 截图库仅在开发态执行截图时加载。\n const { snapdom } = await import('@zumer/snapdom');\n if (cancelled) return;\n const result = await snapdom(document.body, {\n format: 'png',\n width: document.body.scrollWidth,\n height: document.body.scrollHeight,\n fallbackURL: ({ src = '' }) =>\n `${basePath}/dev/snapdom-proxy?url=${encodeURIComponent(src)}`,\n exclude: ['#lucide-react-svg'],\n backgroundColor: '#ffffff',\n });\n if (cancelled) return;\n const image = await result.toPng();\n if (cancelled) return;\n submitPostMessage({ type: 'PageScreenshot', data: image.src });\n })().catch(() => {\n // 截图是辅助能力,失败不影响应用渲染。\n });\n }, 2000);\n\n return () => {\n cancelled = true;\n clearNetworkIdle(id);\n };\n }, []);\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","import { slardar } from '@lark-apaas/internal-slardar';\n\nimport { getAppId } from '../../../utils/getAppId';\n\n/**\n * 上报 app 首次渲染完成时机到 Slardar。\n *\n * 触发时机与 client-toolkit 的 AppContainer 一致:生产环境下 React 首次 mount。\n * 计算口径与 client-toolkit 保持一致:firstRenderTime 取 performance.now() 取整,\n * pageLoadTime 取 navigation entry 的 loadEventEnd - startTime 取整。\n */\nexport function reportAppFirstRender(): void {\n const appId = getAppId();\n const firstRenderTime = Math.round(performance.now());\n const navEntry = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n const pageLoadTime = navEntry && navEntry.loadEventEnd > 0\n ? Math.round(navEntry.loadEventEnd - navEntry.startTime)\n : undefined;\n\n slardar.sendEvent({\n name: 'app-first-render',\n metrics: {\n firstRenderTime,\n ...(pageLoadTime != null ? { pageLoadTime } : {}),\n },\n categories: {\n appId: appId ?? 'unknown',\n mode: window.IS_MIAODA_PREVIEW ? 'preview' : 'runtime',\n appType: String(process.env.MIAODA_APP_TYPE ?? 'unknown'),\n archType: String(process.env.MIAODA_APP_ARCH_TYPE ?? 'unknown'),\n },\n });\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';\nimport { isPreview } from '../utils/utils';\nimport { getParentOriginFromParams, submitPostMessage } from '../utils/postMessage';\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 * iframe-aware 预览态判定 fallback:当 `IS_MIAODA_PREVIEW` 未注入但当前\n * 实际嵌在已知主站 iframe 内时,仍按预览态走 postMessage 协议。\n * 命中条件二选一:\n * - URL 参数/会话缓存的 `__parentOrigin`(兼容豆包链路 parentOrigin 后门)\n * - 构建期注入的 `FORCE_FRAMEWORK_DOMAIN_MAIN` 等于当前 referrer origin\n */\nfunction isIframeUnderMainHost(): boolean {\n if (typeof window === 'undefined') return false;\n if (window.parent === window) return false;\n\n if (getParentOriginFromParams()) return true;\n\n const envOrigin = process.env.FORCE_FRAMEWORK_DOMAIN_MAIN;\n if (!envOrigin || !document.referrer) return false;\n try {\n return new URL(document.referrer).origin === envOrigin;\n } catch {\n return false;\n }\n}\n\n/**\n * 统一的链接组件,用于替换原生 <a> 标签\n * - 内部路由(/dashboard)→ react-router Link\n * - Hash 锚点(#section)→ <a>\n * - 外链(https://...)→ <a target=\"_blank\">\n *\n * 预览态(iframe 内)时,通过 postMessage 通知父页面处理链接跳转,\n * 避免浏览器安全策略限制导致链接无法正常打开。\n */\nexport const UniversalLink = React.forwardRef<HTMLAnchorElement, UniversalLinkProps>(\n function UniversalLink({ to, onClick, ...props }, ref) {\n const isExternal = isExternalLink(to);\n // 仅当 (a) 预览态 (b) 是外链 同时满足时走 postMessage 分支:\n // - 内部路由:父页面不接、内部 SPA 路由也不能用 window.open,应继续走 RouterLink\n // - hash 锚点:原生 <a href=\"#section\"> 在 iframe 内可正常工作,无需绕一圈\n // - 外链:iframe sandbox 会拦 <a target=\"_blank\">,必须 postMessage 给父页面打开\n const preview = (isPreview() || isIframeUnderMainHost()) && isExternal;\n\n if (preview) {\n // 进入此分支时 to 一定是外链,OpenIframeLink.data.external 恒为 true\n const handlePreviewClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n onClick?.(e);\n submitPostMessage({\n type: 'OpenIframeLink',\n data: { href: to, external: true },\n });\n };\n\n return (\n <a\n href={to}\n ref={ref}\n {...props}\n onClick={handlePreviewClick}\n target={props.target ?? '_blank'}\n rel={props.rel ?? 'noopener noreferrer'}\n />\n );\n }\n\n // 内部路由:不管预览态都走 RouterLink,靠 react-router 处理 SPA 跳转\n if (isInternalRoute(to)) {\n return <RouterLink to={to} ref={ref} {...props} onClick={onClick} />;\n }\n\n // Hash 链接 & 外链非预览态\n return (\n <a\n href={to}\n ref={ref}\n {...props}\n onClick={onClick}\n {...(isExternal && {\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","import { 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 = () => {\n const appId = getAppId() ?? '';\n // dataloom 在 SDK 内部每次写请求都从 cookie 现读 X-Suda-Csrf-Token,\n // 避免实例长命时 token 中途被服务端轮换造成 403。\n return createClient({\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 // getInitialInfo 保留:仍依赖其副作用与缓存。\n // storage 切 session 后不再需要 token/url,这里只触发它、不取用返回值。\n pendingPromise = getInitialInfo()\n .then(() => {\n dataloom = createDataLoomClient();\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","/**\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};\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 { 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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2BAAIC,SACvBC,kCAAWF,MAAK,GAAIC,IAAAA,GADD;;;ACNrB;;;;;;;;;;;;;;AACO,IAAME,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;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","viteConnectFailed","viteConnectionLost","time","Date","now","submitPostMessage","type","data","status","slardar","sendEvent","name","metrics","categories","reason","viteConnected","hmrFlag","startTime","duration","listenModuleHmr","hmr","getHmrApi","onSuccess","onError","error","console","warn","String","PROXY_CONSOLE_METHOD","interceptErrors","window","addEventListener","event","logger","forEach","method","originalMethod","args","level","first","map","a","Error","message","join","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","getBrowserTransportLevel","level","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","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","getWatermarkVariant","source","createdVia","origin","trim","toLowerCase","String","startsWith","readWatermarkCreatedVia","process","env","MIAODA_APP_CREATED_VIA","undefined","import_react","CDN","DOUBAO_LOGO_SRC","DOUBAO_BRAND_TEXT_SRC","MIAODA_LOGO_SRC","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","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","useIsomorphicLayoutEffect","window","useLayoutEffect","useEffect","VARIANT","getWatermarkVariant","process","env","MIAODA_APP_SOURCE","readWatermarkCreatedVia","VARIANT_CONFIG","doubao","brandText","logoSrc","DOUBAO_LOGO_SRC","downloadUrl","miaoda","MIAODA_LOGO_SRC","landingUrl","REPORT_ENABLED","FONT_FAMILY","PILL_SHADOW","CARD_SHADOW","HOST_TAG","reportDomainByEnv","env","runtimeEnv","getEnv","openReport","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","DownloadIcon","EfficiencyIcon","ReportIcon","stroke","strokeWidth","strokeLinecap","circle","cx","cy","r","DoubaoCloseIcon","fillOpacity","IconMap","feedback","report","close","download","efficiency","BrandLogo","src","img","alt","borderRadius","Pill","platform","brandText","logoSrc","variant","onClose","showClose","isDesktop","isDoubao","pillStyle","boxSizing","alignItems","gap","padding","background","cursor","border","boxShadow","div","DOUBAO_BRAND_TEXT_SRC","draggable","span","fontFamily","FONT_FAMILY","fontSize","lineHeight","color","whiteSpace","role","aria-label","onClick","e","stopPropagation","MenuRow","icon","label","hover","setHover","useState","rowRef","useRef","useEffect","el","current","enter","leave","addEventListener","removeEventListener","Icon","ref","data-label","minHeight","MenuCard","items","extraItems","minWidth","itemGap","flexDirection","overflow","outline","length","map","it","key","margin","MobileWatermark","onDontShow","portalContainer","setOpen","config","VARIANT_CONFIG","push","miaoda","landingUrl","REPORT_ENABLED","Root","onOpenChange","Trigger","asChild","data-custom-element","Portal","container","Content","side","align","sideOffset","ShadowRootUI","shadowRoot","appId","storageKey","closed","setClosed","localStorage","getItem","showBadge","setShowBadge","loaded","setLoaded","isMobile","useIsMobile","getInitialInfo","then","info","badge","app_info","show_badge","catch","finally","WatermarkContent","VARIANT","setItem","containerRef","leaveTimer","clearTimeout","setTimeout","desktopItems","doubao","downloadUrl","Watermark","hostRef","rootRef","useIsomorphicLayoutEffect","host","shadow","attachShadow","mode","wrapper","document","createElement","appendChild","root","createRoot","render","oldRoot","oldWrapper","queueMicrotask","unmount","remove","NODE_ENV","hostStyle","all","position","right","bottom","zIndex","isStandaloneBuild","process","env","MIAODA_BUILD_TARGET","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","import_react","usePageScreenshot","useEffect","process","env","NODE_ENV","cancelled","basePath","normalizeBasePath","CLIENT_BASE_PATH","id","networkIdleCallback","snapdom","result","document","body","format","width","scrollWidth","height","scrollHeight","fallbackURL","src","encodeURIComponent","exclude","backgroundColor","image","toPng","submitPostMessage","type","data","catch","clearNetworkIdle","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","import_internal_slardar","reportAppFirstRender","appId","getAppId","firstRenderTime","Math","round","performance","now","navEntry","getEntriesByType","pageLoadTime","loadEventEnd","startTime","undefined","slardar","sendEvent","name","metrics","categories","mode","window","IS_MIAODA_PREVIEW","appType","String","process","env","MIAODA_APP_TYPE","archType","MIAODA_APP_ARCH_TYPE","TrackKey","AppContainer","children","useAppInfo","usePageScreenshot","standalone","isStandaloneBuild","useEffect","process","env","NODE_ENV","reportTeaEvent","trackKey","TrackKey","VIEW","trackParams","artifact_uid","getAppId","agent_id","url","window","location","href","reportAppFirstRender","React","Watermark","MiaodaInspector","IframeBridge","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","isIframeUnderMainHost","window","parent","getParentOriginFromParams","envOrigin","process","env","FORCE_FRAMEWORK_DOMAIN_MAIN","document","referrer","URL","origin","UniversalLink","React","forwardRef","onClick","props","ref","isExternal","preview","isPreview","handlePreviewClick","e","preventDefault","submitPostMessage","type","data","href","external","a","target","rel","RouterLink","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","import_auth_sdk","createDataLoomClient","appId","getAppId","createClient","global","enableDataloomLog","process","env","NODE_ENV","requestRateLimit","undefined","brandName","accountServices","user","authClient","session","dataloom","pendingPromise","getDataloom","Promise","resolve","getInitialInfo","then","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","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","_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/watermark-variant.ts","../src/components/AppContainer/Watermark.tsx","../src/components/AppContainer/doubao-watermark-asset.ts","../src/utils/getAppId.ts","../src/utils/getEnv.ts","../src/utils/getInitialInfo.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/components/AppContainer/standalone.ts","../src/components/QueryProvider/index.tsx","../src/components/AppContainer/IframeBridge.tsx","../src/hooks/useUpdatingRef.ts","../src/components/AppContainer/use-page-screenshot.ts","../src/components/AppContainer/utils/tea.ts","../src/utils/deviceType.ts","../src/components/AppContainer/utils/getLarkUser.ts","../src/components/AppContainer/utils/slardar.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/integrations/dataloom.ts","../src/integrations/capabilityClient.ts","../src/components/ui/toast.tsx","../src/locales/messages.ts","../src/utils/locale.ts","../src/locales/index.ts","../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 Watermark from './Watermark';\nimport { isStandaloneBuild } from './standalone';\nimport QueryProvider from '../QueryProvider';\nimport IframeBridge from './IframeBridge';\nimport { usePageScreenshot } from './use-page-screenshot';\nimport { useAppInfo } from '../../hooks';\nimport { reportTeaEvent } from './utils/tea';\nimport { reportAppFirstRender } from './utils/slardar';\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 usePageScreenshot();\n\n const standalone = isStandaloneBuild();\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 reportAppFirstRender();\n }\n }, []);\n\n return (\n <>\n {!standalone && <Watermark />}\n {process.env.NODE_ENV !== 'production' && <MiaodaInspector />}\n {process.env.NODE_ENV !== 'production' && <IframeBridge />}\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 // 检测断连。Vite 的文案:\n // 首次建链失败 → `[vite] WebSocket closed without opened.`\n // 连上后断线 → `[vite] server connection lost. Polling for restart...`\n const viteConnectFailed = log.includes('WebSocket closed without opened');\n const viteConnectionLost = log.includes('server connection lost');\n if (\n devFlag &&\n (log.includes('Disconnected') || viteConnectFailed || viteConnectionLost)\n ) {\n // Vite 的建链失败日志由 watchdog 心跳(5s/次)反复触发,断连态内只上报一次\n if (devServerDisconnectInfo) return;\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 // 仅 Vite:close 分支由 isOpened 区分两种情况。首次建链失败须手动刷新才恢复,\n // 断线有探活轮询多数能自愈,分开统计\n ...(viteConnectFailed\n ? { reason: 'connect-failed' }\n : viteConnectionLost\n ? { reason: 'connection-lost' }\n : {}),\n },\n });\n return;\n }\n // 带结尾句号,避开 `[vite] connected from window` 和 'disconnected'\n const viteConnected = log.includes('[vite] connected.');\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 viteConnected))\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 // 仅 Vite:`[vite] connected.` 在连接建立时打,duration 是真实重连耗时。\n // 聚合 duration 时按本字段筛选\n ...(viteConnected ? { reason: 'connected' } : {}),\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 断连/重连。Vite 走 `console.error('[vite]', err)`,\n // 错误内容在 args[1],合并所有参数后再匹配\n if (typeof first === 'string') {\n processDevServerLog(\n args\n .map((a) =>\n typeof a === 'string' ? a : a instanceof Error ? a.message : ''\n )\n .join(' ')\n );\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\nexport function 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 参数传入(兼容豆包链路 parentOrigin 后门)\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 \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\nfunction getBrowserTransportLevel(level: LogWithMeta['level']): LogWithMeta['level'] {\n return level === 'success' ? 'info' : level;\n}\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(getBrowserTransportLevel(log.level), 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(getBrowserTransportLevel(log.level), 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","/** 保留既有 Source 判断,CreatedVia 补充豆包创建来源。 */\nexport function getWatermarkVariant(\n source: unknown,\n createdVia: string | undefined\n): 'doubao' | 'miaoda' {\n const origin = (createdVia ?? '').trim().toLowerCase();\n return String(source) === '5' ||\n origin === 'workmate' ||\n origin === 'doubao' ||\n origin.startsWith('doubao_')\n ? 'doubao'\n : 'miaoda';\n}\n\n/** 新 SDK 搭配旧 preset 时,新变量可能未被替换,浏览器也可能没有 process。 */\nexport function readWatermarkCreatedVia(): string | undefined {\n try {\n // 保持直接访问,供 Vite / Rspack 的 define 在构建时替换。\n return process.env.MIAODA_APP_CREATED_VIA;\n } catch {\n return undefined;\n }\n}\n","import { getWatermarkVariant, readWatermarkCreatedVia } from './watermark-variant';\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { DOUBAO_LOGO_SRC, DOUBAO_BRAND_TEXT_SRC, MIAODA_LOGO_SRC } from './doubao-watermark-asset';\nimport { getAppId } from '../../utils/getAppId';\nimport { getEnv } from '../../utils/getEnv';\nimport { getInitialInfo } from '../../utils/getInitialInfo';\nimport { useIsMobile } from '../../hooks';\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\n// ── variant 配置 ───────────────────────────────────────────────────\n\ntype WatermarkVariant = 'doubao' | 'miaoda';\n\nconst VARIANT: WatermarkVariant = getWatermarkVariant(\n process.env.MIAODA_APP_SOURCE,\n readWatermarkCreatedVia(),\n);\n\nconst VARIANT_CONFIG = {\n doubao: {\n brandText: '豆包工作 AI 生成',\n logoSrc: DOUBAO_LOGO_SRC,\n downloadUrl: 'https://ugapk.com/FCtLH',\n },\n miaoda: {\n brandText: '妙搭生成',\n logoSrc: MIAODA_LOGO_SRC,\n landingUrl: 'https://miaoda.feishu.cn/landing',\n },\n} as const;\n\nconst REPORT_ENABLED = true;\nconst FONT_FAMILY = \"'PingFang SC', -apple-system, BlinkMacSystemFont, sans-serif\";\nconst DOUBAO_FONT_FAMILY = \"'Doubao Sans', 'PingFang SC', -apple-system, BlinkMacSystemFont, sans-serif\";\n\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\nconst HOST_TAG = 'miaoda-watermark';\n\n// ── 举报链接 ────────────────────────────────────────────────────\n\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 if (env) return 'tns.feishu.cn';\n const runtimeEnv = getEnv();\n if (runtimeEnv === 'BOE') return 'tns.feishu-boe.cn';\n if (runtimeEnv === 'PRE') return 'tns.feishu-pre.cn';\n return 'tns.feishu.cn';\n};\n\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 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// ── icon 组件 ───────────────────────────────────────────────────\n\nexport const FeedbackIcon: React.FC = () => (\n <svg width={16} height={16} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ display: 'block', flexShrink: 0 }}>\n <path 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\" fill=\"currentColor\" />\n <path 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\" fill=\"currentColor\" />\n <path 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\" fill=\"currentColor\" />\n <path 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\" fill=\"currentColor\" />\n <path 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\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const CloseIcon: React.FC<{ size: number }> = ({ size }) => (\n <svg width={size} height={size} viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ display: 'block', flexShrink: 0 }}>\n <path 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\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const DownloadIcon: React.FC = () => (\n <svg width={16} height={16} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ display: 'block', flexShrink: 0 }}>\n <path d=\"M11.9922 1.99221C12.5445 1.98895 12.9958 2.43407 12.999 2.98634L13.0762 16.1943L14.6387 14.6328L17.8926 11.3789C18.2831 10.9884 18.9171 10.9885 19.3076 11.3789C19.6977 11.7695 19.6979 12.4026 19.3076 12.793L16.0527 16.0479L12.7979 19.3018C12.7111 19.3884 12.6098 19.4566 12.5 19.5059H20.375C20.9271 19.5059 21.3748 19.9538 21.375 20.5059C21.375 21.0581 20.9273 21.5059 20.375 21.5059H3.625C3.07272 21.5059 2.625 21.0581 2.625 20.5059C2.62523 19.9538 3.07286 19.5059 3.625 19.5059H11.6816C11.572 19.4566 11.4704 19.3884 11.3838 19.3018L4.87402 12.793C4.48372 12.4026 4.4839 11.7694 4.87402 11.3789C5.26452 10.9884 5.89756 10.9885 6.28809 11.3789L11.0762 16.166L10.999 2.99806C10.9958 2.44603 11.4402 1.99582 11.9922 1.99221Z\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const EfficiencyIcon: React.FC = () => (\n <svg width={16} height={16} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ display: 'block', flexShrink: 0 }}>\n <path d=\"M2.0754 7.57153C2.23188 9.44922 3.49231 11.053 5.27982 11.6488C5.31351 11.6601 5.33994 11.6865 5.35117 11.7202L5.72076 12.8289C5.88752 13.3292 6.3557 13.6667 6.88304 13.6667H9.11696C9.6443 13.6667 10.1125 13.3292 10.2792 12.8289L10.6488 11.7202C10.6601 11.6865 10.6865 11.6601 10.7202 11.6488C12.5077 11.053 13.7681 9.44922 13.9246 7.57153L14 6.66667C14 3.35296 11.3137 0.666668 8 0.666668C4.68629 0.666668 2 3.35296 2 6.66667L2.0754 7.57153ZM9.38392 11.2985L9.03899 12.3333H6.96101L6.61608 11.2985C6.47214 10.8667 6.13328 10.5279 5.70146 10.3839C4.41995 9.95675 3.51631 8.80696 3.40413 7.4608L3.33362 6.61462C3.36152 4.06127 5.44004 2 8 2C10.56 2 12.6385 4.06127 12.6664 6.61462L12.5959 7.4608C12.4837 8.80696 11.5801 9.95675 10.2985 10.3839C9.86672 10.5279 9.52786 10.8667 9.38392 11.2985Z\" fill=\"currentColor\" />\n <path d=\"M6.66667 14.3333C6.29848 14.3333 6 14.6318 6 15C6 15.3682 6.29848 15.6667 6.66667 15.6667H9.33333C9.70152 15.6667 10 15.3682 10 15C10 14.6318 9.70152 14.3333 9.33333 14.3333H6.66667Z\" fill=\"currentColor\" />\n <path d=\"M8.00864 4.13208L5.44578 6.94049C5.20258 7.18228 5.37835 7.56531 5.74361 7.58951L7.2181 7.6872L7.21814 9.60852C7.21814 9.96788 7.72139 10.1366 7.99168 9.86792C8.26197 9.59921 10.5545 7.05951 10.5545 7.05951C10.7977 6.81772 10.622 6.43469 10.2567 6.41049L8.78222 6.3128L8.78219 4.39148C8.78218 4.03212 8.27893 3.86336 8.00864 4.13208Z\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const ReportIcon: React.FC = () => (\n <svg width={16} height={16} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ display: 'block', flexShrink: 0 }}>\n <path d=\"M7.13397 2.5C7.51887 1.83333 8.48113 1.83333 8.86603 2.5L14.0622 11.5C14.4471 12.1667 13.966 13 13.1962 13H2.80385C2.03405 13 1.55292 12.1667 1.93782 11.5L7.13397 2.5Z\" stroke=\"currentColor\" strokeWidth={1.2} fill=\"none\" />\n <path d=\"M8 6.16667V8.83333\" stroke=\"currentColor\" strokeWidth={1.2} strokeLinecap=\"round\" />\n <circle cx={8} cy={10.6667} r={0.6667} fill=\"currentColor\" />\n </svg>\n);\n\nexport const DoubaoCloseIcon: React.FC = () => (\n <svg width={12} height={12} viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ display: 'block', flexShrink: 0 }}>\n <path d=\"M9.91685 2.08234C10.2097 2.37519 10.2096 2.8501 9.91685 3.143L7.06253 5.99732L9.91858 8.85337C10.2114 9.14627 10.2115 9.62115 9.91858 9.91403C9.62568 10.2068 9.15076 10.2068 8.85792 9.91403L6.00187 7.05798L3.14444 9.91541C2.85155 10.2083 2.37667 10.2083 2.08378 9.91541C1.791 9.62251 1.79093 9.14761 2.08378 8.85475L4.94121 5.99732L2.08551 3.14162C1.79267 2.84878 1.79278 2.37387 2.08551 2.08096C2.3784 1.78807 2.85327 1.78807 3.14617 2.08096L6.00187 4.93666L8.85619 2.08234C9.14906 1.78961 9.62399 1.7896 9.91685 2.08234Z\" fill=\"white\" fillOpacity={0.3} />\n </svg>\n);\n\n// ── icon 映射 ───────────────────────────────────────────────────\n\ntype IconType = 'feedback' | 'close' | 'download' | 'efficiency' | 'report';\n\nconst IconMap: Record<IconType, React.FC> = {\n feedback: FeedbackIcon,\n report: ReportIcon,\n close: () => <CloseIcon size={16} />,\n download: DownloadIcon,\n efficiency: EfficiencyIcon,\n};\n\n// ── pill(药丸) ────────────────────────────────────────────────\n\nexport const BrandLogo: React.FC<{ src: string; size: number }> = ({ src, size }) => (\n <img\n src={src}\n width={size}\n height={size}\n alt=\"\"\n style={{ width: size, height: size, borderRadius: 100, flexShrink: 0, display: 'block' }}\n />\n);\n\nexport const Pill: React.FC<{\n platform: 'desktop' | 'mobile';\n brandText: string;\n logoSrc: string;\n variant?: WatermarkVariant;\n onClose?: () => void;\n showClose?: boolean;\n}> = ({ platform, brandText, logoSrc, variant, onClose, showClose = false }) => {\n const isDesktop = platform === 'desktop';\n const isDoubao = variant === 'doubao';\n const pillStyle: React.CSSProperties = isDoubao\n ? {\n boxSizing: 'border-box',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '6px 8px',\n background: 'rgba(77,77,77,0.7)',\n borderRadius: 6,\n cursor: 'pointer',\n }\n : {\n boxSizing: 'border-box',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: isDesktop ? '6px 12px 6px 8px' : '5px 12px 5px 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 return (\n <div style={pillStyle}>\n {!isDoubao && <BrandLogo src={logoSrc} size={16} />}\n {isDoubao ? (\n <img\n src={DOUBAO_BRAND_TEXT_SRC}\n alt={brandText}\n draggable={false}\n style={{ height: isDesktop ? 12 : 14, width: 'auto', display: 'block', flexShrink: 0 }}\n />\n ) : (\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 {brandText}\n </span>\n )}\n {isDesktop && onClose && showClose && (\n <span\n role=\"button\"\n aria-label=\"关闭\"\n onClick={(e) => { e.stopPropagation(); onClose(); }}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n cursor: 'pointer',\n flexShrink: 0,\n ...(isDoubao ? {} : { color: 'rgba(255,255,255,0.5)' }),\n }}\n >\n {isDoubao ? <DoubaoCloseIcon /> : <CloseIcon size={10} />}\n </span>\n )}\n </div>\n );\n};\n\n// ── 菜单行 ──────────────────────────────────────────────────────\n\nexport const MenuRow: React.FC<{\n icon: IconType;\n label: string;\n fontSize: number;\n onClick?: () => void;\n}> = ({ icon, label, fontSize, onClick }) => {\n const [hover, setHover] = useState(false);\n const rowRef = useRef<HTMLDivElement | null>(null);\n useEffect(() => {\n const el = rowRef.current;\n if (!el) return;\n const enter = () => setHover(true);\n const leave = () => setHover(false);\n el.addEventListener('mouseenter', enter);\n el.addEventListener('mouseleave', leave);\n return () => { el.removeEventListener('mouseenter', enter); el.removeEventListener('mouseleave', leave); };\n }, []);\n const Icon = IconMap[icon];\n return (\n <div\n ref={rowRef}\n role=\"menuitem\"\n data-label={label}\n onClick={onClick}\n style={{\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n minHeight: 38,\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 />\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: IconType; label: string; onClick?: () => void };\n\n// ── 菜单卡片 ────────────────────────────────────────────────────\n\nexport const MenuCard: React.FC<{\n items: MenuItem[];\n extraItems?: MenuItem[];\n fontSize: number;\n minWidth: number;\n itemGap?: number;\n style?: React.CSSProperties;\n}> = ({ items, extraItems, fontSize, minWidth, itemGap = 0, 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 outline: 'none',\n ...style,\n }}\n >\n {items.length > 0 && (\n <div style={{ boxSizing: 'border-box', padding: 4, display: 'flex', flexDirection: 'column', gap: itemGap }}>\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 {extraItems && extraItems.length > 0 && (\n <>\n <div style={{ height: 1, background: 'rgba(0,0,0,0.08)', margin: '0 10px' }} />\n <div style={{ boxSizing: 'border-box', padding: 4 }}>\n {extraItems.map((it) => (\n <MenuRow key={it.label} icon={it.icon} label={it.label} fontSize={fontSize} onClick={it.onClick} />\n ))}\n </div>\n </>\n )}\n </div>\n);\n\n// ── 移动端水印 ──────────────────────────────────────────────────\n\nconst MobileWatermark: React.FC<{\n variant: WatermarkVariant;\n onDontShow: () => void;\n portalContainer: HTMLElement | null;\n}> = ({ variant, onDontShow, portalContainer }) => {\n const [open, setOpen] = useState(false);\n const config = VARIANT_CONFIG[variant];\n\n const items: MenuItem[] = [];\n if (variant === 'miaoda') {\n items.push({\n icon: 'efficiency',\n label: '了解妙搭',\n onClick: () => window.open(VARIANT_CONFIG.miaoda.landingUrl, '_blank', 'noopener,noreferrer'),\n });\n }\n if (REPORT_ENABLED) {\n items.push({ icon: variant === 'doubao' ? 'report' : 'feedback', label: '投诉与举报', onClick: openReport });\n }\n const extraItems: MenuItem[] = [{\n icon: 'close',\n label: '不再展示',\n onClick: () => { setOpen(false); onDontShow(); },\n }];\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild>\n <div data-custom-element={`${variant}-watermark-mobile`} style={{ cursor: 'pointer' }}>\n <Pill platform=\"mobile\" brandText={config.brandText} logoSrc={config.logoSrc} variant={variant} />\n </div>\n </PopoverPrimitive.Trigger>\n {/* v8 ignore start */}\n <PopoverPrimitive.Portal container={portalContainer as HTMLElement | undefined}>\n <PopoverPrimitive.Content side=\"top\" align=\"end\" sideOffset={8} style={{ outline: 'none' }}>\n <MenuCard items={items} extraItems={extraItems} fontSize={16} minWidth={160} />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n {/* v8 ignore stop */}\n </PopoverPrimitive.Root>\n );\n};\n\n// ── shadow root 内自治 UI ───────────────────────────────────────\n\nconst ShadowRootUI: React.FC<{ shadowRoot: ShadowRoot }> = ({ shadowRoot }) => {\n const appId = getAppId();\n const storageKey = `miaoda-creatByMiaodo-has-closed-${appId}`;\n const [closed, setClosed] = useState(() => {\n try { return !!window.localStorage?.getItem(storageKey); } catch { return false; }\n });\n const [showBadge, setShowBadge] = useState(true);\n const [loaded, setLoaded] = useState(false);\n const isMobile = useIsMobile();\n\n useEffect(() => {\n getInitialInfo()\n .then(info => {\n const badge = info?.app_info?.show_badge;\n setShowBadge(badge !== false);\n })\n .catch(() => { setShowBadge(true); })\n .finally(() => { setLoaded(true); });\n }, []);\n\n if (!loaded) return null;\n if (!showBadge) return null;\n if (closed) return null;\n return (\n <WatermarkContent\n variant={VARIANT}\n isMobile={isMobile}\n onClose={() => {\n setClosed(true);\n try { window.localStorage?.setItem(storageKey, 'true'); } catch { /* noop */ }\n }}\n portalContainer={shadowRoot as unknown as HTMLElement}\n />\n );\n};\n\n// ── 桌面 / 移动端内容 ──────────────────────────────────────────\n\nconst WatermarkContent: React.FC<{\n variant: WatermarkVariant;\n isMobile: boolean;\n onClose: () => void;\n portalContainer: HTMLElement | null;\n}> = ({ variant, isMobile, onClose, portalContainer }) => {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const config = VARIANT_CONFIG[variant];\n\n // 桌面端 hover: 原生 mouseenter/mouseleave(独立 React root 下合成事件不工作)\n useEffect(() => {\n if (isMobile) return;\n const el = containerRef.current;\n if (!el) return;\n let leaveTimer: ReturnType<typeof setTimeout> | null = null;\n const enter = () => { if (leaveTimer) clearTimeout(leaveTimer); setOpen(true); };\n const leave = () => { leaveTimer = setTimeout(() => setOpen(false), 100); };\n el.addEventListener('mouseenter', enter);\n el.addEventListener('mouseleave', leave);\n return () => {\n if (leaveTimer) clearTimeout(leaveTimer);\n el.removeEventListener('mouseenter', enter);\n el.removeEventListener('mouseleave', leave);\n };\n }, [isMobile]);\n\n if (isMobile) {\n return <MobileWatermark variant={variant} onDontShow={onClose} portalContainer={portalContainer} />;\n }\n\n const desktopItems: MenuItem[] = [];\n if (variant === 'doubao') {\n desktopItems.push({\n icon: 'download',\n label: '下载豆包工作',\n onClick: () => window.open(VARIANT_CONFIG.doubao.downloadUrl, '_blank', 'noopener,noreferrer'),\n });\n } else {\n desktopItems.push({\n icon: 'efficiency',\n label: '了解妙搭',\n onClick: () => window.open(VARIANT_CONFIG.miaoda.landingUrl, '_blank', 'noopener,noreferrer'),\n });\n }\n if (REPORT_ENABLED) {\n desktopItems.push({ icon: variant === 'doubao' ? 'report' : 'feedback', label: '投诉与举报', onClick: openReport });\n }\n\n return (\n <div\n ref={containerRef}\n data-custom-element={`${variant}-watermark`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n gap: 8,\n }}\n >\n {open && <MenuCard items={desktopItems} fontSize={14} minWidth={160} itemGap={8} />}\n <Pill\n platform=\"desktop\"\n brandText={config.brandText}\n logoSrc={config.logoSrc}\n variant={variant}\n onClose={onClose}\n showClose={open}\n />\n </div>\n );\n};\n\n// ── 主组件(Shadow DOM 隔离 + 独立 React root) ────────────────\n\nconst Watermark: React.FC = () => {\n const hostRef = useRef<HTMLElement | null>(null);\n const rootRef = useRef<Root | null>(null);\n\n useIsomorphicLayoutEffect(() => {\n if (!hostRef.current) return;\n const host = hostRef.current;\n const shadow = host.shadowRoot ?? host.attachShadow({ mode: 'open' });\n\n const wrapper = document.createElement('div');\n shadow.appendChild(wrapper);\n const root = createRoot(wrapper);\n rootRef.current = root;\n root.render(<ShadowRootUI shadowRoot={shadow} />);\n return () => {\n const oldRoot = root;\n const oldWrapper = wrapper;\n queueMicrotask(() => { oldRoot.unmount(); oldWrapper.remove(); });\n rootRef.current = null;\n };\n }, []);\n\n if (process.env.NODE_ENV !== 'production') return null;\n\n const hostStyle: React.CSSProperties = {\n all: 'initial',\n position: 'fixed',\n right: 12,\n bottom: 12,\n zIndex: 2147483647,\n display: 'block',\n width: 'auto',\n height: 'auto',\n };\n\n return React.createElement(HOST_TAG, { ref: hostRef, style: hostStyle });\n};\n\nexport default Watermark;\n","const CDN = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp';\n\nexport const DOUBAO_LOGO_SRC = `${CDN}/miaoda-ui/doubao.svg`;\nexport const DOUBAO_BRAND_TEXT_SRC = `${CDN}/miaoda-ui/Doubao_watermark_aigc.svg`;\nexport const MIAODA_LOGO_SRC = `${CDN}/logo/miaodalogo.svg`;\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 { 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 * 是否为 standalone 导出构建(`miaoda app pack --mode standalone`)。\n *\n * standalone 产物脱离妙搭平台、以 `file://` 离线打开,平台徽标(Safety「由妙搭搭建」/\n * 豆包水印)在这里既无意义也无从校验 —— 它们的显隐判据全是 **fail-open** 的:\n * `showBadge` 拿不到平台数据就默认 true、接口失败也 catch 成 true,于是离线产物里\n * 徽标必然出现,还附带两个必然失败的 `tenant_info` / `get_published` 请求。\n * 所以 gate 在挂载处,让整棵子树不渲染,连 effect 里的请求一起省掉。\n *\n * `MIAODA_BUILD_TARGET` 由构建 preset 在 standalone 模式下 define 注入。\n *\n * **必须 try/catch**:客户端 bundle 里没有 `process` 全局,所有 `process.env.X` 全靠\n * 构建期 define 做字符串替换。若应用升级了本 SDK 却仍用**旧版 preset**(不认识这个 key),\n * 该表达式不会被替换,运行时直接 `ReferenceError: process is not defined` 把整个应用打挂。\n * 防御口径:try/catch 兜底旧 preset 不替换该 key 的场景。\n */\nexport const isStandaloneBuild = (): boolean => {\n try {\n return process.env.MIAODA_BUILD_TARGET === 'standalone';\n } catch {\n return false;\n }\n};\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 { useEffect } from 'react';\nimport { clearNetworkIdle, networkIdleCallback } from 'network-idle';\nimport { submitPostMessage } from '../../utils/postMessage';\nimport { normalizeBasePath } from '../../utils/utils';\n\n/** 开发态首屏封面:保持与 client-toolkit 的 PageScreenshot 协议一致。 */\nexport function usePageScreenshot(): void {\n useEffect(() => {\n if (process.env.NODE_ENV !== 'development') return;\n\n let cancelled = false;\n const basePath = normalizeBasePath(process.env.CLIENT_BASE_PATH);\n const id = networkIdleCallback(() => {\n if (cancelled) return;\n void (async () => {\n // 截图库仅在开发态执行截图时加载。\n const { snapdom } = await import('@zumer/snapdom');\n if (cancelled) return;\n const result = await snapdom(document.body, {\n format: 'png',\n width: document.body.scrollWidth,\n height: document.body.scrollHeight,\n fallbackURL: ({ src = '' }) =>\n `${basePath}/dev/snapdom-proxy?url=${encodeURIComponent(src)}`,\n exclude: ['#lucide-react-svg'],\n backgroundColor: '#ffffff',\n });\n if (cancelled) return;\n const image = await result.toPng();\n if (cancelled) return;\n submitPostMessage({ type: 'PageScreenshot', data: image.src });\n })().catch(() => {\n // 截图是辅助能力,失败不影响应用渲染。\n });\n }, 2000);\n\n return () => {\n cancelled = true;\n clearNetworkIdle(id);\n };\n }, []);\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","import { slardar } from '@lark-apaas/internal-slardar';\n\nimport { getAppId } from '../../../utils/getAppId';\n\n/**\n * 上报 app 首次渲染完成时机到 Slardar。\n *\n * 触发时机与 client-toolkit 的 AppContainer 一致:生产环境下 React 首次 mount。\n * 计算口径与 client-toolkit 保持一致:firstRenderTime 取 performance.now() 取整,\n * pageLoadTime 取 navigation entry 的 loadEventEnd - startTime 取整。\n */\nexport function reportAppFirstRender(): void {\n const appId = getAppId();\n const firstRenderTime = Math.round(performance.now());\n const navEntry = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n const pageLoadTime = navEntry && navEntry.loadEventEnd > 0\n ? Math.round(navEntry.loadEventEnd - navEntry.startTime)\n : undefined;\n\n slardar.sendEvent({\n name: 'app-first-render',\n metrics: {\n firstRenderTime,\n ...(pageLoadTime != null ? { pageLoadTime } : {}),\n },\n categories: {\n appId: appId ?? 'unknown',\n mode: window.IS_MIAODA_PREVIEW ? 'preview' : 'runtime',\n appType: String(process.env.MIAODA_APP_TYPE ?? 'unknown'),\n archType: String(process.env.MIAODA_APP_ARCH_TYPE ?? 'unknown'),\n },\n });\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';\nimport { isPreview } from '../utils/utils';\nimport { getParentOriginFromParams, submitPostMessage } from '../utils/postMessage';\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 * iframe-aware 预览态判定 fallback:当 `IS_MIAODA_PREVIEW` 未注入但当前\n * 实际嵌在已知主站 iframe 内时,仍按预览态走 postMessage 协议。\n * 命中条件二选一:\n * - URL 参数/会话缓存的 `__parentOrigin`(兼容豆包链路 parentOrigin 后门)\n * - 构建期注入的 `FORCE_FRAMEWORK_DOMAIN_MAIN` 等于当前 referrer origin\n */\nfunction isIframeUnderMainHost(): boolean {\n if (typeof window === 'undefined') return false;\n if (window.parent === window) return false;\n\n if (getParentOriginFromParams()) return true;\n\n const envOrigin = process.env.FORCE_FRAMEWORK_DOMAIN_MAIN;\n if (!envOrigin || !document.referrer) return false;\n try {\n return new URL(document.referrer).origin === envOrigin;\n } catch {\n return false;\n }\n}\n\n/**\n * 统一的链接组件,用于替换原生 <a> 标签\n * - 内部路由(/dashboard)→ react-router Link\n * - Hash 锚点(#section)→ <a>\n * - 外链(https://...)→ <a target=\"_blank\">\n *\n * 预览态(iframe 内)时,通过 postMessage 通知父页面处理链接跳转,\n * 避免浏览器安全策略限制导致链接无法正常打开。\n */\nexport const UniversalLink = React.forwardRef<HTMLAnchorElement, UniversalLinkProps>(\n function UniversalLink({ to, onClick, ...props }, ref) {\n const isExternal = isExternalLink(to);\n // 仅当 (a) 预览态 (b) 是外链 同时满足时走 postMessage 分支:\n // - 内部路由:父页面不接、内部 SPA 路由也不能用 window.open,应继续走 RouterLink\n // - hash 锚点:原生 <a href=\"#section\"> 在 iframe 内可正常工作,无需绕一圈\n // - 外链:iframe sandbox 会拦 <a target=\"_blank\">,必须 postMessage 给父页面打开\n const preview = (isPreview() || isIframeUnderMainHost()) && isExternal;\n\n if (preview) {\n // 进入此分支时 to 一定是外链,OpenIframeLink.data.external 恒为 true\n const handlePreviewClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n onClick?.(e);\n submitPostMessage({\n type: 'OpenIframeLink',\n data: { href: to, external: true },\n });\n };\n\n return (\n <a\n href={to}\n ref={ref}\n {...props}\n onClick={handlePreviewClick}\n target={props.target ?? '_blank'}\n rel={props.rel ?? 'noopener noreferrer'}\n />\n );\n }\n\n // 内部路由:不管预览态都走 RouterLink,靠 react-router 处理 SPA 跳转\n if (isInternalRoute(to)) {\n return <RouterLink to={to} ref={ref} {...props} onClick={onClick} />;\n }\n\n // Hash 链接 & 外链非预览态\n return (\n <a\n href={to}\n ref={ref}\n {...props}\n onClick={onClick}\n {...(isExternal && {\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","import { 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 = () => {\n const appId = getAppId() ?? '';\n // dataloom 在 SDK 内部每次写请求都从 cookie 现读 X-Suda-Csrf-Token,\n // 避免实例长命时 token 中途被服务端轮换造成 403。\n return createClient({\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 // getInitialInfo 保留:仍依赖其副作用与缓存。\n // storage 切 session 后不再需要 token/url,这里只触发它、不取用返回值。\n pendingPromise = getInitialInfo()\n .then(() => {\n dataloom = createDataLoomClient();\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","/**\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};\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 { 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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IAAMC,QAAQ,2BAAIC,SACvBC,kCAAWF,MAAK,GAAIC,IAAAA,GADD;;;ACNrB;;;;;;;;;;;;;;AACO,IAAME,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;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","viteConnectFailed","viteConnectionLost","time","Date","now","submitPostMessage","type","data","status","slardar","sendEvent","name","metrics","categories","reason","viteConnected","hmrFlag","startTime","duration","listenModuleHmr","hmr","getHmrApi","onSuccess","onError","error","console","warn","String","PROXY_CONSOLE_METHOD","interceptErrors","window","addEventListener","event","logger","forEach","method","originalMethod","args","level","first","map","a","Error","message","join","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","getBrowserTransportLevel","level","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","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","getWatermarkVariant","source","createdVia","origin","trim","toLowerCase","String","startsWith","readWatermarkCreatedVia","process","env","MIAODA_APP_CREATED_VIA","undefined","import_react","CDN","DOUBAO_LOGO_SRC","DOUBAO_BRAND_TEXT_SRC","MIAODA_LOGO_SRC","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","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","useIsomorphicLayoutEffect","window","useLayoutEffect","useEffect","VARIANT","getWatermarkVariant","process","env","MIAODA_APP_SOURCE","readWatermarkCreatedVia","VARIANT_CONFIG","doubao","brandText","logoSrc","DOUBAO_LOGO_SRC","downloadUrl","miaoda","MIAODA_LOGO_SRC","landingUrl","REPORT_ENABLED","FONT_FAMILY","PILL_SHADOW","CARD_SHADOW","HOST_TAG","reportDomainByEnv","env","runtimeEnv","getEnv","openReport","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","DownloadIcon","EfficiencyIcon","ReportIcon","stroke","strokeWidth","strokeLinecap","circle","cx","cy","r","DoubaoCloseIcon","fillOpacity","IconMap","feedback","report","close","download","efficiency","BrandLogo","src","img","alt","borderRadius","Pill","platform","brandText","logoSrc","variant","onClose","showClose","isDesktop","isDoubao","pillStyle","boxSizing","alignItems","gap","padding","background","cursor","border","boxShadow","div","DOUBAO_BRAND_TEXT_SRC","draggable","span","fontFamily","FONT_FAMILY","fontSize","lineHeight","color","whiteSpace","role","aria-label","onClick","e","stopPropagation","MenuRow","icon","label","hover","setHover","useState","rowRef","useRef","useEffect","el","current","enter","leave","addEventListener","removeEventListener","Icon","ref","data-label","minHeight","MenuCard","items","extraItems","minWidth","itemGap","flexDirection","overflow","outline","length","map","it","key","margin","MobileWatermark","onDontShow","portalContainer","setOpen","config","VARIANT_CONFIG","push","miaoda","landingUrl","REPORT_ENABLED","Root","onOpenChange","Trigger","asChild","data-custom-element","Portal","container","Content","side","align","sideOffset","ShadowRootUI","shadowRoot","appId","storageKey","closed","setClosed","localStorage","getItem","showBadge","setShowBadge","loaded","setLoaded","isMobile","useIsMobile","getInitialInfo","then","info","badge","app_info","show_badge","catch","finally","WatermarkContent","VARIANT","setItem","containerRef","leaveTimer","clearTimeout","setTimeout","desktopItems","doubao","downloadUrl","Watermark","hostRef","rootRef","useIsomorphicLayoutEffect","host","shadow","attachShadow","mode","wrapper","document","createElement","appendChild","root","createRoot","render","oldRoot","oldWrapper","queueMicrotask","unmount","remove","NODE_ENV","hostStyle","all","position","right","bottom","zIndex","isStandaloneBuild","process","env","MIAODA_BUILD_TARGET","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","import_react","usePageScreenshot","useEffect","process","env","NODE_ENV","cancelled","basePath","normalizeBasePath","CLIENT_BASE_PATH","id","networkIdleCallback","snapdom","result","document","body","format","width","scrollWidth","height","scrollHeight","fallbackURL","src","encodeURIComponent","exclude","backgroundColor","image","toPng","submitPostMessage","type","data","catch","clearNetworkIdle","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","import_internal_slardar","reportAppFirstRender","appId","getAppId","firstRenderTime","Math","round","performance","now","navEntry","getEntriesByType","pageLoadTime","loadEventEnd","startTime","undefined","slardar","sendEvent","name","metrics","categories","mode","window","IS_MIAODA_PREVIEW","appType","String","process","env","MIAODA_APP_TYPE","archType","MIAODA_APP_ARCH_TYPE","TrackKey","AppContainer","children","useAppInfo","usePageScreenshot","standalone","isStandaloneBuild","useEffect","process","env","NODE_ENV","reportTeaEvent","trackKey","TrackKey","VIEW","trackParams","artifact_uid","getAppId","agent_id","url","window","location","href","reportAppFirstRender","React","Watermark","MiaodaInspector","IframeBridge","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","isIframeUnderMainHost","window","parent","getParentOriginFromParams","envOrigin","process","env","FORCE_FRAMEWORK_DOMAIN_MAIN","document","referrer","URL","origin","UniversalLink","React","forwardRef","onClick","props","ref","isExternal","preview","isPreview","handlePreviewClick","e","preventDefault","submitPostMessage","type","data","href","external","a","target","rel","RouterLink","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","import_auth_sdk","createDataLoomClient","appId","getAppId","createClient","global","enableDataloomLog","process","env","NODE_ENV","requestRateLimit","undefined","brandName","accountServices","user","authClient","session","dataloom","pendingPromise","getDataloom","Promise","resolve","getInitialInfo","then","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","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","_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"]}
|