@lark-apaas/client-toolkit-lite 1.1.7-alpha.21 → 1.1.7-alpha.22

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.
@@ -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/logger/logger.ts","../src/logger/intercept-global-error.ts","../src/utils/hmr-api.ts","../src/utils/postMessage.ts","../src/logger/log-types.ts","../src/utils/safeStringify.ts","../src/logger/selected-logs.ts","../src/logger/batch-logger.ts","../src/runtime/iframe-bridge.ts","../src/utils/utils.ts","../src/components/AppContainer/utils/childApi.ts","../src/runtime/index.ts","../src/components/AppContainer/safety.tsx","../src/utils/getAppId.ts","../src/utils/apiPath.ts","../src/hooks/useAppInfo.tsx","../src/utils/getInitialInfo.ts","../src/integrations/getAppInfo.ts","../src/hooks/useCurrentUserProfile.tsx","../src/integrations/getCurrentUserProfile.ts","../src/utils/url.ts","../src/integrations/dataloom.ts","../src/hooks/useIsMobile.ts","../src/hooks/useLogout.ts","../src/locales/messages.ts","../src/utils/locale.ts","../src/locales/index.ts","../src/components/QueryProvider/index.tsx","../src/components/AppContainer/IframeBridge.tsx","../src/hooks/useUpdatingRef.ts","../src/components/AppContainer/utils/tea.ts","../src/utils/deviceType.ts","../src/utils/getEnv.ts","../src/components/AppContainer/utils/getLarkUser.ts","../src/components/AppContainer/utils/observable.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/capabilityClient.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// Types\nexport type { AppInfoPayload } from './types/common';\nexport type { IUserProfile, IJson, IFileAttachment } from './types/udt-types';\nexport type { TrackParams } from './types/tea';\nexport { TrackKey } from './types/tea';\n\n// Tea\nexport { reportTeaEvent } from './components/AppContainer/utils/tea';\n\n// Constants\nexport * as avatarImages from './constants/img-resources/avatar';\nexport * as bannerImages from './constants/img-resources/banner';\nexport * as coverImages from './constants/img-resources/cover';\n","import React, { useEffect } from 'react';\nimport { MiaodaInspector } from '@lark-apaas/miaoda-inspector';\n\n// 兼容性:确保 runtime 被加载\n// runtime 内部有防重复机制(__FULLSTACK_RUNTIME_INITIALIZED__),不会重复执行\nimport '../../runtime';\n\nimport Safety from './safety';\nimport QueryProvider from '../QueryProvider';\nimport IframeBridge from './IframeBridge';\nimport { useAppInfo } from '../../hooks';\nimport { reportTeaEvent } from './utils/tea';\nimport { initObservable } from './utils/observable';\nimport { TrackKey } from '../../types/tea';\nimport { getAppId } from '../../utils/getAppId';\n\ninterface AppContainerProps {\n children: React.ReactNode;\n}\n\nconst AppContainer: React.FC<AppContainerProps> = ({ children }) => {\n useAppInfo();\n\n // 启动 OpenTelemetry 可观测(traces/logs/metrics);内部 try/catch,失败不阻断渲染\n useEffect(() => {\n initObservable();\n }, []);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'production') {\n reportTeaEvent({\n trackKey: TrackKey.VIEW,\n trackParams: {\n artifact_uid: getAppId(),\n agent_id: 'agent_miaoda',\n url: window.location.href,\n },\n });\n }\n }, []);\n\n return (\n <>\n <Safety />\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 } from '@lark-apaas/observable-web';\nimport { interceptErrors as interceptLogs } from './intercept-global-error';\nimport { LogLevel, LogWithMeta } from './log-types';\nimport { processLogParams, mapLogLevel } from '../utils/safeStringify';\nimport { interceptors } from './selected-logs';\n\n/**\n * lite 版 logger:\n * - 跟老 toolkit 一样的语义(debug/info/warn/error/success + 通用 log())\n * - 生产环境通过 observable.log 上报到 OpenTelemetry\n * - dev 环境调 interceptErrors,监听全局 error/unhandledrejection、devServer 状态\n * - 末尾通过 interceptors 链路包一层 typedLogInterceptor:任何 logger 顶层方法调用\n * 都会同步 postMessage `SELECTED_LOG`(typedLogV2 格式)给妙搭外壳,level==='error'\n * 时妙搭 sandbox-console 把它计入 errorCount → 显示「一键修复」按钮\n */\n\nexport type LogInterceptor = (originLogger: typeof logger) => typeof logger;\n\nconst shouldReportToObservable = process.env.NODE_ENV === 'production';\n\ninterface LoggerConfig {\n /** 是否显示日志级别前缀 */\n showLevel?: boolean;\n /** 是否显示时间戳 */\n showTimestamp?: boolean;\n /** 日志级别 */\n level?: LogLevel;\n /** 配置前缀字符串 */\n prefix?: string;\n}\n\nconst ORDERED_LEVELS: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n\nconst defaultConfig: Required<LoggerConfig> = {\n showLevel: false,\n showTimestamp: false,\n level: 'info',\n prefix: '',\n};\n\nlet config: Required<LoggerConfig> = { ...defaultConfig };\n\nfunction configureLogger(options: LoggerConfig) {\n config = { ...defaultConfig, ...options };\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return ORDERED_LEVELS.indexOf(level) >= ORDERED_LEVELS.indexOf(config.level);\n}\n\nfunction getFormattedPrefix(level: LogLevel): string[] {\n const parts: string[] = [];\n if (config.prefix) {\n parts.push(`[${config.prefix}]`);\n }\n if (config.showLevel) {\n parts.push(`[${level.toUpperCase()}]`);\n }\n return parts;\n}\n\n// 默认配置 logger,import 即生效\nconfigureLogger({\n showLevel: true,\n showTimestamp: false,\n level: process.env.NODE_ENV === 'development' ? 'debug' : 'error',\n prefix: 'MiaoDa',\n});\n\nexport let logger = {\n debug(message: unknown, ...args: unknown[]) {\n if (shouldLog('debug')) {\n console.log(...getFormattedPrefix('debug'), message, ...args);\n }\n },\n info(message: unknown, ...args: unknown[]) {\n if (shouldLog('info')) {\n console.log(...getFormattedPrefix('info'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('INFO', processLogParams([message, ...args]).join(' '));\n }\n },\n warn(message: unknown, ...args: unknown[]) {\n if (shouldLog('warn')) {\n console.log(...getFormattedPrefix('warn'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('WARN', processLogParams([message, ...args]).join(' '));\n }\n },\n error(message: unknown, ...args: unknown[]) {\n if (shouldLog('error')) {\n console.error(...getFormattedPrefix('error'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('ERROR', processLogParams([message, ...args]).join(' '));\n }\n },\n success(message: unknown, ...args: unknown[]) {\n if (shouldLog('info')) {\n console.log(...getFormattedPrefix('success'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('INFO', processLogParams([message, ...args]).join(' '));\n }\n },\n log({ level, args }: LogWithMeta) {\n if (shouldLog(level)) {\n console.log(...getFormattedPrefix(level), ...args);\n }\n if (shouldReportToObservable && level !== 'debug') {\n observable.log(mapLogLevel(level), processLogParams(args).join(' '));\n }\n },\n};\n\nif (process.env.NODE_ENV !== 'production') {\n // 在 window 上挂内置 logger,用于收集 ErrorBoundary 之外的运行时报错\n (window as unknown as { __RUNTIME_LOGGER__?: unknown }).__RUNTIME_LOGGER__ = {\n get() {\n return logger;\n },\n };\n}\n\n// 应用 interceptors 链:包一层 typedLogInterceptor,让所有 logger 方法都发 SELECTED_LOG\nfor (const interceptor of interceptors) {\n logger = interceptor(logger);\n}\n\nif (process.env.NODE_ENV !== 'production') {\n interceptLogs();\n}\n","import { slardar } from '@lark-apaas/internal-slardar';\nimport { getHmrApi } from '../utils/hmr-api';\nimport { submitPostMessage } from '../utils/postMessage';\nimport { isLogLevel, LogLevel } from './log-types';\nimport { logger } from './logger';\n\n/**\n * lite 版 intercept-global-error:\n * - 拦截全局 error / unhandledrejection → logger.error 上报\n * - 监听 HMR 成功/失败 → postMessage 通知妙搭外壳 + Slardar 埋点\n * - 监听 console 输出里的 devServer 断连/重连关键词 → postMessage 通知外壳 + Slardar 埋点\n */\n\n/** 记录 devServer 断开时间 */\nlet devServerDisconnectInfo: { time: number } | null = null;\nlet retryCount = 0;\n\nfunction processDevServerLog(log: string) {\n if (!log) return;\n const devFlag = log.includes('[webpack-dev-server]') || log.includes('[vite]');\n // 检测断连\n if (devFlag && log.includes('Disconnected')) {\n const time = Date.now();\n devServerDisconnectInfo = { time };\n submitPostMessage({\n type: 'DevServerMessage',\n data: {\n type: 'devServer-status',\n status: 'disconnected',\n },\n });\n slardar.sendEvent({\n name: 'sandbox-devServer',\n metrics: { time },\n categories: {\n type: 'disconnected',\n },\n });\n return;\n }\n if (!devServerDisconnectInfo) {\n return;\n }\n // 检测重连尝试\n if (devFlag && log.includes('Trying to reconnect')) {\n if (retryCount) {\n // 已经重连过一次还没成功,记为 reconnect-failed\n slardar.sendEvent({\n name: 'sandbox-devServer',\n metrics: { retryCount: retryCount + 1 },\n categories: {\n type: 'reconnect-failed',\n },\n });\n }\n retryCount++;\n return;\n }\n // 检测重连成功\n const hmrFlag = log.includes('[HMR]');\n if (\n hmrFlag ||\n (devFlag &&\n (log.includes('Socket connected') ||\n log.includes('App updated') ||\n log.includes('App hot update') ||\n log.includes('connected')))\n ) {\n submitPostMessage({\n type: 'DevServerMessage',\n data: {\n type: 'devServer-status',\n status: 'connected',\n },\n });\n const startTime = devServerDisconnectInfo.time;\n const duration = Date.now() - startTime;\n slardar.sendEvent({\n name: 'sandbox-devServer',\n metrics: { startTime, duration },\n categories: {\n type: 'devServer-reconnected',\n },\n });\n devServerDisconnectInfo = null;\n retryCount = 0;\n }\n}\n\n/**\n * 监听模块热更:\n * - 热更应用成功 → postMessage 通知主应用更新完成\n * - 热更失败 → console.warn + Slardar 埋点\n */\nfunction listenModuleHmr() {\n const hmr = getHmrApi();\n if (hmr) {\n hmr.onSuccess(() => {\n submitPostMessage({\n type: 'DevServerMessage',\n data: {\n type: 'devServer-status',\n status: 'hmr-apply-success',\n },\n });\n });\n\n hmr.onError((error) => {\n console.warn('hmr apply failed', error);\n slardar.sendEvent({\n name: 'sandbox-devServer',\n categories: {\n type: 'hmr-apply-failed',\n error: String(error),\n },\n });\n });\n }\n}\n\nconst PROXY_CONSOLE_METHOD = ['log', 'info', 'warn', 'error'] as const;\n\n/** 当前只有开发态会执行此操作 */\nexport function interceptErrors() {\n window.addEventListener('error', (event) => {\n logger.error(event.error);\n });\n\n window.addEventListener('unhandledrejection', (event) => {\n logger.error(event.reason);\n });\n\n listenModuleHmr();\n\n PROXY_CONSOLE_METHOD.forEach((method) => {\n const originalMethod = window.console[method];\n window.console[method] = (...args: unknown[]) => {\n originalMethod(...args);\n const level: LogLevel = method === 'log' ? 'info' : (method as LogLevel);\n const first = args[0];\n // 检测 devServer 断连/重连\n if (typeof first === 'string') {\n processDevServerLog(first);\n }\n // 转发特定 prefix 日志给妙搭外壳(典型场景:dataloom 报错)\n if (\n typeof first === 'string' &&\n first.startsWith('[Dataloom]') &&\n isLogLevel(level)\n ) {\n logger.log({ level, args });\n submitPostMessage({\n type: 'Console',\n method,\n data: args as unknown as Record<string, unknown>,\n });\n }\n };\n });\n}\n","/**\n * 统一 HMR API\n *\n * 提供统一的 HMR 成功/失败回调接口,屏蔽 Webpack 和 Vite 的差异。\n *\n * - Webpack/Rspack: 通过 import.meta.webpackHot 或 module.hot\n * - Vite: 通过 error-overlay 注入的 window.__VITE_HMR__\n *\n * @see docs/RFC_HMR_API.md\n */\n\nexport interface HmrApi {\n /**\n * 注册 HMR 更新前回调(模块替换之前触发)\n * @param callback 回调函数\n * @returns cleanup 函数,用于取消注册\n */\n onBeforeApply?(callback: () => void): () => void;\n\n /**\n * 注册 HMR 成功回调\n * @param callback 成功回调函数\n * @returns cleanup 函数,用于取消注册\n */\n onSuccess(callback: () => void): () => void;\n\n /**\n * 注册 HMR 失败回调\n * @param callback 失败回调函数,参数为错误信息\n * @returns cleanup 函数,用于取消注册\n */\n onError(callback: (error: unknown) => void): () => void;\n}\n\ndeclare global {\n interface Window {\n __VITE_HMR__?: Required<HmrApi>;\n }\n}\n\ninterface WebpackHot {\n addStatusHandler(handler: (status: string) => void): void;\n removeStatusHandler(handler: (status: string) => void): void;\n}\n\n/**\n * 创建 Webpack/Rspack HMR 适配器\n */\nfunction createWebpackHmrApi(hot: WebpackHot): HmrApi {\n return {\n onSuccess(callback) {\n let lastStatus: string | null = null;\n const handler = (status: string) => {\n // apply -> idle 转换表示 HMR 成功\n if (status === 'idle' && lastStatus === 'apply') {\n try {\n callback();\n } catch (e) {\n console.error('[HMR] Success callback error:', e);\n }\n }\n lastStatus = status;\n };\n hot.addStatusHandler(handler);\n return () => hot.removeStatusHandler(handler);\n },\n\n onError(callback) {\n const handler = (status: string) => {\n // fail 或 abort 表示 HMR 失败\n if (status === 'fail' || status === 'abort') {\n try {\n callback(new Error(`HMR ${status}`));\n } catch (e) {\n console.error('[HMR] Error callback error:', e);\n }\n }\n };\n hot.addStatusHandler(handler);\n return () => hot.removeStatusHandler(handler);\n },\n };\n}\n\n/**\n * 获取 HMR API 实例\n *\n * 自动检测当前构建工具(Webpack/Vite)并返回对应实现:\n * - Webpack/Rspack: 使用内置适配器\n * - Vite: 使用 error-overlay 注入的 window.__VITE_HMR__\n *\n * @returns HmrApi 实例,如果不在开发环境或不支持 HMR 则返回 null\n */\nexport function getHmrApi(): HmrApi | null {\n if (process.env.NODE_ENV === 'production') return null;\n\n // Webpack/Rspack (import.meta.webpackHot)\n // @ts-ignore - Webpack HMR API\n if (import.meta.webpackHot) {\n // @ts-ignore\n return createWebpackHmrApi(import.meta.webpackHot);\n }\n\n // Legacy webpack (module.hot)\n // @ts-ignore\n if (typeof module !== 'undefined' && module.hot) {\n // @ts-ignore\n return createWebpackHmrApi(module.hot);\n }\n\n // Vite (通过 error-overlay 注入)\n if (window.__VITE_HMR__) {\n return window.__VITE_HMR__;\n }\n\n return null;\n}\n","import type { IncomingMessage, OutgoingMessage } from '../types/iframe-events';\n\nconst PARENT_ORIGIN_KEY = '__parentOrigin';\n\nfunction getParentOriginFromParams(): string | undefined {\n try {\n const params = new URLSearchParams(window.location.search);\n const origin = params.get(PARENT_ORIGIN_KEY);\n if (origin) {\n sessionStorage.setItem(PARENT_ORIGIN_KEY, origin);\n return origin;\n }\n } catch {\n // URL 解析失败时忽略\n }\n try {\n return sessionStorage.getItem(PARENT_ORIGIN_KEY) || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getLegacyParentOrigin(): string {\n const { origin } = window.location;\n if (origin.includes('force.feishuapp.net')) {\n return 'https://force.feishu.cn';\n }\n if (origin.includes('force-pre.feishuapp.net')) {\n return 'https://force.feishu-pre.cn';\n }\n if (origin.includes('force.byted.org')) {\n return 'https://force.feishu-boe.cn';\n }\n if (origin.includes('feishuapp.cn') || origin.includes('miaoda.feishuapp.net')) {\n return 'https://miaoda.feishu.cn';\n }\n if (origin.includes('fsapp.kundou.cn') || origin.includes('miaoda-pre.feishuapp.net')) {\n return 'https://miaoda.feishu-pre.cn';\n }\n return 'https://miaoda.feishu-boe.cn';\n}\n\nexport function resolveParentOrigin(): string {\n // 本地开发:父页面为 localhost / 127.0.0.1 时,使用 referrer 真实 origin 作为 targetOrigin\n try {\n if (document.referrer) {\n const referrerOrigin = new URL(document.referrer).origin;\n if (\n referrerOrigin.startsWith('http://localhost') ||\n referrerOrigin.startsWith('http://127.0.0.1')\n ) {\n return referrerOrigin;\n }\n }\n } catch {\n // referrer 为空或无效时忽略,走正常环境匹配逻辑\n }\n\n // 父页面运行时通过 URL 参数传入\n const paramOrigin = getParentOriginFromParams();\n if (paramOrigin) return paramOrigin;\n\n return process.env?.FORCE_FRAMEWORK_DOMAIN_MAIN ?? getLegacyParentOrigin();\n}\n\nexport function submitPostMessage<T extends OutgoingMessage>(\n message: T,\n targetOrigin?: string\n): void {\n try {\n const parentOrigin = resolveParentOrigin();\n const origin = targetOrigin ?? parentOrigin;\n if (!origin) return;\n window.parent.postMessage(message, origin);\n } catch (e) {\n console.error('postMessage error', e);\n }\n}\n\nexport function isOutgoingMessage<T extends OutgoingMessage['type']>(\n msg: OutgoingMessage,\n type: T\n): msg is Extract<OutgoingMessage, { type: T }> {\n return msg.type === type;\n}\n\nexport function isIncomingMessage<T extends IncomingMessage['type']>(\n msg: IncomingMessage,\n type: T\n): msg is Extract<IncomingMessage, { type: T }> {\n return msg.type === type;\n}\n","/**\n * Logger 类型定义。\n *\n * 跟老 toolkit 相比,lite 砍掉了 zod schema 校验,改成纯 TS 类型——\n * intercept-global-error 不再走 levelSchema.safeParse 那条分支,\n * 而是直接用 LOG_LEVELS 字面量数组 includes 判断。\n */\n\nexport const LOG_LEVELS = ['debug', 'info', 'warn', 'error', 'success'] as const;\nexport type LogLevel = (typeof LOG_LEVELS)[number];\n\nexport function isLogLevel(value: unknown): value is LogLevel {\n return typeof value === 'string' && (LOG_LEVELS as readonly string[]).includes(value);\n}\n\nexport interface LogStackFrame {\n functionName: string;\n fileName: string;\n lineNumber: number;\n columnNumber: number;\n}\n\nexport interface LogMeta {\n stacktrace?: LogStackFrame[];\n logTraceID?: string;\n skipFrame?: number;\n noStacktrace?: boolean;\n repairMessage?: string;\n /** 预留字段,用于分类日志 */\n type?: string;\n /** 日志去重相关字段 */\n isDuplicate?: boolean;\n duplicateCount?: number;\n duplicateOfId?: string;\n}\n\nexport interface LogWithMeta {\n level: LogLevel;\n args: unknown[];\n meta?: LogMeta;\n}\n\nexport interface SelectedLog {\n type: 'typedLogV2';\n level: LogLevel;\n id: string;\n args: unknown[];\n meta: LogMeta;\n}\n","import type { LogLevel } from '../logger/log-types';\n\n// 安全的 JSON.stringify 实现\nexport function safeStringify(obj: unknown): string {\n const seen = new Set<object>();\n\n try {\n return JSON.stringify(obj, (_key, value) => {\n // 处理循环引用\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) {\n return '[Circular]';\n }\n seen.add(value);\n }\n\n // 处理 BigInt\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n // 处理 Date\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n // 处理 Map\n if (value instanceof Map) {\n return Object.fromEntries(value);\n }\n\n // 处理 Set\n if (value instanceof Set) {\n return Array.from(value);\n }\n\n // 处理 Error(safeStringify 默认会丢失 name/message/stack)\n if (value instanceof Error) {\n return {\n name: value.name,\n message: value.message,\n stack: value.stack,\n };\n }\n\n // 处理 undefined\n if (typeof value === 'undefined') {\n return 'undefined';\n }\n\n // 处理 Symbol\n if (typeof value === 'symbol') {\n return value.toString();\n }\n\n return value;\n });\n } catch {\n return '';\n } finally {\n seen.clear();\n }\n}\n\n/** 把任意 log 参数(可能含 Error/对象/循环引用)转成可序列化的字符串数组 */\nexport function processLogParams(args: unknown[]): string[] {\n return args.map((arg) => {\n if (typeof arg === 'string') return arg;\n if (arg instanceof Error) {\n return `${arg.name}: ${arg.message}\\n${arg.stack ?? ''}`;\n }\n if (typeof arg === 'object' && arg !== null) {\n return safeStringify(arg);\n }\n return String(arg);\n });\n}\n\n/** logger.log({ level }) → observable.log 的等级字符串 */\nexport function mapLogLevel(level: LogLevel): 'INFO' | 'WARN' | 'ERROR' {\n if (level === 'warn') return 'WARN';\n if (level === 'error') return 'ERROR';\n return 'INFO';\n}\n","/**\n * Selected logs interceptor 链。\n *\n * 跟老 toolkit 对齐:把 logger 顶层 6 个方法(debug/info/warn/error/success/log)\n * 都包一层 typedLogInterceptor,每次调用同步发 `SELECTED_LOG` postMessage 给妙搭外壳。\n * 妙搭 sandbox-console 监听 SELECTED_LOG,把 level==='error' 的计入 errorCount,\n * 进而显示\"一键修复\"按钮。\n *\n * 与老 toolkit 的差异:\n * - 砍掉了 webpack 模式专用的 parseSourceMap / source-map WASM / SourceMapConsumer 链路\n * (老 toolkit 里 parseSourceMap 是 dead code 无人调用;lite 跑在 vite 上也不需要)\n * - 保留 stacktrace-js:StackTrace.fromError 把 Error.stack 字符串解析成结构化 frames;\n * vite dev 模式下 stack 已经是源码路径,结构化后 sandbox-console 显示更友好\n */\n\nimport StackTrace from 'stacktrace-js';\nimport { batchLogInfo } from './batch-logger';\nimport { submitPostMessage } from '../utils/postMessage';\nimport {\n LogMeta,\n LogStackFrame,\n LogWithMeta,\n SelectedLog,\n} from './log-types';\nimport type { LogInterceptor } from './logger';\n\n/**\n * 把 stacktrace-js 的 StackFrame[] 转成本仓 LogStackFrame schema 格式。\n */\nfunction mapStacktrace(stacktrace: StackTrace.StackFrame[]): LogStackFrame[] {\n return stacktrace.map((frame) => ({\n functionName: frame.functionName || '',\n fileName: frame.fileName || '',\n lineNumber: frame.lineNumber || 0,\n columnNumber: frame.columnNumber || 0,\n }));\n}\n\n/**\n * stacktrace 解析失败时上报给外壳,外壳可用于诊断 sourcemap 加载/解析问题。\n */\nfunction reportStacktraceParseError(e: unknown, context: string): void {\n if (window.parent === window) return;\n try {\n submitPostMessage({\n type: 'STACKTRACE_PARSE_ERROR',\n payload: {\n error: e instanceof Error ? e.message : String(e),\n context,\n },\n });\n } catch {\n // ignore\n }\n}\n\n/**\n * 拿当前调用栈(filter 由调用方处理)。\n * 主 toolkit 在 sendSelectedLog 末尾若 meta.stacktrace 缺失会调一次。\n */\nexport async function getStacktrace(): Promise<LogStackFrame[]> {\n const stacktrace = await StackTrace.get();\n return mapStacktrace(stacktrace);\n}\n\n/**\n * 序列化 Error 实例为 {message, stack, name}。\n * Error 默认属性不可枚举,直接 JSON.stringify 会输出 `{}` 丢信息。\n */\nfunction errorReplacer(_key: string, value: unknown) {\n if (value instanceof Error) {\n return {\n message: value.message,\n stack: value.stack,\n name: value.name,\n };\n }\n return value;\n}\n\nfunction generateLogId(): string {\n try {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n } catch {\n // ignore — fall through to fallback\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/** 保存上一次的日志内容用于去重 */\nlet lastLogInfo: { content: string; id: string; count: number } | null = null;\n\n/**\n * 发送一条 SelectedLog 到妙搭外壳。\n *\n * 包含:\n * - args 里的 Error 实例展开为 [message, errorObj](与老 toolkit 一致)\n * - meta.skipFrame 默认 2(让外壳跳过 logger 自己的栈帧)\n * - 与上一条内容完全一样时设 meta.isDuplicate / duplicateCount / duplicateOfId\n * - 同时走 batchLogInfo 批量通道 + window.parent.postMessage SELECTED_LOG\n */\nasync function sendSelectedLog(logWithoutID: Omit<SelectedLog, 'id'>) {\n try {\n const log: SelectedLog = {\n ...logWithoutID,\n id: generateLogId(),\n };\n\n const newParts: unknown[] = [];\n for (let i = 0; i < log.args.length; i++) {\n const item = log.args[i];\n if (item instanceof Error) {\n const newError = {\n message: item.message,\n stack: item.stack,\n name: item.name,\n };\n // 首个 Error 优先用其 stack 反查到结构化 frames,覆盖 meta.stacktrace\n if (!log.meta.stacktrace) {\n try {\n const stacktrace = await StackTrace.fromError(item);\n log.meta.stacktrace = mapStacktrace(stacktrace);\n } catch (e) {\n reportStacktraceParseError(e, 'StackTrace.fromError');\n }\n }\n newParts.push(newError.message, newError);\n } else {\n newParts.push(item);\n }\n }\n log.args = newParts;\n\n // 兜底:args 里没有 Error 时拿当前调用栈\n if (!log.meta.stacktrace) {\n try {\n const frames = await getStacktrace();\n // 过滤本 logger 内部的栈帧(避免噪音)\n const firstFrameIndex = frames.findIndex(\n (frame) => !frame.fileName.includes('client-toolkit-lite/dist/logger'),\n );\n log.meta.stacktrace = firstFrameIndex === -1 ? [] : frames.slice(firstFrameIndex);\n } catch (e) {\n reportStacktraceParseError(e, 'getStacktrace');\n }\n }\n\n if (log.meta.skipFrame === undefined) {\n log.meta.skipFrame = 2;\n }\n\n const logJSON = JSON.stringify(log, errorReplacer);\n\n // 去重:以去掉 id 的版本做比较\n const logForDedup = { ...log };\n delete (logForDedup as Partial<SelectedLog>).id;\n const logContentForDedup = JSON.stringify(logForDedup, errorReplacer);\n\n if (lastLogInfo && lastLogInfo.content === logContentForDedup) {\n lastLogInfo.count++;\n log.meta.isDuplicate = true;\n log.meta.duplicateCount = lastLogInfo.count;\n log.meta.duplicateOfId = lastLogInfo.id;\n const updatedJSON = JSON.stringify(log, errorReplacer);\n try {\n batchLogInfo('info', updatedJSON);\n } catch {\n // ignore\n }\n if (window.parent !== window) {\n try {\n submitPostMessage({ type: 'SELECTED_LOG', payload: updatedJSON });\n } catch {\n // ignore\n }\n }\n return;\n }\n\n lastLogInfo = {\n content: logContentForDedup,\n id: log.id,\n count: 1,\n };\n\n try {\n batchLogInfo('info', logJSON);\n } catch {\n // ignore\n }\n if (window.parent !== window) {\n try {\n submitPostMessage({ type: 'SELECTED_LOG', payload: logJSON });\n } catch {\n // ignore\n }\n }\n } catch {\n // sendSelectedLog 失败不应影响业务\n }\n}\n\nfunction sendTypedLogV2(logWithMeta: LogWithMeta) {\n // sendSelectedLog 是 async(stacktrace 解析需要异步),但调用方不关心结果,\n // 用 void 忽略 Promise,避免 unhandled rejection 噪音\n void sendSelectedLog({\n type: 'typedLogV2',\n level: logWithMeta.level,\n args: logWithMeta.args,\n meta: logWithMeta.meta ?? {},\n });\n}\n\n/**\n * 拦截 logger 的 6 个方法(debug/info/warn/error/success/log),\n * 在调用原方法的同时同步 sendTypedLogV2 到妙搭外壳。\n */\nconst typedLogInterceptor: LogInterceptor = (originLogger) => ({\n debug: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.debug(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'info', args: [message, ...args], meta: {} });\n },\n info: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.info(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'info', args: [message, ...args], meta: {} });\n },\n warn: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.warn(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'warn', args: [message, ...args], meta: {} });\n },\n error: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.error(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'error', args: [message, ...args], meta: {} });\n },\n success: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.success(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'success', args: [message, ...args], meta: {} });\n },\n log: ({ level, args, meta }: LogWithMeta) => {\n try {\n originLogger.log({ level, args, meta });\n } catch {\n // ignore\n }\n sendTypedLogV2({ level, args, meta: meta ?? ({} as LogMeta) });\n },\n});\n\nexport const interceptors: LogInterceptor[] = [typedLogInterceptor];\n","interface CollectLogRequest {\n level: string;\n message: string;\n time: string; // ISO String\n source?: string; // Log Source string\n user_id: string; // User ID\n tenant_id: string; // Tenant ID\n app_id: string; // App ID\n}\n\ninterface LogEntry {\n id: string;\n level: string;\n message: string;\n source?: string;\n timestamp: number;\n}\n\ninterface BatchLoggerConfig {\n /** 用户ID */\n userId: string;\n /** 租户ID */\n tenantId: string;\n /** 应用ID */\n appId: string;\n /** 后端接收日志的接口地址,默认为/dev/logs/collect */\n endpoint?: string;\n /** 达到此数量时触发刷新 */\n sizeThreshold?: number;\n /** 自动刷新的时间间隔(毫秒) */\n flushInterval?: number;\n /** 最大重试次数 */\n maxRetries?: number;\n /** 重试延迟(毫秒) */\n retryDelay?: number;\n /** 自定义请求头 */\n headers?: Record<string, string>;\n}\n\nexport class BatchLogger {\n private config: Required<BatchLoggerConfig>;\n private logQueue: LogEntry[] = [];\n private flushTimer: NodeJS.Timeout | null = null;\n private isProcessing = false;\n\n private originConsole: Console;\n\n constructor(console: Console, config?: BatchLoggerConfig) {\n this.originConsole = { ...console };\n const {\n userId = '',\n tenantId = '',\n appId = '',\n } = (window || {}) as {\n userId?: string;\n tenantId?: string;\n appId?: string;\n };\n this.config = {\n userId,\n tenantId,\n appId,\n // 需要加请求路径前缀\n endpoint: (process.env.CLIENT_BASE_PATH || '') + '/dev/logs/collect-batch',\n sizeThreshold: 20,\n flushInterval: 1000,\n maxRetries: 3,\n retryDelay: 500,\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(config || {}),\n };\n\n this.startFlushTimer();\n this.setupBeforeUnloadHandler();\n }\n\n /**\n * 批量记录日志(对外暴露的唯一方法)\n */\n batchLog(level: string, message: string, source?: string): void {\n const logEntry: LogEntry = {\n id: this.generateId(),\n level,\n message,\n source,\n timestamp: Date.now(),\n };\n\n // 直接添加日志,不进行合并\n this.logQueue.push(logEntry);\n\n // 如果队列达到批处理阈值,立即刷新\n if (this.logQueue.length >= this.config.sizeThreshold) {\n this.flush();\n }\n }\n\n\n\n /**\n * 刷新日志队列,全部发送\n */\n async flush(): Promise<void> {\n if (this.isProcessing || this.logQueue.length === 0) {\n return;\n }\n\n this.isProcessing = true;\n const logsToSend = this.logQueue.splice(0, this.logQueue.length);\n\n try {\n await this.sendBatch(logsToSend);\n } catch (error) {\n // 发送失败时,将日志重新加入队列\n this.logQueue.unshift(...logsToSend);\n } finally {\n this.isProcessing = false;\n }\n }\n\n /**\n * 发送日志批次到后端\n */\n private async sendBatch(logs: LogEntry[]): Promise<void> {\n // 将LogEntry转换为CollectLogRequest格式\n const collectLogs: CollectLogRequest[] = logs.map(log => ({\n level: log.level,\n message: log.message,\n time: new Date(log.timestamp).toISOString(),\n source: log.source,\n user_id: this.config.userId,\n tenant_id: this.config.tenantId,\n app_id: this.config.appId,\n }));\n\n let retries = 0;\n\n while (retries <= this.config.maxRetries) {\n try {\n await this.execFetch(this.config.endpoint, {\n method: 'POST',\n headers: this.config.headers,\n body: JSON.stringify(collectLogs),\n });\n return;\n } catch (error) {\n retries++;\n\n if (retries > this.config.maxRetries) {\n this.originConsole.error(\n `Failed to send logs (attempt ${retries}), retrying in ${this.config.retryDelay}ms...`,\n );\n } else {\n this.originConsole.warn(\n `Failed to send logs (attempt ${retries}), retrying in ${this.config.retryDelay}ms...`,\n );\n }\n\n await this.delay(this.config.retryDelay * retries); // 指数退避\n }\n }\n }\n\n /**\n * 执行实际的fetch请求\n */\n private async execFetch(\n url: string,\n options: RequestInit,\n ): Promise<Response> {\n return fetch(url, options);\n }\n\n /**\n * 启动自动刷新定时器\n */\n private startFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = setInterval(() => {\n if (this.logQueue.length > 0) {\n this.flush();\n }\n }, this.config.flushInterval);\n }\n\n /**\n * 设置页面卸载时的处理\n */\n private setupBeforeUnloadHandler(): void {\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', () => {\n this.flush().finally(() => {\n this.destroy();\n });\n });\n }\n }\n\n /**\n * 延迟函数\n */\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n /**\n * 生成唯一ID\n */\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * 销毁资源\n */\n async destroy(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n // 发送剩余的日志\n if (this.logQueue.length > 0) {\n await this.flush();\n }\n }\n\n /**\n * 获取队列大小\n */\n getQueueSize(): number {\n return this.logQueue.length;\n }\n\n /**\n * 更新配置\n */\n updateConfig(newConfig: Partial<BatchLoggerConfig>): void {\n this.config = { ...this.config, ...newConfig };\n\n // 重新启动定时器\n this.startFlushTimer();\n }\n}\n\nlet defaultBatchLogger: BatchLogger | null = null;\n\nexport function getBatchLogger() {\n return defaultBatchLogger;\n}\n\nexport function initBatchLogger(\n oldConsole: Console,\n config?: BatchLoggerConfig,\n): void {\n defaultBatchLogger = new BatchLogger(oldConsole, config);\n}\n\n/** 记录日志进行批量同步 */\nexport function batchLogInfo(\n level: string,\n message: string,\n source?: string,\n): void {\n if (!defaultBatchLogger) {\n return;\n }\n defaultBatchLogger.batchLog(level, message, source);\n}\n\nexport function destroyBatchLogger(): void {\n if (defaultBatchLogger) {\n defaultBatchLogger.destroy();\n defaultBatchLogger = null;\n }\n}\n\n// 模块加载时自动初始化(仅在开发环境且浏览器环境)\nif (process.env.NODE_ENV !== 'production' && typeof window !== 'undefined') {\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. Logger 模块 side-effect(dev 下注册 interceptErrors)\n * 4. 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. 触发 logger 模块的 side-effect(dev 下注册 interceptErrors)\nimport '../logger';\n\n// 3. 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\n if (process.env.NODE_ENV !== 'production') {\n initIframeBridge();\n }\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { getCsrfToken } from '../../utils/getCsrfToken';\nimport { getAppId } from '../../utils/getAppId';\nimport { isNewPathEnabled } from '../../utils/apiPath';\nimport { useIsMobile } from '../../hooks';\nimport { t } from '../../locales';\n\n// ── defensive reset (prevents host page CSS from leaking in) ────\n\nconst resetBase: React.CSSProperties = {\n boxSizing: 'border-box',\n margin: 0,\n padding: 0,\n border: 'none',\n background: 'none',\n font: 'inherit',\n color: 'inherit',\n textAlign: 'left',\n textDecoration: 'none',\n textTransform: 'none',\n letterSpacing: 'normal',\n wordSpacing: 'normal',\n lineHeight: 'normal',\n verticalAlign: 'baseline',\n listStyle: 'none',\n};\n\n// ── inline style constants ──────────────────────────────────────\n\nconst FONT_FAMILY = \"'PingFang SC', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\";\nconst Z_BADGE = 10000000;\nconst Z_OVERLAY = 10000001;\n\nconst LOGO_URL = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodalogo.svg';\n// Cover URLs 通过 locale 机制获取,支持中英文不同封面\nconst getCoverUrl = () => t('safety.cover.pc');\nconst getCoverMobileUrl = () => t('safety.cover.mobile');\nconst ICON_COMPANY_URL = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/icon/icon_company_outlined.svg';\nconst ICON_AI_URL = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/icon/icon_efficiency-ai_outlined.svg';\nconst LANDING_URL = 'https://miaoda.feishu.cn/landing';\n\nconst badgeBase: React.CSSProperties = {\n ...resetBase,\n position: 'fixed',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n border: '1px solid rgba(255,255,255,0.1)',\n padding: '6px 10px',\n background: '#1f2329',\n boxShadow: '0 6px 12px 0 rgba(65,68,74,0.04), 0 8px 24px 8px rgba(65,68,74,0.04)',\n borderRadius: 6,\n fontFamily: FONT_FAMILY,\n fontSize: 12,\n lineHeight: '20px',\n zIndex: Z_BADGE,\n cursor: 'pointer',\n};\n\nconst badgeDesktop: React.CSSProperties = { ...badgeBase, right: 12, bottom: 12 };\nconst badgeMobile: React.CSSProperties = { ...badgeBase, right: 12, bottom: 80 };\n\nconst logoStyle: React.CSSProperties = { flexShrink: 0, width: 16, height: 16 };\n\nconst badgeTextStyle: React.CSSProperties = {\n flexShrink: 0,\n margin: 0,\n color: '#EBEBEB',\n};\n\n// ── desktop popover styles ──────────────────────────────────────\n\nconst popoverContent: React.CSSProperties = {\n ...resetBase,\n overflow: 'hidden',\n borderRadius: 12,\n width: 286,\n boxShadow: '0 6px 12px 0 rgba(65,68,74,0.04), 0 8px 24px 0 rgba(65,68,74,0.04)',\n zIndex: Z_OVERLAY,\n};\n\nconst popoverInner: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n background: '#1A1A1A',\n};\n\nconst popoverCover: React.CSSProperties = { width: 286, height: 128, cursor: 'pointer', display: 'block' };\n\nconst popoverBody: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'flex-end',\n gap: 12,\n border: '1px solid rgba(255,255,255,0.05)',\n padding: '11px 15px 15px 14px',\n borderRadius: '12px 12px 0 0',\n fontFamily: FONT_FAMILY,\n fontSize: 12,\n lineHeight: '20px',\n color: '#a6a6a6',\n background: '#1f2021',\n};\n\nconst infoRow: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n alignSelf: 'stretch',\n};\n\nconst infoIcon: React.CSSProperties = { flexShrink: 0, width: 12, height: 12 };\nconst infoIconMobile: React.CSSProperties = { flexShrink: 0, width: 14, height: 14 };\n\nconst infoText: React.CSSProperties = { margin: 0, color: '#a6a6a6', flexShrink: 0 };\n\nconst btnRow: React.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 8,\n width: '100%',\n alignSelf: 'stretch',\n};\n\nconst btnBase: React.CSSProperties = {\n ...resetBase,\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: 34,\n borderRadius: 8,\n borderWidth: '0.5px',\n borderStyle: 'solid',\n borderColor: 'rgba(255,255,255,0.11)',\n background: 'rgba(255,255,255,0.03)',\n color: '#ebebeb',\n cursor: 'pointer',\n fontSize: 12,\n fontFamily: FONT_FAMILY,\n transition: 'background 0.15s ease, border-color 0.15s ease',\n};\n\nconst btnHovered: React.CSSProperties = {\n background: 'rgba(255,255,255,0.08)',\n borderColor: 'rgba(255,255,255,0.2)',\n};\n\n// ── mobile sheet styles ─────────────────────────────────────────\n\nconst overlayStyle: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n zIndex: Z_OVERLAY,\n background: 'rgba(0,0,0,0.5)',\n};\n\nconst sheetContent: React.CSSProperties = {\n position: 'fixed',\n inset: 'auto 0 0 0',\n zIndex: Z_OVERLAY + 1,\n outline: 'none',\n};\n\nconst sheetInner: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n background: '#fff',\n overflow: 'hidden',\n borderRadius: '16px 16px 0 0',\n position: 'relative',\n};\n\nconst sheetCloseBtn: React.CSSProperties = {\n position: 'absolute',\n top: 8,\n left: 16,\n width: 24,\n height: 24,\n color: '#2B2F36',\n cursor: 'pointer',\n background: 'none',\n border: 'none',\n padding: 0,\n};\n\nconst sheetCover: React.CSSProperties = { width: '100%', display: 'block', cursor: 'pointer' };\n\nconst sheetBody: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n justifyContent: 'center',\n alignItems: 'flex-end',\n gap: 16,\n padding: '16px 20px 48px',\n fontFamily: FONT_FAMILY,\n fontSize: 12,\n lineHeight: '20px',\n color: '#a6a6a6',\n};\n\nconst sheetInfoText: React.CSSProperties = { margin: 0, color: '#646A73', fontSize: 14, flexShrink: 0 };\n\nconst mobileBtnRow: React.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 16,\n alignSelf: 'stretch',\n};\n\nconst mobileBtnBase: React.CSSProperties = {\n ...resetBase,\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 99,\n fontSize: 18,\n fontFamily: FONT_FAMILY,\n padding: '12px 0',\n cursor: 'pointer',\n};\n\nconst mobileBtnOutline: React.CSSProperties = {\n ...mobileBtnBase,\n border: '0.5px solid #D0D3D6',\n background: '#fff',\n color: '#1F2329',\n};\n\nconst mobileBtnFilled: React.CSSProperties = {\n ...mobileBtnBase,\n border: '0.5px solid #000',\n background: '#000',\n color: '#fff',\n};\n\n// ── HoverButton helper ──────────────────────────────────────────\n\nconst HoverButton: React.FC<{\n style: React.CSSProperties;\n onClick: (e: React.MouseEvent) => void;\n children: React.ReactNode;\n 'data-custom-element'?: string;\n}> = ({ style, onClick, children, ...rest }) => {\n const [hovered, setHovered] = useState(false);\n return (\n <div\n style={{\n ...style,\n ...(hovered ? btnHovered : {}),\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onClick={onClick}\n {...rest}\n >\n {children}\n </div>\n );\n};\n\n// ── X icon (inline SVG, replaces lucide-react dependency) ───────\n\nconst XIcon: React.FC<{ style?: React.CSSProperties; onClick?: () => void }> = ({ style, onClick }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={style}\n onClick={onClick}\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n);\n\n// ── main component ──────────────────────────────────────────────\n\nconst Safety = () => {\n const HasClosedKey = `miaoda-creatByMiaodo-has-closed-${getAppId()}`;\n const [visible, setVisible] = useState(\n !window.localStorage?.getItem(HasClosedKey),\n );\n const [open, setOpen] = useState(false);\n const isMobile = useIsMobile();\n const [userinfo, setUserinfo] = useState<{ id: number; name: string } | null>(null);\n const [isInternetVisible, setIsInternetVisible] = useState(false);\n const [showBadge, setShowBadge] = useState(true);\n const [badgeLoaded, setBadgeLoaded] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n const appId = getAppId();\n const csrfToken = getCsrfToken() ?? '';\n const csrfHeaders: Record<string, string> = { 'X-Suda-Csrf-Token': csrfToken };\n\n const tenantInfoUrl = isNewPathEnabled()\n ? `/app/${appId}/__runtime__/api/v1/studio/tenant_info`\n : `/spark/b/${appId}/tenant_info`;\n fetch(tenantInfoUrl, { headers: csrfHeaders })\n .then(res => res.json())\n .then(data => {\n setUserinfo(data?.data?.tenant_info);\n setIsInternetVisible(data?.data?.is_internet_visible);\n })\n .catch(() => {});\n\n const getPublishedUrl = isNewPathEnabled()\n ? `/app/${appId}/__runtime__/api/v1/studio/get_published`\n : `/spark/b/${appId}/get_published`;\n fetch(getPublishedUrl, { headers: csrfHeaders })\n .then(res => res.json())\n .then(data => {\n const badge = data?.data?.app_info?.show_badge;\n setShowBadge(badge !== false);\n })\n .catch(() => {\n setShowBadge(true);\n })\n .finally(() => {\n setBadgeLoaded(true);\n });\n }, []);\n\n useEffect(() => {\n if (isMobile) {\n const link = document.createElement('link');\n link.rel = 'preload';\n link.as = 'image';\n link.href = getCoverMobileUrl();\n document.head.appendChild(link);\n }\n }, [isMobile]);\n\n if (process.env.NODE_ENV !== 'production') return null;\n // AppType=7 是 jsPage MODERN_APP,不显示「由妙搭搭建」徽标\n // 沙箱通过环境变量注入 MIAODA_APP_TYPE,preset 顶层 define 透传给客户端\n // process.env 在浏览器是 undefined,env 必然是字符串(即使语义是数字)\n if (String(process.env.MIAODA_APP_TYPE) === '7') return null;\n if (!badgeLoaded) return null;\n if (!showBadge) return null;\n if (!visible) return null;\n\n // ── mobile: bottom sheet ────────────────────────────────────\n if (isMobile) {\n return (\n <DialogPrimitive.Root open={open} onOpenChange={setOpen}>\n <DialogPrimitive.Trigger asChild>\n <div style={badgeMobile} onClick={() => setOpen(true)}>\n <img src={LOGO_URL} style={logoStyle} />\n <p style={{ ...badgeTextStyle, minWidth: 28 }}>{t('safety.badge.label')}</p>\n </div>\n </DialogPrimitive.Trigger>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay style={overlayStyle} />\n <DialogPrimitive.Content style={sheetContent} aria-describedby={undefined}>\n <DialogPrimitive.Title style={{ position: 'absolute', clip: 'rect(0 0 0 0)' }}>\n {t('safety.badge.builtWith')}\n </DialogPrimitive.Title>\n <div style={sheetInner}>\n <XIcon style={sheetCloseBtn} onClick={() => setOpen(false)} />\n <img\n src={getCoverMobileUrl()}\n alt=\"\"\n style={sheetCover}\n onClick={() => window.open(LANDING_URL, '_blank')}\n />\n <div style={sheetBody}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, alignSelf: 'stretch' }}>\n {isInternetVisible && (\n <div style={infoRow}>\n <img src={ICON_COMPANY_URL} style={infoIconMobile} />\n <p style={sheetInfoText}>{t('safety.tenant.operated', { name: userinfo?.name ?? '' })}</p>\n </div>\n )}\n <div style={infoRow}>\n <img src={ICON_AI_URL} style={infoIconMobile} />\n <p style={sheetInfoText}>{t('safety.ai.disclaimer')}</p>\n </div>\n </div>\n <div style={mobileBtnRow}>\n <div\n style={mobileBtnOutline}\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setOpen(false);\n setTimeout(() => setVisible(false), 200);\n window.localStorage?.setItem(HasClosedKey, 'true');\n }}\n >\n {t('safety.button.dontShowAgain')}\n </div>\n <div\n style={mobileBtnFilled}\n onClick={() => window.open(LANDING_URL, '_blank')}\n >\n {t('safety.button.learnMore')}\n </div>\n </div>\n </div>\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n }\n\n // ── desktop: popover on hover ───────────────────────────────\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild>\n <div\n style={badgeDesktop}\n onMouseEnter={() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setOpen(true);\n }}\n onMouseLeave={() => {\n timeoutRef.current = setTimeout(() => setOpen(false), 100);\n }}\n >\n <img src={LOGO_URL} style={logoStyle} />\n <p style={{ ...badgeTextStyle, minWidth: 60 }}>{t('safety.badge.builtWith')}</p>\n </div>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n style={popoverContent}\n side=\"top\"\n align=\"end\"\n sideOffset={8}\n onMouseEnter={() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setOpen(true);\n }}\n onMouseLeave={() => {\n timeoutRef.current = setTimeout(() => setOpen(false), 100);\n }}\n >\n <div style={popoverInner}>\n <img\n src={getCoverUrl()}\n alt=\"\"\n style={popoverCover}\n onClick={() => window.open(LANDING_URL, '_blank')}\n />\n <div style={popoverBody}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, alignSelf: 'stretch' }}>\n {isInternetVisible && (\n <div style={infoRow}>\n <img src={ICON_COMPANY_URL} style={infoIcon} />\n <p style={infoText}>{t('safety.tenant.operated', { name: userinfo?.name ?? '' })}</p>\n </div>\n )}\n <div style={infoRow}>\n <img src={ICON_AI_URL} style={infoIcon} />\n <p style={infoText}>{t('safety.ai.disclaimer')}</p>\n </div>\n </div>\n <div style={btnRow}>\n <HoverButton\n style={btnBase}\n data-custom-element=\"safety-close\"\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setVisible(false);\n window.localStorage?.setItem(HasClosedKey, 'true');\n }}\n >\n {t('safety.button.dontShowAgain')}\n </HoverButton>\n <HoverButton\n style={btnBase}\n data-custom-element=\"safety-more\"\n onClick={() => window.open(LANDING_URL, '_blank')}\n >\n {t('safety.button.learnMore')}\n </HoverButton>\n </div>\n </div>\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n};\n\nexport default Safety;\n","/* eslint-disable */\n/**\n * 获取应用 ID\n */\nexport function getAppId(): string | null {\n const windowAppId = (window as any).appId || null;\n return windowAppId;\n}\n","/**\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 { 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","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}\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","/* 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 { IUserProfile } from '../types/udt-types';\nimport { getCurrentUserProfile } from '../integrations/getCurrentUserProfile';\nimport { getDataloom } from '../integrations/dataloom';\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 dataloom = await getDataloom();\n const result = await dataloom?.service?.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","\nexport interface UrlParts {\n baseUrl: string;\n workspace: string;\n}\n\n/**\n * @internal\n */\nexport function splitWorkspaceUrl(fullUrl: string): UrlParts {\n try {\n // https://www.suda.com/suda/api/v1/workspaces/:workspace_id\n const url = new URL(fullUrl);\n const pathParts = url.pathname.split('/');\n\n // 找到 workspaces 位置\n const workspacesIndex = pathParts.findIndex(part => part === 'workspaces');\n if (workspacesIndex === -1) {\n throw new Error('Invalid workspace URL format');\n }\n\n const basePathParts = pathParts.slice(0, workspacesIndex);\n const workspace = pathParts[workspacesIndex + 1];\n\n return {\n baseUrl: `${url.origin}${basePathParts.join('/')}`,\n workspace,\n };\n } catch (error) {\n console.error('Error splitting workspace URL:', error);\n }\n return {\n baseUrl: fullUrl,\n // 兜底给一个,不要给空字符串,不然 createClient 都直接挂了,页面会白屏,体感不太好\n workspace: 'workspace',\n };\n}\n","import { splitWorkspaceUrl } from '../utils/url';\nimport { createClient } from '@lark-apaas/dataloom';\nimport { getAppId } from '../utils/getAppId';\nimport { getInitialInfo } from '../utils/getInitialInfo';\n\nconst createDataLoomClient = (url?: string, pat?: string) => {\n const { baseUrl } = url ? splitWorkspaceUrl(url) : { baseUrl: '' };\n const appId = getAppId() ?? '';\n return createClient(baseUrl, pat ?? '', {\n global: {\n enableDataloomLog: process.env.NODE_ENV !== 'production',\n requestRateLimit: process.env.NODE_ENV !== 'production' ? 100 : undefined,\n brandName: 'miaoda',\n appId\n },\n });\n};\n\nlet dataloom: ReturnType<typeof createDataLoomClient> | null = null;\n// 缓存进行中的 Promise,防止并发调用创建多个实例\nlet pendingPromise: Promise<ReturnType<typeof createDataLoomClient>> | null = null;\n\n/** 获取dataloom实例 */\nexport function getDataloom(): Promise<ReturnType<typeof createDataLoomClient>> {\n if (dataloom) {\n return Promise.resolve(dataloom);\n }\n if (pendingPromise) {\n return pendingPromise;\n }\n pendingPromise = getInitialInfo()\n .then(info => {\n const DATALOOM_CLIENT_URL = info?.app_runtime_extra?.url;\n const DATALOOM_PAT = info?.app_runtime_extra?.token;\n dataloom = createDataLoomClient(DATALOOM_CLIENT_URL, DATALOOM_PAT);\n return dataloom;\n })\n .finally(() => {\n pendingPromise = null;\n });\n return pendingPromise;\n}\n","import 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 { getDataloom } from '../integrations/dataloom';\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 const dataloom = await getDataloom();\n await dataloom.service.session.signOut();\n } catch (error) {\n console.error('登出失败', error);\n } finally {\n setIsLoading(false);\n }\n }\n\n return {\n handlerLogout,\n isLoading,\n };\n}\n","/**\n * 中英文文案源(统一管理)。\n *\n * 每条文案同时包含 zh 和 en,方便对照和维护。\n * Key 规则:`{组件}.{区域}.{标识}`\n * 文案来源:https://bytedance.larkoffice.com/wiki/BJCQwv9auiP9erkudMfcVIIGnRg\n */\n\nconst messages: Record<string, { zh: string; en: string }> = {\n // ── Safety 组件 ──────────────────────────────────────────────\n 'safety.badge.label': {\n zh: '妙搭',\n en: 'Spark',\n },\n 'safety.badge.builtWith': {\n zh: '由妙搭搭建',\n en: 'Built with Spark',\n },\n 'safety.ai.disclaimer': {\n zh: '包含 AI 生成内容,请注意甄别',\n en: 'AI-generated content. Use with care.',\n },\n 'safety.tenant.operated': {\n zh: '{name}运营',\n en: 'Operated by {name}',\n },\n 'safety.button.dontShowAgain': {\n zh: '不再展示',\n en: \"Don't show again\",\n },\n 'safety.button.learnMore': {\n zh: '了解更多',\n en: 'Learn more',\n },\n 'safety.cover.pc': {\n zh: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover.png',\n en: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover-weben.png',\n },\n 'safety.cover.mobile': {\n zh: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover-mobile.png',\n en: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover-mobileen.png',\n },\n};\n\nexport default messages;\n","/**\n * 统一的语言判断方法。\n *\n * 生产环境(`process.env.NODE_ENV === 'production'`):\n * 只看浏览器容器语言(navigator.language)。\n *\n * 非生产环境(沙箱预览场景):\n * 优先级 query > localStorage > navigator。\n * URL query `locale`(值为 `zh_CN` / `en_US`)由宿主平台(miaoda)\n * 通过 iframe src 透传,确保产物内的语言与宿主一致;\n * 读到 query 时会同步写入 localStorage,便于后续无 query 的跳转/刷新场景使用。\n *\n * 返回标准化 locale code:'zh' | 'en'。\n * 目前只区分中英文,未来扩展时在此调整。\n */\n\nexport type Locale = 'zh' | 'en';\n\nconst STORAGE_KEY = 'miaoda:preview-locale';\n\nfunction toLocale(value: string | null | undefined): Locale {\n const lang = value ?? 'zh';\n return lang.toLowerCase().startsWith('zh') ? 'zh' : 'en';\n}\n\nfunction readLocaleFromQuery(): string | null {\n if (typeof window === 'undefined') return null;\n try {\n const value = new URLSearchParams(window.location.search).get('locale');\n return value && value.length > 0 ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction readLocaleFromStorage(): string | null {\n if (typeof window === 'undefined') return null;\n try {\n const value = window.localStorage?.getItem(STORAGE_KEY);\n return value && value.length > 0 ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction writeLocaleToStorage(value: string): void {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage?.setItem(STORAGE_KEY, value);\n } catch {\n // ignore(隐私模式 / 配额满等)\n }\n}\n\nexport function getLocale(): Locale {\n // 生产环境只信任容器语言,不受 query/localStorage 影响\n if (process.env.NODE_ENV === 'production') {\n return toLocale(navigator.language);\n }\n\n const fromQuery = readLocaleFromQuery();\n if (fromQuery) {\n writeLocaleToStorage(fromQuery);\n return toLocale(fromQuery);\n }\n\n const fromStorage = readLocaleFromStorage();\n if (fromStorage) return toLocale(fromStorage);\n\n return toLocale(navigator.language);\n}\n","import messages from './messages';\nimport { getLocale } from '../utils/locale';\nimport type { Locale } from '../utils/locale';\n\n/**\n * 获取当前语言环境下的翻译文案。\n *\n * 支持 `{key}` 形式的变量替换:\n * ```ts\n * t('safety.tenant.operated', { name: '字节' })\n * // zh → \"字节运营\"\n * // en → \"Operated by 字节\"\n * ```\n *\n * 如果 key 不存在,fallback 到中文;中文也没有则返回 key 本身。\n */\nexport function t(key: string, params?: Record<string, string>): string {\n const locale = getLocale();\n const entry = messages[key];\n let text = entry?.[locale] ?? entry?.zh ?? key;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n}\n\nexport { getLocale } from '../utils/locale';\nexport type { Locale } from '../utils/locale';\n","import React from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\nlet defaultQueryClient: QueryClient | null = null;\n\nconst getDefaultQueryClient = () => {\n if (!defaultQueryClient) {\n defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n refetchOnWindowFocus: false,\n },\n mutations: {\n retry: 1,\n },\n },\n });\n }\n return defaultQueryClient;\n};\n\nexport type QueryProviderProps = {\n children: React.ReactNode;\n client?: QueryClient;\n};\n\nconst QueryProvider: React.FC<QueryProviderProps> = ({ children, client }) => {\n const qc = client ?? getDefaultQueryClient();\n return <QueryClientProvider client={qc}>{children}</QueryClientProvider>;\n};\n\nexport default QueryProvider;\nexport { getDefaultQueryClient };\n\n","import { useEffect, useCallback, useRef, useMemo, createElement } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { useUpdatingRef } from '../../hooks/useUpdatingRef';\nimport { submitPostMessage } from '../../utils/postMessage';\n\n// 注意:connectParent 和 connectDevServer 已移至 runtime/iframe-bridge.ts\n\nenum RouteMessageType {\n RouteChange = 'RouteChange',\n RouteBack = 'RouteBack',\n RouteForward = 'RouteForward',\n}\n\nfunction isRouteMessageType(type: string): type is RouteMessageType {\n return Object.values(RouteMessageType).includes(type as RouteMessageType);\n}\n\nexport default function IframeBridge() {\n const location = useLocation();\n const navigate = useNavigate();\n const navigateRef = useUpdatingRef(navigate);\n type NavigateArg = Parameters<typeof navigate>[0];\n const isActive = useRef(false);\n\n const historyBack = useCallback(\n (_payload: NavigateArg) => {\n navigateRef.current(-1);\n isActive.current = true;\n },\n [navigateRef]\n );\n\n const historyForward = useCallback(\n (_payload: NavigateArg) => {\n navigateRef.current(1);\n isActive.current = true;\n },\n [navigateRef]\n );\n\n const operatorMessage = useMemo<\n Record<RouteMessageType, (payload: NavigateArg) => void>\n >(\n () => ({\n [RouteMessageType.RouteBack]: historyBack,\n [RouteMessageType.RouteForward]: historyForward,\n [RouteMessageType.RouteChange]: navigateRef.current,\n }),\n [historyBack, historyForward, navigateRef]\n );\n\n useEffect(() => {\n if (isActive.current) {\n isActive.current = false;\n return;\n }\n submitPostMessage({\n type: 'ChildLocationChange',\n data: location,\n });\n }, [location]);\n\n const handleMessage = useCallback(\n (event: MessageEvent) => {\n const data: { type?: unknown; data?: unknown } = event.data ?? {};\n if (typeof data.type === 'string' && isRouteMessageType(data.type)) {\n operatorMessage[data.type](data.data as NavigateArg);\n }\n },\n [operatorMessage]\n );\n\n useEffect(() => {\n (window as unknown as Window).addEventListener('message', handleMessage);\n\n return () => {\n (window as unknown as Window).removeEventListener(\n 'message',\n handleMessage\n );\n };\n }, [handleMessage]);\n\n // 用 createElement 而不是 JSX:避开 esbuild classic JSX transform 需要 React 在\n // scope 的问题(lite 的 tsconfig 是 react-jsx 自动模式,typecheck 不需要 React\n // import,但 tsup/esbuild 默认 classic transform 编译成 React.createElement,\n // 没 React import 就 runtime 报 ReferenceError)\n return createElement('div', { style: { display: 'none' } });\n}\n","import { useRef } from 'react';\nexport function useUpdatingRef<T>(value: T) {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n","import md5 from 'blueimp-md5';\nimport sha1 from 'crypto-js/sha1';\nimport { isMobile } from '../../../utils/deviceType';\nimport { getEnv } from '../../../utils/getEnv';\nimport { getLarkUserInfo } from './getLarkUser';\n\nimport { type TrackParams } from '../../../types/tea';\n\nconst saltA = '08a441';\nconst saltB = '42b91e';\nexport const encryptTea = (message: any): string => {\n const msgString = String(message);\n return sha1(saltA + md5(msgString + saltB)).toString();\n};\n\nlet teaInstance = false;\n\n/**\n * 初始化Tea 客户端\n * @export\n */\nexport async function createTracker(): Promise<void> {\n const { data } = await getLarkUserInfo();\n const { tenantID, userID} = data || {};\n const userIDEncrypt = userID && userID !== '0' ? encryptTea(userID) : undefined;\n const tenantIDEncrypt = tenantID && tenantID !== '0' ? encryptTea(tenantID) : undefined;\n\n window.collectEvent?.('init', {\n app_id: 788827,\n channel: 'cn',\n disable_auto_pv: false,\n enable_ab_test: false,\n enable_debug: false,\n enable_stay_duration: true, // 上报页面停留时间\n reportTime: 1000, // 事件上报异步队列的时间间隔\n });\n\n window.collectEvent?.('config', {\n user_unique_id: userIDEncrypt,\n device_type: isMobile() ? 'mobile' : 'pc',\n evtParams: {\n open_from: new URLSearchParams(window.location.search).get('open-from') ?? undefined,\n env: getEnv(),\n user_id: userIDEncrypt,\n tenant_id: tenantIDEncrypt,\n },\n });\n teaInstance = true;\n\n window.collectEvent?.('start');\n}\n\nexport const reportTeaEvent = async ({ trackKey, trackParams = {}}: TrackParams): Promise<void> => {\n try {\n if (!teaInstance) {\n teaInstance = true;\n await createTracker();\n }\n\n window.collectEvent?.(trackKey, trackParams);\n } catch (err) {\n // 静默,不影响业务\n console.error(err); // eslint-disable-line no-restricted-syntax\n }\n};\n","export const isIpad = (): boolean => {\n const _isIpad =\n /iPad|Tab|Tablet/i.test(navigator.userAgent) && navigator.maxTouchPoints && navigator.maxTouchPoints > 1;\n\n return Boolean(_isIpad);\n};\n\nexport const isMobile = (): boolean => {\n const isPhone =\n /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i.test(\n navigator.userAgent\n );\n\n return isPhone || isIpad();\n};\n\nexport const isIOS = (): boolean => {\n if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {\n return true;\n }\n return false;\n};\n","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 '../../../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 { 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","export interface TrackParams {\n trackKey: TrackKey;\n trackParams?: Record<string, unknown>;\n}\n\nexport enum TrackKey {\n VIEW = 'aily_agent_artifact_page_view',\n}\n","import React from 'react';\n\nconst Welcome: React.FC<{\n title?: string;\n description?: string;\n}> = ({ title = '页面待开发', description = '页面暂未开发,请耐心等待...' }) => {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: 'calc(100vh - 64px)',\n padding: '0 24px',\n textAlign: 'center',\n }}\n >\n <img\n style={{ borderRadius: 6, marginBottom: 24 }}\n width=\"320\"\n height=\"200\"\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/miao/welcome.svg\"\n alt=\"Welcome\"\n />\n <div style={{ fontSize: 16, fontWeight: 500, lineHeight: '24px', marginBottom: 4, color: '#1f2329' }}>\n {title}\n </div>\n <div style={{ fontSize: 16, lineHeight: '24px', color: '#8f959e', maxWidth: 480 }}>\n {description}\n </div>\n </div>\n );\n};\n\nexport default Welcome;\n","import React from 'react';\n\nconst PagePlaceholder: React.FC<{\n title?: string;\n description?: string;\n}> = ({ title = '页面待开发', description = '页面暂未开发,请耐心等待...' }) => {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0 24px',\n width: '100%',\n height: 'calc(100vh - 64px)',\n textAlign: 'center',\n }}\n >\n <img\n style={{ borderRadius: '6px', marginBottom: '24px' }}\n width=\"320\"\n height=\"200\"\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/miao/welcome.svg\"\n alt=\"Welcome\"\n />\n <div style={{ fontSize: '16px', fontWeight: 500, marginBottom: '4px', lineHeight: '24px' }}>\n {title}\n </div>\n <div\n style={{\n color: '#6b7280',\n fontSize: '16px',\n lineHeight: '24px',\n maxWidth: '480px',\n overflow: 'hidden',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n }}\n >\n {description}\n </div>\n </div>\n );\n};\n\nexport default PagePlaceholder;\n","import React, { useEffect } from 'react';\nimport { logger } from '../../logger';\nimport { getHmrApi } from '../../utils/hmr-api';\nimport { submitPostMessage } from '../../utils/postMessage';\n\n/**\n * ErrorBoundary fallback 组件。\n *\n * 链路:业务代码 throw → react-error-boundary 捕获 → 渲染本组件\n * → submitPostMessage({ type: 'RenderError' }) 通知妙搭外壳\n * → logger.log meta.repairMessage 让外壳 sandbox-console 弹「一键修复」\n *\n * HMR 恢复策略按构建工具区分:\n * - **vite**: ErrorBoundary 状态下 React Refresh family map 找不到 fiber,\n * resetErrorBoundary 让 children 重新 mount 时 import 仍是旧引用 → 死循环。\n * vite 模式(检测到 window.__VITE_HMR__)必须 `window.location.reload()`\n * 才能让模块图完整重载(这是 vite 官方对 ErrorBoundary 场景的 recommended fallback)。\n * - **webpack/rspack**: 模块 cache 可被 HMR 直接替换,resetErrorBoundary 让 children\n * 重新 mount 时 import 拿到新版本 → 正常恢复,不需要 reload。\n */\nconst ErrorRender: React.FC<{\n error: unknown;\n resetErrorBoundary?: (...args: unknown[]) => void;\n}> = (props) => {\n const { error, resetErrorBoundary } = props;\n\n useEffect(() => {\n if (error) {\n submitPostMessage({\n type: 'RenderError',\n data: error,\n });\n logger.log({\n level: 'error',\n args: ['Render Error', error],\n meta: {\n type: 'render-error',\n repairMessage: '页面渲染时报错,请根据错误信息修复对应页面的代码',\n },\n });\n }\n }, [error]);\n\n useEffect(() => {\n if (!resetErrorBoundary) return;\n const hmr = getHmrApi();\n if (!hmr) return;\n\n return hmr.onSuccess(() => {\n // vite 下 ErrorBoundary 状态下模块图无法更新,必须整页 reload;\n // webpack/rspack 下 resetErrorBoundary 即可让 children 重新 mount 拿到新模块。\n const isVite =\n typeof window !== 'undefined' && Boolean(window.__VITE_HMR__);\n if (isVite) {\n window.location.reload();\n } else {\n resetErrorBoundary();\n }\n });\n }, [resetErrorBoundary]);\n\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-white\">\n <div className=\"flex flex-col justify-center items-center text-center\">\n <img\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/template/illustration_empty_negative_error.svg\"\n alt=\"render error\"\n className=\"mb-3 w-[100px]\"\n />\n <p className=\"text-l/[22px] text-[14px] text-[#1F2329] font-medium\">\n 页面出错了\n </p>\n </div>\n </div>\n );\n};\n\nexport default ErrorRender;\n","import React, { forwardRef, useEffect, useState } from 'react';\nimport { NavLink, type NavLinkProps } from 'react-router-dom';\n\nexport interface ActiveLinkProps extends Omit<NavLinkProps, 'to'> {\n to: string;\n}\n\n/**\n * ActiveLink 组件\n *\n * 替换 react-router-dom 的 NavLink,扩展支持 hash 路由跳转和激活态功能\n *\n * @example\n * // 普通路由跳转\n * <ActiveLink to=\"/dashboard\">Dashboard</ActiveLink>\n *\n * // hash 路由跳转\n * <ActiveLink to=\"#section1\">Section 1</ActiveLink>\n *\n * // 使用函数式 className 显示激活态\n * <ActiveLink\n * to=\"#features\"\n * className={({isActive}) => isActive ? 'active' : ''}\n * >\n * Features\n * </ActiveLink>\n */\n\nexport const ActiveLink = forwardRef<HTMLAnchorElement, ActiveLinkProps>(\n ({ to, onClick, className, style, children, ...rest }, ref) => {\n const [currentHash, setCurrentHash] = useState(() =>\n typeof window !== 'undefined' ? window.location.hash : ''\n );\n\n // 检测是否为 hash 路由\n const isHashRoute = typeof to === 'string' && to.startsWith('#');\n\n // 监听 hash 变化\n useEffect(() => {\n if (!isHashRoute) return;\n\n const handleHashChange = () => {\n setCurrentHash(window.location.hash);\n };\n\n window.addEventListener('hashchange', handleHashChange);\n return () => window.removeEventListener('hashchange', handleHashChange);\n }, [isHashRoute]);\n\n // 计算激活态\n const isActive = isHashRoute && currentHash === to;\n\n // 如果是普通路由,使用 NavLink\n if (!isHashRoute) {\n return (\n <NavLink\n ref={ref}\n to={to}\n onClick={onClick}\n className={className}\n style={style}\n {...rest}\n >\n {children}\n </NavLink>\n );\n }\n\n // 处理 hash 路由点击事件\n const handleHashClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n // 先调用用户自定义的 onClick\n onClick?.(e);\n\n // 如果用户在 onClick 中调用了 preventDefault,则不执行默认行为\n if (e.defaultPrevented) {\n return;\n }\n\n // 阻止默认的锚点跳转行为\n e.preventDefault();\n\n const targetId = to.slice(1); // \"#home\" -> \"home\"\n const targetElement = document.getElementById(targetId);\n\n // 使用 pushState 更新 URL,保留历史记录且避免浏览器默认的瞬间跳转\n history.pushState(null, '', to);\n\n // 立即更新内部状态以确保 UI 及时响应\n setCurrentHash(to);\n\n // 手动触发 hashchange 事件以通知其他组件\n window.dispatchEvent(new Event('hashchange'));\n\n // 平滑滚动到目标元素\n if (targetElement && typeof targetElement.scrollIntoView === 'function') {\n targetElement.scrollIntoView({ behavior: 'smooth' });\n }\n };\n\n // 处理 className(支持函数和字符串)\n const computedClassName =\n typeof className === 'function'\n ? className({ isActive, isPending: false, isTransitioning: false })\n : className;\n\n // 处理 style(支持函数和对象)\n const computedStyle =\n typeof style === 'function'\n ? style({ isActive, isPending: false, isTransitioning: false })\n : style;\n\n // 处理 children(支持函数和 ReactNode)\n const computedChildren =\n typeof children === 'function'\n ? children({ isActive, isPending: false, isTransitioning: false })\n : children;\n\n return (\n <a\n ref={ref}\n href={to}\n onClick={handleHashClick}\n className={computedClassName}\n style={computedStyle}\n {...rest}\n >\n {computedChildren}\n </a>\n );\n }\n);\n\nActiveLink.displayName = 'ActiveLink';\n","/* eslint-disable */\nimport * as React from 'react';\nimport {\n NavLink as OriginalNavLink,\n useLocation,\n useNavigate,\n type NavLinkProps,\n} from 'react-router-dom';\n\n/**\n * Enhanced NavLink component that extends react-router-dom's NavLink\n * with support for hash links (anchor navigation) and smooth scrolling.\n */\nconst NavLink = React.forwardRef<HTMLAnchorElement, NavLinkProps>(\n ({ to, children, className, style, ...props }, ref) => {\n const isHashLink = typeof to === 'string' && to.startsWith('#');\n const location = useLocation();\n const navigate = useNavigate();\n\n if (isHashLink) {\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n const element = document.querySelector(to as string);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth' });\n }\n navigate(to as string);\n };\n\n const isActive = location.hash === to;\n\n const renderProps = {\n isActive,\n isPending: false,\n isTransitioning: false,\n };\n\n const resolvedClassName =\n typeof className === 'function' ? className(renderProps) : className;\n const resolvedStyle =\n typeof style === 'function' ? style(renderProps) : style;\n\n const {\n caseSensitive,\n end,\n replace,\n state,\n preventScrollReset,\n relative,\n viewTransition,\n ...restProps\n } = props;\n\n return (\n <a\n href={to as string}\n onClick={handleClick}\n ref={ref}\n className={resolvedClassName}\n style={resolvedStyle}\n {...restProps}\n >\n {typeof children === 'function' ? children(renderProps) : children}\n </a>\n );\n }\n\n return (\n <OriginalNavLink\n to={to}\n ref={ref}\n className={className}\n style={style}\n onClick={() =>\n (document.getElementById('rootContainer') || window)?.scrollTo({\n top: 0,\n behavior: 'smooth',\n })\n }\n {...props}\n >\n {children}\n </OriginalNavLink>\n );\n },\n);\n\nNavLink.displayName = 'NavLink';\n\nexport { NavLink };\nexport type { NavLinkProps };\n","import React from 'react';\nimport { Link as RouterLink } from 'react-router-dom';\n\nexport interface UniversalLinkProps\n extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {\n /** 链接目标:内部路由、hash 锚点或外部 URL */\n to: string;\n}\n\n/** 是否为内部路由(非 hash、非外链) */\nfunction isInternalRoute(to: string): boolean {\n return !to.startsWith('#') && !to.startsWith('http://') && !to.startsWith('https://') && !to.startsWith('//');\n}\n\n/** 是否为外部链接 */\nfunction isExternalLink(to: string): boolean {\n return to.startsWith('http://') || to.startsWith('https://') || to.startsWith('//');\n}\n\n/**\n * 统一的链接组件,用于替换原生 <a> 标签\n * - 内部路由(/dashboard)→ react-router Link\n * - Hash 锚点(#section)→ <a>\n * - 外链(https://...)→ <a target=\"_blank\">\n */\nexport const UniversalLink = React.forwardRef<HTMLAnchorElement, UniversalLinkProps>(\n function UniversalLink({ to, ...props }, ref) {\n // 内部路由\n if (isInternalRoute(to)) {\n return <RouterLink to={to} ref={ref} {...props} />;\n }\n\n // Hash 链接 & 外部链接\n return (\n <a\n href={to}\n ref={ref}\n {...props}\n {...(isExternalLink(to) && {\n target: props.target ?? '_blank',\n rel: props.rel ?? 'noopener noreferrer',\n })}\n />\n );\n }\n);\n","import { getAppId } from './getAppId';\n\n/**\n * 获取当前 appId 对应的命名空间前缀\n * 格式:__miaoda_<appId>__:\n * 若 appId 为 null,则使用 __global__\n */\nfunction getPrefix(): string {\n const appId = getAppId();\n const namespace = appId || '__global__';\n return `__miaoda_${namespace}__:`;\n}\n\n/**\n * 获取当前 appId 范围内的所有 key(已去前缀)\n */\nfunction getScopedKeys(): string[] {\n const prefix = getPrefix();\n const keys: string[] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && key.startsWith(prefix)) {\n keys.push(key.substring(prefix.length));\n }\n }\n\n return keys;\n}\n\n/**\n * 按 appId 隔离的 localStorage 封装\n * API 与原生 localStorage 保持一致\n */\nexport const scopedStorage: Storage = {\n /**\n * 获取指定 key 的值\n */\n getItem(key: string): string | null {\n const prefixedKey = getPrefix() + key;\n return localStorage.getItem(prefixedKey);\n },\n\n /**\n * 设置指定 key 的值\n */\n setItem(key: string, value: string): void {\n const prefixedKey = getPrefix() + key;\n localStorage.setItem(prefixedKey, value);\n },\n\n /**\n * 删除指定 key\n */\n removeItem(key: string): void {\n const prefixedKey = getPrefix() + key;\n localStorage.removeItem(prefixedKey);\n },\n\n /**\n * 清空当前 appId 范围内的所有 key\n * 不影响其他 app 和无前缀的 key\n */\n clear(): void {\n const prefix = getPrefix();\n const keysToRemove: string[] = [];\n\n // 收集需要删除的 key\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && key.startsWith(prefix)) {\n keysToRemove.push(key);\n }\n }\n\n // 删除收集到的 key\n keysToRemove.forEach(key => localStorage.removeItem(key));\n },\n\n /**\n * 返回当前 appId 范围内第 index 个 key(去前缀后的原始 key)\n */\n key(index: number): string | null {\n const keys = getScopedKeys();\n return keys[index] || null;\n },\n\n /**\n * 返回当前 appId 范围内的 key 数量\n */\n get length(): number {\n return getScopedKeys().length;\n },\n};\n","/**\n * 复制字符串到剪切板\n * @param text 要复制的文本\n * @returns Promise<boolean> 复制是否成功\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n // 优先使用现代的 Clipboard API\n if (navigator.clipboard && window.isSecureContext) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n\n // 降级方案:使用传统的 execCommand 方法\n return fallbackCopyToClipboard(text);\n } catch (error) {\n // 执行navigator.clipboard.writeText失败时,降级方案\n return fallbackCopyToClipboard(text);\n }\n}\n\n/**\n * 降级复制方案(兼容旧浏览器)\n * @param text 要复制的文本\n * @returns boolean 复制是否成功\n */\nfunction fallbackCopyToClipboard(text: string): boolean {\n try {\n // 创建临时的 textarea 元素\n const textArea = document.createElement('textarea');\n textArea.value = text;\n\n // 设置样式,使其不可见\n textArea.style.position = 'fixed';\n textArea.style.left = '-999999px';\n textArea.style.top = '-999999px';\n textArea.setAttribute('readonly', '');\n\n // 添加到 DOM\n document.body.appendChild(textArea);\n\n // 选中文本\n textArea.focus();\n textArea.select();\n\n // 执行复制命令\n const successful = document.execCommand('copy');\n\n // 清理:移除临时元素\n document.body.removeChild(textArea);\n\n return successful;\n } catch (error) {\n console.error('降级复制方案失败:', error);\n return false;\n }\n}\n","import { normalizeBasePath } from './utils';\n\n/**\n * 确保路径包含 CLIENT_BASE_PATH 前缀\n */\nfunction ensureBasePath(pathname: string, basePath: string): string {\n if (!basePath) return pathname;\n if (pathname.startsWith(basePath)) return pathname;\n return `${basePath}${pathname.startsWith('/') ? '' : '/'}${pathname}`;\n}\n\n/**\n * 解析应用内路径,自动补全 CLIENT_BASE_PATH 前缀,返回完整 URL\n * 适用于生成分享链接、二维码等需要完整 URL 的场景\n *\n * - 相对路径:补全前缀 + 当前域名\n * - 当前域名的完整 URL:修正路径部分,补全前缀\n * - 其他域名的 URL:原样返回,不做处理\n *\n * @param path - 应用内相对路径或完整 URL\n * @returns 完整的 URL 字符串\n *\n * @example\n * // 假设 CLIENT_BASE_PATH = '/app/abc',当前域名为 https://example.com\n *\n * resolveAppUrl('/detail/123')\n * // => 'https://example.com/app/abc/detail/123'\n *\n * resolveAppUrl('https://example.com/detail/123')\n * // => 'https://example.com/app/abc/detail/123'\n *\n * resolveAppUrl('https://example.com/app/abc/detail/123')\n * // => 'https://example.com/app/abc/detail/123' (已有前缀,不重复添加)\n *\n * resolveAppUrl('https://other-site.com/page')\n * // => 'https://other-site.com/page' (非当前域名,原样返回)\n */\nexport function resolveAppUrl(path: string): string {\n const basePath = normalizeBasePath(process.env.CLIENT_BASE_PATH);\n\n // 尝试解析为完整 URL\n try {\n const url = new URL(path);\n // 非当前域名,原样返回\n if (url.origin !== window.location.origin) {\n return path;\n }\n // 当前域名,修正路径\n url.pathname = ensureBasePath(url.pathname, basePath);\n return url.toString();\n } catch {\n // 不是完整 URL,当作相对路径处理\n }\n\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const resolvedPath = ensureBasePath(normalizedPath, basePath);\n return `${window.location.origin}${resolvedPath}`;\n}\n","/**\n * @internal\n */\nexport function getEnvPath() {\n return window.IS_MIAODA_PREVIEW ? 'feida_preview' : 'feida_runtime';\n}\n","import axios, { AxiosInstance } from 'axios';\nimport { initAxiosConfig } from './axiosConfig';\n\nlet axiosInstance: AxiosInstance | undefined;\n\n/** 显示 toast 提示(兼容 PC/移动端) */\nfunction showToast(message: string, duration = 3000): Promise<void> {\n return new Promise(resolve => {\n const toast = document.createElement('div');\n\n const iconSvg = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8 1.333a6.667 6.667 0 1 1 0 13.334A6.667 6.667 0 0 1 8 1.333ZM8 10a.667.667 0 1 0 0 1.333A.667.667 0 0 0 8 10Zm0-5.333a.667.667 0 0 0-.667.666v3.334a.667.667 0 0 0 1.334 0V5.333A.667.667 0 0 0 8 4.667Z\" fill=\"#ff811a\"/>\n </svg>`;\n\n const iconWrapper = document.createElement('span');\n iconWrapper.innerHTML = iconSvg;\n Object.assign(iconWrapper.style, {\n display: 'flex',\n alignItems: 'center',\n marginRight: '8px',\n flexShrink: '0',\n });\n\n const textWrapper = document.createElement('span');\n textWrapper.textContent = message;\n\n toast.appendChild(iconWrapper);\n toast.appendChild(textWrapper);\n\n Object.assign(toast.style, {\n position: 'fixed',\n top: '20%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n display: 'flex',\n alignItems: 'center',\n padding: '12px 16px',\n backgroundColor: '#fff',\n color: '#1f2329',\n border: '1px solid #dee0e3',\n borderRadius: '6px',\n fontSize: '14px',\n lineHeight: '1.5',\n zIndex: '99999',\n maxWidth: '80vw',\n wordBreak: 'break-word',\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.03), 0 3px 6px rgba(0, 0, 0, 0.05), 0 6px 18px rgba(0, 0, 0, 0.03)',\n opacity: '0',\n transition: 'opacity 0.3s ease',\n });\n\n document.body.appendChild(toast);\n\n requestAnimationFrame(() => {\n toast.style.opacity = '1';\n });\n\n setTimeout(() => {\n toast.style.opacity = '0';\n setTimeout(() => {\n document.body.removeChild(toast);\n resolve();\n }, 300);\n }, duration);\n });\n}\n\ndeclare module 'axios' {\n export interface AxiosRequestConfig {\n meta?: {\n autoJumpToLogin?: boolean;\n };\n }\n}\n\n/** 获取axios实例 */\nexport function getAxiosForBackend() {\n if (!axiosInstance) {\n axiosInstance = axios.create({\n baseURL: process.env.CLIENT_BASE_PATH || '/',\n });\n axiosInstance.interceptors.response.use(\n null,\n err => {\n if (err.config.meta?.autoJumpToLogin !== false) {\n const loginUrl = err.response?.headers?.['x-login-url'];\n if (loginUrl) {\n showToast('需要登录后才能执行操作,将自动跳转登录页', 3000).then(() => {\n window.location.href = loginUrl;\n });\n }\n }\n return Promise.reject(err);\n });\n initAxiosConfig(axiosInstance);\n }\n return axiosInstance;\n}\n\nexport const axiosForBackend = getAxiosForBackend();\n","import { createClient } from '@lark-apaas/client-capability';\nimport { normalizeBasePath } from '../utils/utils';\nimport { getAppId } from '../utils/getAppId';\nimport { isNewPathEnabled } from '../utils/apiPath';\n\n/**\n * 调用平台 capability(插件能力)的客户端实例。\n *\n * 从老 client-toolkit 搬过来。lite 没有像 toolkit 那样在内部封 logger / toast,\n * 这里走精简版:\n * - logger 留空(业务可在 createClient 调用处自己包)\n * - onRateLimitError 不接入 toast,业务自己处理(避免强依赖 sonner 主题)\n *\n * 业务用法:\n * import { capabilityClient } from '@lark-apaas/client-toolkit-lite';\n * await capabilityClient.invoke('xxx', { ... });\n */\nconst _appId = getAppId();\nconst _acquireUploadUrl = isNewPathEnabled()\n ? `/app/${_appId}/__runtime__/api/v1/studio/plugins/tmp_files/acquire_upload_url`\n : `/af/api/v1/studio/plugins/tmp_files/acquire_upload_url`;\nconst _acquireDownloadUrl = isNewPathEnabled()\n ? `/app/${_appId}/__runtime__/api/v1/studio/plugins/tmp_files/acquire_download_url`\n : `/af/api/v1/studio/plugins/tmp_files/acquire_download_url`;\n\n// 默认强制走中心化插件服务(plugin_server 4 端点):\n// - 沙箱开发态 NODE_ENV=development → 预览态路径 + body 携带 virtual:capabilities 注入的 config\n// - 运行态 NODE_ENV=production → 运行态路径 + 中心 store 查 config\n// 关闭:把 `central.enabled` 改 false 回退老 SDK 行为(直接打用户应用,jsPage 无 server 会 404)\n// 方案文档: https://bytedance.larkoffice.com/wiki/WtW5wJ7wli9BImkExyJcjR5znfx\nexport const capabilityClient = createClient({\n baseURL: normalizeBasePath(process.env.CLIENT_BASE_PATH ?? '/'),\n acquireUploadUrl: _acquireUploadUrl,\n acquireDownloadUrl: _acquireDownloadUrl,\n fetchOptions: {\n headers: {\n 'X-Suda-Csrf-Token':\n (window as { csrfToken?: string }).csrfToken ?? '',\n },\n },\n central: {\n enabled: true,\n // window.appId 由妙搭沙箱 / 线上环境注入;非妙搭场景下 capability 调用本身不可用\n appId: _appId ?? '',\n // baseURL 不传 → 默认 window.location.origin(同源调用,SSO cookie 自动带)\n // capabilities map 由 SDK 直接 import 'virtual:capabilities',构建时由\n // @lark-apaas/coding-vite-preset 的 capabilitiesBundlePlugin 注入\n },\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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,QAAQH,MAAAA,oEACR;AACJ,IAAMI,sBAAsBD,iBAAAA,IACxB,QAAQH,MAAAA,sEACR;AAOG,IAAMK,uBAAmBC,uCAAa;EAC3CC,SAASC,kBAAkBC,QAAQC,IAAIC,oBAAoB,GAAA;EAC3DC,kBAAkBV;EAClBW,oBAAoBT;EACpBU,cAAc;IACZC,SAAS;MACP,qBACGC,OAAkCC,aAAa;IACpD;EACF;EACAC,SAAS;IACPC,SAAS;;IAETC,OAAOpB,UAAU;EAInB;AACF,CAAA;;;AChDA;;;;;;;;;;;;;;AACO,IAAMqB,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","createWebpackHmrApi","hot","onSuccess","callback","lastStatus","handler","status","e","console","error","addStatusHandler","removeStatusHandler","onError","Error","getHmrApi","process","env","NODE_ENV","webpackHot","module","window","__VITE_HMR__","PARENT_ORIGIN_KEY","getParentOriginFromParams","params","URLSearchParams","window","location","search","origin","get","sessionStorage","setItem","getItem","undefined","getLegacyParentOrigin","includes","resolveParentOrigin","document","referrer","referrerOrigin","URL","startsWith","paramOrigin","process","env","FORCE_FRAMEWORK_DOMAIN_MAIN","submitPostMessage","message","targetOrigin","parentOrigin","parent","postMessage","e","console","error","LOG_LEVELS","isLogLevel","value","includes","devServerDisconnectInfo","retryCount","processDevServerLog","log","devFlag","includes","time","Date","now","submitPostMessage","type","data","status","slardar","sendEvent","name","metrics","categories","hmrFlag","startTime","duration","listenModuleHmr","hmr","getHmrApi","onSuccess","onError","error","console","warn","String","PROXY_CONSOLE_METHOD","interceptErrors","window","addEventListener","event","logger","reason","forEach","method","originalMethod","args","level","first","startsWith","isLogLevel","safeStringify","obj","seen","Set","JSON","stringify","_key","value","has","add","toString","Date","toISOString","Map","Object","fromEntries","Array","from","Error","name","message","stack","clear","processLogParams","args","map","arg","String","mapLogLevel","level","BatchLogger","config","logQueue","flushTimer","isProcessing","originConsole","console","userId","tenantId","appId","window","endpoint","process","env","CLIENT_BASE_PATH","sizeThreshold","flushInterval","maxRetries","retryDelay","headers","startFlushTimer","setupBeforeUnloadHandler","batchLog","level","message","source","logEntry","id","generateId","timestamp","Date","now","push","length","flush","logsToSend","splice","sendBatch","error","unshift","logs","collectLogs","map","log","time","toISOString","user_id","tenant_id","app_id","retries","execFetch","method","body","JSON","stringify","warn","delay","url","options","fetch","clearInterval","setInterval","addEventListener","finally","destroy","ms","Promise","resolve","setTimeout","Math","random","toString","substr","getQueueSize","updateConfig","newConfig","defaultBatchLogger","batchLogInfo","level","message","source","defaultBatchLogger","batchLog","process","env","NODE_ENV","window","defaultBatchLogger","BatchLogger","console","mapStacktrace","stacktrace","map","frame","functionName","fileName","lineNumber","columnNumber","reportStacktraceParseError","e","context","window","parent","submitPostMessage","type","payload","error","Error","message","String","getStacktrace","StackTrace","get","errorReplacer","_key","value","stack","name","generateLogId","crypto","randomUUID","Date","now","Math","random","toString","slice","lastLogInfo","sendSelectedLog","logWithoutID","log","id","newParts","i","args","length","item","newError","meta","fromError","push","frames","firstFrameIndex","findIndex","includes","skipFrame","undefined","logJSON","JSON","stringify","logForDedup","logContentForDedup","content","count","isDuplicate","duplicateCount","duplicateOfId","updatedJSON","batchLogInfo","sendTypedLogV2","logWithMeta","level","typedLogInterceptor","originLogger","debug","info","warn","success","interceptors","shouldReportToObservable","process","env","NODE_ENV","ORDERED_LEVELS","defaultConfig","showLevel","showTimestamp","level","prefix","config","configureLogger","options","shouldLog","indexOf","getFormattedPrefix","parts","push","toUpperCase","logger","debug","message","args","console","log","info","observable","processLogParams","join","warn","error","success","mapLogLevel","window","__RUNTIME_LOGGER__","get","interceptor","interceptors","interceptLogs","clsxWithTw","inputs","twMerge","clsx","isPreview","window","IS_MIAODA_PREVIEW","normalizeBasePath","basePath","replace","getWsPath","rawBasePath","process","env","CLIENT_BASE_PATH","normalizedBasePath","startsWith","basePathWithoutTrailingSlash","endsWith","slice","isSparkRuntime","_IS_Spark_RUNTIME","runtimeMode","getRoutes","routes","path","basePath","normalizeBasePath","process","env","CLIENT_BASE_PATH","res","fetch","json","error","console","warn","childApi","updateAppInfo","appInfo","dispatchEvent","CustomEvent","detail","connectParent","submitPostMessage","type","data","batchLogInfo","JSON","stringify","timestamp","Date","now","url","window","location","href","parentOrigin","resolveParentOrigin","connection","connectToParent","methods","childApi","promise","initIframeBridge","parent","window","__FULLSTACK_RUNTIME_INITIALIZED__","initAxiosConfig","process","env","NODE_ENV","initIframeBridge","import_react","getAppId","windowAppId","window","appId","isNewPathEnabled","basePath","process","env","CLIENT_BASE_PATH","test","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","splitWorkspaceUrl","fullUrl","url","URL","pathParts","pathname","split","workspacesIndex","findIndex","part","Error","basePathParts","slice","workspace","baseUrl","origin","join","error","console","createDataLoomClient","url","pat","baseUrl","splitWorkspaceUrl","appId","getAppId","createClient","global","enableDataloomLog","process","env","NODE_ENV","requestRateLimit","undefined","brandName","dataloom","pendingPromise","getDataloom","Promise","resolve","getInitialInfo","then","info","DATALOOM_CLIENT_URL","app_runtime_extra","DATALOOM_PAT","token","finally","getNameFromArray","nameArray","length","undefined","chineseName","find","item","language_code","text","getCompatibilityUserProfile","userInfo","getCurrentUserProfile","userName","name","userAvatar","avatar","useCurrentUserProfile","setUserInfo","useState","useEffect","cancelled","fetchAndSetUserInfo","dataloom","getDataloom","result","service","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","useLogout","isLoading","setIsLoading","useState","handlerLogout","process","env","NODE_ENV","console","log","dataloom","getDataloom","service","session","signOut","error","messages","zh","en","STORAGE_KEY","toLocale","value","lang","toLowerCase","startsWith","readLocaleFromQuery","window","URLSearchParams","location","search","get","length","readLocaleFromStorage","localStorage","getItem","writeLocaleToStorage","setItem","getLocale","process","env","NODE_ENV","navigator","language","fromQuery","fromStorage","t","key","params","locale","getLocale","entry","messages","text","zh","k","v","Object","entries","replace","resetBase","boxSizing","margin","padding","border","background","font","color","textAlign","textDecoration","textTransform","letterSpacing","wordSpacing","lineHeight","verticalAlign","listStyle","FONT_FAMILY","Z_BADGE","Z_OVERLAY","LOGO_URL","getCoverUrl","t","getCoverMobileUrl","ICON_COMPANY_URL","ICON_AI_URL","LANDING_URL","badgeBase","position","display","alignItems","gap","boxShadow","borderRadius","fontFamily","fontSize","zIndex","cursor","badgeDesktop","right","bottom","badgeMobile","logoStyle","flexShrink","width","height","badgeTextStyle","popoverContent","overflow","popoverInner","flexDirection","popoverCover","popoverBody","justifyContent","infoRow","alignSelf","infoIcon","infoIconMobile","infoText","btnRow","btnBase","flex","borderWidth","borderStyle","borderColor","transition","btnHovered","overlayStyle","inset","sheetContent","outline","sheetInner","sheetCloseBtn","top","left","sheetCover","sheetBody","sheetInfoText","mobileBtnRow","mobileBtnBase","mobileBtnOutline","mobileBtnFilled","HoverButton","style","onClick","children","rest","hovered","setHovered","useState","React","div","onMouseEnter","onMouseLeave","XIcon","svg","xmlns","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","path","d","Safety","HasClosedKey","getAppId","visible","setVisible","window","localStorage","getItem","open","setOpen","isMobile","useIsMobile","userinfo","setUserinfo","isInternetVisible","setIsInternetVisible","showBadge","setShowBadge","badgeLoaded","setBadgeLoaded","timeoutRef","useRef","useEffect","appId","csrfToken","getCsrfToken","csrfHeaders","tenantInfoUrl","isNewPathEnabled","fetch","headers","then","res","json","data","tenant_info","is_internet_visible","catch","getPublishedUrl","badge","app_info","show_badge","finally","link","document","createElement","rel","as","href","head","appendChild","process","env","NODE_ENV","String","MIAODA_APP_TYPE","Root","onOpenChange","Trigger","asChild","img","src","p","minWidth","Portal","Overlay","Content","aria-describedby","undefined","Title","clip","alt","name","e","stopPropagation","preventDefault","setTimeout","setItem","current","clearTimeout","side","align","sideOffset","data-custom-element","import_react","defaultQueryClient","getDefaultQueryClient","QueryClient","defaultOptions","queries","retry","refetchOnWindowFocus","mutations","QueryProvider","children","client","qc","React","QueryClientProvider","import_react","import_react","useUpdatingRef","value","ref","useRef","current","RouteMessageType","isRouteMessageType","type","Object","values","includes","IframeBridge","location","useLocation","navigate","useNavigate","navigateRef","useUpdatingRef","isActive","useRef","historyBack","useCallback","_payload","current","historyForward","operatorMessage","useMemo","useEffect","submitPostMessage","data","handleMessage","event","window","addEventListener","removeEventListener","createElement","style","display","isIpad","_isIpad","test","navigator","userAgent","maxTouchPoints","Boolean","isMobile","isPhone","isIOS","getEnv","globalThis","ENVIRONMENT","origin","window","location","includes","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_observable_web","initObservable","appId","window","observable","start","serviceName","env","process","NODE_ENV","AppEnv","Dev","Prod","collectorUrl","isNewPathEnabled","log","trace","metric","time","error","console","TrackKey","AppContainer","children","useAppInfo","useEffect","initObservable","process","env","NODE_ENV","reportTeaEvent","trackKey","TrackKey","VIEW","trackParams","artifact_uid","getAppId","agent_id","url","window","location","href","React","Safety","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","UniversalLink","React","forwardRef","props","ref","RouterLink","a","href","target","rel","getPrefix","appId","getAppId","namespace","getScopedKeys","prefix","keys","i","localStorage","length","key","startsWith","push","substring","scopedStorage","getItem","prefixedKey","setItem","value","removeItem","clear","keysToRemove","forEach","index","copyToClipboard","text","navigator","clipboard","window","isSecureContext","writeText","fallbackCopyToClipboard","error","textArea","document","createElement","value","style","position","left","top","setAttribute","body","appendChild","focus","select","successful","execCommand","removeChild","console","ensureBasePath","pathname","basePath","startsWith","resolveAppUrl","path","normalizeBasePath","process","env","CLIENT_BASE_PATH","url","URL","origin","window","location","toString","normalizedPath","resolvedPath","getEnvPath","window","IS_MIAODA_PREVIEW","import_axios","axiosInstance","showToast","message","duration","Promise","resolve","toast","document","createElement","iconSvg","iconWrapper","innerHTML","Object","assign","style","display","alignItems","marginRight","flexShrink","textWrapper","textContent","appendChild","position","top","left","transform","padding","backgroundColor","color","border","borderRadius","fontSize","lineHeight","zIndex","maxWidth","wordBreak","boxShadow","opacity","transition","body","requestAnimationFrame","setTimeout","removeChild","getAxiosForBackend","axios","create","baseURL","process","env","CLIENT_BASE_PATH","interceptors","response","use","err","config","meta","autoJumpToLogin","loginUrl","headers","then","window","location","href","reject","initAxiosConfig","axiosForBackend","_appId","getAppId","_acquireUploadUrl","isNewPathEnabled","_acquireDownloadUrl","capabilityClient","createClient","baseURL","normalizeBasePath","process","env","CLIENT_BASE_PATH","acquireUploadUrl","acquireDownloadUrl","fetchOptions","headers","window","csrfToken","central","enabled","appId","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/logger/logger.ts","../src/logger/intercept-global-error.ts","../src/utils/hmr-api.ts","../src/utils/postMessage.ts","../src/logger/log-types.ts","../src/utils/safeStringify.ts","../src/logger/selected-logs.ts","../src/logger/batch-logger.ts","../src/runtime/iframe-bridge.ts","../src/utils/utils.ts","../src/components/AppContainer/utils/childApi.ts","../src/runtime/index.ts","../src/components/AppContainer/safety.tsx","../src/utils/getAppId.ts","../src/utils/apiPath.ts","../src/hooks/useAppInfo.tsx","../src/utils/getInitialInfo.ts","../src/integrations/getAppInfo.ts","../src/hooks/useCurrentUserProfile.tsx","../src/integrations/getCurrentUserProfile.ts","../src/utils/url.ts","../src/integrations/dataloom.ts","../src/hooks/useIsMobile.ts","../src/hooks/useLogout.ts","../src/locales/messages.ts","../src/utils/locale.ts","../src/locales/index.ts","../src/components/QueryProvider/index.tsx","../src/components/AppContainer/IframeBridge.tsx","../src/hooks/useUpdatingRef.ts","../src/components/AppContainer/utils/tea.ts","../src/utils/deviceType.ts","../src/utils/getEnv.ts","../src/components/AppContainer/utils/getLarkUser.ts","../src/components/AppContainer/utils/observable.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/capabilityClient.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// Types\nexport type { AppInfoPayload } from './types/common';\nexport type { IUserProfile, IJson, IFileAttachment } from './types/udt-types';\nexport type { TrackParams } from './types/tea';\nexport { TrackKey } from './types/tea';\n\n// Tea\nexport { reportTeaEvent } from './components/AppContainer/utils/tea';\n\n// Constants\nexport * as avatarImages from './constants/img-resources/avatar';\nexport * as bannerImages from './constants/img-resources/banner';\nexport * as coverImages from './constants/img-resources/cover';\n","import React, { useEffect } from 'react';\nimport { MiaodaInspector } from '@lark-apaas/miaoda-inspector';\n\n// 兼容性:确保 runtime 被加载\n// runtime 内部有防重复机制(__FULLSTACK_RUNTIME_INITIALIZED__),不会重复执行\nimport '../../runtime';\n\nimport Safety from './safety';\nimport QueryProvider from '../QueryProvider';\nimport IframeBridge from './IframeBridge';\nimport { useAppInfo } from '../../hooks';\nimport { reportTeaEvent } from './utils/tea';\nimport { initObservable } from './utils/observable';\nimport { TrackKey } from '../../types/tea';\nimport { getAppId } from '../../utils/getAppId';\n\ninterface AppContainerProps {\n children: React.ReactNode;\n}\n\nconst AppContainer: React.FC<AppContainerProps> = ({ children }) => {\n useAppInfo();\n\n // 启动 OpenTelemetry 可观测(traces/logs/metrics);内部 try/catch,失败不阻断渲染\n useEffect(() => {\n initObservable();\n }, []);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'production') {\n reportTeaEvent({\n trackKey: TrackKey.VIEW,\n trackParams: {\n artifact_uid: getAppId(),\n agent_id: 'agent_miaoda',\n url: window.location.href,\n },\n });\n }\n }, []);\n\n return (\n <>\n <Safety />\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 } from '@lark-apaas/observable-web';\nimport { interceptErrors as interceptLogs } from './intercept-global-error';\nimport { LogLevel, LogWithMeta } from './log-types';\nimport { processLogParams, mapLogLevel } from '../utils/safeStringify';\nimport { interceptors } from './selected-logs';\n\n/**\n * lite 版 logger:\n * - 跟老 toolkit 一样的语义(debug/info/warn/error/success + 通用 log())\n * - 生产环境通过 observable.log 上报到 OpenTelemetry\n * - dev 环境调 interceptErrors,监听全局 error/unhandledrejection、devServer 状态\n * - 末尾通过 interceptors 链路包一层 typedLogInterceptor:任何 logger 顶层方法调用\n * 都会同步 postMessage `SELECTED_LOG`(typedLogV2 格式)给妙搭外壳,level==='error'\n * 时妙搭 sandbox-console 把它计入 errorCount → 显示「一键修复」按钮\n */\n\nexport type LogInterceptor = (originLogger: typeof logger) => typeof logger;\n\nconst shouldReportToObservable = process.env.NODE_ENV === 'production';\n\ninterface LoggerConfig {\n /** 是否显示日志级别前缀 */\n showLevel?: boolean;\n /** 是否显示时间戳 */\n showTimestamp?: boolean;\n /** 日志级别 */\n level?: LogLevel;\n /** 配置前缀字符串 */\n prefix?: string;\n}\n\nconst ORDERED_LEVELS: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n\nconst defaultConfig: Required<LoggerConfig> = {\n showLevel: false,\n showTimestamp: false,\n level: 'info',\n prefix: '',\n};\n\nlet config: Required<LoggerConfig> = { ...defaultConfig };\n\nfunction configureLogger(options: LoggerConfig) {\n config = { ...defaultConfig, ...options };\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return ORDERED_LEVELS.indexOf(level) >= ORDERED_LEVELS.indexOf(config.level);\n}\n\nfunction getFormattedPrefix(level: LogLevel): string[] {\n const parts: string[] = [];\n if (config.prefix) {\n parts.push(`[${config.prefix}]`);\n }\n if (config.showLevel) {\n parts.push(`[${level.toUpperCase()}]`);\n }\n return parts;\n}\n\n// 默认配置 logger,import 即生效\nconfigureLogger({\n showLevel: true,\n showTimestamp: false,\n level: process.env.NODE_ENV === 'development' ? 'debug' : 'error',\n prefix: 'MiaoDa',\n});\n\nexport let logger = {\n debug(message: unknown, ...args: unknown[]) {\n if (shouldLog('debug')) {\n console.log(...getFormattedPrefix('debug'), message, ...args);\n }\n },\n info(message: unknown, ...args: unknown[]) {\n if (shouldLog('info')) {\n console.log(...getFormattedPrefix('info'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('INFO', processLogParams([message, ...args]).join(' '));\n }\n },\n warn(message: unknown, ...args: unknown[]) {\n if (shouldLog('warn')) {\n console.log(...getFormattedPrefix('warn'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('WARN', processLogParams([message, ...args]).join(' '));\n }\n },\n error(message: unknown, ...args: unknown[]) {\n if (shouldLog('error')) {\n console.error(...getFormattedPrefix('error'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('ERROR', processLogParams([message, ...args]).join(' '));\n }\n },\n success(message: unknown, ...args: unknown[]) {\n if (shouldLog('info')) {\n console.log(...getFormattedPrefix('success'), message, ...args);\n }\n if (shouldReportToObservable) {\n observable.log('INFO', processLogParams([message, ...args]).join(' '));\n }\n },\n log({ level, args }: LogWithMeta) {\n if (shouldLog(level)) {\n console.log(...getFormattedPrefix(level), ...args);\n }\n if (shouldReportToObservable && level !== 'debug') {\n observable.log(mapLogLevel(level), processLogParams(args).join(' '));\n }\n },\n};\n\nif (process.env.NODE_ENV !== 'production') {\n // 在 window 上挂内置 logger,用于收集 ErrorBoundary 之外的运行时报错\n (window as unknown as { __RUNTIME_LOGGER__?: unknown }).__RUNTIME_LOGGER__ = {\n get() {\n return logger;\n },\n };\n}\n\n// 应用 interceptors 链:包一层 typedLogInterceptor,让所有 logger 方法都发 SELECTED_LOG\nfor (const interceptor of interceptors) {\n logger = interceptor(logger);\n}\n\nif (process.env.NODE_ENV !== 'production') {\n interceptLogs();\n}\n","import { slardar } from '@lark-apaas/internal-slardar';\nimport { getHmrApi } from '../utils/hmr-api';\nimport { submitPostMessage } from '../utils/postMessage';\nimport { isLogLevel, LogLevel } from './log-types';\nimport { logger } from './logger';\n\n/**\n * lite 版 intercept-global-error:\n * - 拦截全局 error / unhandledrejection → logger.error 上报\n * - 监听 HMR 成功/失败 → postMessage 通知妙搭外壳 + Slardar 埋点\n * - 监听 console 输出里的 devServer 断连/重连关键词 → postMessage 通知外壳 + Slardar 埋点\n */\n\n/** 记录 devServer 断开时间 */\nlet devServerDisconnectInfo: { time: number } | null = null;\nlet retryCount = 0;\n\nfunction processDevServerLog(log: string) {\n if (!log) return;\n const devFlag = log.includes('[webpack-dev-server]') || log.includes('[vite]');\n // 检测断连\n if (devFlag && log.includes('Disconnected')) {\n const time = Date.now();\n devServerDisconnectInfo = { time };\n submitPostMessage({\n type: 'DevServerMessage',\n data: {\n type: 'devServer-status',\n status: 'disconnected',\n },\n });\n slardar.sendEvent({\n name: 'sandbox-devServer',\n metrics: { time },\n categories: {\n type: 'disconnected',\n },\n });\n return;\n }\n if (!devServerDisconnectInfo) {\n return;\n }\n // 检测重连尝试\n if (devFlag && log.includes('Trying to reconnect')) {\n if (retryCount) {\n // 已经重连过一次还没成功,记为 reconnect-failed\n slardar.sendEvent({\n name: 'sandbox-devServer',\n metrics: { retryCount: retryCount + 1 },\n categories: {\n type: 'reconnect-failed',\n },\n });\n }\n retryCount++;\n return;\n }\n // 检测重连成功\n const hmrFlag = log.includes('[HMR]');\n if (\n hmrFlag ||\n (devFlag &&\n (log.includes('Socket connected') ||\n log.includes('App updated') ||\n log.includes('App hot update') ||\n log.includes('connected')))\n ) {\n submitPostMessage({\n type: 'DevServerMessage',\n data: {\n type: 'devServer-status',\n status: 'connected',\n },\n });\n const startTime = devServerDisconnectInfo.time;\n const duration = Date.now() - startTime;\n slardar.sendEvent({\n name: 'sandbox-devServer',\n metrics: { startTime, duration },\n categories: {\n type: 'devServer-reconnected',\n },\n });\n devServerDisconnectInfo = null;\n retryCount = 0;\n }\n}\n\n/**\n * 监听模块热更:\n * - 热更应用成功 → postMessage 通知主应用更新完成\n * - 热更失败 → console.warn + Slardar 埋点\n */\nfunction listenModuleHmr() {\n const hmr = getHmrApi();\n if (hmr) {\n hmr.onSuccess(() => {\n submitPostMessage({\n type: 'DevServerMessage',\n data: {\n type: 'devServer-status',\n status: 'hmr-apply-success',\n },\n });\n });\n\n hmr.onError((error) => {\n console.warn('hmr apply failed', error);\n slardar.sendEvent({\n name: 'sandbox-devServer',\n categories: {\n type: 'hmr-apply-failed',\n error: String(error),\n },\n });\n });\n }\n}\n\nconst PROXY_CONSOLE_METHOD = ['log', 'info', 'warn', 'error'] as const;\n\n/** 当前只有开发态会执行此操作 */\nexport function interceptErrors() {\n window.addEventListener('error', (event) => {\n logger.error(event.error);\n });\n\n window.addEventListener('unhandledrejection', (event) => {\n logger.error(event.reason);\n });\n\n listenModuleHmr();\n\n PROXY_CONSOLE_METHOD.forEach((method) => {\n const originalMethod = window.console[method];\n window.console[method] = (...args: unknown[]) => {\n originalMethod(...args);\n const level: LogLevel = method === 'log' ? 'info' : (method as LogLevel);\n const first = args[0];\n // 检测 devServer 断连/重连\n if (typeof first === 'string') {\n processDevServerLog(first);\n }\n // 转发特定 prefix 日志给妙搭外壳(典型场景:dataloom 报错)\n if (\n typeof first === 'string' &&\n first.startsWith('[Dataloom]') &&\n isLogLevel(level)\n ) {\n logger.log({ level, args });\n submitPostMessage({\n type: 'Console',\n method,\n data: args as unknown as Record<string, unknown>,\n });\n }\n };\n });\n}\n","/**\n * 统一 HMR API\n *\n * 提供统一的 HMR 成功/失败回调接口,屏蔽 Webpack 和 Vite 的差异。\n *\n * - Webpack/Rspack: 通过 import.meta.webpackHot 或 module.hot\n * - Vite: 通过 error-overlay 注入的 window.__VITE_HMR__\n *\n * @see docs/RFC_HMR_API.md\n */\n\nexport interface HmrApi {\n /**\n * 注册 HMR 更新前回调(模块替换之前触发)\n * @param callback 回调函数\n * @returns cleanup 函数,用于取消注册\n */\n onBeforeApply?(callback: () => void): () => void;\n\n /**\n * 注册 HMR 成功回调\n * @param callback 成功回调函数\n * @returns cleanup 函数,用于取消注册\n */\n onSuccess(callback: () => void): () => void;\n\n /**\n * 注册 HMR 失败回调\n * @param callback 失败回调函数,参数为错误信息\n * @returns cleanup 函数,用于取消注册\n */\n onError(callback: (error: unknown) => void): () => void;\n}\n\ndeclare global {\n interface Window {\n __VITE_HMR__?: Required<HmrApi>;\n }\n}\n\ninterface WebpackHot {\n addStatusHandler(handler: (status: string) => void): void;\n removeStatusHandler(handler: (status: string) => void): void;\n}\n\n/**\n * 创建 Webpack/Rspack HMR 适配器\n */\nfunction createWebpackHmrApi(hot: WebpackHot): HmrApi {\n return {\n onSuccess(callback) {\n let lastStatus: string | null = null;\n const handler = (status: string) => {\n // apply -> idle 转换表示 HMR 成功\n if (status === 'idle' && lastStatus === 'apply') {\n try {\n callback();\n } catch (e) {\n console.error('[HMR] Success callback error:', e);\n }\n }\n lastStatus = status;\n };\n hot.addStatusHandler(handler);\n return () => hot.removeStatusHandler(handler);\n },\n\n onError(callback) {\n const handler = (status: string) => {\n // fail 或 abort 表示 HMR 失败\n if (status === 'fail' || status === 'abort') {\n try {\n callback(new Error(`HMR ${status}`));\n } catch (e) {\n console.error('[HMR] Error callback error:', e);\n }\n }\n };\n hot.addStatusHandler(handler);\n return () => hot.removeStatusHandler(handler);\n },\n };\n}\n\n/**\n * 获取 HMR API 实例\n *\n * 自动检测当前构建工具(Webpack/Vite)并返回对应实现:\n * - Webpack/Rspack: 使用内置适配器\n * - Vite: 使用 error-overlay 注入的 window.__VITE_HMR__\n *\n * @returns HmrApi 实例,如果不在开发环境或不支持 HMR 则返回 null\n */\nexport function getHmrApi(): HmrApi | null {\n if (process.env.NODE_ENV === 'production') return null;\n\n // Webpack/Rspack (import.meta.webpackHot)\n // @ts-ignore - Webpack HMR API\n if (import.meta.webpackHot) {\n // @ts-ignore\n return createWebpackHmrApi(import.meta.webpackHot);\n }\n\n // Legacy webpack (module.hot)\n // @ts-ignore\n if (typeof module !== 'undefined' && module.hot) {\n // @ts-ignore\n return createWebpackHmrApi(module.hot);\n }\n\n // Vite (通过 error-overlay 注入)\n if (window.__VITE_HMR__) {\n return window.__VITE_HMR__;\n }\n\n return null;\n}\n","import type { IncomingMessage, OutgoingMessage } from '../types/iframe-events';\n\nconst PARENT_ORIGIN_KEY = '__parentOrigin';\n\nfunction getParentOriginFromParams(): string | undefined {\n try {\n const params = new URLSearchParams(window.location.search);\n const origin = params.get(PARENT_ORIGIN_KEY);\n if (origin) {\n sessionStorage.setItem(PARENT_ORIGIN_KEY, origin);\n return origin;\n }\n } catch {\n // URL 解析失败时忽略\n }\n try {\n return sessionStorage.getItem(PARENT_ORIGIN_KEY) || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getLegacyParentOrigin(): string {\n const { origin } = window.location;\n if (origin.includes('force.feishuapp.net')) {\n return 'https://force.feishu.cn';\n }\n if (origin.includes('force-pre.feishuapp.net')) {\n return 'https://force.feishu-pre.cn';\n }\n if (origin.includes('force.byted.org')) {\n return 'https://force.feishu-boe.cn';\n }\n if (origin.includes('feishuapp.cn') || origin.includes('miaoda.feishuapp.net')) {\n return 'https://miaoda.feishu.cn';\n }\n if (origin.includes('fsapp.kundou.cn') || origin.includes('miaoda-pre.feishuapp.net')) {\n return 'https://miaoda.feishu-pre.cn';\n }\n return 'https://miaoda.feishu-boe.cn';\n}\n\nexport function resolveParentOrigin(): string {\n // 本地开发:父页面为 localhost / 127.0.0.1 时,使用 referrer 真实 origin 作为 targetOrigin\n try {\n if (document.referrer) {\n const referrerOrigin = new URL(document.referrer).origin;\n if (\n referrerOrigin.startsWith('http://localhost') ||\n referrerOrigin.startsWith('http://127.0.0.1')\n ) {\n return referrerOrigin;\n }\n }\n } catch {\n // referrer 为空或无效时忽略,走正常环境匹配逻辑\n }\n\n // 父页面运行时通过 URL 参数传入\n const paramOrigin = getParentOriginFromParams();\n if (paramOrigin) return paramOrigin;\n\n return process.env?.FORCE_FRAMEWORK_DOMAIN_MAIN ?? getLegacyParentOrigin();\n}\n\nexport function submitPostMessage<T extends OutgoingMessage>(\n message: T,\n targetOrigin?: string\n): void {\n try {\n const parentOrigin = resolveParentOrigin();\n const origin = targetOrigin ?? parentOrigin;\n if (!origin) return;\n window.parent.postMessage(message, origin);\n } catch (e) {\n console.error('postMessage error', e);\n }\n}\n\nexport function isOutgoingMessage<T extends OutgoingMessage['type']>(\n msg: OutgoingMessage,\n type: T\n): msg is Extract<OutgoingMessage, { type: T }> {\n return msg.type === type;\n}\n\nexport function isIncomingMessage<T extends IncomingMessage['type']>(\n msg: IncomingMessage,\n type: T\n): msg is Extract<IncomingMessage, { type: T }> {\n return msg.type === type;\n}\n","/**\n * Logger 类型定义。\n *\n * 跟老 toolkit 相比,lite 砍掉了 zod schema 校验,改成纯 TS 类型——\n * intercept-global-error 不再走 levelSchema.safeParse 那条分支,\n * 而是直接用 LOG_LEVELS 字面量数组 includes 判断。\n */\n\nexport const LOG_LEVELS = ['debug', 'info', 'warn', 'error', 'success'] as const;\nexport type LogLevel = (typeof LOG_LEVELS)[number];\n\nexport function isLogLevel(value: unknown): value is LogLevel {\n return typeof value === 'string' && (LOG_LEVELS as readonly string[]).includes(value);\n}\n\nexport interface LogStackFrame {\n functionName: string;\n fileName: string;\n lineNumber: number;\n columnNumber: number;\n}\n\nexport interface LogMeta {\n stacktrace?: LogStackFrame[];\n logTraceID?: string;\n skipFrame?: number;\n noStacktrace?: boolean;\n repairMessage?: string;\n /** 预留字段,用于分类日志 */\n type?: string;\n /** 日志去重相关字段 */\n isDuplicate?: boolean;\n duplicateCount?: number;\n duplicateOfId?: string;\n}\n\nexport interface LogWithMeta {\n level: LogLevel;\n args: unknown[];\n meta?: LogMeta;\n}\n\nexport interface SelectedLog {\n type: 'typedLogV2';\n level: LogLevel;\n id: string;\n args: unknown[];\n meta: LogMeta;\n}\n","import type { LogLevel } from '../logger/log-types';\n\n// 安全的 JSON.stringify 实现\nexport function safeStringify(obj: unknown): string {\n const seen = new Set<object>();\n\n try {\n return JSON.stringify(obj, (_key, value) => {\n // 处理循环引用\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) {\n return '[Circular]';\n }\n seen.add(value);\n }\n\n // 处理 BigInt\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n // 处理 Date\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n // 处理 Map\n if (value instanceof Map) {\n return Object.fromEntries(value);\n }\n\n // 处理 Set\n if (value instanceof Set) {\n return Array.from(value);\n }\n\n // 处理 Error(safeStringify 默认会丢失 name/message/stack)\n if (value instanceof Error) {\n return {\n name: value.name,\n message: value.message,\n stack: value.stack,\n };\n }\n\n // 处理 undefined\n if (typeof value === 'undefined') {\n return 'undefined';\n }\n\n // 处理 Symbol\n if (typeof value === 'symbol') {\n return value.toString();\n }\n\n return value;\n });\n } catch {\n return '';\n } finally {\n seen.clear();\n }\n}\n\n/** 把任意 log 参数(可能含 Error/对象/循环引用)转成可序列化的字符串数组 */\nexport function processLogParams(args: unknown[]): string[] {\n return args.map((arg) => {\n if (typeof arg === 'string') return arg;\n if (arg instanceof Error) {\n return `${arg.name}: ${arg.message}\\n${arg.stack ?? ''}`;\n }\n if (typeof arg === 'object' && arg !== null) {\n return safeStringify(arg);\n }\n return String(arg);\n });\n}\n\n/** logger.log({ level }) → observable.log 的等级字符串 */\nexport function mapLogLevel(level: LogLevel): 'INFO' | 'WARN' | 'ERROR' {\n if (level === 'warn') return 'WARN';\n if (level === 'error') return 'ERROR';\n return 'INFO';\n}\n","/**\n * Selected logs interceptor 链。\n *\n * 跟老 toolkit 对齐:把 logger 顶层 6 个方法(debug/info/warn/error/success/log)\n * 都包一层 typedLogInterceptor,每次调用同步发 `SELECTED_LOG` postMessage 给妙搭外壳。\n * 妙搭 sandbox-console 监听 SELECTED_LOG,把 level==='error' 的计入 errorCount,\n * 进而显示\"一键修复\"按钮。\n *\n * 与老 toolkit 的差异:\n * - 砍掉了 webpack 模式专用的 parseSourceMap / source-map WASM / SourceMapConsumer 链路\n * (老 toolkit 里 parseSourceMap 是 dead code 无人调用;lite 跑在 vite 上也不需要)\n * - 保留 stacktrace-js:StackTrace.fromError 把 Error.stack 字符串解析成结构化 frames;\n * vite dev 模式下 stack 已经是源码路径,结构化后 sandbox-console 显示更友好\n */\n\nimport StackTrace from 'stacktrace-js';\nimport { batchLogInfo } from './batch-logger';\nimport { submitPostMessage } from '../utils/postMessage';\nimport {\n LogMeta,\n LogStackFrame,\n LogWithMeta,\n SelectedLog,\n} from './log-types';\nimport type { LogInterceptor } from './logger';\n\n/**\n * 把 stacktrace-js 的 StackFrame[] 转成本仓 LogStackFrame schema 格式。\n */\nfunction mapStacktrace(stacktrace: StackTrace.StackFrame[]): LogStackFrame[] {\n return stacktrace.map((frame) => ({\n functionName: frame.functionName || '',\n fileName: frame.fileName || '',\n lineNumber: frame.lineNumber || 0,\n columnNumber: frame.columnNumber || 0,\n }));\n}\n\n/**\n * stacktrace 解析失败时上报给外壳,外壳可用于诊断 sourcemap 加载/解析问题。\n */\nfunction reportStacktraceParseError(e: unknown, context: string): void {\n if (window.parent === window) return;\n try {\n submitPostMessage({\n type: 'STACKTRACE_PARSE_ERROR',\n payload: {\n error: e instanceof Error ? e.message : String(e),\n context,\n },\n });\n } catch {\n // ignore\n }\n}\n\n/**\n * 拿当前调用栈(filter 由调用方处理)。\n * 主 toolkit 在 sendSelectedLog 末尾若 meta.stacktrace 缺失会调一次。\n */\nexport async function getStacktrace(): Promise<LogStackFrame[]> {\n const stacktrace = await StackTrace.get();\n return mapStacktrace(stacktrace);\n}\n\n/**\n * 序列化 Error 实例为 {message, stack, name}。\n * Error 默认属性不可枚举,直接 JSON.stringify 会输出 `{}` 丢信息。\n */\nfunction errorReplacer(_key: string, value: unknown) {\n if (value instanceof Error) {\n return {\n message: value.message,\n stack: value.stack,\n name: value.name,\n };\n }\n return value;\n}\n\nfunction generateLogId(): string {\n try {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n } catch {\n // ignore — fall through to fallback\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/** 保存上一次的日志内容用于去重 */\nlet lastLogInfo: { content: string; id: string; count: number } | null = null;\n\n/**\n * 发送一条 SelectedLog 到妙搭外壳。\n *\n * 包含:\n * - args 里的 Error 实例展开为 [message, errorObj](与老 toolkit 一致)\n * - meta.skipFrame 默认 2(让外壳跳过 logger 自己的栈帧)\n * - 与上一条内容完全一样时设 meta.isDuplicate / duplicateCount / duplicateOfId\n * - 同时走 batchLogInfo 批量通道 + window.parent.postMessage SELECTED_LOG\n */\nasync function sendSelectedLog(logWithoutID: Omit<SelectedLog, 'id'>) {\n try {\n const log: SelectedLog = {\n ...logWithoutID,\n id: generateLogId(),\n };\n\n const newParts: unknown[] = [];\n for (let i = 0; i < log.args.length; i++) {\n const item = log.args[i];\n if (item instanceof Error) {\n const newError = {\n message: item.message,\n stack: item.stack,\n name: item.name,\n };\n // 首个 Error 优先用其 stack 反查到结构化 frames,覆盖 meta.stacktrace\n if (!log.meta.stacktrace) {\n try {\n const stacktrace = await StackTrace.fromError(item);\n log.meta.stacktrace = mapStacktrace(stacktrace);\n } catch (e) {\n reportStacktraceParseError(e, 'StackTrace.fromError');\n }\n }\n newParts.push(newError.message, newError);\n } else {\n newParts.push(item);\n }\n }\n log.args = newParts;\n\n // 兜底:args 里没有 Error 时拿当前调用栈\n if (!log.meta.stacktrace) {\n try {\n const frames = await getStacktrace();\n // 过滤本 logger 内部的栈帧(避免噪音)\n const firstFrameIndex = frames.findIndex(\n (frame) => !frame.fileName.includes('client-toolkit-lite/dist/logger'),\n );\n log.meta.stacktrace = firstFrameIndex === -1 ? [] : frames.slice(firstFrameIndex);\n } catch (e) {\n reportStacktraceParseError(e, 'getStacktrace');\n }\n }\n\n if (log.meta.skipFrame === undefined) {\n log.meta.skipFrame = 2;\n }\n\n const logJSON = JSON.stringify(log, errorReplacer);\n\n // 去重:以去掉 id 的版本做比较\n const logForDedup = { ...log };\n delete (logForDedup as Partial<SelectedLog>).id;\n const logContentForDedup = JSON.stringify(logForDedup, errorReplacer);\n\n if (lastLogInfo && lastLogInfo.content === logContentForDedup) {\n lastLogInfo.count++;\n log.meta.isDuplicate = true;\n log.meta.duplicateCount = lastLogInfo.count;\n log.meta.duplicateOfId = lastLogInfo.id;\n const updatedJSON = JSON.stringify(log, errorReplacer);\n try {\n batchLogInfo('info', updatedJSON);\n } catch {\n // ignore\n }\n if (window.parent !== window) {\n try {\n submitPostMessage({ type: 'SELECTED_LOG', payload: updatedJSON });\n } catch {\n // ignore\n }\n }\n return;\n }\n\n lastLogInfo = {\n content: logContentForDedup,\n id: log.id,\n count: 1,\n };\n\n try {\n batchLogInfo('info', logJSON);\n } catch {\n // ignore\n }\n if (window.parent !== window) {\n try {\n submitPostMessage({ type: 'SELECTED_LOG', payload: logJSON });\n } catch {\n // ignore\n }\n }\n } catch {\n // sendSelectedLog 失败不应影响业务\n }\n}\n\nfunction sendTypedLogV2(logWithMeta: LogWithMeta) {\n // sendSelectedLog 是 async(stacktrace 解析需要异步),但调用方不关心结果,\n // 用 void 忽略 Promise,避免 unhandled rejection 噪音\n void sendSelectedLog({\n type: 'typedLogV2',\n level: logWithMeta.level,\n args: logWithMeta.args,\n meta: logWithMeta.meta ?? {},\n });\n}\n\n/**\n * 拦截 logger 的 6 个方法(debug/info/warn/error/success/log),\n * 在调用原方法的同时同步 sendTypedLogV2 到妙搭外壳。\n */\nconst typedLogInterceptor: LogInterceptor = (originLogger) => ({\n debug: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.debug(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'info', args: [message, ...args], meta: {} });\n },\n info: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.info(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'info', args: [message, ...args], meta: {} });\n },\n warn: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.warn(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'warn', args: [message, ...args], meta: {} });\n },\n error: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.error(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'error', args: [message, ...args], meta: {} });\n },\n success: (message: unknown, ...args: unknown[]) => {\n try {\n originLogger.success(message, ...args);\n } catch {\n // ignore\n }\n sendTypedLogV2({ level: 'success', args: [message, ...args], meta: {} });\n },\n log: ({ level, args, meta }: LogWithMeta) => {\n try {\n originLogger.log({ level, args, meta });\n } catch {\n // ignore\n }\n sendTypedLogV2({ level, args, meta: meta ?? ({} as LogMeta) });\n },\n});\n\nexport const interceptors: LogInterceptor[] = [typedLogInterceptor];\n","interface CollectLogRequest {\n level: string;\n message: string;\n time: string; // ISO String\n source?: string; // Log Source string\n user_id: string; // User ID\n tenant_id: string; // Tenant ID\n app_id: string; // App ID\n}\n\ninterface LogEntry {\n id: string;\n level: string;\n message: string;\n source?: string;\n timestamp: number;\n}\n\ninterface BatchLoggerConfig {\n /** 用户ID */\n userId: string;\n /** 租户ID */\n tenantId: string;\n /** 应用ID */\n appId: string;\n /** 后端接收日志的接口地址,默认为/dev/logs/collect */\n endpoint?: string;\n /** 达到此数量时触发刷新 */\n sizeThreshold?: number;\n /** 自动刷新的时间间隔(毫秒) */\n flushInterval?: number;\n /** 最大重试次数 */\n maxRetries?: number;\n /** 重试延迟(毫秒) */\n retryDelay?: number;\n /** 自定义请求头 */\n headers?: Record<string, string>;\n}\n\nexport class BatchLogger {\n private config: Required<BatchLoggerConfig>;\n private logQueue: LogEntry[] = [];\n private flushTimer: NodeJS.Timeout | null = null;\n private isProcessing = false;\n\n private originConsole: Console;\n\n constructor(console: Console, config?: BatchLoggerConfig) {\n this.originConsole = { ...console };\n const {\n userId = '',\n tenantId = '',\n appId = '',\n } = (window || {}) as {\n userId?: string;\n tenantId?: string;\n appId?: string;\n };\n this.config = {\n userId,\n tenantId,\n appId,\n // 需要加请求路径前缀\n endpoint: (process.env.CLIENT_BASE_PATH || '') + '/dev/logs/collect-batch',\n sizeThreshold: 20,\n flushInterval: 1000,\n maxRetries: 3,\n retryDelay: 500,\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(config || {}),\n };\n\n this.startFlushTimer();\n this.setupBeforeUnloadHandler();\n }\n\n /**\n * 批量记录日志(对外暴露的唯一方法)\n */\n batchLog(level: string, message: string, source?: string): void {\n const logEntry: LogEntry = {\n id: this.generateId(),\n level,\n message,\n source,\n timestamp: Date.now(),\n };\n\n // 直接添加日志,不进行合并\n this.logQueue.push(logEntry);\n\n // 如果队列达到批处理阈值,立即刷新\n if (this.logQueue.length >= this.config.sizeThreshold) {\n this.flush();\n }\n }\n\n\n\n /**\n * 刷新日志队列,全部发送\n */\n async flush(): Promise<void> {\n if (this.isProcessing || this.logQueue.length === 0) {\n return;\n }\n\n this.isProcessing = true;\n const logsToSend = this.logQueue.splice(0, this.logQueue.length);\n\n try {\n await this.sendBatch(logsToSend);\n } catch (error) {\n // 发送失败时,将日志重新加入队列\n this.logQueue.unshift(...logsToSend);\n } finally {\n this.isProcessing = false;\n }\n }\n\n /**\n * 发送日志批次到后端\n */\n private async sendBatch(logs: LogEntry[]): Promise<void> {\n // 将LogEntry转换为CollectLogRequest格式\n const collectLogs: CollectLogRequest[] = logs.map(log => ({\n level: log.level,\n message: log.message,\n time: new Date(log.timestamp).toISOString(),\n source: log.source,\n user_id: this.config.userId,\n tenant_id: this.config.tenantId,\n app_id: this.config.appId,\n }));\n\n let retries = 0;\n\n while (retries <= this.config.maxRetries) {\n try {\n await this.execFetch(this.config.endpoint, {\n method: 'POST',\n headers: this.config.headers,\n body: JSON.stringify(collectLogs),\n });\n return;\n } catch (error) {\n retries++;\n\n if (retries > this.config.maxRetries) {\n this.originConsole.error(\n `Failed to send logs (attempt ${retries}), retrying in ${this.config.retryDelay}ms...`,\n );\n } else {\n this.originConsole.warn(\n `Failed to send logs (attempt ${retries}), retrying in ${this.config.retryDelay}ms...`,\n );\n }\n\n await this.delay(this.config.retryDelay * retries); // 指数退避\n }\n }\n }\n\n /**\n * 执行实际的fetch请求\n */\n private async execFetch(\n url: string,\n options: RequestInit,\n ): Promise<Response> {\n return fetch(url, options);\n }\n\n /**\n * 启动自动刷新定时器\n */\n private startFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = setInterval(() => {\n if (this.logQueue.length > 0) {\n this.flush();\n }\n }, this.config.flushInterval);\n }\n\n /**\n * 设置页面卸载时的处理\n */\n private setupBeforeUnloadHandler(): void {\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', () => {\n this.flush().finally(() => {\n this.destroy();\n });\n });\n }\n }\n\n /**\n * 延迟函数\n */\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n /**\n * 生成唯一ID\n */\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * 销毁资源\n */\n async destroy(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n // 发送剩余的日志\n if (this.logQueue.length > 0) {\n await this.flush();\n }\n }\n\n /**\n * 获取队列大小\n */\n getQueueSize(): number {\n return this.logQueue.length;\n }\n\n /**\n * 更新配置\n */\n updateConfig(newConfig: Partial<BatchLoggerConfig>): void {\n this.config = { ...this.config, ...newConfig };\n\n // 重新启动定时器\n this.startFlushTimer();\n }\n}\n\nlet defaultBatchLogger: BatchLogger | null = null;\n\nexport function getBatchLogger() {\n return defaultBatchLogger;\n}\n\nexport function initBatchLogger(\n oldConsole: Console,\n config?: BatchLoggerConfig,\n): void {\n defaultBatchLogger = new BatchLogger(oldConsole, config);\n}\n\n/** 记录日志进行批量同步 */\nexport function batchLogInfo(\n level: string,\n message: string,\n source?: string,\n): void {\n if (!defaultBatchLogger) {\n return;\n }\n defaultBatchLogger.batchLog(level, message, source);\n}\n\nexport function destroyBatchLogger(): void {\n if (defaultBatchLogger) {\n defaultBatchLogger.destroy();\n defaultBatchLogger = null;\n }\n}\n\n// 模块加载时自动初始化(仅在开发环境且浏览器环境)\nif (process.env.NODE_ENV !== 'production' && typeof window !== 'undefined') {\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. Logger 模块 side-effect(dev 下注册 interceptErrors)\n * 4. 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. 触发 logger 模块的 side-effect(dev 下注册 interceptErrors)\nimport '../logger';\n\n// 3. 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\n if (process.env.NODE_ENV !== 'production') {\n initIframeBridge();\n }\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { getCsrfToken } from '../../utils/getCsrfToken';\nimport { getAppId } from '../../utils/getAppId';\nimport { isNewPathEnabled } from '../../utils/apiPath';\nimport { useIsMobile } from '../../hooks';\nimport { t } from '../../locales';\n\n// ── defensive reset (prevents host page CSS from leaking in) ────\n\nconst resetBase: React.CSSProperties = {\n boxSizing: 'border-box',\n margin: 0,\n padding: 0,\n border: 'none',\n background: 'none',\n font: 'inherit',\n color: 'inherit',\n textAlign: 'left',\n textDecoration: 'none',\n textTransform: 'none',\n letterSpacing: 'normal',\n wordSpacing: 'normal',\n lineHeight: 'normal',\n verticalAlign: 'baseline',\n listStyle: 'none',\n};\n\n// ── inline style constants ──────────────────────────────────────\n\nconst FONT_FAMILY = \"'PingFang SC', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\";\nconst Z_BADGE = 10000000;\nconst Z_OVERLAY = 10000001;\n\nconst LOGO_URL = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodalogo.svg';\n// Cover URLs 通过 locale 机制获取,支持中英文不同封面\nconst getCoverUrl = () => t('safety.cover.pc');\nconst getCoverMobileUrl = () => t('safety.cover.mobile');\nconst ICON_COMPANY_URL = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/icon/icon_company_outlined.svg';\nconst ICON_AI_URL = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/icon/icon_efficiency-ai_outlined.svg';\nconst LANDING_URL = 'https://miaoda.feishu.cn/landing';\n\nconst badgeBase: React.CSSProperties = {\n ...resetBase,\n position: 'fixed',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n border: '1px solid rgba(255,255,255,0.1)',\n padding: '6px 10px',\n background: '#1f2329',\n boxShadow: '0 6px 12px 0 rgba(65,68,74,0.04), 0 8px 24px 8px rgba(65,68,74,0.04)',\n borderRadius: 6,\n fontFamily: FONT_FAMILY,\n fontSize: 12,\n lineHeight: '20px',\n zIndex: Z_BADGE,\n cursor: 'pointer',\n};\n\nconst badgeDesktop: React.CSSProperties = { ...badgeBase, right: 12, bottom: 12 };\nconst badgeMobile: React.CSSProperties = { ...badgeBase, right: 12, bottom: 80 };\n\nconst logoStyle: React.CSSProperties = { flexShrink: 0, width: 16, height: 16 };\n\nconst badgeTextStyle: React.CSSProperties = {\n flexShrink: 0,\n margin: 0,\n color: '#EBEBEB',\n};\n\n// ── desktop popover styles ──────────────────────────────────────\n\nconst popoverContent: React.CSSProperties = {\n ...resetBase,\n overflow: 'hidden',\n borderRadius: 12,\n width: 286,\n boxShadow: '0 6px 12px 0 rgba(65,68,74,0.04), 0 8px 24px 0 rgba(65,68,74,0.04)',\n zIndex: Z_OVERLAY,\n};\n\nconst popoverInner: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n background: '#1A1A1A',\n};\n\nconst popoverCover: React.CSSProperties = { width: 286, height: 128, cursor: 'pointer', display: 'block' };\n\nconst popoverBody: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'flex-end',\n gap: 12,\n border: '1px solid rgba(255,255,255,0.05)',\n padding: '11px 15px 15px 14px',\n borderRadius: '12px 12px 0 0',\n fontFamily: FONT_FAMILY,\n fontSize: 12,\n lineHeight: '20px',\n color: '#a6a6a6',\n background: '#1f2021',\n};\n\nconst infoRow: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n alignSelf: 'stretch',\n};\n\nconst infoIcon: React.CSSProperties = { flexShrink: 0, width: 12, height: 12 };\nconst infoIconMobile: React.CSSProperties = { flexShrink: 0, width: 14, height: 14 };\n\nconst infoText: React.CSSProperties = { margin: 0, color: '#a6a6a6', flexShrink: 0 };\n\nconst btnRow: React.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 8,\n width: '100%',\n alignSelf: 'stretch',\n};\n\nconst btnBase: React.CSSProperties = {\n ...resetBase,\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: 34,\n borderRadius: 8,\n borderWidth: '0.5px',\n borderStyle: 'solid',\n borderColor: 'rgba(255,255,255,0.11)',\n background: 'rgba(255,255,255,0.03)',\n color: '#ebebeb',\n cursor: 'pointer',\n fontSize: 12,\n fontFamily: FONT_FAMILY,\n transition: 'background 0.15s ease, border-color 0.15s ease',\n};\n\nconst btnHovered: React.CSSProperties = {\n background: 'rgba(255,255,255,0.08)',\n borderColor: 'rgba(255,255,255,0.2)',\n};\n\n// ── mobile sheet styles ─────────────────────────────────────────\n\nconst overlayStyle: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n zIndex: Z_OVERLAY,\n background: 'rgba(0,0,0,0.5)',\n};\n\nconst sheetContent: React.CSSProperties = {\n position: 'fixed',\n inset: 'auto 0 0 0',\n zIndex: Z_OVERLAY + 1,\n outline: 'none',\n};\n\nconst sheetInner: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n background: '#fff',\n overflow: 'hidden',\n borderRadius: '16px 16px 0 0',\n position: 'relative',\n};\n\nconst sheetCloseBtn: React.CSSProperties = {\n position: 'absolute',\n top: 8,\n left: 16,\n width: 24,\n height: 24,\n color: '#2B2F36',\n cursor: 'pointer',\n background: 'none',\n border: 'none',\n padding: 0,\n};\n\nconst sheetCover: React.CSSProperties = { width: '100%', display: 'block', cursor: 'pointer' };\n\nconst sheetBody: React.CSSProperties = {\n ...resetBase,\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n justifyContent: 'center',\n alignItems: 'flex-end',\n gap: 16,\n padding: '16px 20px 48px',\n fontFamily: FONT_FAMILY,\n fontSize: 12,\n lineHeight: '20px',\n color: '#a6a6a6',\n};\n\nconst sheetInfoText: React.CSSProperties = { margin: 0, color: '#646A73', fontSize: 14, flexShrink: 0 };\n\nconst mobileBtnRow: React.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 16,\n alignSelf: 'stretch',\n};\n\nconst mobileBtnBase: React.CSSProperties = {\n ...resetBase,\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 99,\n fontSize: 18,\n fontFamily: FONT_FAMILY,\n padding: '12px 0',\n cursor: 'pointer',\n};\n\nconst mobileBtnOutline: React.CSSProperties = {\n ...mobileBtnBase,\n border: '0.5px solid #D0D3D6',\n background: '#fff',\n color: '#1F2329',\n};\n\nconst mobileBtnFilled: React.CSSProperties = {\n ...mobileBtnBase,\n border: '0.5px solid #000',\n background: '#000',\n color: '#fff',\n};\n\n// ── HoverButton helper ──────────────────────────────────────────\n\nconst HoverButton: React.FC<{\n style: React.CSSProperties;\n onClick: (e: React.MouseEvent) => void;\n children: React.ReactNode;\n 'data-custom-element'?: string;\n}> = ({ style, onClick, children, ...rest }) => {\n const [hovered, setHovered] = useState(false);\n return (\n <div\n style={{\n ...style,\n ...(hovered ? btnHovered : {}),\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onClick={onClick}\n {...rest}\n >\n {children}\n </div>\n );\n};\n\n// ── X icon (inline SVG, replaces lucide-react dependency) ───────\n\nconst XIcon: React.FC<{ style?: React.CSSProperties; onClick?: () => void }> = ({ style, onClick }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={style}\n onClick={onClick}\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n);\n\n// ── main component ──────────────────────────────────────────────\n\nconst Safety = () => {\n const HasClosedKey = `miaoda-creatByMiaodo-has-closed-${getAppId()}`;\n const [visible, setVisible] = useState(\n !window.localStorage?.getItem(HasClosedKey),\n );\n const [open, setOpen] = useState(false);\n const isMobile = useIsMobile();\n const [userinfo, setUserinfo] = useState<{ id: number; name: string } | null>(null);\n const [isInternetVisible, setIsInternetVisible] = useState(false);\n const [showBadge, setShowBadge] = useState(true);\n const [badgeLoaded, setBadgeLoaded] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n const appId = getAppId();\n const csrfToken = getCsrfToken() ?? '';\n const csrfHeaders: Record<string, string> = { 'X-Suda-Csrf-Token': csrfToken };\n\n const tenantInfoUrl = isNewPathEnabled()\n ? `/app/${appId}/__runtime__/api/v1/studio/tenant_info`\n : `/spark/b/${appId}/tenant_info`;\n fetch(tenantInfoUrl, { headers: csrfHeaders })\n .then(res => res.json())\n .then(data => {\n setUserinfo(data?.data?.tenant_info);\n setIsInternetVisible(data?.data?.is_internet_visible);\n })\n .catch(() => {});\n\n const getPublishedUrl = isNewPathEnabled()\n ? `/app/${appId}/__runtime__/api/v1/studio/get_published`\n : `/spark/b/${appId}/get_published`;\n fetch(getPublishedUrl, { headers: csrfHeaders })\n .then(res => res.json())\n .then(data => {\n const badge = data?.data?.app_info?.show_badge;\n setShowBadge(badge !== false);\n })\n .catch(() => {\n setShowBadge(true);\n })\n .finally(() => {\n setBadgeLoaded(true);\n });\n }, []);\n\n useEffect(() => {\n if (isMobile) {\n const link = document.createElement('link');\n link.rel = 'preload';\n link.as = 'image';\n link.href = getCoverMobileUrl();\n document.head.appendChild(link);\n }\n }, [isMobile]);\n\n if (process.env.NODE_ENV !== 'production') return null;\n // AppType=7 是 jsPage MODERN_APP,不显示「由妙搭搭建」徽标\n // 沙箱通过环境变量注入 MIAODA_APP_TYPE,preset 顶层 define 透传给客户端\n // process.env 在浏览器是 undefined,env 必然是字符串(即使语义是数字)\n if (String(process.env.MIAODA_APP_TYPE) === '7') return null;\n if (!badgeLoaded) return null;\n if (!showBadge) return null;\n if (!visible) return null;\n\n // ── mobile: bottom sheet ────────────────────────────────────\n if (isMobile) {\n return (\n <DialogPrimitive.Root open={open} onOpenChange={setOpen}>\n <DialogPrimitive.Trigger asChild>\n <div style={badgeMobile} onClick={() => setOpen(true)}>\n <img src={LOGO_URL} style={logoStyle} />\n <p style={{ ...badgeTextStyle, minWidth: 28 }}>{t('safety.badge.label')}</p>\n </div>\n </DialogPrimitive.Trigger>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay style={overlayStyle} />\n <DialogPrimitive.Content style={sheetContent} aria-describedby={undefined}>\n <DialogPrimitive.Title style={{ position: 'absolute', clip: 'rect(0 0 0 0)' }}>\n {t('safety.badge.builtWith')}\n </DialogPrimitive.Title>\n <div style={sheetInner}>\n <XIcon style={sheetCloseBtn} onClick={() => setOpen(false)} />\n <img\n src={getCoverMobileUrl()}\n alt=\"\"\n style={sheetCover}\n onClick={() => window.open(LANDING_URL, '_blank')}\n />\n <div style={sheetBody}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, alignSelf: 'stretch' }}>\n {isInternetVisible && (\n <div style={infoRow}>\n <img src={ICON_COMPANY_URL} style={infoIconMobile} />\n <p style={sheetInfoText}>{t('safety.tenant.operated', { name: userinfo?.name ?? '' })}</p>\n </div>\n )}\n <div style={infoRow}>\n <img src={ICON_AI_URL} style={infoIconMobile} />\n <p style={sheetInfoText}>{t('safety.ai.disclaimer')}</p>\n </div>\n </div>\n <div style={mobileBtnRow}>\n <div\n style={mobileBtnOutline}\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setOpen(false);\n setTimeout(() => setVisible(false), 200);\n window.localStorage?.setItem(HasClosedKey, 'true');\n }}\n >\n {t('safety.button.dontShowAgain')}\n </div>\n <div\n style={mobileBtnFilled}\n onClick={() => window.open(LANDING_URL, '_blank')}\n >\n {t('safety.button.learnMore')}\n </div>\n </div>\n </div>\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n }\n\n // ── desktop: popover on hover ───────────────────────────────\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild>\n <div\n style={badgeDesktop}\n onMouseEnter={() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setOpen(true);\n }}\n onMouseLeave={() => {\n timeoutRef.current = setTimeout(() => setOpen(false), 100);\n }}\n >\n <img src={LOGO_URL} style={logoStyle} />\n <p style={{ ...badgeTextStyle, minWidth: 60 }}>{t('safety.badge.builtWith')}</p>\n </div>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n style={popoverContent}\n side=\"top\"\n align=\"end\"\n sideOffset={8}\n onMouseEnter={() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setOpen(true);\n }}\n onMouseLeave={() => {\n timeoutRef.current = setTimeout(() => setOpen(false), 100);\n }}\n >\n <div style={popoverInner}>\n <img\n src={getCoverUrl()}\n alt=\"\"\n style={popoverCover}\n onClick={() => window.open(LANDING_URL, '_blank')}\n />\n <div style={popoverBody}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, alignSelf: 'stretch' }}>\n {isInternetVisible && (\n <div style={infoRow}>\n <img src={ICON_COMPANY_URL} style={infoIcon} />\n <p style={infoText}>{t('safety.tenant.operated', { name: userinfo?.name ?? '' })}</p>\n </div>\n )}\n <div style={infoRow}>\n <img src={ICON_AI_URL} style={infoIcon} />\n <p style={infoText}>{t('safety.ai.disclaimer')}</p>\n </div>\n </div>\n <div style={btnRow}>\n <HoverButton\n style={btnBase}\n data-custom-element=\"safety-close\"\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setVisible(false);\n window.localStorage?.setItem(HasClosedKey, 'true');\n }}\n >\n {t('safety.button.dontShowAgain')}\n </HoverButton>\n <HoverButton\n style={btnBase}\n data-custom-element=\"safety-more\"\n onClick={() => window.open(LANDING_URL, '_blank')}\n >\n {t('safety.button.learnMore')}\n </HoverButton>\n </div>\n </div>\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n};\n\nexport default Safety;\n","/* eslint-disable */\n/**\n * 获取应用 ID\n */\nexport function getAppId(): string | null {\n const windowAppId = (window as any).appId || null;\n return windowAppId;\n}\n","/**\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 { 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","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}\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","/* 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 { IUserProfile } from '../types/udt-types';\nimport { getCurrentUserProfile } from '../integrations/getCurrentUserProfile';\nimport { getDataloom } from '../integrations/dataloom';\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 dataloom = await getDataloom();\n const result = await dataloom?.service?.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","\nexport interface UrlParts {\n baseUrl: string;\n workspace: string;\n}\n\n/**\n * @internal\n */\nexport function splitWorkspaceUrl(fullUrl: string): UrlParts {\n try {\n // https://www.suda.com/suda/api/v1/workspaces/:workspace_id\n const url = new URL(fullUrl);\n const pathParts = url.pathname.split('/');\n\n // 找到 workspaces 位置\n const workspacesIndex = pathParts.findIndex(part => part === 'workspaces');\n if (workspacesIndex === -1) {\n throw new Error('Invalid workspace URL format');\n }\n\n const basePathParts = pathParts.slice(0, workspacesIndex);\n const workspace = pathParts[workspacesIndex + 1];\n\n return {\n baseUrl: `${url.origin}${basePathParts.join('/')}`,\n workspace,\n };\n } catch (error) {\n console.error('Error splitting workspace URL:', error);\n }\n return {\n baseUrl: fullUrl,\n // 兜底给一个,不要给空字符串,不然 createClient 都直接挂了,页面会白屏,体感不太好\n workspace: 'workspace',\n };\n}\n","import { splitWorkspaceUrl } from '../utils/url';\nimport { createClient } from '@lark-apaas/dataloom';\nimport { getAppId } from '../utils/getAppId';\nimport { getInitialInfo } from '../utils/getInitialInfo';\n\nconst createDataLoomClient = (url?: string, pat?: string) => {\n const { baseUrl } = url ? splitWorkspaceUrl(url) : { baseUrl: '' };\n const appId = getAppId() ?? '';\n return createClient(baseUrl, pat ?? '', {\n global: {\n enableDataloomLog: process.env.NODE_ENV !== 'production',\n requestRateLimit: process.env.NODE_ENV !== 'production' ? 100 : undefined,\n brandName: 'miaoda',\n appId\n },\n });\n};\n\nlet dataloom: ReturnType<typeof createDataLoomClient> | null = null;\n// 缓存进行中的 Promise,防止并发调用创建多个实例\nlet pendingPromise: Promise<ReturnType<typeof createDataLoomClient>> | null = null;\n\n/** 获取dataloom实例 */\nexport function getDataloom(): Promise<ReturnType<typeof createDataLoomClient>> {\n if (dataloom) {\n return Promise.resolve(dataloom);\n }\n if (pendingPromise) {\n return pendingPromise;\n }\n pendingPromise = getInitialInfo()\n .then(info => {\n const DATALOOM_CLIENT_URL = info?.app_runtime_extra?.url;\n const DATALOOM_PAT = info?.app_runtime_extra?.token;\n dataloom = createDataLoomClient(DATALOOM_CLIENT_URL, DATALOOM_PAT);\n return dataloom;\n })\n .finally(() => {\n pendingPromise = null;\n });\n return pendingPromise;\n}\n","import 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 { getDataloom } from '../integrations/dataloom';\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 const dataloom = await getDataloom();\n await dataloom.service.session.signOut();\n } catch (error) {\n console.error('登出失败', error);\n } finally {\n setIsLoading(false);\n }\n }\n\n return {\n handlerLogout,\n isLoading,\n };\n}\n","/**\n * 中英文文案源(统一管理)。\n *\n * 每条文案同时包含 zh 和 en,方便对照和维护。\n * Key 规则:`{组件}.{区域}.{标识}`\n * 文案来源:https://bytedance.larkoffice.com/wiki/BJCQwv9auiP9erkudMfcVIIGnRg\n */\n\nconst messages: Record<string, { zh: string; en: string }> = {\n // ── Safety 组件 ──────────────────────────────────────────────\n 'safety.badge.label': {\n zh: '妙搭',\n en: 'Spark',\n },\n 'safety.badge.builtWith': {\n zh: '由妙搭搭建',\n en: 'Built with Spark',\n },\n 'safety.ai.disclaimer': {\n zh: '包含 AI 生成内容,请注意甄别',\n en: 'AI-generated content. Use with care.',\n },\n 'safety.tenant.operated': {\n zh: '{name}运营',\n en: 'Operated by {name}',\n },\n 'safety.button.dontShowAgain': {\n zh: '不再展示',\n en: \"Don't show again\",\n },\n 'safety.button.learnMore': {\n zh: '了解更多',\n en: 'Learn more',\n },\n 'safety.cover.pc': {\n zh: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover.png',\n en: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover-weben.png',\n },\n 'safety.cover.mobile': {\n zh: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover-mobile.png',\n en: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover-mobileen.png',\n },\n};\n\nexport default messages;\n","/**\n * 统一的语言判断方法。\n *\n * 生产环境(`process.env.NODE_ENV === 'production'`):\n * 只看浏览器容器语言(navigator.language)。\n *\n * 非生产环境(沙箱预览场景):\n * 优先级 query > localStorage > navigator。\n * URL query `locale`(值为 `zh_CN` / `en_US`)由宿主平台(miaoda)\n * 通过 iframe src 透传,确保产物内的语言与宿主一致;\n * 读到 query 时会同步写入 localStorage,便于后续无 query 的跳转/刷新场景使用。\n *\n * 返回标准化 locale code:'zh' | 'en'。\n * 目前只区分中英文,未来扩展时在此调整。\n */\n\nexport type Locale = 'zh' | 'en';\n\nconst STORAGE_KEY = 'miaoda:preview-locale';\n\nfunction toLocale(value: string | null | undefined): Locale {\n const lang = value ?? 'zh';\n return lang.toLowerCase().startsWith('zh') ? 'zh' : 'en';\n}\n\nfunction readLocaleFromQuery(): string | null {\n if (typeof window === 'undefined') return null;\n try {\n const value = new URLSearchParams(window.location.search).get('locale');\n return value && value.length > 0 ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction readLocaleFromStorage(): string | null {\n if (typeof window === 'undefined') return null;\n try {\n const value = window.localStorage?.getItem(STORAGE_KEY);\n return value && value.length > 0 ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction writeLocaleToStorage(value: string): void {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage?.setItem(STORAGE_KEY, value);\n } catch {\n // ignore(隐私模式 / 配额满等)\n }\n}\n\nexport function getLocale(): Locale {\n // 生产环境只信任容器语言,不受 query/localStorage 影响\n if (process.env.NODE_ENV === 'production') {\n return toLocale(navigator.language);\n }\n\n const fromQuery = readLocaleFromQuery();\n if (fromQuery) {\n writeLocaleToStorage(fromQuery);\n return toLocale(fromQuery);\n }\n\n const fromStorage = readLocaleFromStorage();\n if (fromStorage) return toLocale(fromStorage);\n\n return toLocale(navigator.language);\n}\n","import messages from './messages';\nimport { getLocale } from '../utils/locale';\nimport type { Locale } from '../utils/locale';\n\n/**\n * 获取当前语言环境下的翻译文案。\n *\n * 支持 `{key}` 形式的变量替换:\n * ```ts\n * t('safety.tenant.operated', { name: '字节' })\n * // zh → \"字节运营\"\n * // en → \"Operated by 字节\"\n * ```\n *\n * 如果 key 不存在,fallback 到中文;中文也没有则返回 key 本身。\n */\nexport function t(key: string, params?: Record<string, string>): string {\n const locale = getLocale();\n const entry = messages[key];\n let text = entry?.[locale] ?? entry?.zh ?? key;\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n text = text.replace(`{${k}}`, v);\n }\n }\n return text;\n}\n\nexport { getLocale } from '../utils/locale';\nexport type { Locale } from '../utils/locale';\n","import React from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\nlet defaultQueryClient: QueryClient | null = null;\n\nconst getDefaultQueryClient = () => {\n if (!defaultQueryClient) {\n defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n refetchOnWindowFocus: false,\n },\n mutations: {\n retry: 1,\n },\n },\n });\n }\n return defaultQueryClient;\n};\n\nexport type QueryProviderProps = {\n children: React.ReactNode;\n client?: QueryClient;\n};\n\nconst QueryProvider: React.FC<QueryProviderProps> = ({ children, client }) => {\n const qc = client ?? getDefaultQueryClient();\n return <QueryClientProvider client={qc}>{children}</QueryClientProvider>;\n};\n\nexport default QueryProvider;\nexport { getDefaultQueryClient };\n\n","import { useEffect, useCallback, useRef, useMemo, createElement } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { useUpdatingRef } from '../../hooks/useUpdatingRef';\nimport { submitPostMessage } from '../../utils/postMessage';\n\n// 注意:connectParent 和 connectDevServer 已移至 runtime/iframe-bridge.ts\n\nenum RouteMessageType {\n RouteChange = 'RouteChange',\n RouteBack = 'RouteBack',\n RouteForward = 'RouteForward',\n}\n\nfunction isRouteMessageType(type: string): type is RouteMessageType {\n return Object.values(RouteMessageType).includes(type as RouteMessageType);\n}\n\nexport default function IframeBridge() {\n const location = useLocation();\n const navigate = useNavigate();\n const navigateRef = useUpdatingRef(navigate);\n type NavigateArg = Parameters<typeof navigate>[0];\n const isActive = useRef(false);\n\n const historyBack = useCallback(\n (_payload: NavigateArg) => {\n navigateRef.current(-1);\n isActive.current = true;\n },\n [navigateRef]\n );\n\n const historyForward = useCallback(\n (_payload: NavigateArg) => {\n navigateRef.current(1);\n isActive.current = true;\n },\n [navigateRef]\n );\n\n const operatorMessage = useMemo<\n Record<RouteMessageType, (payload: NavigateArg) => void>\n >(\n () => ({\n [RouteMessageType.RouteBack]: historyBack,\n [RouteMessageType.RouteForward]: historyForward,\n [RouteMessageType.RouteChange]: navigateRef.current,\n }),\n [historyBack, historyForward, navigateRef]\n );\n\n useEffect(() => {\n if (isActive.current) {\n isActive.current = false;\n return;\n }\n submitPostMessage({\n type: 'ChildLocationChange',\n data: location,\n });\n }, [location]);\n\n const handleMessage = useCallback(\n (event: MessageEvent) => {\n const data: { type?: unknown; data?: unknown } = event.data ?? {};\n if (typeof data.type === 'string' && isRouteMessageType(data.type)) {\n operatorMessage[data.type](data.data as NavigateArg);\n }\n },\n [operatorMessage]\n );\n\n useEffect(() => {\n (window as unknown as Window).addEventListener('message', handleMessage);\n\n return () => {\n (window as unknown as Window).removeEventListener(\n 'message',\n handleMessage\n );\n };\n }, [handleMessage]);\n\n // 用 createElement 而不是 JSX:避开 esbuild classic JSX transform 需要 React 在\n // scope 的问题(lite 的 tsconfig 是 react-jsx 自动模式,typecheck 不需要 React\n // import,但 tsup/esbuild 默认 classic transform 编译成 React.createElement,\n // 没 React import 就 runtime 报 ReferenceError)\n return createElement('div', { style: { display: 'none' } });\n}\n","import { useRef } from 'react';\nexport function useUpdatingRef<T>(value: T) {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n","import md5 from 'blueimp-md5';\nimport sha1 from 'crypto-js/sha1';\nimport { isMobile } from '../../../utils/deviceType';\nimport { getEnv } from '../../../utils/getEnv';\nimport { getLarkUserInfo } from './getLarkUser';\n\nimport { type TrackParams } from '../../../types/tea';\n\nconst saltA = '08a441';\nconst saltB = '42b91e';\nexport const encryptTea = (message: any): string => {\n const msgString = String(message);\n return sha1(saltA + md5(msgString + saltB)).toString();\n};\n\nlet teaInstance = false;\n\n/**\n * 初始化Tea 客户端\n * @export\n */\nexport async function createTracker(): Promise<void> {\n const { data } = await getLarkUserInfo();\n const { tenantID, userID} = data || {};\n const userIDEncrypt = userID && userID !== '0' ? encryptTea(userID) : undefined;\n const tenantIDEncrypt = tenantID && tenantID !== '0' ? encryptTea(tenantID) : undefined;\n\n window.collectEvent?.('init', {\n app_id: 788827,\n channel: 'cn',\n disable_auto_pv: false,\n enable_ab_test: false,\n enable_debug: false,\n enable_stay_duration: true, // 上报页面停留时间\n reportTime: 1000, // 事件上报异步队列的时间间隔\n });\n\n window.collectEvent?.('config', {\n user_unique_id: userIDEncrypt,\n device_type: isMobile() ? 'mobile' : 'pc',\n evtParams: {\n open_from: new URLSearchParams(window.location.search).get('open-from') ?? undefined,\n env: getEnv(),\n user_id: userIDEncrypt,\n tenant_id: tenantIDEncrypt,\n },\n });\n teaInstance = true;\n\n window.collectEvent?.('start');\n}\n\nexport const reportTeaEvent = async ({ trackKey, trackParams = {}}: TrackParams): Promise<void> => {\n try {\n if (!teaInstance) {\n teaInstance = true;\n await createTracker();\n }\n\n window.collectEvent?.(trackKey, trackParams);\n } catch (err) {\n // 静默,不影响业务\n console.error(err); // eslint-disable-line no-restricted-syntax\n }\n};\n","export const isIpad = (): boolean => {\n const _isIpad =\n /iPad|Tab|Tablet/i.test(navigator.userAgent) && navigator.maxTouchPoints && navigator.maxTouchPoints > 1;\n\n return Boolean(_isIpad);\n};\n\nexport const isMobile = (): boolean => {\n const isPhone =\n /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i.test(\n navigator.userAgent\n );\n\n return isPhone || isIpad();\n};\n\nexport const isIOS = (): boolean => {\n if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {\n return true;\n }\n return false;\n};\n","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 '../../../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 { 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","export interface TrackParams {\n trackKey: TrackKey;\n trackParams?: Record<string, unknown>;\n}\n\nexport enum TrackKey {\n VIEW = 'aily_agent_artifact_page_view',\n}\n","import React from 'react';\n\nconst Welcome: React.FC<{\n title?: string;\n description?: string;\n}> = ({ title = '页面待开发', description = '页面暂未开发,请耐心等待...' }) => {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: 'calc(100vh - 64px)',\n padding: '0 24px',\n textAlign: 'center',\n }}\n >\n <img\n style={{ borderRadius: 6, marginBottom: 24 }}\n width=\"320\"\n height=\"200\"\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/miao/welcome.svg\"\n alt=\"Welcome\"\n />\n <div style={{ fontSize: 16, fontWeight: 500, lineHeight: '24px', marginBottom: 4, color: '#1f2329' }}>\n {title}\n </div>\n <div style={{ fontSize: 16, lineHeight: '24px', color: '#8f959e', maxWidth: 480 }}>\n {description}\n </div>\n </div>\n );\n};\n\nexport default Welcome;\n","import React from 'react';\n\nconst PagePlaceholder: React.FC<{\n title?: string;\n description?: string;\n}> = ({ title = '页面待开发', description = '页面暂未开发,请耐心等待...' }) => {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0 24px',\n width: '100%',\n height: 'calc(100vh - 64px)',\n textAlign: 'center',\n }}\n >\n <img\n style={{ borderRadius: '6px', marginBottom: '24px' }}\n width=\"320\"\n height=\"200\"\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/miao/welcome.svg\"\n alt=\"Welcome\"\n />\n <div style={{ fontSize: '16px', fontWeight: 500, marginBottom: '4px', lineHeight: '24px' }}>\n {title}\n </div>\n <div\n style={{\n color: '#6b7280',\n fontSize: '16px',\n lineHeight: '24px',\n maxWidth: '480px',\n overflow: 'hidden',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n }}\n >\n {description}\n </div>\n </div>\n );\n};\n\nexport default PagePlaceholder;\n","import React, { useEffect } from 'react';\nimport { logger } from '../../logger';\nimport { getHmrApi } from '../../utils/hmr-api';\nimport { submitPostMessage } from '../../utils/postMessage';\n\n/**\n * ErrorBoundary fallback 组件。\n *\n * 链路:业务代码 throw → react-error-boundary 捕获 → 渲染本组件\n * → submitPostMessage({ type: 'RenderError' }) 通知妙搭外壳\n * → logger.log meta.repairMessage 让外壳 sandbox-console 弹「一键修复」\n *\n * HMR 恢复策略按构建工具区分:\n * - **vite**: ErrorBoundary 状态下 React Refresh family map 找不到 fiber,\n * resetErrorBoundary 让 children 重新 mount 时 import 仍是旧引用 → 死循环。\n * vite 模式(检测到 window.__VITE_HMR__)必须 `window.location.reload()`\n * 才能让模块图完整重载(这是 vite 官方对 ErrorBoundary 场景的 recommended fallback)。\n * - **webpack/rspack**: 模块 cache 可被 HMR 直接替换,resetErrorBoundary 让 children\n * 重新 mount 时 import 拿到新版本 → 正常恢复,不需要 reload。\n */\nconst ErrorRender: React.FC<{\n error: unknown;\n resetErrorBoundary?: (...args: unknown[]) => void;\n}> = (props) => {\n const { error, resetErrorBoundary } = props;\n\n useEffect(() => {\n if (error) {\n submitPostMessage({\n type: 'RenderError',\n data: error,\n });\n logger.log({\n level: 'error',\n args: ['Render Error', error],\n meta: {\n type: 'render-error',\n repairMessage: '页面渲染时报错,请根据错误信息修复对应页面的代码',\n },\n });\n }\n }, [error]);\n\n useEffect(() => {\n if (!resetErrorBoundary) return;\n const hmr = getHmrApi();\n if (!hmr) return;\n\n return hmr.onSuccess(() => {\n // vite 下 ErrorBoundary 状态下模块图无法更新,必须整页 reload;\n // webpack/rspack 下 resetErrorBoundary 即可让 children 重新 mount 拿到新模块。\n const isVite =\n typeof window !== 'undefined' && Boolean(window.__VITE_HMR__);\n if (isVite) {\n window.location.reload();\n } else {\n resetErrorBoundary();\n }\n });\n }, [resetErrorBoundary]);\n\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-white\">\n <div className=\"flex flex-col justify-center items-center text-center\">\n <img\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/template/illustration_empty_negative_error.svg\"\n alt=\"render error\"\n className=\"mb-3 w-[100px]\"\n />\n <p className=\"text-l/[22px] text-[14px] text-[#1F2329] font-medium\">\n 页面出错了\n </p>\n </div>\n </div>\n );\n};\n\nexport default ErrorRender;\n","import React, { forwardRef, useEffect, useState } from 'react';\nimport { NavLink, type NavLinkProps } from 'react-router-dom';\n\nexport interface ActiveLinkProps extends Omit<NavLinkProps, 'to'> {\n to: string;\n}\n\n/**\n * ActiveLink 组件\n *\n * 替换 react-router-dom 的 NavLink,扩展支持 hash 路由跳转和激活态功能\n *\n * @example\n * // 普通路由跳转\n * <ActiveLink to=\"/dashboard\">Dashboard</ActiveLink>\n *\n * // hash 路由跳转\n * <ActiveLink to=\"#section1\">Section 1</ActiveLink>\n *\n * // 使用函数式 className 显示激活态\n * <ActiveLink\n * to=\"#features\"\n * className={({isActive}) => isActive ? 'active' : ''}\n * >\n * Features\n * </ActiveLink>\n */\n\nexport const ActiveLink = forwardRef<HTMLAnchorElement, ActiveLinkProps>(\n ({ to, onClick, className, style, children, ...rest }, ref) => {\n const [currentHash, setCurrentHash] = useState(() =>\n typeof window !== 'undefined' ? window.location.hash : ''\n );\n\n // 检测是否为 hash 路由\n const isHashRoute = typeof to === 'string' && to.startsWith('#');\n\n // 监听 hash 变化\n useEffect(() => {\n if (!isHashRoute) return;\n\n const handleHashChange = () => {\n setCurrentHash(window.location.hash);\n };\n\n window.addEventListener('hashchange', handleHashChange);\n return () => window.removeEventListener('hashchange', handleHashChange);\n }, [isHashRoute]);\n\n // 计算激活态\n const isActive = isHashRoute && currentHash === to;\n\n // 如果是普通路由,使用 NavLink\n if (!isHashRoute) {\n return (\n <NavLink\n ref={ref}\n to={to}\n onClick={onClick}\n className={className}\n style={style}\n {...rest}\n >\n {children}\n </NavLink>\n );\n }\n\n // 处理 hash 路由点击事件\n const handleHashClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n // 先调用用户自定义的 onClick\n onClick?.(e);\n\n // 如果用户在 onClick 中调用了 preventDefault,则不执行默认行为\n if (e.defaultPrevented) {\n return;\n }\n\n // 阻止默认的锚点跳转行为\n e.preventDefault();\n\n const targetId = to.slice(1); // \"#home\" -> \"home\"\n const targetElement = document.getElementById(targetId);\n\n // 使用 pushState 更新 URL,保留历史记录且避免浏览器默认的瞬间跳转\n history.pushState(null, '', to);\n\n // 立即更新内部状态以确保 UI 及时响应\n setCurrentHash(to);\n\n // 手动触发 hashchange 事件以通知其他组件\n window.dispatchEvent(new Event('hashchange'));\n\n // 平滑滚动到目标元素\n if (targetElement && typeof targetElement.scrollIntoView === 'function') {\n targetElement.scrollIntoView({ behavior: 'smooth' });\n }\n };\n\n // 处理 className(支持函数和字符串)\n const computedClassName =\n typeof className === 'function'\n ? className({ isActive, isPending: false, isTransitioning: false })\n : className;\n\n // 处理 style(支持函数和对象)\n const computedStyle =\n typeof style === 'function'\n ? style({ isActive, isPending: false, isTransitioning: false })\n : style;\n\n // 处理 children(支持函数和 ReactNode)\n const computedChildren =\n typeof children === 'function'\n ? children({ isActive, isPending: false, isTransitioning: false })\n : children;\n\n return (\n <a\n ref={ref}\n href={to}\n onClick={handleHashClick}\n className={computedClassName}\n style={computedStyle}\n {...rest}\n >\n {computedChildren}\n </a>\n );\n }\n);\n\nActiveLink.displayName = 'ActiveLink';\n","/* eslint-disable */\nimport * as React from 'react';\nimport {\n NavLink as OriginalNavLink,\n useLocation,\n useNavigate,\n type NavLinkProps,\n} from 'react-router-dom';\n\n/**\n * Enhanced NavLink component that extends react-router-dom's NavLink\n * with support for hash links (anchor navigation) and smooth scrolling.\n */\nconst NavLink = React.forwardRef<HTMLAnchorElement, NavLinkProps>(\n ({ to, children, className, style, ...props }, ref) => {\n const isHashLink = typeof to === 'string' && to.startsWith('#');\n const location = useLocation();\n const navigate = useNavigate();\n\n if (isHashLink) {\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n const element = document.querySelector(to as string);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth' });\n }\n navigate(to as string);\n };\n\n const isActive = location.hash === to;\n\n const renderProps = {\n isActive,\n isPending: false,\n isTransitioning: false,\n };\n\n const resolvedClassName =\n typeof className === 'function' ? className(renderProps) : className;\n const resolvedStyle =\n typeof style === 'function' ? style(renderProps) : style;\n\n const {\n caseSensitive,\n end,\n replace,\n state,\n preventScrollReset,\n relative,\n viewTransition,\n ...restProps\n } = props;\n\n return (\n <a\n href={to as string}\n onClick={handleClick}\n ref={ref}\n className={resolvedClassName}\n style={resolvedStyle}\n {...restProps}\n >\n {typeof children === 'function' ? children(renderProps) : children}\n </a>\n );\n }\n\n return (\n <OriginalNavLink\n to={to}\n ref={ref}\n className={className}\n style={style}\n onClick={() =>\n (document.getElementById('rootContainer') || window)?.scrollTo({\n top: 0,\n behavior: 'smooth',\n })\n }\n {...props}\n >\n {children}\n </OriginalNavLink>\n );\n },\n);\n\nNavLink.displayName = 'NavLink';\n\nexport { NavLink };\nexport type { NavLinkProps };\n","import React from 'react';\nimport { Link as RouterLink } from 'react-router-dom';\n\nexport interface UniversalLinkProps\n extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {\n /** 链接目标:内部路由、hash 锚点或外部 URL */\n to: string;\n}\n\n/** 是否为内部路由(非 hash、非外链) */\nfunction isInternalRoute(to: string): boolean {\n return !to.startsWith('#') && !to.startsWith('http://') && !to.startsWith('https://') && !to.startsWith('//');\n}\n\n/** 是否为外部链接 */\nfunction isExternalLink(to: string): boolean {\n return to.startsWith('http://') || to.startsWith('https://') || to.startsWith('//');\n}\n\n/**\n * 统一的链接组件,用于替换原生 <a> 标签\n * - 内部路由(/dashboard)→ react-router Link\n * - Hash 锚点(#section)→ <a>\n * - 外链(https://...)→ <a target=\"_blank\">\n */\nexport const UniversalLink = React.forwardRef<HTMLAnchorElement, UniversalLinkProps>(\n function UniversalLink({ to, ...props }, ref) {\n // 内部路由\n if (isInternalRoute(to)) {\n return <RouterLink to={to} ref={ref} {...props} />;\n }\n\n // Hash 链接 & 外部链接\n return (\n <a\n href={to}\n ref={ref}\n {...props}\n {...(isExternalLink(to) && {\n target: props.target ?? '_blank',\n rel: props.rel ?? 'noopener noreferrer',\n })}\n />\n );\n }\n);\n","import { getAppId } from './getAppId';\n\n/**\n * 获取当前 appId 对应的命名空间前缀\n * 格式:__miaoda_<appId>__:\n * 若 appId 为 null,则使用 __global__\n */\nfunction getPrefix(): string {\n const appId = getAppId();\n const namespace = appId || '__global__';\n return `__miaoda_${namespace}__:`;\n}\n\n/**\n * 获取当前 appId 范围内的所有 key(已去前缀)\n */\nfunction getScopedKeys(): string[] {\n const prefix = getPrefix();\n const keys: string[] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && key.startsWith(prefix)) {\n keys.push(key.substring(prefix.length));\n }\n }\n\n return keys;\n}\n\n/**\n * 按 appId 隔离的 localStorage 封装\n * API 与原生 localStorage 保持一致\n */\nexport const scopedStorage: Storage = {\n /**\n * 获取指定 key 的值\n */\n getItem(key: string): string | null {\n const prefixedKey = getPrefix() + key;\n return localStorage.getItem(prefixedKey);\n },\n\n /**\n * 设置指定 key 的值\n */\n setItem(key: string, value: string): void {\n const prefixedKey = getPrefix() + key;\n localStorage.setItem(prefixedKey, value);\n },\n\n /**\n * 删除指定 key\n */\n removeItem(key: string): void {\n const prefixedKey = getPrefix() + key;\n localStorage.removeItem(prefixedKey);\n },\n\n /**\n * 清空当前 appId 范围内的所有 key\n * 不影响其他 app 和无前缀的 key\n */\n clear(): void {\n const prefix = getPrefix();\n const keysToRemove: string[] = [];\n\n // 收集需要删除的 key\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && key.startsWith(prefix)) {\n keysToRemove.push(key);\n }\n }\n\n // 删除收集到的 key\n keysToRemove.forEach(key => localStorage.removeItem(key));\n },\n\n /**\n * 返回当前 appId 范围内第 index 个 key(去前缀后的原始 key)\n */\n key(index: number): string | null {\n const keys = getScopedKeys();\n return keys[index] || null;\n },\n\n /**\n * 返回当前 appId 范围内的 key 数量\n */\n get length(): number {\n return getScopedKeys().length;\n },\n};\n","/**\n * 复制字符串到剪切板\n * @param text 要复制的文本\n * @returns Promise<boolean> 复制是否成功\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n // 优先使用现代的 Clipboard API\n if (navigator.clipboard && window.isSecureContext) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n\n // 降级方案:使用传统的 execCommand 方法\n return fallbackCopyToClipboard(text);\n } catch (error) {\n // 执行navigator.clipboard.writeText失败时,降级方案\n return fallbackCopyToClipboard(text);\n }\n}\n\n/**\n * 降级复制方案(兼容旧浏览器)\n * @param text 要复制的文本\n * @returns boolean 复制是否成功\n */\nfunction fallbackCopyToClipboard(text: string): boolean {\n try {\n // 创建临时的 textarea 元素\n const textArea = document.createElement('textarea');\n textArea.value = text;\n\n // 设置样式,使其不可见\n textArea.style.position = 'fixed';\n textArea.style.left = '-999999px';\n textArea.style.top = '-999999px';\n textArea.setAttribute('readonly', '');\n\n // 添加到 DOM\n document.body.appendChild(textArea);\n\n // 选中文本\n textArea.focus();\n textArea.select();\n\n // 执行复制命令\n const successful = document.execCommand('copy');\n\n // 清理:移除临时元素\n document.body.removeChild(textArea);\n\n return successful;\n } catch (error) {\n console.error('降级复制方案失败:', error);\n return false;\n }\n}\n","import { normalizeBasePath } from './utils';\n\n/**\n * 确保路径包含 CLIENT_BASE_PATH 前缀\n */\nfunction ensureBasePath(pathname: string, basePath: string): string {\n if (!basePath) return pathname;\n if (pathname.startsWith(basePath)) return pathname;\n return `${basePath}${pathname.startsWith('/') ? '' : '/'}${pathname}`;\n}\n\n/**\n * 解析应用内路径,自动补全 CLIENT_BASE_PATH 前缀,返回完整 URL\n * 适用于生成分享链接、二维码等需要完整 URL 的场景\n *\n * - 相对路径:补全前缀 + 当前域名\n * - 当前域名的完整 URL:修正路径部分,补全前缀\n * - 其他域名的 URL:原样返回,不做处理\n *\n * @param path - 应用内相对路径或完整 URL\n * @returns 完整的 URL 字符串\n *\n * @example\n * // 假设 CLIENT_BASE_PATH = '/app/abc',当前域名为 https://example.com\n *\n * resolveAppUrl('/detail/123')\n * // => 'https://example.com/app/abc/detail/123'\n *\n * resolveAppUrl('https://example.com/detail/123')\n * // => 'https://example.com/app/abc/detail/123'\n *\n * resolveAppUrl('https://example.com/app/abc/detail/123')\n * // => 'https://example.com/app/abc/detail/123' (已有前缀,不重复添加)\n *\n * resolveAppUrl('https://other-site.com/page')\n * // => 'https://other-site.com/page' (非当前域名,原样返回)\n */\nexport function resolveAppUrl(path: string): string {\n const basePath = normalizeBasePath(process.env.CLIENT_BASE_PATH);\n\n // 尝试解析为完整 URL\n try {\n const url = new URL(path);\n // 非当前域名,原样返回\n if (url.origin !== window.location.origin) {\n return path;\n }\n // 当前域名,修正路径\n url.pathname = ensureBasePath(url.pathname, basePath);\n return url.toString();\n } catch {\n // 不是完整 URL,当作相对路径处理\n }\n\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const resolvedPath = ensureBasePath(normalizedPath, basePath);\n return `${window.location.origin}${resolvedPath}`;\n}\n","/**\n * @internal\n */\nexport function getEnvPath() {\n return window.IS_MIAODA_PREVIEW ? 'feida_preview' : 'feida_runtime';\n}\n","import axios, { AxiosInstance } from 'axios';\nimport { initAxiosConfig } from './axiosConfig';\n\nlet axiosInstance: AxiosInstance | undefined;\n\n/** 显示 toast 提示(兼容 PC/移动端) */\nfunction showToast(message: string, duration = 3000): Promise<void> {\n return new Promise(resolve => {\n const toast = document.createElement('div');\n\n const iconSvg = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8 1.333a6.667 6.667 0 1 1 0 13.334A6.667 6.667 0 0 1 8 1.333ZM8 10a.667.667 0 1 0 0 1.333A.667.667 0 0 0 8 10Zm0-5.333a.667.667 0 0 0-.667.666v3.334a.667.667 0 0 0 1.334 0V5.333A.667.667 0 0 0 8 4.667Z\" fill=\"#ff811a\"/>\n </svg>`;\n\n const iconWrapper = document.createElement('span');\n iconWrapper.innerHTML = iconSvg;\n Object.assign(iconWrapper.style, {\n display: 'flex',\n alignItems: 'center',\n marginRight: '8px',\n flexShrink: '0',\n });\n\n const textWrapper = document.createElement('span');\n textWrapper.textContent = message;\n\n toast.appendChild(iconWrapper);\n toast.appendChild(textWrapper);\n\n Object.assign(toast.style, {\n position: 'fixed',\n top: '20%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n display: 'flex',\n alignItems: 'center',\n padding: '12px 16px',\n backgroundColor: '#fff',\n color: '#1f2329',\n border: '1px solid #dee0e3',\n borderRadius: '6px',\n fontSize: '14px',\n lineHeight: '1.5',\n zIndex: '99999',\n maxWidth: '80vw',\n wordBreak: 'break-word',\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.03), 0 3px 6px rgba(0, 0, 0, 0.05), 0 6px 18px rgba(0, 0, 0, 0.03)',\n opacity: '0',\n transition: 'opacity 0.3s ease',\n });\n\n document.body.appendChild(toast);\n\n requestAnimationFrame(() => {\n toast.style.opacity = '1';\n });\n\n setTimeout(() => {\n toast.style.opacity = '0';\n setTimeout(() => {\n document.body.removeChild(toast);\n resolve();\n }, 300);\n }, duration);\n });\n}\n\ndeclare module 'axios' {\n export interface AxiosRequestConfig {\n meta?: {\n autoJumpToLogin?: boolean;\n };\n }\n}\n\n/** 获取axios实例 */\nexport function getAxiosForBackend() {\n if (!axiosInstance) {\n axiosInstance = axios.create({\n baseURL: process.env.CLIENT_BASE_PATH || '/',\n });\n axiosInstance.interceptors.response.use(\n null,\n err => {\n if (err.config.meta?.autoJumpToLogin !== false) {\n const loginUrl = err.response?.headers?.['x-login-url'];\n if (loginUrl) {\n showToast('需要登录后才能执行操作,将自动跳转登录页', 3000).then(() => {\n window.location.href = loginUrl;\n });\n }\n }\n return Promise.reject(err);\n });\n initAxiosConfig(axiosInstance);\n }\n return axiosInstance;\n}\n\nexport const axiosForBackend = getAxiosForBackend();\n","import { createClient } from '@lark-apaas/client-capability';\nimport { normalizeBasePath } from '../utils/utils';\nimport { getAppId } from '../utils/getAppId';\nimport { isNewPathEnabled } from '../utils/apiPath';\n\n/**\n * 调用平台 capability(插件能力)的客户端实例。\n *\n * 从老 client-toolkit 搬过来。lite 没有像 toolkit 那样在内部封 logger / toast,\n * 这里走精简版:\n * - logger 留空(业务可在 createClient 调用处自己包)\n * - onRateLimitError 不接入 toast,业务自己处理(避免强依赖 sonner 主题)\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 */\nconst _appId = getAppId();\nconst _acquireUploadUrl = isNewPathEnabled()\n ? `/app/${_appId}/__runtime__/api/v1/studio/plugins/tmp_files/acquire_upload_url`\n : `/af/api/v1/studio/plugins/tmp_files/acquire_upload_url`;\nconst _acquireDownloadUrl = isNewPathEnabled()\n ? `/app/${_appId}/__runtime__/api/v1/studio/plugins/tmp_files/acquire_download_url`\n : `/af/api/v1/studio/plugins/tmp_files/acquire_download_url`;\n\n// 默认强制走中心化插件服务(plugin_server 4 端点):\n// - 沙箱开发态 NODE_ENV=development → 预览态路径 + body 携带 virtual:capabilities 注入的 config\n// - 运行态 NODE_ENV=production → 运行态路径 + 中心 store 查 config\n// 关闭:把 `central.enabled` 改 false 回退老 SDK 行为(直接打用户应用,jsPage 无 server 会 404)\n// 方案文档: https://bytedance.larkoffice.com/wiki/WtW5wJ7wli9BImkExyJcjR5znfx\nexport const capabilityClient = createClient({\n baseURL: normalizeBasePath(process.env.CLIENT_BASE_PATH ?? '/'),\n acquireUploadUrl: _acquireUploadUrl,\n acquireDownloadUrl: _acquireDownloadUrl,\n fetchOptions: {\n headers: {\n 'X-Suda-Csrf-Token':\n (window as { csrfToken?: string }).csrfToken ?? '',\n },\n },\n central: {\n enabled: true,\n // window.appId 由妙搭沙箱 / 线上环境注入;非妙搭场景下 capability 调用本身不可用\n appId: _appId ?? '',\n // baseURL 不传 → 默认 window.location.origin(同源调用,SSO cookie 自动带)\n // capabilities map 由 SDK 直接 import 'virtual:capabilities',构建时由\n // @lark-apaas/coding-vite-preset 的 capabilitiesBundlePlugin 注入\n },\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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,QAAQH,MAAAA,oEACR;AACJ,IAAMI,sBAAsBD,iBAAAA,IACxB,QAAQH,MAAAA,sEACR;AAOG,IAAMK,uBAAmBC,uCAAa;EAC3CC,SAASC,kBAAkBC,QAAQC,IAAIC,oBAAoB,GAAA;EAC3DC,kBAAkBV;EAClBW,oBAAoBT;EACpBU,cAAc;IACZC,SAAS;MACP,qBACGC,OAAkCC,aAAa;IACpD;EACF;EACAC,SAAS;IACPC,SAAS;;IAETC,OAAOpB,UAAU;EAInB;AACF,CAAA;;;ACxDA;;;;;;;;;;;;;;AACO,IAAMqB,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","createWebpackHmrApi","hot","onSuccess","callback","lastStatus","handler","status","e","console","error","addStatusHandler","removeStatusHandler","onError","Error","getHmrApi","process","env","NODE_ENV","webpackHot","module","window","__VITE_HMR__","PARENT_ORIGIN_KEY","getParentOriginFromParams","params","URLSearchParams","window","location","search","origin","get","sessionStorage","setItem","getItem","undefined","getLegacyParentOrigin","includes","resolveParentOrigin","document","referrer","referrerOrigin","URL","startsWith","paramOrigin","process","env","FORCE_FRAMEWORK_DOMAIN_MAIN","submitPostMessage","message","targetOrigin","parentOrigin","parent","postMessage","e","console","error","LOG_LEVELS","isLogLevel","value","includes","devServerDisconnectInfo","retryCount","processDevServerLog","log","devFlag","includes","time","Date","now","submitPostMessage","type","data","status","slardar","sendEvent","name","metrics","categories","hmrFlag","startTime","duration","listenModuleHmr","hmr","getHmrApi","onSuccess","onError","error","console","warn","String","PROXY_CONSOLE_METHOD","interceptErrors","window","addEventListener","event","logger","reason","forEach","method","originalMethod","args","level","first","startsWith","isLogLevel","safeStringify","obj","seen","Set","JSON","stringify","_key","value","has","add","toString","Date","toISOString","Map","Object","fromEntries","Array","from","Error","name","message","stack","clear","processLogParams","args","map","arg","String","mapLogLevel","level","BatchLogger","config","logQueue","flushTimer","isProcessing","originConsole","console","userId","tenantId","appId","window","endpoint","process","env","CLIENT_BASE_PATH","sizeThreshold","flushInterval","maxRetries","retryDelay","headers","startFlushTimer","setupBeforeUnloadHandler","batchLog","level","message","source","logEntry","id","generateId","timestamp","Date","now","push","length","flush","logsToSend","splice","sendBatch","error","unshift","logs","collectLogs","map","log","time","toISOString","user_id","tenant_id","app_id","retries","execFetch","method","body","JSON","stringify","warn","delay","url","options","fetch","clearInterval","setInterval","addEventListener","finally","destroy","ms","Promise","resolve","setTimeout","Math","random","toString","substr","getQueueSize","updateConfig","newConfig","defaultBatchLogger","batchLogInfo","level","message","source","defaultBatchLogger","batchLog","process","env","NODE_ENV","window","defaultBatchLogger","BatchLogger","console","mapStacktrace","stacktrace","map","frame","functionName","fileName","lineNumber","columnNumber","reportStacktraceParseError","e","context","window","parent","submitPostMessage","type","payload","error","Error","message","String","getStacktrace","StackTrace","get","errorReplacer","_key","value","stack","name","generateLogId","crypto","randomUUID","Date","now","Math","random","toString","slice","lastLogInfo","sendSelectedLog","logWithoutID","log","id","newParts","i","args","length","item","newError","meta","fromError","push","frames","firstFrameIndex","findIndex","includes","skipFrame","undefined","logJSON","JSON","stringify","logForDedup","logContentForDedup","content","count","isDuplicate","duplicateCount","duplicateOfId","updatedJSON","batchLogInfo","sendTypedLogV2","logWithMeta","level","typedLogInterceptor","originLogger","debug","info","warn","success","interceptors","shouldReportToObservable","process","env","NODE_ENV","ORDERED_LEVELS","defaultConfig","showLevel","showTimestamp","level","prefix","config","configureLogger","options","shouldLog","indexOf","getFormattedPrefix","parts","push","toUpperCase","logger","debug","message","args","console","log","info","observable","processLogParams","join","warn","error","success","mapLogLevel","window","__RUNTIME_LOGGER__","get","interceptor","interceptors","interceptLogs","clsxWithTw","inputs","twMerge","clsx","isPreview","window","IS_MIAODA_PREVIEW","normalizeBasePath","basePath","replace","getWsPath","rawBasePath","process","env","CLIENT_BASE_PATH","normalizedBasePath","startsWith","basePathWithoutTrailingSlash","endsWith","slice","isSparkRuntime","_IS_Spark_RUNTIME","runtimeMode","getRoutes","routes","path","basePath","normalizeBasePath","process","env","CLIENT_BASE_PATH","res","fetch","json","error","console","warn","childApi","updateAppInfo","appInfo","dispatchEvent","CustomEvent","detail","connectParent","submitPostMessage","type","data","batchLogInfo","JSON","stringify","timestamp","Date","now","url","window","location","href","parentOrigin","resolveParentOrigin","connection","connectToParent","methods","childApi","promise","initIframeBridge","parent","window","__FULLSTACK_RUNTIME_INITIALIZED__","initAxiosConfig","process","env","NODE_ENV","initIframeBridge","import_react","getAppId","windowAppId","window","appId","isNewPathEnabled","basePath","process","env","CLIENT_BASE_PATH","test","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","splitWorkspaceUrl","fullUrl","url","URL","pathParts","pathname","split","workspacesIndex","findIndex","part","Error","basePathParts","slice","workspace","baseUrl","origin","join","error","console","createDataLoomClient","url","pat","baseUrl","splitWorkspaceUrl","appId","getAppId","createClient","global","enableDataloomLog","process","env","NODE_ENV","requestRateLimit","undefined","brandName","dataloom","pendingPromise","getDataloom","Promise","resolve","getInitialInfo","then","info","DATALOOM_CLIENT_URL","app_runtime_extra","DATALOOM_PAT","token","finally","getNameFromArray","nameArray","length","undefined","chineseName","find","item","language_code","text","getCompatibilityUserProfile","userInfo","getCurrentUserProfile","userName","name","userAvatar","avatar","useCurrentUserProfile","setUserInfo","useState","useEffect","cancelled","fetchAndSetUserInfo","dataloom","getDataloom","result","service","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","useLogout","isLoading","setIsLoading","useState","handlerLogout","process","env","NODE_ENV","console","log","dataloom","getDataloom","service","session","signOut","error","messages","zh","en","STORAGE_KEY","toLocale","value","lang","toLowerCase","startsWith","readLocaleFromQuery","window","URLSearchParams","location","search","get","length","readLocaleFromStorage","localStorage","getItem","writeLocaleToStorage","setItem","getLocale","process","env","NODE_ENV","navigator","language","fromQuery","fromStorage","t","key","params","locale","getLocale","entry","messages","text","zh","k","v","Object","entries","replace","resetBase","boxSizing","margin","padding","border","background","font","color","textAlign","textDecoration","textTransform","letterSpacing","wordSpacing","lineHeight","verticalAlign","listStyle","FONT_FAMILY","Z_BADGE","Z_OVERLAY","LOGO_URL","getCoverUrl","t","getCoverMobileUrl","ICON_COMPANY_URL","ICON_AI_URL","LANDING_URL","badgeBase","position","display","alignItems","gap","boxShadow","borderRadius","fontFamily","fontSize","zIndex","cursor","badgeDesktop","right","bottom","badgeMobile","logoStyle","flexShrink","width","height","badgeTextStyle","popoverContent","overflow","popoverInner","flexDirection","popoverCover","popoverBody","justifyContent","infoRow","alignSelf","infoIcon","infoIconMobile","infoText","btnRow","btnBase","flex","borderWidth","borderStyle","borderColor","transition","btnHovered","overlayStyle","inset","sheetContent","outline","sheetInner","sheetCloseBtn","top","left","sheetCover","sheetBody","sheetInfoText","mobileBtnRow","mobileBtnBase","mobileBtnOutline","mobileBtnFilled","HoverButton","style","onClick","children","rest","hovered","setHovered","useState","React","div","onMouseEnter","onMouseLeave","XIcon","svg","xmlns","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","path","d","Safety","HasClosedKey","getAppId","visible","setVisible","window","localStorage","getItem","open","setOpen","isMobile","useIsMobile","userinfo","setUserinfo","isInternetVisible","setIsInternetVisible","showBadge","setShowBadge","badgeLoaded","setBadgeLoaded","timeoutRef","useRef","useEffect","appId","csrfToken","getCsrfToken","csrfHeaders","tenantInfoUrl","isNewPathEnabled","fetch","headers","then","res","json","data","tenant_info","is_internet_visible","catch","getPublishedUrl","badge","app_info","show_badge","finally","link","document","createElement","rel","as","href","head","appendChild","process","env","NODE_ENV","String","MIAODA_APP_TYPE","Root","onOpenChange","Trigger","asChild","img","src","p","minWidth","Portal","Overlay","Content","aria-describedby","undefined","Title","clip","alt","name","e","stopPropagation","preventDefault","setTimeout","setItem","current","clearTimeout","side","align","sideOffset","data-custom-element","import_react","defaultQueryClient","getDefaultQueryClient","QueryClient","defaultOptions","queries","retry","refetchOnWindowFocus","mutations","QueryProvider","children","client","qc","React","QueryClientProvider","import_react","import_react","useUpdatingRef","value","ref","useRef","current","RouteMessageType","isRouteMessageType","type","Object","values","includes","IframeBridge","location","useLocation","navigate","useNavigate","navigateRef","useUpdatingRef","isActive","useRef","historyBack","useCallback","_payload","current","historyForward","operatorMessage","useMemo","useEffect","submitPostMessage","data","handleMessage","event","window","addEventListener","removeEventListener","createElement","style","display","isIpad","_isIpad","test","navigator","userAgent","maxTouchPoints","Boolean","isMobile","isPhone","isIOS","getEnv","globalThis","ENVIRONMENT","origin","window","location","includes","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_observable_web","initObservable","appId","window","observable","start","serviceName","env","process","NODE_ENV","AppEnv","Dev","Prod","collectorUrl","isNewPathEnabled","log","trace","metric","time","error","console","TrackKey","AppContainer","children","useAppInfo","useEffect","initObservable","process","env","NODE_ENV","reportTeaEvent","trackKey","TrackKey","VIEW","trackParams","artifact_uid","getAppId","agent_id","url","window","location","href","React","Safety","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","UniversalLink","React","forwardRef","props","ref","RouterLink","a","href","target","rel","getPrefix","appId","getAppId","namespace","getScopedKeys","prefix","keys","i","localStorage","length","key","startsWith","push","substring","scopedStorage","getItem","prefixedKey","setItem","value","removeItem","clear","keysToRemove","forEach","index","copyToClipboard","text","navigator","clipboard","window","isSecureContext","writeText","fallbackCopyToClipboard","error","textArea","document","createElement","value","style","position","left","top","setAttribute","body","appendChild","focus","select","successful","execCommand","removeChild","console","ensureBasePath","pathname","basePath","startsWith","resolveAppUrl","path","normalizeBasePath","process","env","CLIENT_BASE_PATH","url","URL","origin","window","location","toString","normalizedPath","resolvedPath","getEnvPath","window","IS_MIAODA_PREVIEW","import_axios","axiosInstance","showToast","message","duration","Promise","resolve","toast","document","createElement","iconSvg","iconWrapper","innerHTML","Object","assign","style","display","alignItems","marginRight","flexShrink","textWrapper","textContent","appendChild","position","top","left","transform","padding","backgroundColor","color","border","borderRadius","fontSize","lineHeight","zIndex","maxWidth","wordBreak","boxShadow","opacity","transition","body","requestAnimationFrame","setTimeout","removeChild","getAxiosForBackend","axios","create","baseURL","process","env","CLIENT_BASE_PATH","interceptors","response","use","err","config","meta","autoJumpToLogin","loginUrl","headers","then","window","location","href","reject","initAxiosConfig","axiosForBackend","_appId","getAppId","_acquireUploadUrl","isNewPathEnabled","_acquireDownloadUrl","capabilityClient","createClient","baseURL","normalizeBasePath","process","env","CLIENT_BASE_PATH","acquireUploadUrl","acquireDownloadUrl","fetchOptions","headers","window","csrfToken","central","enabled","appId","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"]}