@malette/agent-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/fetch.ts","../src/services/agent.ts","../src/services/file.ts","../src/services/template.ts","../src/stores/agentStore.ts","../src/hooks/useSSE.ts","../src/hooks/sseConnection.ts","../src/utils/thoughtParser.ts","../src/utils/parameterFormatter.ts","../src/utils/toolCallUtils.ts","../../../node_modules/ccount/index.js","../../../node_modules/devlop/lib/default.js","../../../node_modules/micromark-util-character/index.js","../../../node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp/index.js","../../../node_modules/unist-util-is/lib/index.js","../../../node_modules/unist-util-visit-parents/lib/color.node.js","../../../node_modules/unist-util-visit-parents/lib/index.js","../../../node_modules/mdast-util-find-and-replace/lib/index.js","../../../node_modules/mdast-util-gfm-autolink-literal/lib/index.js","../../../node_modules/micromark-util-normalize-identifier/index.js","../../../node_modules/mdast-util-gfm-footnote/lib/index.js","../../../node_modules/mdast-util-gfm-strikethrough/lib/index.js","../../../node_modules/markdown-table/index.js","../../../node_modules/mdast-util-to-markdown/lib/handle/blockquote.js","../../../node_modules/mdast-util-to-markdown/lib/util/pattern-in-scope.js","../../../node_modules/mdast-util-to-markdown/lib/handle/break.js","../../../node_modules/longest-streak/index.js","../../../node_modules/mdast-util-to-markdown/lib/util/format-code-as-indented.js","../../../node_modules/mdast-util-to-markdown/lib/util/check-fence.js","../../../node_modules/mdast-util-to-markdown/lib/handle/code.js","../../../node_modules/mdast-util-to-markdown/lib/util/check-quote.js","../../../node_modules/mdast-util-to-markdown/lib/handle/definition.js","../../../node_modules/mdast-util-to-markdown/lib/util/check-emphasis.js","../../../node_modules/mdast-util-to-markdown/lib/util/encode-character-reference.js","../../../node_modules/micromark-util-classify-character/index.js","../../../node_modules/mdast-util-to-markdown/lib/util/encode-info.js","../../../node_modules/mdast-util-to-markdown/lib/handle/emphasis.js","../../../node_modules/unist-util-visit/lib/index.js","../../../node_modules/mdast-util-to-string/lib/index.js","../../../node_modules/mdast-util-to-markdown/lib/util/format-heading-as-setext.js","../../../node_modules/mdast-util-to-markdown/lib/handle/heading.js","../../../node_modules/mdast-util-to-markdown/lib/handle/html.js","../../../node_modules/mdast-util-to-markdown/lib/handle/image.js","../../../node_modules/mdast-util-to-markdown/lib/handle/image-reference.js","../../../node_modules/mdast-util-to-markdown/lib/handle/inline-code.js","../../../node_modules/mdast-util-to-markdown/lib/util/format-link-as-autolink.js","../../../node_modules/mdast-util-to-markdown/lib/handle/link.js","../../../node_modules/mdast-util-to-markdown/lib/handle/link-reference.js","../../../node_modules/mdast-util-to-markdown/lib/util/check-bullet.js","../../../node_modules/mdast-util-to-markdown/lib/util/check-bullet-other.js","../../../node_modules/mdast-util-to-markdown/lib/util/check-bullet-ordered.js","../../../node_modules/mdast-util-to-markdown/lib/util/check-rule.js","../../../node_modules/mdast-util-to-markdown/lib/handle/list.js","../../../node_modules/mdast-util-to-markdown/lib/util/check-list-item-indent.js","../../../node_modules/mdast-util-to-markdown/lib/handle/list-item.js","../../../node_modules/mdast-util-to-markdown/lib/handle/paragraph.js","../../../node_modules/mdast-util-phrasing/lib/index.js","../../../node_modules/mdast-util-to-markdown/lib/handle/root.js","../../../node_modules/mdast-util-to-markdown/lib/util/check-strong.js","../../../node_modules/mdast-util-to-markdown/lib/handle/strong.js","../../../node_modules/mdast-util-to-markdown/lib/handle/text.js","../../../node_modules/mdast-util-to-markdown/lib/util/check-rule-repetition.js","../../../node_modules/mdast-util-to-markdown/lib/handle/thematic-break.js","../../../node_modules/mdast-util-to-markdown/lib/handle/index.js","../../../node_modules/mdast-util-gfm-table/lib/index.js","../../../node_modules/mdast-util-gfm-task-list-item/lib/index.js","../../../node_modules/mdast-util-gfm/lib/index.js","../../../node_modules/micromark-util-chunked/index.js","../../../node_modules/micromark-util-combine-extensions/index.js","../../../node_modules/micromark-extension-gfm-autolink-literal/lib/syntax.js","../../../node_modules/micromark-util-resolve-all/index.js","../../../node_modules/micromark-factory-space/index.js","../../../node_modules/micromark-core-commonmark/lib/blank-line.js","../../../node_modules/micromark-extension-gfm-footnote/lib/syntax.js","../../../node_modules/micromark-extension-gfm-strikethrough/lib/syntax.js","../../../node_modules/micromark-extension-gfm-table/lib/edit-map.js","../../../node_modules/micromark-extension-gfm-table/lib/infer.js","../../../node_modules/micromark-extension-gfm-table/lib/syntax.js","../../../node_modules/micromark-extension-gfm-task-list-item/lib/syntax.js","../../../node_modules/micromark-extension-gfm/index.js","../../../node_modules/remark-gfm/lib/index.js","../src/utils/asset.ts","../src/components/MultiAgentThoughts.tsx","../../../node_modules/clsx/dist/clsx.mjs","../../../node_modules/tailwind-merge/src/lib/class-group-utils.ts","../../../node_modules/tailwind-merge/src/lib/lru-cache.ts","../../../node_modules/tailwind-merge/src/lib/parse-class-name.ts","../../../node_modules/tailwind-merge/src/lib/config-utils.ts","../../../node_modules/tailwind-merge/src/lib/merge-classlist.ts","../../../node_modules/tailwind-merge/src/lib/tw-join.ts","../../../node_modules/tailwind-merge/src/lib/create-tailwind-merge.ts","../../../node_modules/tailwind-merge/src/lib/from-theme.ts","../../../node_modules/tailwind-merge/src/lib/validators.ts","../../../node_modules/tailwind-merge/src/lib/default-config.ts","../../../node_modules/tailwind-merge/src/lib/tw-merge.ts","../src/lib/utils.ts","../src/components/StreamingJsonDisplay.tsx","../src/components/PlanCard.tsx","../src/context/ComponentContext.tsx","../src/components/MessageIdentity.tsx","../src/components/MessageTimeline.tsx","../src/components/message/MessageMedia.tsx","../src/components/message/utils.ts","../src/components/message/MessageMarkdown.tsx","../src/components/ParameterDisplay.tsx","../src/components/ToolConfirmCard.tsx","../src/components/message/CustomResponseRenderer.tsx","../src/components/message/ToolCallCards.tsx","../src/components/message/ComponentPendingCard.tsx","../src/components/message/ThoughtTimelineCard.tsx","../src/components/message/hooks/useMessageContent.ts","../src/components/message/hooks/useToolCalls.ts","../src/components/message/hooks/useComponents.ts","../src/components/message/hooks/usePlanState.ts","../src/components/message/hooks/useThinkingContent.ts","../src/components/message/hooks/useTimelineItems.ts","../src/components/MessageBubble.tsx","../src/components/ChatWindow.tsx","../src/components/MessageMedia.tsx","../src/components/ThinkingProcess.tsx","../src/components/ToolConfirmDialog.tsx","../src/components/ui/dialog.tsx","../../../node_modules/class-variance-authority/dist/index.mjs","../src/components/ui/button.tsx","../src/components/ui/badge.tsx","../src/components/ui/card.tsx","../src/components/ui/separator.tsx","../src/components/ui/scroll-area.tsx","../src/components/PlanConfirmDialog.tsx","../src/components/PlanProgressPanel.tsx","../src/components/ui/textarea.tsx","../src/components/HumanInputDialog.tsx","../../../node_modules/sonner/dist/index.mjs","../src/components/ShareModal.tsx","../src/components/SaveTemplateDialog.tsx","../src/components/UpdateTemplateDialog.tsx","../src/components/TemplateSourceBadge.tsx","../src/components/TemplateSelector.tsx","../src/components/TemplateVariableDialog.tsx","../src/components/voice/useVoiceRecognition.ts","../src/components/voice/VoiceWaveform.tsx","../src/components/voice/VoiceInput.tsx","../src/components/voice/VoiceRecordingModal.tsx","../src/components/voice/VoiceInputButton.tsx","../src/utils/cn.ts","../src/components/SidePanel.tsx","../src/components/ArtifactViewer.tsx","../src/components/biz/InformationSupplement.tsx","../src/components/biz/BriefReview.tsx","../src/components/chat/SessionItem.tsx","../src/components/chat/Sidebar.tsx","../src/components/chat/WelcomePage.tsx","../src/components/chat/ChatInputArea.tsx","../src/components/AgentChat.tsx","../src/components/ShareReplayPage.tsx"],"names":["Cookies","path","API_BASE","normalizeToolCalls","thought","SSE_HEARTBEAT_TIMEOUT","MAX_RECONNECT_ATTEMPTS","RECONNECT_BASE_DELAY","parseSSELine","image","code","ok","index","all","node","is","visit","list","replace","domain","trail","exit","row","sizes","columnIndex","value","map","subexit","text","constructs","previous","emptyOptions","ToolCallCard","useState","ThoughtStepCard","SubAgentsSummary","MultiAgentThoughts","CLASS_PART_SEPARATOR","createClassGroupUtils","config","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","getClassGroupId","className","classParts","split","length","shift","getGroupRecursive","getGroupIdForArbitraryProperty","getConflictingClassGroupIds","classGroupId","hasPostfixModifier","conflicts","classPartObject","currentClassPart","nextClassPartObject","nextPart","get","classGroupFromNextClassPart","slice","undefined","validators","classRest","join","find","validator","arbitraryPropertyRegex","test","arbitraryPropertyClassName","exec","property","substring","indexOf","theme","prefix","Map","prefixedClassGroupEntries","getPrefixedClassGroupEntries","Object","entries","classGroups","forEach","classGroup","processClassesRecursively","classDefinition","classPartObjectToEdit","getPart","isThemeGetter","push","key","currentClassPartObject","pathPart","has","set","func","classGroupEntries","prefixedClassGroup","fromEntries","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","IMPORTANT_MODIFIER","createParseClassName","separator","experimentalParseClassName","isSeparatorSingleCharacter","firstSeparatorCharacter","separatorLength","parseClassName","modifiers","bracketDepth","modifierStart","postfixModifierPosition","currentCharacter","baseClassNameWithImportantModifier","hasImportantModifier","startsWith","baseClassName","maybePostfixModifierPosition","sortModifiers","sortedModifiers","unsortedModifiers","modifier","isArbitraryVariant","sort","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","classGroupsInConflict","classNames","trim","result","originalClassName","Boolean","variantModifier","modifierId","classId","includes","conflictGroups","i","group","twJoin","argument","resolvedValue","string","arguments","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","reduce","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","callTailwindMerge","apply","fromTheme","themeGetter","arbitraryValueRegex","fractionRegex","stringLengths","Set","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isLength","isNumber","isArbitraryLength","getIsArbitraryValue","isLengthOnly","Number","isNaN","isArbitraryNumber","isInteger","isPercent","endsWith","isArbitraryValue","isTshirtSize","sizeLabels","isArbitrarySize","isNever","isArbitraryPosition","imageLabels","isArbitraryImage","isImage","isArbitraryShadow","isShadow","isAny","label","testValue","getDefaultConfig","colors","spacing","blur","brightness","borderColor","borderRadius","borderSpacing","borderWidth","contrast","grayscale","hueRotate","invert","gap","gradientColorStops","gradientColorStopPositions","inset","margin","opacity","padding","saturate","scale","sepia","skew","space","translate","getOverscroll","getOverflow","getSpacingWithAutoAndArbitrary","getSpacingWithArbitrary","getLengthWithEmptyAndArbitrary","getNumberWithAutoAndArbitrary","getPositions","getLineStyles","getBlendModes","getAlign","getZeroAndEmpty","getBreaks","getNumberAndArbitrary","aspect","container","columns","box","display","float","clear","isolation","object","overflow","overscroll","position","start","end","top","right","bottom","left","visibility","z","basis","flex","grow","shrink","order","col","span","justify","content","items","self","p","px","py","ps","pe","pt","pr","pb","pl","m","mx","my","ms","me","mt","mr","mb","ml","w","screen","h","size","font","tracking","leading","placeholder","decoration","indent","align","whitespace","break","hyphens","bg","repeat","from","via","to","rounded","border","divide","outline","ring","shadow","filter","table","caption","transition","duration","ease","delay","animate","transform","rotate","origin","accent","appearance","cursor","caret","resize","scroll","snap","touch","select","fill","stroke","sr","twMerge","color","jsx","memo","StreamingJsonDisplay","useMemo","jsxs","Zap","Bot","AlertCircle","PlanMarkdownContent","ReactMarkdown","ImagePreviewModal","useEffect","link","Download","StepResultRenderer","ChevronUp","ChevronDown","Check","Loader2","ImageIcon","StepItem","Clock","PlanCard","MessageImageInternal","React","MessageVideoInternal","ImagePreviewInternal","X","VideoPreviewInternal","ResolvedMarkdownMedia","isVideoUrl","parseThinkingContent","CodeBlock","Copy","MarkdownContent","ParamRow","Fragment","JsonView","Sparkles","Eye","html","Code2","ContentPreviewCard","useCallback","ContentPreviewModal","ContentPreviewRenderer","HtmlPreview","ExternalLink","SourceCodeViewer","CustomResponseRenderer","JsonValue","ElegantJsonRenderer","FileJson","CheckCheck","ToolResultRenderer","collectMediaAssetsFromResult","SkillLoadCard","ChevronRight","ToolCallResults","StreamingToolCard","ComponentPendingCard","ThoughtTimelineCard","r","getFinalStatusPriority","useComponents","useRef","COMPONENT_TAGS_TO_STRIP","ThoughtBlockItem","MessageBubble","handleDelete","Square","AlertTriangle","EmptyState","LoadingState","Lightbulb","ThinkingBubble","ChatErrorBanner","MessageImage","MessageVideo","ImagePreview","Pencil","React19","param","React20","React22","getStepIcon","UserCheck","Play","RotateCcw","XCircle","Pause","Ban","React23","toast","Trash2","FileText","Save","BookOpen","Tag","User","Globe","CheckCircle2","EyeOff","Send","Mic","cn","SidePanel","Maximize2","ViewTabs","ToolbarButton","RefreshCw","MarkdownPreview","JsonPreview","FileCode","ArtifactViewer","Minimize2","Search","MessageSquare","Plus","DragHandle","input","PanelLeft","Lock","ArrowLeft","Calendar","Share2","SkipForward","CheckCircle"],"mappings":"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","file":"index.mjs","sourcesContent":["import Cookies from 'js-cookie';\n\nexport default async function fetcher<JSON = any>(\n input: RequestInfo,\n init?: RequestInit,\n isServer: boolean = false,\n): Promise<JSON> {\n const token = Cookies.get('X-Csrf-Token') || '';\n const headers: any = {\n 'Content-Type': 'application/json',\n 'X-Csrf-Token': token,\n };\n if (isServer) {\n headers['api-key'] = 'fdc24ec3-a900-4668-9467-7a5c5681fb47';\n }\n const res = await fetch(input, {\n ...init,\n headers: headers,\n credentials: 'include', // 携带 Cookie 用于 CSRF 验证\n });\n return res.json();\n}\n","/**\n * Agent SDK API 服务层\n * 封装所有 Agent 相关的 API 调用\n */\n\nimport fetcher from '../lib/fetch';\nimport Cookies from 'js-cookie';\nimport type {\n AgentSession,\n AgentMessage,\n CreateSessionRequest,\n SendMessageRequest,\n ConfirmToolCallRequest,\n PaginationParams,\n PaginatedResponse,\n ApiResponse,\n SessionShareDTO,\n SharedSessionDTO,\n CreateShareRequest,\n UpdateShareRequest,\n VerifySharePasswordRequest,\n ExecutionPlan,\n ConfirmPlanRequest,\n ProvideHumanInputRequest,\n PlanStatusResponse,\n AgentConfig,\n AgentTool,\n AgentSkillConfig,\n} from '../types/agent';\n\n// ============ API 基础路径 ============\nconst API_BASE = '/api/agent/v1';\n\nexport const agentService = {\n /**\n * 获取 Agent 详情\n */\n get: async (publicId: string): Promise<ApiResponse<AgentConfig>> => {\n return fetcher(`${API_BASE}/config/agent/${publicId}`);\n }\n};\n\n// ============ Session CRUD ============\n\nexport const sessionService = {\n /**\n * 创建会话\n */\n create: async (data: CreateSessionRequest): Promise<ApiResponse<AgentSession>> => {\n return fetcher(`${API_BASE}/sessions`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * 获取会话详情(包含消息历史)\n */\n get: async (sessionId: string): Promise<ApiResponse<AgentSession>> => {\n return fetcher(`${API_BASE}/sessions/${sessionId}`);\n },\n\n /**\n * 更新会话\n */\n update: async (sessionId: string, data: Partial<AgentSession>): Promise<ApiResponse<AgentSession>> => {\n return fetcher(`${API_BASE}/sessions/${sessionId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * 更新会话标题\n * 使用专门的标题更新接口\n */\n updateTitle: async (sessionId: string, title: string): Promise<ApiResponse<AgentSession>> => {\n return fetcher(`${API_BASE}/sessions/${sessionId}/title`, {\n method: 'PUT',\n body: JSON.stringify({ title }),\n });\n },\n\n /**\n * 删除会话\n */\n delete: async (sessionId: string): Promise<ApiResponse<void>> => {\n return fetcher(`${API_BASE}/sessions/${sessionId}`, {\n method: 'DELETE',\n });\n },\n\n /**\n * 获取会话消息列表\n */\n getMessages: async (sessionId: string, params?: { pageNo?: number; pageSize?: number }): Promise<ApiResponse<PaginatedResponse<AgentMessage>>> => {\n const searchParams = new URLSearchParams();\n searchParams.set('pageNo', String(params?.pageNo || 1));\n searchParams.set('pageSize', String(params?.pageSize || 100));\n return fetcher(`${API_BASE}/sessions/${sessionId}/messages?${searchParams.toString()}`);\n },\n\n /**\n * 获取会话列表\n */\n list: async (params?: PaginationParams & { projectId?: string; agentId?: string }): Promise<ApiResponse<PaginatedResponse<AgentSession>>> => {\n const searchParams = new URLSearchParams();\n if (params?.pageNo) searchParams.set('pageNo', String(params.pageNo));\n if (params?.pageSize) searchParams.set('pageSize', String(params.pageSize));\n if (params?.projectId) searchParams.set('projectId', params.projectId);\n if (params?.agentId) searchParams.set('agentId', params.agentId);\n\n const queryString = searchParams.toString();\n return fetcher(`${API_BASE}/sessions${queryString ? `?${queryString}` : ''}`);\n },\n};\n\n// ============ 消息发送 ============\n\nexport const messageService = {\n /**\n * 发送消息(非流式)\n */\n send: async (data: SendMessageRequest): Promise<ApiResponse<AgentMessage>> => {\n return fetcher(`${API_BASE}/messages`, {\n method: 'POST',\n body: JSON.stringify({ ...data, stream: false }),\n });\n },\n\n /**\n * 发送消息(流式)- 返回 Response 用于 SSE 处理\n * 注意:SSE 流式响应必须使用原生 fetch,不能使用 fetcher(会自动解析 JSON)\n */\n sendStream: async (data: SendMessageRequest, signal?: AbortSignal): Promise<Response> => {\n const requestBody = { ...data };\n console.log('[sendStream] Request data:', JSON.stringify(requestBody));\n\n // 获取 CSRF token(与 fetcher 保持一致)\n const csrfToken = Cookies.get('X-Csrf-Token') || '';\n\n const response = await fetch(`${API_BASE}/messages/stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'text/event-stream',\n 'X-Csrf-Token': csrfToken,\n },\n body: JSON.stringify(requestBody),\n signal,\n credentials: 'include',\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n return response;\n },\n\n /**\n * 获取消息的思考过程(用于断线重连)\n * 注意:SSE 流式响应必须使用原生 fetch,不能使用 fetcher(会自动解析 JSON)\n */\n getThoughtsStream: async (messageId: string): Promise<Response> => {\n // 获取 CSRF token(与 fetcher 保持一致)\n const csrfToken = Cookies.get('X-Csrf-Token') || '';\n\n const response = await fetch(`${API_BASE}/messages/${messageId}/thoughts/stream`, {\n headers: {\n 'Accept': 'text/event-stream',\n 'X-Csrf-Token': csrfToken,\n },\n credentials: 'include',\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n return response;\n },\n\n /**\n * 取消消息执行\n */\n cancel: async (messageId: string): Promise<ApiResponse<void>> => {\n return fetcher(`${API_BASE}/messages/${messageId}/cancel`, {\n method: 'POST',\n });\n },\n\n /**\n * 获取消息详情\n */\n getDetail: async (messageId: string): Promise<ApiResponse<AgentMessage>> => {\n return fetcher(`${API_BASE}/messages/${messageId}`);\n },\n\n /**\n * 删除消息\n * 删除指定的单条消息(原子操作)\n */\n delete: async (messageId: string): Promise<ApiResponse<boolean>> => {\n return fetcher(`${API_BASE}/messages/${messageId}`, {\n method: 'DELETE',\n });\n },\n};\n\n// ========= 工具确认 ============\n\nexport const toolCallService = {\n /**\n * 确认/拒绝工具调用\n */\n confirm: async (data: ConfirmToolCallRequest): Promise<ApiResponse<{ toolCallId: string; status: string; result?: string }>> => {\n return fetcher(`${API_BASE}/toolcalls/confirm`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * 批量确认工具调用\n */\n confirmBatch: async (\n toolCallIds: string[],\n approved: boolean,\n rejectReason?: string\n ): Promise<ApiResponse<{ results: Array<{ toolCallId: string; status: string }> }>> => {\n return fetcher(`${API_BASE}/toolcalls/confirm/batch`, {\n method: 'POST',\n body: JSON.stringify({\n toolCallIds,\n approved,\n rejectReason,\n }),\n });\n },\n\n /**\n * 获取待确认的工具调用\n */\n getPending: async (toolCallId: string): Promise<ApiResponse<{ toolCallId: string; name: string; arguments: Record<string, unknown>; status: string }>> => {\n return fetcher(`${API_BASE}/toolcalls/${toolCallId}/pending`);\n },\n\n /**\n * 前端工具结果回传\n */\n submitFrontendResult: async (toolCallId: string, result: any): Promise<ApiResponse<boolean>> => {\n return fetcher(`${API_BASE}/toolcalls/${toolCallId}/frontend-result`, {\n method: 'POST',\n body: JSON.stringify({ result }),\n });\n },\n};\n\n// ============ 组件 ============\n\nexport const componentService = {\n /**\n * 提交组件(确认/取消)\n */\n submit: async (data: { componentId: string; confirmed: boolean; data?: Record<string, any>; cancelReason?: string }): Promise<ApiResponse<boolean>> => {\n return fetcher(`${API_BASE}/components/submit`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * 获取待处理组件列表\n */\n getPending: async (messageId: string): Promise<ApiResponse<any[]>> => {\n return fetcher(`${API_BASE}/messages/${messageId}/components/pending`);\n },\n\n /**\n * 获取组件详情\n */\n getDetail: async (componentId: string): Promise<ApiResponse<any>> => {\n return fetcher(`${API_BASE}/components/${componentId}`);\n },\n};\n\n// ============ 便捷方法 ============\n\n/**\n * 快速创建并进入会话\n */\nexport async function createAndStartSession(\n projectId: string,\n agentId: string,\n title?: string\n): Promise<AgentSession | null> {\n try {\n const response = await sessionService.create({ projectId, agentId, title });\n console.log('[createAndStartSession] Response:', JSON.stringify(response));\n\n if (response.success && response.data) {\n const data = response.data as any;\n // 兼容后端可能返回的不同字段名\n const sessionId = data.publicId || data.sessionId || data.session_id || data.id;\n if (!sessionId) {\n console.error('[createAndStartSession] No sessionId found in response:', data);\n return null;\n }\n return {\n ...data,\n sessionId,\n };\n }\n return null;\n } catch (error) {\n console.error('Failed to create session:', error);\n return null;\n }\n}\n\n/**\n * 获取会话及其消息历史\n */\nexport async function getSessionWithMessages(\n sessionId: string,\n messageParams?: { pageNo?: number; pageSize?: number }\n): Promise<{ session: AgentSession; messages: AgentMessage[] } | null> {\n try {\n const [sessionResponse, messagesResponse] = await Promise.all([\n sessionService.get(sessionId),\n sessionService.getMessages(sessionId, messageParams),\n ]);\n\n if (sessionResponse.success && sessionResponse.data) {\n return {\n session: sessionResponse.data,\n messages: messagesResponse.success && messagesResponse.data ? messagesResponse.data.list : [],\n };\n }\n return null;\n } catch (error) {\n console.error('Failed to get session with messages:', error);\n return null;\n }\n}\n\n/**\n * 确认所有待确认的工具调用\n */\nexport async function confirmAllPendingToolCalls(\n toolCallIds: string[]\n): Promise<{ success: boolean; failedIds: string[] }> {\n const failedIds: string[] = [];\n\n for (const toolCallId of toolCallIds) {\n try {\n const response = await toolCallService.confirm({\n toolCallId,\n approved: true,\n });\n if (!response.success) {\n failedIds.push(toolCallId);\n }\n } catch {\n failedIds.push(toolCallId);\n }\n }\n\n return {\n success: failedIds.length === 0,\n failedIds,\n };\n}\n\n/**\n * 拒绝所有待确认的工具调用\n */\nexport async function rejectAllPendingToolCalls(\n toolCallIds: string[],\n reason?: string\n): Promise<{ success: boolean; failedIds: string[] }> {\n const failedIds: string[] = [];\n\n for (const toolCallId of toolCallIds) {\n try {\n const response = await toolCallService.confirm({\n toolCallId,\n approved: false,\n rejectReason: reason,\n });\n if (!response.success) {\n failedIds.push(toolCallId);\n }\n } catch {\n failedIds.push(toolCallId);\n }\n }\n\n return {\n success: failedIds.length === 0,\n failedIds,\n };\n}\n\n// ============ LLM 服务 ============\n\n/** OpenAI 风格的 Chat Completion 请求 */\ninterface ChatCompletionRequest {\n model?: string;\n messages: Array<{\n role: 'system' | 'user' | 'assistant';\n content: string;\n }>;\n stream?: boolean;\n temperature?: number;\n max_tokens?: number;\n}\n\n/** OpenAI 风格的 Chat Completion 响应 */\ninterface ChatCompletionResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: string;\n content: string;\n };\n finish_reason: string;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\nexport const llmService = {\n /**\n * 调用 LLM Chat Completions 接口(OpenAI 风格)\n */\n chatCompletions: async (request: ChatCompletionRequest): Promise<ChatCompletionResponse> => {\n const csrfToken = Cookies.get('X-Csrf-Token') || '';\n\n const response = await fetch('/api/agent/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Csrf-Token': csrfToken,\n },\n body: JSON.stringify({\n ...request,\n stream: false, // 强制使用同步模式\n }),\n credentials: 'include',\n });\n\n if (!response.ok) {\n throw new Error(`LLM API error: ${response.status}`);\n }\n\n return response.json();\n },\n};\n\n// ============ Plan 总结检测服务 ============\n\n/**\n * 检测总结是否是机械化的模板格式\n * 用于前端决定是否显示\"智能总结\"标识\n * @param summary 总结内容\n * @returns 是否为机械化总结\n */\nexport function isMechanicalSummary(summary: string): boolean {\n if (!summary) return true;\n\n // 检测机械化总结的特征\n const mechanicalPatterns = [\n /^## 执行总结\\s*\\n\\n\\*\\*计划\\*\\*:/m, // 固定的模板格式\n /\\*\\*步骤 \\d+\\*\\*:.*\\n- 状态: (COMPLETED|FAILED|PENDING)/m, // 机械化的步骤罗列\n /\\*\\*状态\\*\\*: (COMPLETED|CANCELLED|PAUSED)/m, // 状态直接显示枚举值\n /\\*\\*完成步骤\\*\\*: \\d+\\/\\d+/m, // 机械化的进度显示\n ];\n\n // 如果匹配 2 个或以上的机械化模式,认为是机械化总结\n let matchCount = 0;\n for (const pattern of mechanicalPatterns) {\n if (pattern.test(summary)) {\n matchCount++;\n }\n }\n\n return matchCount >= 2;\n}\n\n/**\n * 根据对话内容生成会话标题\n * @param userMessage 用户的第一条消息\n * @param assistantMessage AI 的回复(可选)\n * @returns 生成的标题\n */\nexport async function generateSessionTitle(\n userMessage: string,\n assistantMessage?: string\n): Promise<string> {\n try {\n const messages: ChatCompletionRequest['messages'] = [\n {\n role: 'system',\n content: '你是一个标题生成助手。根据用户的问题生成一个简短的对话标题(不超过20个字符),直接输出标题内容,不要有任何额外的解释或标点符号。',\n },\n {\n role: 'user',\n content: `用户问题:${userMessage.slice(0, 500)}${assistantMessage ? `\\n\\nAI回复摘要:${assistantMessage.slice(0, 200)}` : ''}`,\n },\n ];\n\n const response = await llmService.chatCompletions({\n messages,\n temperature: 0.7,\n max_tokens: 50,\n });\n\n const title = response.choices?.[0]?.message?.content?.trim();\n\n if (title && title.length > 0) {\n // 限制标题长度,去除可能的引号\n return title.replace(/^[\"'\"]|[\"'\"]$/g, '').slice(0, 30);\n }\n\n // 如果生成失败,使用用户消息的前20个字符作为标题\n return userMessage.slice(0, 20) + (userMessage.length > 20 ? '...' : '');\n } catch (error) {\n console.error('[generateSessionTitle] Failed to generate title:', error);\n // 降级:使用用户消息的前20个字符作为标题\n return userMessage.slice(0, 20) + (userMessage.length > 20 ? '...' : '');\n }\n}\n\n// ============ 分享服务 ============\n\nexport const shareService = {\n /**\n * 创建分享链接\n */\n create: async (data: CreateShareRequest): Promise<ApiResponse<SessionShareDTO>> => {\n return fetcher(`${API_BASE}/share`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * 获取分享信息(需登录)\n */\n get: async (shareId: string): Promise<ApiResponse<SessionShareDTO>> => {\n return fetcher(`${API_BASE}/share/${shareId}`);\n },\n\n /**\n * 更新分享设置\n */\n update: async (data: UpdateShareRequest): Promise<ApiResponse<SessionShareDTO>> => {\n return fetcher(`${API_BASE}/share`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * 删除分享链接\n */\n delete: async (shareId: string): Promise<ApiResponse<void>> => {\n return fetcher(`${API_BASE}/share/${shareId}`, {\n method: 'DELETE',\n });\n },\n\n /**\n * 获取我的分享列表\n */\n listMy: async (): Promise<ApiResponse<SessionShareDTO[]>> => {\n return fetcher(`${API_BASE}/share/my`);\n },\n\n /**\n * 获取会话的分享列表\n */\n listBySession: async (sessionId: string): Promise<ApiResponse<SessionShareDTO[]>> => {\n return fetcher(`${API_BASE}/share/session/${sessionId}`);\n },\n\n // ============ 公开接口(无需登录) ============\n\n /**\n * 获取分享内容(公开接口,用于回放)\n */\n getPublicContent: async (shareId: string, token?: string): Promise<ApiResponse<SharedSessionDTO>> => {\n const url = `${API_BASE}/share/public/${shareId}/content${token ? `?token=${encodeURIComponent(token)}` : ''}`;\n return fetcher(url);\n },\n\n /**\n * 检查是否需要密码\n */\n isPasswordRequired: async (shareId: string): Promise<ApiResponse<boolean>> => {\n return fetcher(`${API_BASE}/share/public/${shareId}/password-required`);\n },\n\n /**\n * 验证分享密码\n */\n verifyPassword: async (data: VerifySharePasswordRequest): Promise<ApiResponse<string>> => {\n return fetcher(`${API_BASE}/share/public/verify-password`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * 检查分享是否有效\n */\n isValid: async (shareId: string): Promise<ApiResponse<boolean>> => {\n return fetcher(`${API_BASE}/share/public/${shareId}/valid`);\n },\n};\n\n// ============ Plan Mode 服务 ============\n\nexport const planService = {\n /**\n * 确认/拒绝执行计划\n */\n confirm: async (planId: string, data: ConfirmPlanRequest): Promise<ApiResponse<ExecutionPlan>> => {\n return fetcher(`${API_BASE}/plans/${planId}/confirm`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * 提供人工输入\n * @param planId 计划 ID\n * @param stepId 步骤 ID\n * @param data 人工输入数据\n */\n provideHumanInput: async (planId: string, stepId: string, data: ProvideHumanInputRequest): Promise<ApiResponse<void>> => {\n return fetcher(`${API_BASE}/plans/${planId}/steps/${stepId}/human-input`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * 暂停计划执行\n */\n pause: async (planId: string): Promise<ApiResponse<void>> => {\n return fetcher(`${API_BASE}/plans/${planId}/pause`, {\n method: 'POST',\n });\n },\n\n /**\n * 恢复计划执行\n */\n resume: async (planId: string): Promise<ApiResponse<void>> => {\n return fetcher(`${API_BASE}/plans/${planId}/resume`, {\n method: 'POST',\n });\n },\n\n /**\n * 取消计划执行\n */\n cancel: async (planId: string): Promise<ApiResponse<void>> => {\n return fetcher(`${API_BASE}/plans/${planId}/cancel`, {\n method: 'POST',\n });\n },\n\n /**\n * 重试失败步骤\n * 重置失败步骤状态,从该步骤重新开始执行\n */\n retry: async (planId: string): Promise<ApiResponse<void>> => {\n return fetcher(`${API_BASE}/plans/${planId}/retry`, {\n method: 'POST',\n });\n },\n\n /**\n * 跳过失败步骤\n * 将失败步骤标记为 SKIPPED,从下一个步骤继续执行\n */\n skip: async (planId: string): Promise<ApiResponse<void>> => {\n return fetcher(`${API_BASE}/plans/${planId}/skip`, {\n method: 'POST',\n });\n },\n\n /**\n * 获取计划详情(包含完整 steps)\n */\n getDetail: async (planId: string): Promise<ApiResponse<ExecutionPlan>> => {\n return fetcher(`${API_BASE}/plans/${planId}/detail`);\n },\n\n /**\n * 获取计划执行状态(仅状态信息)\n */\n getStatus: async (planId: string): Promise<ApiResponse<PlanStatusResponse>> => {\n return fetcher(`${API_BASE}/plans/${planId}/status`);\n },\n};\n\n\n// ============ Agent-Tool ============\n\nexport const agentToolService = {\n /**\n * 获取 Agent 的工具列表\n */\n list: async (agentId: string): Promise<ApiResponse<AgentTool[]>> => {\n return fetcher(`${API_BASE}/config/agent/${agentId}/tools`);\n },\n};\n\nexport const agentSkillService = {\n /**\n * 获取 Agent 的技能列表\n */\n list: async (agentId: string): Promise<ApiResponse<AgentSkillConfig[]>> => {\n return fetcher(`${API_BASE}/skills/agent/${agentId}`);\n },\n};\n","import OSS from 'ali-oss';\nimport fetcher from '../lib/fetch';\n\nconst BASE_IMAGE_URL = '';\n\nexport function getImageUrl(fileId: string) {\n if (typeof fileId !== 'string' || fileId.trim() === '') {\n return '';\n }\n if (fileId?.startsWith('http')) {\n return fileId;\n }\n return `${BASE_IMAGE_URL}/preview/image?path=${encodeURIComponent(fileId)}`;\n}\n\nexport function getHDImageUrl(fileId: string) {\n return `${BASE_IMAGE_URL}/preview/image?path=${encodeURIComponent(fileId)}&type=HD`;\n}\n\n/**\n * 解析媒体 URL,优先使用 fileId 获取缩略图和高清图\n * @param options.fileId - 文件ID(优先使用)\n * @param options.fileUrl - 文件URL(备用)\n * @returns { url: 缩略图/预览URL, hdUrl: 高清/下载URL, isVideo: 是否为视频 }\n */\nexport function resolveMediaUrl(options: { fileId?: string; fileUrl?: string }): { \n url: string; \n hdUrl: string; \n isVideo: boolean;\n} | null {\n const { fileId, fileUrl } = options;\n \n if (!fileId && !fileUrl) return null;\n \n // 检查是否为视频\n const checkIsVideo = (url?: string) => {\n if (!url) return false;\n try {\n const urlObj = new URL(url, 'http://dummy');\n const pathname = urlObj.pathname.toLowerCase();\n return /\\.(mp4|mov|webm|avi|mkv|m4v)$/i.test(pathname);\n } catch {\n return /\\.(mp4|mov|webm|avi|mkv|m4v)(\\?|#|$)/i.test((url || '').toLowerCase());\n }\n };\n \n const isVideo = checkIsVideo(fileUrl) || checkIsVideo(fileId);\n \n // 优先使用 fileId\n if (fileId) {\n // 视频只能使用 getHDImageUrl,图片使用 getImageUrl 获取缩略图\n const url = isVideo ? getHDImageUrl(fileId) : getImageUrl(fileId);\n return {\n url,\n hdUrl: getHDImageUrl(fileId),\n isVideo,\n };\n }\n \n // 回退使用 fileUrl\n return {\n url: fileUrl!,\n hdUrl: fileUrl!,\n isVideo,\n };\n}\n\nconst UPLOAD_URL = '/getFileUploadPolicy.json';\n\nexport const getOSSClient = async (fileName: string): Promise<{ id: string; path: string; client: OSS } | null> => {\n if (!fileName) {\n return null;\n }\n // 步骤1:获取上传策略和临时凭证\n const policyResponse = await fetcher(`${UPLOAD_URL}?fileName=${fileName}`, {\n method: 'GET',\n });\n\n if (!policyResponse.success || !policyResponse.data) {\n throw new Error('获取上传凭证失败');\n }\n\n // 提取STS凭证和上传信息\n\n const { id, key: path, accessKeyId, accessKeySecret, bucket, host, securitytoken } = policyResponse.data;\n\n return {\n id,\n path,\n client: new OSS({\n accessKeyId,\n accessKeySecret,\n bucket,\n endpoint: host,\n stsToken: securitytoken,\n }),\n };\n};\n\nexport const uploadOSS = async (file: File, onProgress?: (p: any) => void) => {\n const fileName = file.name;\n const res = await getOSSClient(fileName);\n const { path: fileId, path, client } = res as { id: string; path: string; client: OSS };\n await client.multipartUpload(path, file, {\n progress: (p: number) => {\n onProgress?.({\n percent: p * 100,\n });\n },\n });\n\n return {\n name: file.name,\n id: fileId,\n key: path,\n };\n};\n\nexport const getFileUrl = async (fileId: string) => {\n const res = await fetcher(`${BASE_IMAGE_URL}/getFileUrl?path=${fileId}`, {\n method: 'GET',\n });\n if (res.data) {\n return res.data;\n }\n return '';\n};\n\nexport const embedding = async (imagePath: string) => {\n const res = await fetcher(`${BASE_IMAGE_URL}/api/v1/sam/embedding`, {\n method: 'POST',\n body: JSON.stringify({\n imagePath: imagePath,\n }),\n });\n return res.data;\n};\n","/**\n * 提示词模板服务\n * 封装所有模板相关的 API 调用\n */\n\nimport fetcher from '../lib/fetch';\nimport type {\n PromptTemplate,\n PromptTemplateWithArrayVars,\n CreateTemplateRequest,\n UpdateTemplateRequest,\n TemplateListParams,\n IncrementUsageRequest,\n ApiResponse,\n PaginationParams,\n PaginatedResponse,\n} from '../types/agent';\nimport type {\n VariableDefinitionArray,\n} from '../types/template';\n\n// ============ API 基础路径 ============\nconst API_BASE = '/api/agent/v1/templates';\n\nexport const templateService = {\n /**\n * 获取模板列表(分页)\n */\n list: async (params?: TemplateListParams): Promise<ApiResponse<PaginatedResponse<PromptTemplateWithArrayVars>>> => {\n const searchParams = new URLSearchParams();\n if (params?.scope) searchParams.set('scope', params.scope);\n if (params?.category) searchParams.set('category', params.category);\n if (params?.keyword) searchParams.set('keyword', params.keyword);\n searchParams.set('pageNo', String(params?.pageNo || 1));\n searchParams.set('pageSize', String(params?.pageSize || 20));\n\n const queryString = searchParams.toString();\n return fetcher(`${API_BASE}/list${queryString ? `?${queryString}` : ''}`);\n },\n\n /**\n * 获取模板详情\n */\n get: async (publicId: string): Promise<ApiResponse<PromptTemplateWithArrayVars>> => {\n return fetcher(`${API_BASE}/${publicId}`);\n },\n\n /**\n * 创建模板\n */\n create: async (data: CreateTemplateRequest): Promise<ApiResponse<PromptTemplateWithArrayVars>> => {\n return fetcher(API_BASE, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * 更新模板\n */\n update: async (data: UpdateTemplateRequest): Promise<ApiResponse<PromptTemplateWithArrayVars>> => {\n return fetcher(`${API_BASE}/${data.publicId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * 删除模板\n */\n delete: async (publicId: string): Promise<ApiResponse<void>> => {\n return fetcher(`${API_BASE}/${publicId}`, {\n method: 'DELETE',\n });\n },\n\n /**\n * 增加使用次数\n */\n incrementUsage: async (data: IncrementUsageRequest): Promise<ApiResponse<void>> => {\n return fetcher(`${API_BASE}/${data.publicId}/usage`, {\n method: 'POST',\n });\n },\n\n /**\n * 获取最近使用的模板\n */\n getRecent: async (limit: number = 10): Promise<ApiResponse<PromptTemplateWithArrayVars[]>> => {\n return fetcher(`${API_BASE}/recent?limit=${limit}`);\n },\n\n /**\n * 获取我的模板\n */\n getMine: async (params?: PaginationParams): Promise<ApiResponse<PaginatedResponse<PromptTemplateWithArrayVars>>> => {\n const searchParams = new URLSearchParams();\n searchParams.set('scope', 'MINE');\n if (params?.pageNo) searchParams.set('pageNo', String(params.pageNo));\n if (params?.pageSize) searchParams.set('pageSize', String(params.pageSize));\n\n return fetcher(`${API_BASE}/list?${searchParams.toString()}`);\n },\n\n /**\n * 获取公开模板\n */\n getPublic: async (params?: PaginationParams): Promise<ApiResponse<PaginatedResponse<PromptTemplateWithArrayVars>>> => {\n const searchParams = new URLSearchParams();\n searchParams.set('scope', 'PUBLIC');\n if (params?.pageNo) searchParams.set('pageNo', String(params.pageNo));\n if (params?.pageSize) searchParams.set('pageSize', String(params.pageSize));\n\n return fetcher(`${API_BASE}/list?${searchParams.toString()}`);\n },\n};\n","/**\n * Agent SDK 状态管理 Store\n * 使用 zustand 管理 Agent 系统的全局状态\n */\n\nimport { create } from 'zustand';\nimport { devtools } from 'zustand/middleware';\nimport type {\n AgentSession,\n AgentMessage,\n AgentThought,\n ToolCall,\n FrontendToolCall,\n AgentComponentInstance,\n SubAgentInfo,\n ChatUIState,\n ExecutionPlan,\n PlanStep,\n AgentTool,\n AgentSkillConfig,\n} from '../types/agent';\n\n// ============ Store 状态类型 ============\n\ninterface AgentState {\n // 会话管理\n sessions: AgentSession[];\n currentSession: AgentSession | null;\n sessionsLoading: boolean;\n\n // 消息管理\n messages: AgentMessage[];\n\n // 对话 UI 状态\n chatUI: ChatUIState;\n\n // Multi-Agent 子 Agent 状态\n subAgents: SubAgentInfo[];\n\n // 绑定的 tools\n tools: AgentTool[];\n\n // 绑定的 skills\n skills: AgentSkillConfig[];\n showItemTime: boolean;\n\n // ============ Session Actions ============\n setSessions: (sessions: AgentSession[]) => void;\n addSession: (session: AgentSession) => void;\n updateSession: (sessionId: string, updates: Partial<AgentSession>) => void;\n removeSession: (sessionId: string) => void;\n setCurrentSession: (session: AgentSession | null) => void;\n setSessionsLoading: (loading: boolean) => void;\n\n // ============ Message Actions ============\n setMessages: (messages: AgentMessage[]) => void;\n addMessage: (message: AgentMessage) => void;\n updateMessage: (messageId: string, updates: Partial<AgentMessage>) => void;\n removeMessage: (messageId: string) => void;\n clearMessages: () => void;\n\n setTools: (tools: AgentTool[]) => void;\n setSkills: (skills: AgentSkillConfig[]) => void;\n setShowItemTime: (showItemTime: boolean) => void;\n\n // ============ Chat UI Actions ============\n setIsThinking: (isThinking: boolean) => void;\n setIsStreaming: (isStreaming: boolean, sessionId?: string | null) => void;\n appendStreamingContent: (content: string) => void;\n setStreamingContent: (content: string) => void;\n clearStreamingContent: () => void;\n\n // 思考过程\n addThought: (thought: AgentThought) => void;\n updateThought: (thoughtId: string, updates: Partial<AgentThought>) => void;\n clearThoughts: () => void;\n\n // 工具确认\n addPendingToolCall: (toolCall: ToolCall) => void;\n updatePendingToolCall: (toolCallId: string, updates: Partial<ToolCall>) => void;\n removePendingToolCall: (toolCallId: string) => void;\n clearPendingToolCalls: () => void;\n\n // 前端工具调用\n addPendingFrontendToolCall: (toolCall: FrontendToolCall) => void;\n updatePendingFrontendToolCall: (toolCallId: string, updates: Partial<FrontendToolCall>) => void;\n removePendingFrontendToolCall: (toolCallId: string) => void;\n clearPendingFrontendToolCalls: () => void;\n\n // 组件\n addPendingComponent: (component: AgentComponentInstance) => void;\n updatePendingComponent: (componentId: string, updates: Partial<AgentComponentInstance>) => void;\n removePendingComponent: (componentId: string) => void;\n clearPendingComponents: () => void;\n\n // 错误处理\n setChatError: (error: string | undefined) => void;\n\n // ============ Plan Mode Actions ============\n setCurrentPlan: (plan: ExecutionPlan | null) => void;\n setShowPlanConfirmDialog: (show: boolean) => void;\n setShowHumanInputDialog: (show: boolean) => void;\n setWaitingStepId: (stepId: string | null) => void;\n clearPlanState: () => void;\n\n // ============ Multi-Agent Actions ============\n setSubAgents: (subAgents: SubAgentInfo[]) => void;\n updateSubAgent: (agentId: string, updates: Partial<SubAgentInfo>) => void;\n setActiveSubAgent: (subAgent: SubAgentInfo | undefined) => void;\n\n // ============ 复合操作 ============\n // 开始新对话\n startNewChat: (sessionId: string) => void;\n // 重置对话状态\n resetChatState: () => void;\n}\n\n// ============ 初始状态 ============\n\nconst initialChatUIState: ChatUIState = {\n isThinking: false,\n isStreaming: false,\n streamingSessionId: null, // 追踪正在流式输出的 session,实现 session 级别隔离\n streamingContent: '',\n currentThoughts: [],\n currentThoughtsSessionId: null, // 追踪 currentThoughts 关联的 session\n pendingToolCalls: [],\n pendingToolCallsSessionId: null, // 追踪 pendingToolCalls 关联的 session\n pendingFrontendToolCalls: [],\n pendingFrontendToolCallsSessionId: null,\n pendingComponents: [],\n pendingComponentsSessionId: null,\n activeSubAgent: undefined,\n error: undefined,\n // Plan Mode 状态\n currentPlan: null,\n showPlanConfirmDialog: false,\n showHumanInputDialog: false,\n waitingStepId: null,\n};\n\n// ============ Store 实现 ============\n\nexport const useAgentStore = create<AgentState>()(\n devtools(\n (set, get) => ({\n // 初始状态\n sessions: [],\n currentSession: null,\n sessionsLoading: false,\n messages: [],\n chatUI: initialChatUIState,\n subAgents: [],\n tools: [],\n skills: [],\n\n // ============ Session Actions ============\n setSessions: (sessions) => set({ sessions }, false, 'setSessions'),\n setTools: (tools) => set({ tools }, false, 'setTools'),\n setSkills: (skills) => set({ skills }, false, 'setSkills'),\n setShowItemTime: (showItemTime) => set({ showItemTime }, false, 'setShowItemTime'),\n\n addSession: (session) => set(\n (state) => ({ sessions: [session, ...state.sessions] }),\n false,\n 'addSession'\n ),\n\n updateSession: (sessionId, updates) => set(\n (state) => ({\n sessions: state.sessions.map((s) =>\n s.sessionId === sessionId ? { ...s, ...updates } : s\n ),\n currentSession:\n state.currentSession?.sessionId === sessionId\n ? { ...state.currentSession, ...updates }\n : state.currentSession,\n }),\n false,\n 'updateSession'\n ),\n\n removeSession: (sessionId) => set(\n (state) => ({\n sessions: state.sessions.filter((s) => s.sessionId !== sessionId),\n currentSession:\n state.currentSession?.sessionId === sessionId ? null : state.currentSession,\n }),\n false,\n 'removeSession'\n ),\n\n setCurrentSession: (session) => set(\n { currentSession: session, messages: session?.messages || [] },\n false,\n 'setCurrentSession'\n ),\n\n setSessionsLoading: (loading) => set({ sessionsLoading: loading }, false, 'setSessionsLoading'),\n\n // ============ Message Actions ============\n setMessages: (messages) => set({ messages }, false, 'setMessages'),\n\n addMessage: (message) => set(\n (state) => ({ messages: [...state.messages, message] }),\n false,\n 'addMessage'\n ),\n\n updateMessage: (messageId, updates) => set(\n (state) => ({\n messages: state.messages.map((m) =>\n m.messageId === messageId ? { ...m, ...updates } : m\n ),\n }),\n false,\n 'updateMessage'\n ),\n\n removeMessage: (messageId) => set(\n (state) => ({\n messages: state.messages.filter((m) => m.messageId !== messageId),\n }),\n false,\n 'removeMessage'\n ),\n\n clearMessages: () => set({ messages: [] }, false, 'clearMessages'),\n\n // ============ Chat UI Actions ============\n setIsThinking: (isThinking) => set(\n (state) => ({ chatUI: { ...state.chatUI, isThinking } }),\n false,\n 'setIsThinking'\n ),\n\n setIsStreaming: (isStreaming, sessionId) => set(\n (state) => ({\n chatUI: {\n ...state.chatUI,\n isStreaming,\n // 开始流式时记录 sessionId,结束时清空\n streamingSessionId: isStreaming ? (sessionId ?? state.currentSession?.sessionId ?? null) : null,\n }\n }),\n false,\n 'setIsStreaming'\n ),\n\n appendStreamingContent: (content) => set(\n (state) => ({\n chatUI: {\n ...state.chatUI,\n streamingContent: state.chatUI.streamingContent + content,\n },\n }),\n false,\n 'appendStreamingContent'\n ),\n\n setStreamingContent: (content) => set(\n (state) => ({ chatUI: { ...state.chatUI, streamingContent: content } }),\n false,\n 'setStreamingContent'\n ),\n\n clearStreamingContent: () => set(\n (state) => ({ chatUI: { ...state.chatUI, streamingContent: '' } }),\n false,\n 'clearStreamingContent'\n ),\n\n // 思考过程\n addThought: (thought) => set(\n (state) => ({\n chatUI: {\n ...state.chatUI,\n currentThoughts: [...state.chatUI.currentThoughts, thought],\n // 自动关联当前流式输出的 sessionId\n currentThoughtsSessionId: state.chatUI.streamingSessionId ?? state.chatUI.currentThoughtsSessionId,\n },\n }),\n false,\n 'addThought'\n ),\n\n updateThought: (thoughtId, updates) => set(\n (state) => ({\n chatUI: {\n ...state.chatUI,\n currentThoughts: state.chatUI.currentThoughts.map((t) =>\n t.id === thoughtId ? { ...t, ...updates } : t\n ),\n },\n }),\n false,\n 'updateThought'\n ),\n\n clearThoughts: () => set(\n (state) => ({ chatUI: { ...state.chatUI, currentThoughts: [], currentThoughtsSessionId: null } }),\n false,\n 'clearThoughts'\n ),\n\n // 工具确认\n addPendingToolCall: (toolCall) => set(\n (state) => {\n // 检查是否已存在相同 ID 的记录,避免重复添加\n const exists = state.chatUI.pendingToolCalls.some(tc => tc.id === toolCall.id);\n // 自动关联当前流式输出的 sessionId\n const sessionId = state.chatUI.streamingSessionId ?? state.chatUI.pendingToolCallsSessionId;\n\n if (exists) {\n // 如果已存在,更新而不是添加\n console.log('[Store] addPendingToolCall: 已存在相同 ID,更新状态', toolCall.id, toolCall.status);\n return {\n chatUI: {\n ...state.chatUI,\n pendingToolCalls: state.chatUI.pendingToolCalls.map(tc =>\n tc.id === toolCall.id ? { ...tc, ...toolCall } : tc\n ),\n pendingToolCallsSessionId: sessionId,\n },\n };\n }\n // 不存在,正常添加\n console.log('[Store] addPendingToolCall: 添加新记录', toolCall.id, toolCall.status);\n return {\n chatUI: {\n ...state.chatUI,\n pendingToolCalls: [...state.chatUI.pendingToolCalls, toolCall],\n pendingToolCallsSessionId: sessionId,\n },\n };\n },\n false,\n 'addPendingToolCall'\n ),\n\n updatePendingToolCall: (toolCallId, updates) => set(\n (state) => ({\n chatUI: {\n ...state.chatUI,\n pendingToolCalls: state.chatUI.pendingToolCalls.map((tc) =>\n tc.id === toolCallId ? { ...tc, ...updates } : tc\n ),\n },\n }),\n false,\n 'updatePendingToolCall'\n ),\n\n removePendingToolCall: (toolCallId) => set(\n (state) => ({\n chatUI: {\n ...state.chatUI,\n pendingToolCalls: state.chatUI.pendingToolCalls.filter(\n (tc) => tc.id !== toolCallId\n ),\n },\n }),\n false,\n 'removePendingToolCall'\n ),\n\n clearPendingToolCalls: () => set(\n (state) => ({ chatUI: { ...state.chatUI, pendingToolCalls: [], pendingToolCallsSessionId: null } }),\n false,\n 'clearPendingToolCalls'\n ),\n\n // 前端工具调用\n addPendingFrontendToolCall: (toolCall) => set(\n (state) => {\n const exists = state.chatUI.pendingFrontendToolCalls.some(tc => tc.id === toolCall.id);\n const sessionId = state.chatUI.streamingSessionId ?? state.chatUI.pendingFrontendToolCallsSessionId;\n\n if (exists) {\n return {\n chatUI: {\n ...state.chatUI,\n pendingFrontendToolCalls: state.chatUI.pendingFrontendToolCalls.map(tc =>\n tc.id === toolCall.id ? { ...tc, ...toolCall } : tc\n ),\n pendingFrontendToolCallsSessionId: sessionId,\n },\n };\n }\n\n return {\n chatUI: {\n ...state.chatUI,\n pendingFrontendToolCalls: [...state.chatUI.pendingFrontendToolCalls, toolCall],\n pendingFrontendToolCallsSessionId: sessionId,\n },\n };\n },\n false,\n 'addPendingFrontendToolCall'\n ),\n\n updatePendingFrontendToolCall: (toolCallId, updates) => set(\n (state) => ({\n chatUI: {\n ...state.chatUI,\n pendingFrontendToolCalls: state.chatUI.pendingFrontendToolCalls.map((tc) =>\n tc.id === toolCallId ? { ...tc, ...updates } : tc\n ),\n },\n }),\n false,\n 'updatePendingFrontendToolCall'\n ),\n\n removePendingFrontendToolCall: (toolCallId) => set(\n (state) => ({\n chatUI: {\n ...state.chatUI,\n pendingFrontendToolCalls: state.chatUI.pendingFrontendToolCalls.filter(\n (tc) => tc.id !== toolCallId\n ),\n },\n }),\n false,\n 'removePendingFrontendToolCall'\n ),\n\n clearPendingFrontendToolCalls: () => set(\n (state) => ({\n chatUI: {\n ...state.chatUI,\n pendingFrontendToolCalls: [],\n pendingFrontendToolCallsSessionId: null,\n }\n }),\n false,\n 'clearPendingFrontendToolCalls'\n ),\n\n // 组件\n addPendingComponent: (component) => set(\n (state) => {\n const exists = state.chatUI.pendingComponents.some(c => c.id === component.id);\n const sessionId = state.chatUI.streamingSessionId ?? state.chatUI.pendingComponentsSessionId;\n\n if (exists) {\n return {\n chatUI: {\n ...state.chatUI,\n pendingComponents: state.chatUI.pendingComponents.map(c =>\n c.id === component.id ? { ...c, ...component } : c\n ),\n pendingComponentsSessionId: sessionId,\n },\n };\n }\n\n return {\n chatUI: {\n ...state.chatUI,\n pendingComponents: [...state.chatUI.pendingComponents, component],\n pendingComponentsSessionId: sessionId,\n },\n };\n },\n false,\n 'addPendingComponent'\n ),\n\n updatePendingComponent: (componentId, updates) => set(\n (state) => ({\n chatUI: {\n ...state.chatUI,\n pendingComponents: state.chatUI.pendingComponents.map((c) =>\n c.id === componentId ? { ...c, ...updates } : c\n ),\n },\n }),\n false,\n 'updatePendingComponent'\n ),\n\n removePendingComponent: (componentId) => set(\n (state) => ({\n chatUI: {\n ...state.chatUI,\n pendingComponents: state.chatUI.pendingComponents.filter(\n (c) => c.id !== componentId\n ),\n },\n }),\n false,\n 'removePendingComponent'\n ),\n\n clearPendingComponents: () => set(\n (state) => ({\n chatUI: {\n ...state.chatUI,\n pendingComponents: [],\n pendingComponentsSessionId: null,\n }\n }),\n false,\n 'clearPendingComponents'\n ),\n\n // 错误处理\n setChatError: (error) => set(\n (state) => ({ chatUI: { ...state.chatUI, error } }),\n false,\n 'setChatError'\n ),\n\n // ============ Plan Mode Actions ============\n setCurrentPlan: (plan) => set(\n (state) => ({ chatUI: { ...state.chatUI, currentPlan: plan } }),\n false,\n 'setCurrentPlan'\n ),\n\n setShowPlanConfirmDialog: (show) => set(\n (state) => ({ chatUI: { ...state.chatUI, showPlanConfirmDialog: show } }),\n false,\n 'setShowPlanConfirmDialog'\n ),\n\n setShowHumanInputDialog: (show) => set(\n (state) => ({ chatUI: { ...state.chatUI, showHumanInputDialog: show } }),\n false,\n 'setShowHumanInputDialog'\n ),\n\n setWaitingStepId: (stepId) => set(\n (state) => ({ chatUI: { ...state.chatUI, waitingStepId: stepId } }),\n false,\n 'setWaitingStepId'\n ),\n\n clearPlanState: () => set(\n (state) => ({\n chatUI: {\n ...state.chatUI,\n currentPlan: null,\n showPlanConfirmDialog: false,\n showHumanInputDialog: false,\n waitingStepId: null,\n },\n }),\n false,\n 'clearPlanState'\n ),\n\n // ============ Multi-Agent Actions ============\n setSubAgents: (subAgents) => set({ subAgents }, false, 'setSubAgents'),\n\n updateSubAgent: (agentId, updates) => set(\n (state) => ({\n subAgents: state.subAgents.map((sa) =>\n sa.agentId === agentId ? { ...sa, ...updates } : sa\n ),\n }),\n false,\n 'updateSubAgent'\n ),\n\n setActiveSubAgent: (subAgent) => set(\n (state) => ({ chatUI: { ...state.chatUI, activeSubAgent: subAgent } }),\n false,\n 'setActiveSubAgent'\n ),\n\n // ============ 复合操作 ============\n startNewChat: (sessionId) => {\n set(\n (state) => ({\n messages: [],\n chatUI: initialChatUIState,\n }),\n false,\n 'startNewChat'\n );\n },\n\n resetChatState: () => set(\n { chatUI: initialChatUIState },\n false,\n 'resetChatState'\n ),\n }),\n { name: 'agent-store' }\n )\n);\n\n// ============ 选择器 Hooks ============\n\n/** 获取当前思考过程 */\nexport const useCurrentThoughts = () => useAgentStore((state) => state.chatUI.currentThoughts);\n\n/** 获取待确认的工具调用 */\nexport const usePendingToolCalls = () => useAgentStore((state) => state.chatUI.pendingToolCalls);\n\n/** 获取 pendingToolCalls 关联的 sessionId */\nexport const usePendingToolCallsSessionId = () => useAgentStore((state) => state.chatUI.pendingToolCallsSessionId);\n\n/** 获取待处理的前端工具调用 */\nexport const usePendingFrontendToolCalls = () => useAgentStore((state) => state.chatUI.pendingFrontendToolCalls);\n\n/** 获取 pendingFrontendToolCalls 关联的 sessionId */\nexport const usePendingFrontendToolCallsSessionId = () => useAgentStore((state) => state.chatUI.pendingFrontendToolCallsSessionId);\n\n/** 获取待处理的组件 */\nexport const usePendingComponents = () => useAgentStore((state) => state.chatUI.pendingComponents);\n\n/** 获取 pendingComponents 关联的 sessionId */\nexport const usePendingComponentsSessionId = () => useAgentStore((state) => state.chatUI.pendingComponentsSessionId);\n\n/** 获取 currentThoughts 关联的 sessionId */\nexport const useCurrentThoughtsSessionId = () => useAgentStore((state) => state.chatUI.currentThoughtsSessionId);\n\n/** 获取是否正在思考 */\nexport const useIsThinking = () => useAgentStore((state) => state.chatUI.isThinking);\n\n/** 获取是否正在流式输出 */\nexport const useIsStreaming = () => useAgentStore((state) => state.chatUI.isStreaming);\n\n/** 获取正在流式输出的 session ID */\nexport const useStreamingSessionId = () => useAgentStore((state) => state.chatUI.streamingSessionId);\n\n/** 获取流式内容 */\nexport const useStreamingContent = () => useAgentStore((state) => state.chatUI.streamingContent);\n\n/** 获取当前活跃的子 Agent (Multi-Agent) */\nexport const useActiveSubAgent = () => useAgentStore((state) => state.chatUI.activeSubAgent);\n\n/** 获取聊天错误信息 */\nexport const useChatError = () => useAgentStore((state) => state.chatUI.error);\n\n/** 获取所有消息 */\nexport const useMessages = () => useAgentStore((state) => state.messages);\n\n/** 获取当前会话 */\nexport const useCurrentSession = () => useAgentStore((state) => state.currentSession);\n\n/** 获取会话列表 */\nexport const useSessions = () => useAgentStore((state) => state.sessions);\n\n/** 获取子 Agent 列表 */\nexport const useSubAgents = () => useAgentStore((state) => state.subAgents);\n\n/** 获取完整的 ChatUI 状态 */\nexport const useChatUI = () => useAgentStore((state) => state.chatUI);\n\n/** 获取加载状态 */\nexport const useSessionsLoading = () => useAgentStore((state) => state.sessionsLoading);\n\n// ============ 工具函数 ============\n\n/** 根据 messageId 查找消息 */\nexport const findMessageById = (messageId: string): AgentMessage | undefined => {\n return useAgentStore.getState().messages.find(m => m.messageId === messageId);\n};\n\n/** 根据 sessionId 查找会话 */\nexport const findSessionById = (sessionId: string): AgentSession | undefined => {\n return useAgentStore.getState().sessions.find(s => s.sessionId === sessionId);\n};\n\n/** 获取当前会话的所有消息 */\nexport const getCurrentSessionMessages = (): AgentMessage[] => {\n const { currentSession, messages } = useAgentStore.getState();\n if (!currentSession) return [];\n return messages.filter(m => m.sessionId === currentSession.sessionId);\n};\n\n/** 检查是否有待确认的工具调用 */\nexport const hasPendingToolCalls = (): boolean => {\n return useAgentStore.getState().chatUI.pendingToolCalls.length > 0;\n};\n\n/** 检查是否正在进行对话 */\nexport const isConversationActive = (): boolean => {\n const { isThinking, isStreaming } = useAgentStore.getState().chatUI;\n return isThinking || isStreaming;\n};\n\n/** 获取指定 session 的 pendingToolCalls(用于 session 级别隔离) */\nexport const getSessionPendingToolCalls = (sessionId: string | null): ToolCall[] => {\n const { pendingToolCalls, pendingToolCallsSessionId } = useAgentStore.getState().chatUI;\n // 如果没有指定 sessionId,返回空数组\n if (!sessionId) return [];\n // 如果 pendingToolCalls 关联的 sessionId 与当前 sessionId 匹配,返回全部;否则返回空\n return pendingToolCallsSessionId === sessionId ? pendingToolCalls : [];\n};\n\n/** 获取指定 session 的 currentThoughts(用于 session 级别隔离) */\nexport const getSessionCurrentThoughts = (sessionId: string | null): AgentThought[] => {\n const { currentThoughts, currentThoughtsSessionId } = useAgentStore.getState().chatUI;\n // 如果没有指定 sessionId,返回空数组\n if (!sessionId) return [];\n // 如果 currentThoughts 关联的 sessionId 与当前 sessionId 匹配,返回全部;否则返回空\n return currentThoughtsSessionId === sessionId ? currentThoughts : [];\n};\n\n/** 检查 pendingToolCalls 是否属于指定 session */\nexport const isPendingToolCallsForSession = (sessionId: string | null): boolean => {\n const { pendingToolCallsSessionId } = useAgentStore.getState().chatUI;\n return sessionId !== null && pendingToolCallsSessionId === sessionId;\n};\n","/**\n * SSE Hook - 用于处理流式消息\n *\n * 流程:\n * 1. 发送消息到 /messages/stream\n * 2. 收到 message_start 事件,获取后端生成的 messageId\n * 3. 用 messageId 调用 /messages/{messageId}/thoughts/stream\n * 4. 处理思考过程的 SSE 事件\n *\n * 健壮性优化:\n * - 心跳检测:长时间无数据时触发重连\n * - 自动重连:网络断开后自动恢复\n * - 指数退避:重连失败时递增等待时间\n */\n\nimport { useCallback, useRef, useState, useEffect } from 'react';\nimport { useAgentStore } from '../stores/agentStore';\nimport { messageService } from '../services/agent';\nimport type {\n AgentThought,\n AgentThoughtType,\n ToolCall,\n ToolCallStatus,\n AgentMessage,\n FrontendToolCall,\n FrontendToolDefinition,\n AgentComponentInstance,\n} from '../types/agent';\n\n// ============ 常量配置 ============\n\n/** SSE 心跳超时时间(毫秒)- 超过此时间无数据则触发重连 */\nconst SSE_HEARTBEAT_TIMEOUT = 45000; // 45秒,考虑到工具执行可能需要较长时间\n\n/** 最大重连次数 */\nconst MAX_RECONNECT_ATTEMPTS = 3;\n\n/** 重连基础延迟(毫秒) */\nconst RECONNECT_BASE_DELAY = 1000;\n\n// ============ 类型定义 ============\n\ninterface UseSSEOptions {\n onThought?: (thought: AgentThought) => void;\n onComplete?: (content: string) => void;\n onError?: (error: Error) => void;\n onFrontendToolCall?: (toolCalls: FrontendToolCall[], messageId?: string) => void;\n onComponentPending?: (components: AgentComponentInstance[], messageId?: string) => void;\n}\n\ninterface UseSSEReturn {\n sendMessage: (sessionId: string, content: string, options?: { frontendTools?: FrontendToolDefinition[] }) => Promise<void>;\n reconnect: (messageId: string) => Promise<void>;\n abort: () => void;\n isConnected: boolean;\n}\n\ninterface SSEParsedResult {\n event?: string;\n data?: Record<string, unknown>;\n}\n\n// ============ 工具函数 ============\n\n/**\n * 解析后端返回的 SSE 格式\n * 支持格式:\n * - \"data:event: xxx\" - 事件类型\n * - \"data: {...}\" - JSON 数据(标准格式)\n * - \"{...}\" - 裸 JSON(兼容业务层转发后无 data: 前缀的情况)\n */\nfunction parseSSELine(line: string): SSEParsedResult | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n\n // 解析 \"data:event: xxx\" 格式\n if (trimmed.startsWith('data:event:')) {\n return { event: trimmed.substring(11).trim() };\n }\n\n // 解析 \"data: {...}\" 格式\n if (trimmed.startsWith('data:')) {\n const dataStr = trimmed.substring(5).trim();\n if (dataStr) {\n try {\n return { data: JSON.parse(dataStr) };\n } catch {\n console.error('[SSE] Failed to parse JSON data:', dataStr);\n }\n }\n return null;\n }\n\n // 兼容:尝试直接解析裸 JSON(业务层转发后可能没有 data: 前缀)\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n try {\n return { data: JSON.parse(trimmed) };\n } catch {\n // 不是有效的 JSON,忽略\n }\n }\n\n return null;\n}\n\n/**\n * 生成唯一 ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * 异步获取后端完整的消息详情数据\n * 使用消息详情接口 /api/agent/v1/messages/{messageId} 获取\n * 流式数据处理完成后,接口会立即返回正确的结果,无需轮询\n *\n * 重要:合并 extraData 而不是整体替换,避免覆盖前端 SSE 收集的 thoughts/tool_calls\n */\nasync function fetchBackendExtraData(\n localMessageId: string,\n backendMessageId: string,\n updateMessage: (messageId: string, updates: Partial<AgentMessage>) => void,\n retryCount = 0\n): Promise<void> {\n const maxRetries = 3;\n const retryDelay = 500; // 500ms 延迟\n\n // 首次调用时等待一小段时间,让后端有时间处理完数据\n if (retryCount === 0) {\n await new Promise(resolve => setTimeout(resolve, 300));\n }\n\n console.log(`[SSE] Fetching message detail, messageId: ${backendMessageId}, retry: ${retryCount}`);\n\n try {\n // 使用消息详情接口获取数据\n const response = await messageService.getDetail(backendMessageId);\n\n if (!response.success || !response.data) {\n console.warn('[SSE] Failed to get message detail:', response.msg);\n // 如果失败且还有重试次数,则重试\n if (retryCount < maxRetries) {\n await new Promise(resolve => setTimeout(resolve, retryDelay));\n return fetchBackendExtraData(localMessageId, backendMessageId, updateMessage, retryCount + 1);\n }\n return;\n }\n\n const messageDetail = response.data;\n\n // 检查后端数据是否有效(有 extraData 或 content)\n const hasValidData = messageDetail.extraData || messageDetail.content;\n const hasThoughts = messageDetail.extraData?.thoughts?.length > 0;\n const hasToolCalls = messageDetail.extraData?.tool_calls?.length > 0;\n\n // 如果后端数据为空且还有重试次数,则重试(可能后端还没处理完)\n if (!hasValidData && !hasThoughts && !hasToolCalls && retryCount < maxRetries) {\n console.log('[SSE] Backend data is empty, retrying...');\n await new Promise(resolve => setTimeout(resolve, retryDelay));\n return fetchBackendExtraData(localMessageId, backendMessageId, updateMessage, retryCount + 1);\n }\n\n // 更新消息数据\n if (hasValidData) {\n console.log('[SSE] ✓ Fetched message detail:', {\n messageId: backendMessageId,\n content: messageDetail.content ? `${messageDetail.content.slice(0, 50)}...` : 'empty',\n thoughts: messageDetail.extraData?.thoughts?.length || 0,\n toolCalls: messageDetail.extraData?.tool_calls?.length || 0,\n });\n\n // 获取当前消息的 extraData,用于合并\n const currentMessages = useAgentStore.getState().messages;\n const currentMessage = currentMessages.find(m => m.messageId === localMessageId);\n const currentExtraData = (currentMessage as any)?.extraData || {};\n const currentContent = currentMessage?.content;\n\n console.log('[SSE] fetchBackendExtraData - 合并前数据:', {\n currentThoughts: currentExtraData.thoughts?.length || 0,\n currentToolCalls: currentExtraData.tool_calls?.length || 0,\n currentPlan: currentExtraData.plan ? `${currentExtraData.plan.publicId} (${currentExtraData.plan.steps?.length || 0} steps)` : 'none',\n currentContent: currentContent ? `${currentContent.slice(0, 30)}...` : 'empty',\n backendThoughts: messageDetail.extraData?.thoughts?.length || 0,\n backendToolCalls: messageDetail.extraData?.tool_calls?.length || 0,\n backendPlan: messageDetail.extraData?.plan ? `${messageDetail.extraData.plan.publicId}` : 'none',\n backendContent: messageDetail.content ? `${messageDetail.content.slice(0, 30)}...` : 'empty',\n });\n\n // 合并 extraData,而不是整体替换\n // 优先级:后端数据 > 前端 SSE 收集的数据(但只有后端数据非空时才覆盖)\n const backendThoughts = messageDetail.extraData?.thoughts;\n const backendToolCalls = messageDetail.extraData?.tool_calls;\n const backendPlan = messageDetail.extraData?.plan;\n\n const mergedExtraData = {\n ...currentExtraData,\n ...messageDetail.extraData,\n // 特殊处理 thoughts:如果后端有数据则使用后端的,否则保留前端收集的\n thoughts: (backendThoughts && backendThoughts.length > 0)\n ? backendThoughts\n : currentExtraData.thoughts,\n // 特殊处理 tool_calls:同上\n tool_calls: (backendToolCalls && backendToolCalls.length > 0)\n ? backendToolCalls\n : currentExtraData.tool_calls,\n // 特殊处理 plan:如果后端有 plan,合并但保留前端的 steps(后端可能只返回简化版本)\n plan: backendPlan ? {\n ...currentExtraData.plan,\n ...backendPlan,\n // 保留前端收集的完整 steps(后端可能只返回 summary)\n steps: currentExtraData.plan?.steps || backendPlan.steps || [],\n } : currentExtraData.plan,\n };\n\n // 构建更新对象,只包含有效字段(避免 undefined 覆盖原有值)\n const updates: Partial<AgentMessage> = {\n extraData: mergedExtraData,\n };\n\n // 只有后端返回了有效内容才更新 content(避免空字符串或 undefined 覆盖)\n if (messageDetail.content && messageDetail.content.trim() !== '') {\n updates.content = messageDetail.content;\n }\n\n console.log('[SSE] fetchBackendExtraData - 合并后数据:', {\n mergedThoughts: mergedExtraData.thoughts?.length || 0,\n mergedToolCalls: mergedExtraData.tool_calls?.length || 0,\n mergedPlan: mergedExtraData.plan ? `${mergedExtraData.plan.publicId} (${mergedExtraData.plan.steps?.length || 0} steps)` : 'none',\n willUpdateContent: !!updates.content,\n });\n\n updateMessage(localMessageId, updates);\n }\n } catch (error) {\n console.warn('[SSE] Failed to fetch message detail:', error);\n // 如果出错且还有重试次数,则重试\n if (retryCount < maxRetries) {\n await new Promise(resolve => setTimeout(resolve, retryDelay));\n return fetchBackendExtraData(localMessageId, backendMessageId, updateMessage, retryCount + 1);\n }\n }\n}\n\n/**\n * 创建 SSE 流读取器\n */\nfunction createStreamReader(response: Response) {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n return {\n async *readLines(): AsyncGenerator<string> {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n yield line;\n }\n }\n\n // 处理剩余的 buffer\n if (buffer.trim()) {\n yield buffer;\n }\n } finally {\n reader.releaseLock();\n }\n },\n\n cancel() {\n reader.cancel();\n reader.releaseLock();\n },\n };\n}\n\nexport function useSSE(options?: UseSSEOptions): UseSSEReturn {\n const abortControllerRef = useRef<AbortController | null>(null);\n const currentMessageIdRef = useRef<string | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n\n // 心跳检测和重连相关 refs\n const heartbeatTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const reconnectAttemptsRef = useRef(0);\n const lastActivityTimeRef = useRef<number>(Date.now());\n const isReconnectingRef = useRef(false);\n const currentSessionIdRef = useRef<string | null>(null);\n const currentLocalMessageIdRef = useRef<string | null>(null);\n\n const {\n addMessage,\n updateMessage,\n addThought,\n setIsThinking,\n setIsStreaming,\n clearStreamingContent,\n appendStreamingContent,\n clearThoughts,\n addPendingToolCall,\n updatePendingToolCall,\n removePendingToolCall,\n clearPendingToolCalls,\n addPendingFrontendToolCall,\n updatePendingFrontendToolCall,\n removePendingFrontendToolCall,\n clearPendingFrontendToolCalls,\n addPendingComponent,\n updatePendingComponent,\n removePendingComponent,\n clearPendingComponents,\n setChatError,\n // Plan Mode actions\n setCurrentPlan,\n setShowPlanConfirmDialog,\n setShowHumanInputDialog,\n setWaitingStepId,\n clearPlanState,\n } = useAgentStore();\n\n /**\n * 清理心跳定时器\n */\n const clearHeartbeatTimeout = useCallback(() => {\n if (heartbeatTimeoutRef.current) {\n clearTimeout(heartbeatTimeoutRef.current);\n heartbeatTimeoutRef.current = null;\n }\n }, []);\n\n /**\n * 重置心跳定时器 - 收到数据时调用\n */\n const resetHeartbeatTimeout = useCallback((onTimeout: () => void) => {\n lastActivityTimeRef.current = Date.now();\n clearHeartbeatTimeout();\n\n heartbeatTimeoutRef.current = setTimeout(() => {\n console.warn(`[SSE] 心跳超时 (${SSE_HEARTBEAT_TIMEOUT}ms 无数据),触发重连...`);\n onTimeout();\n }, SSE_HEARTBEAT_TIMEOUT);\n }, [clearHeartbeatTimeout]);\n\n /**\n * 计算重连延迟(指数退避)\n */\n const getReconnectDelay = useCallback(() => {\n const attempt = reconnectAttemptsRef.current;\n // 指数退避:1s, 2s, 4s\n const delay = RECONNECT_BASE_DELAY * Math.pow(2, attempt);\n return Math.min(delay, 8000); // 最大 8 秒\n }, []);\n\n /**\n * 清理组件卸载时的定时器\n */\n useEffect(() => {\n return () => {\n clearHeartbeatTimeout();\n };\n }, [clearHeartbeatTimeout]);\n\n /**\n * 处理 final 事件 - 流式结束,保存数据并异步获取后端完整数据\n *\n * 策略:乐观更新 + 延迟同步\n * 1. 立即使用 SSE 收集的数据更新 UI(乐观更新)\n * 2. 延迟 5 秒后从后端获取完整数据(最终一致性)\n */\n const handleFinalEvent = useCallback(async (\n data: Record<string, unknown>,\n localMessageId: string\n ) => {\n setIsStreaming(false);\n setIsThinking(false);\n clearStreamingContent();\n\n // 获取当前收集的 thoughts 和 pending tool calls\n const state = useAgentStore.getState();\n const currentThoughts = state.chatUI.currentThoughts;\n const pendingToolCalls = state.chatUI.pendingToolCalls;\n\n console.log('[SSE] handleFinalEvent - 收集的数据:', {\n thoughtsCount: currentThoughts.length,\n pendingToolCallsCount: pendingToolCalls.length,\n dataContent: data.content ? `${String(data.content).slice(0, 50)}...` : 'empty',\n });\n\n // 从 thoughts 中提取 toolCalls\n const toolCallsFromThoughts = currentThoughts\n .filter(t => t.type === 'action' && t.toolCalls)\n .flatMap(t => t.toolCalls || []);\n\n // 合并 thoughts 中的 toolCalls 和 pendingToolCalls(按 id 去重,保留最新状态)\n const toolCallMap = new Map<string, ToolCall>();\n toolCallsFromThoughts.forEach(tc => toolCallMap.set(tc.id, tc));\n pendingToolCalls.forEach(tc => {\n const existing = toolCallMap.get(tc.id);\n if (existing) {\n // 合并,保留最新状态\n toolCallMap.set(tc.id, { ...existing, ...tc });\n } else {\n toolCallMap.set(tc.id, tc);\n }\n });\n const mergedToolCalls = Array.from(toolCallMap.values());\n\n console.log('[SSE] Final event - merged tool calls:', mergedToolCalls.length);\n\n // 构建 extraData:合并 SSE 收集的数据\n // 注意:Plan 数据不再保存完整 steps,只保存简化版(planId + summary),\n // 前端会按需通过 planService.getStatus(planId) 获取完整数据\n const { pendingFrontendToolCalls, pendingComponents } = useAgentStore.getState().chatUI;\n const extraData: Record<string, any> = {\n thoughts: currentThoughts,\n tool_calls: mergedToolCalls,\n frontend_tool_calls: pendingFrontendToolCalls,\n components: pendingComponents,\n };\n\n // Plan Mode:保存简化版 plan(只有 planId 和 summary,不含 steps)\n if (data.plan) {\n extraData.plan = data.plan;\n console.log('[SSE] handleFinalEvent - 保存简化版 plan:', {\n planId: (data.plan as any).publicId || (data.plan as any).planId,\n hasSummary: !!(data.plan as any).summary,\n hasSteps: !!(data.plan as any).steps,\n });\n }\n\n // 乐观更新:立即使用 SSE 收集的数据更新消息\n updateMessage(localMessageId, {\n content: data.content as string,\n status: 'completed',\n extraData,\n });\n\n // 验证更新是否成功\n const updatedMessage = useAgentStore.getState().messages.find(m => m.messageId === localMessageId);\n console.log('[SSE] handleFinalEvent - 更新后验证:', {\n savedThoughts: (updatedMessage as any)?.extraData?.thoughts?.length || 0,\n savedToolCalls: (updatedMessage as any)?.extraData?.tool_calls?.length || 0,\n savedContent: updatedMessage?.content ? `${updatedMessage.content.slice(0, 30)}...` : 'empty',\n });\n\n // 清除实时 thoughts 和 pending tool calls(已保存到 extraData)\n clearThoughts();\n\n // 获取后端完整数据(流式处理完成后接口会立即返回正确结果)\n const backendMessageId = currentMessageIdRef.current;\n if (backendMessageId) {\n console.log('[SSE] Fetching backend data for messageId:', backendMessageId);\n fetchBackendExtraData(localMessageId, backendMessageId, updateMessage)\n .catch((err: Error) => console.warn('[SSE] Failed to fetch backend data:', err));\n }\n\n options?.onComplete?.(data.content as string);\n }, [setIsStreaming, setIsThinking, clearStreamingContent, updateMessage, clearThoughts, options]);\n\n /**\n * 规范化 ToolCall 数据格式\n * 确保从 SSE 事件中提取的 toolCalls 格式正确\n */\n const normalizeToolCalls = useCallback((toolCalls: any[]): ToolCall[] => {\n if (!Array.isArray(toolCalls)) return [];\n\n return toolCalls.map(tc => ({\n id: tc.id || tc.toolCallId || generateId(),\n name: tc.name || tc.toolName || 'unknown',\n displayName: tc.displayName || tc.name?.replace('comfy_', '') || 'Tool',\n arguments: tc.arguments || tc.input || {},\n status: (tc.status || 'pending') as ToolCallStatus,\n result: tc.result || tc.output,\n error: tc.error,\n startTime: tc.startTime || Date.now(),\n endTime: tc.endTime,\n }));\n }, []);\n\n /**\n * 处理思考过程事件\n */\n const handleThoughtEvent = useCallback((\n eventType: string,\n data: any,\n localMessageId: string\n ) => {\n\n // ============ Frontend Tool & Component Events (非思考事件) ============\n if (eventType === 'reasoning_error') {\n const errorContent = data.content || data.error || data.message || '发生错误';\n setIsStreaming(false);\n setIsThinking(false);\n clearStreamingContent();\n updateMessage(localMessageId, {\n status: 'failed',\n content: errorContent,\n });\n setChatError(errorContent);\n options?.onError?.(new Error(errorContent));\n return;\n }\n\n if (eventType === 'cancelled') {\n setIsStreaming(false);\n setIsThinking(false);\n clearStreamingContent();\n updateMessage(localMessageId, {\n status: 'completed',\n content: data.content || '已取消',\n });\n return;\n }\n\n if (eventType === 'frontend_tool_call') {\n const toolCalls: FrontendToolCall[] = Array.isArray(data.toolCalls)\n ? data.toolCalls.map((tc: any) => ({\n id: tc.id,\n name: tc.name,\n arguments: tc.arguments || {},\n status: tc.status || 'PENDING',\n }))\n : [];\n\n if (toolCalls.length > 0) {\n toolCalls.forEach(tc => addPendingFrontendToolCall(tc));\n }\n\n options?.onFrontendToolCall?.(toolCalls, data.messageId);\n return;\n }\n\n if (eventType === 'frontend_tool_result') {\n const toolCalls: FrontendToolCall[] = Array.isArray(data.toolCalls)\n ? data.toolCalls.map((tc: any) => ({\n id: tc.id,\n name: tc.name,\n arguments: tc.arguments || {},\n status: tc.status || 'COMPLETED',\n result: tc.result,\n }))\n : [];\n\n toolCalls.forEach(tc => {\n updatePendingFrontendToolCall(tc.id, {\n status: tc.status || 'COMPLETED',\n result: tc.result,\n });\n setTimeout(() => removePendingFrontendToolCall(tc.id), 1000);\n });\n return;\n }\n\n if (eventType === 'component_pending') {\n const components: AgentComponentInstance[] = Array.isArray(data.extraData?.components)\n ? data.extraData.components\n : (Array.isArray(data.components) ? data.components : []);\n\n // 获取外层的时间戳,用于没有自身时间戳的 component\n const eventTs = data.gmtCreate || data.gmt_create || data.timestamp || data.createdAt || Date.now();\n\n if (components.length > 0) {\n components.forEach(c => addPendingComponent({\n ...c,\n messageId: c.messageId || data.messageId,\n componentName: c.componentName || c.type || 'UnknownComponent',\n props: c.props || c.content || {},\n status: c.status || 'PENDING',\n // 优先使用 component 自身的时间戳,否则使用外层事件的时间戳\n gmtCreate: c.gmtCreate || c.gmt_create || c.timestamp || c.createdAt || eventTs,\n }));\n }\n\n // 将 component_pending 事件也保存到 thoughts 中,包含完整的 extraData.components\n // 这样刷新页面后可以从 thoughts 中恢复组件数据\n const thought: AgentThought = {\n id: data.id || generateId(),\n messageId: localMessageId,\n type: eventType as AgentThoughtType,\n content: data.content,\n timestamp: eventTs,\n // 保存 extraData,包含 components 数据\n extraData: data.extraData,\n };\n addThought(thought);\n\n options?.onComponentPending?.(components, data.messageId);\n return;\n }\n\n if (eventType === 'component_submitted' || eventType === 'component_cancelled') {\n const pendingComponents = useAgentStore.getState().chatUI.pendingComponents;\n pendingComponents.forEach(c => {\n updatePendingComponent(c.id, {\n status: eventType === 'component_submitted' ? 'SUBMITTED' : 'CANCELLED',\n });\n setTimeout(() => removePendingComponent(c.id), 1000);\n });\n return;\n }\n\n if (eventType === 'component_timeout') {\n const pendingComponents = useAgentStore.getState().chatUI.pendingComponents;\n pendingComponents.forEach(c => {\n updatePendingComponent(c.id, { status: 'CANCELLED' });\n setTimeout(() => removePendingComponent(c.id), 1000);\n });\n return;\n }\n\n // 规范化 toolCalls 数据 - 支持多种字段名\n // 后端可能使用 toolCalls、tool_calls、actions 等不同的字段名\n const rawToolCalls = data.toolCalls || data.tool_calls || data.actions || [];\n const normalizedToolCalls = rawToolCalls.length > 0 ? normalizeToolCalls(rawToolCalls) : undefined;\n\n // 如果是 action 事件但没有 toolCalls,尝试从 data 本身构造\n // 有些后端实现会把工具调用信息直接放在 data 的顶层\n let finalToolCalls = normalizedToolCalls;\n if (!finalToolCalls && eventType === 'action' && (data.name || data.toolName || data.tool)) {\n console.log('[SSE] Constructing toolCall from action data:', data);\n finalToolCalls = normalizeToolCalls([{\n id: data.id || data.toolCallId || generateId(),\n name: data.name || data.toolName || data.tool,\n arguments: data.arguments || data.input || data.params || {},\n status: 'pending',\n }]);\n }\n\n const thought: AgentThought = {\n id: data.id || generateId(),\n messageId: localMessageId,\n type: eventType as AgentThoughtType,\n content: data.content,\n toolCalls: finalToolCalls,\n observation: data.observation,\n error: data.error,\n subAgentId: data.subAgentId,\n // Multi-Agent 场景:解析 agent_id 和 agent_name(支持 snake_case 和 camelCase)\n agentId: data.agent_id || data.agentId,\n agentName: data.agent_name || data.agentName,\n timestamp: data.gmt_create || data.gmtCreate || Date.now(),\n };\n\n // 不应该作为思考内容展示的事件类型(这些事件有专门的 UI 处理)\n const excludedFromThoughts = new Set([\n 'tool_confirmed',\n 'tool_rejected',\n 'waiting_confirmation',\n 'component_submitted',\n 'component_cancelled',\n 'component_timeout',\n ]);\n\n // 只有非排除类型的事件才添加到 thoughts\n if (!excludedFromThoughts.has(eventType)) {\n addThought(thought);\n options?.onThought?.(thought);\n }\n\n // 打印 toolCalls 信息用于调试\n if (finalToolCalls && finalToolCalls.length > 0) {\n console.log(`[SSE] ToolCalls in ${eventType}:`, finalToolCalls);\n }\n\n // 根据事件类型处理\n switch (eventType) {\n case 'reasoning_start':\n setIsThinking(true);\n break;\n\n case 'reasoning_delta':\n // 实时追加内容\n if (data.content) {\n appendStreamingContent(data.content);\n }\n break;\n\n case 'reasoning_end':\n setIsThinking(false);\n break;\n\n case 'action':\n // action 事件:工具调用开始,立即添加到 pending 列表用于实时渲染\n if (finalToolCalls && finalToolCalls.length > 0) {\n console.log('[SSE] Adding pending tool calls from action event:', finalToolCalls);\n finalToolCalls.forEach((toolCall: ToolCall) => {\n addPendingToolCall({\n ...toolCall,\n status: toolCall.status || 'pending',\n });\n });\n }\n break;\n\n case 'waiting_confirmation':\n console.log('[SSE] 🔔 waiting_confirmation 事件收到!');\n console.log('[SSE] 🔔 finalToolCalls:', JSON.stringify(finalToolCalls, null, 2));\n if (finalToolCalls && finalToolCalls.length > 0) {\n finalToolCalls.forEach((toolCall: ToolCall) => {\n // 先检查是否已存在(action 事件可能已添加),存在则更新状态,不存在则添加\n const existingCalls = useAgentStore.getState().chatUI.pendingToolCalls;\n console.log('[SSE] 🔔 当前 pendingToolCalls:', existingCalls.map(tc => ({ id: tc.id, status: tc.status })));\n const existing = existingCalls.find(tc => tc.id === toolCall.id);\n console.log('[SSE] 🔔 查找结果 - toolCall.id:', toolCall.id, '已存在:', !!existing);\n if (existing) {\n console.log('[SSE] 🔔 调用 updatePendingToolCall, id:', toolCall.id, 'status: waiting_confirmation');\n updatePendingToolCall(toolCall.id, { status: 'waiting_confirmation' });\n } else {\n console.log('[SSE] 🔔 调用 addPendingToolCall, id:', toolCall.id, 'status: waiting_confirmation');\n addPendingToolCall({\n ...toolCall,\n status: 'waiting_confirmation',\n });\n }\n // 验证更新后的状态\n setTimeout(() => {\n const updatedCalls = useAgentStore.getState().chatUI.pendingToolCalls;\n console.log('[SSE] 🔔 更新后 pendingToolCalls:', updatedCalls.map(tc => ({ id: tc.id, status: tc.status })));\n }, 0);\n });\n } else {\n console.log('[SSE] ⚠️ waiting_confirmation 事件但没有 toolCalls!');\n }\n break;\n\n case 'tool_confirmed':\n console.log('[SSE] 🔔 tool_confirmed 事件收到!');\n console.log('[SSE] 🔔 finalToolCalls:', JSON.stringify(finalToolCalls, null, 2));\n if (finalToolCalls && finalToolCalls.length > 0) {\n finalToolCalls.forEach((toolCall: ToolCall) => {\n console.log('[SSE] 🔔 更新 toolCall 状态为 confirmed, id:', toolCall.id);\n // 更新状态为 confirmed(不是 executing,因为确认后还需要等待执行)\n updatePendingToolCall(toolCall.id, { status: 'confirmed' });\n });\n } else {\n // 如果 finalToolCalls 为空,尝试从 data.toolCalls 直接获取\n const directToolCalls = data.toolCalls || data.tool_calls || [];\n console.log('[SSE] 🔔 直接从 data 获取 toolCalls:', JSON.stringify(directToolCalls, null, 2));\n if (directToolCalls.length > 0) {\n directToolCalls.forEach((tc: any) => {\n const toolCallId = tc.id || tc.toolCallId;\n if (toolCallId) {\n console.log('[SSE] 🔔 更新 toolCall 状态为 confirmed, id:', toolCallId);\n updatePendingToolCall(toolCallId, { status: 'confirmed' });\n }\n });\n }\n }\n break;\n\n case 'tool_rejected':\n if (finalToolCalls && finalToolCalls.length > 0) {\n finalToolCalls.forEach((toolCall: ToolCall) => {\n // 更新状态为 rejected,然后移除\n updatePendingToolCall(toolCall.id, { status: 'rejected' });\n setTimeout(() => removePendingToolCall(toolCall.id), 1000);\n });\n }\n break;\n\n case 'observation':\n // 工具执行结果:更新对应的 pending tool call 状态\n if (finalToolCalls && finalToolCalls.length > 0) {\n finalToolCalls.forEach((toolCall: ToolCall) => {\n updatePendingToolCall(toolCall.id, {\n status: 'completed',\n result: toolCall.result || data.observation,\n endTime: Date.now(),\n });\n });\n } else if (data.observation) {\n // 如果没有 toolCalls 但有 observation,尝试更新最近的 pending tool call\n const pendingCalls = useAgentStore.getState().chatUI.pendingToolCalls;\n const executingCall = pendingCalls.find(tc => tc.status === 'pending' || tc.status === 'executing');\n if (executingCall) {\n updatePendingToolCall(executingCall.id, {\n status: 'completed',\n result: data.observation,\n endTime: Date.now(),\n });\n }\n }\n break;\n\n case 'final':\n handleFinalEvent(data, localMessageId);\n break;\n\n case 'error':\n // 错误事件 - 停止流式状态,显示错误内容\n console.log('[SSE] Error:', data.content || data.error || data.message);\n setIsStreaming(false);\n setIsThinking(false);\n clearStreamingContent();\n // 优先使用 content 字段(后端新格式),兼容 error/message\n const errorContent = data.content || data.error || data.message || '发生错误';\n \n // 收集当前的 thoughts 和 pending tool calls\n {\n const state = useAgentStore.getState();\n const currentThoughts = state.chatUI.currentThoughts;\n const pendingToolCalls = state.chatUI.pendingToolCalls;\n \n // 构建 extraData\n const extraData: Record<string, any> = {\n thoughts: currentThoughts,\n tool_calls: pendingToolCalls,\n };\n \n // 更新消息状态和内容\n updateMessage(localMessageId, {\n status: 'failed',\n content: errorContent,\n extraData,\n });\n \n // 清除实时 thoughts\n clearThoughts();\n }\n \n setChatError(errorContent);\n options?.onError?.(new Error(errorContent));\n \n // 获取后端完整数据\n {\n const backendMessageId = currentMessageIdRef.current;\n if (backendMessageId) {\n console.log('[SSE] Error - Fetching backend data for messageId:', backendMessageId);\n fetchBackendExtraData(localMessageId, backendMessageId, updateMessage)\n .catch((err: Error) => console.warn('[SSE] Failed to fetch backend data on error:', err));\n }\n }\n break;\n\n case 'timeout':\n // 超时事件 - Agent 执行达到最大步骤或时间限制\n console.log('[SSE] Timeout:', data.content);\n setIsStreaming(false);\n setIsThinking(false);\n clearStreamingContent();\n \n // 收集当前的 thoughts 和 pending tool calls\n {\n const state = useAgentStore.getState();\n const currentThoughts = state.chatUI.currentThoughts;\n const pendingToolCalls = state.chatUI.pendingToolCalls;\n const currentPlan = state.chatUI.currentPlan;\n \n // 构建 extraData\n const extraData: Record<string, any> = {\n thoughts: currentThoughts,\n tool_calls: pendingToolCalls,\n };\n \n // 如果有 Plan,更新其状态\n if (currentPlan) {\n const updatedPlan = {\n ...currentPlan,\n status: 'PAUSED' as const,\n errorMessage: data.content || 'Agent 执行超时',\n };\n setCurrentPlan(updatedPlan);\n extraData.plan = updatedPlan;\n }\n \n // 更新消息状态,显示超时提示\n updateMessage(localMessageId, {\n status: 'completed',\n content: data.content || 'Agent 执行超时',\n extraData,\n });\n \n // 清除实时 thoughts\n clearThoughts();\n }\n \n // 获取后端完整数据\n {\n const backendMessageId = currentMessageIdRef.current;\n if (backendMessageId) {\n console.log('[SSE] Timeout - Fetching backend data for messageId:', backendMessageId);\n fetchBackendExtraData(localMessageId, backendMessageId, updateMessage)\n .catch((err: Error) => console.warn('[SSE] Failed to fetch backend data on timeout:', err));\n }\n }\n break;\n\n // ============ Plan Mode 事件处理 ============\n // 注意:后端返回的事件名是小写 snake_case\n\n case 'plan_generating':\n // 计划生成中\n setIsThinking(true);\n if (data.plan) {\n updateMessage(localMessageId, {\n extraData: {\n plan: data.plan,\n },\n });\n }\n break;\n\n case 'plan_generating_delta':\n // 计划生成增量\n if (data.content) {\n appendStreamingContent(data.content);\n }\n break;\n\n case 'plan_ready':\n // 计划就绪,等待用户确认\n console.log('[SSE] Plan ready:', data.plan);\n setIsThinking(false);\n // 关键:清空流式内容(plan_generating_delta 累积的 JSON)\n clearStreamingContent();\n if (data.plan) {\n // 解析 $ref 引用:用 currentStep 替换 steps 中的引用\n const rawPlan = data.plan as any;\n const resolvedSteps = rawPlan.steps?.map((step: any) => {\n if (step && step.$ref === '$.plan.currentStep') {\n return rawPlan.currentStep;\n }\n return step;\n }).filter((s: any) => s && s.type); // 过滤掉无效步骤\n\n // 确保 plan 有 status 字段,如果后端没返回则默认为 DRAFT\n const plan = {\n ...rawPlan,\n status: rawPlan.status || 'DRAFT',\n steps: resolvedSteps,\n };\n updateMessage(localMessageId, {\n // 清空 content,避免显示原始 JSON\n content: '',\n extraData: {\n plan,\n },\n });\n // 设置当前计划\n setCurrentPlan(plan);\n setShowPlanConfirmDialog(true);\n }\n break;\n\n case 'plan_confirmed':\n // 计划已确认,开始执行\n console.log('[SSE] Plan confirmed, starting execution');\n // 关闭确认弹窗\n setShowPlanConfirmDialog(false);\n clearStreamingContent();\n if (data.plan) {\n // 解析 $ref 引用\n const rawPlan = data.plan as any;\n const resolvedSteps = rawPlan.steps?.map((s: any) => {\n if (s && s.$ref === '$.plan.currentStep') {\n return rawPlan.currentStep;\n }\n return s;\n }).filter((s: any) => s && s.type);\n\n const plan = {\n ...rawPlan,\n status: rawPlan.status || 'CONFIRMED',\n steps: resolvedSteps,\n };\n setCurrentPlan(plan);\n updateMessage(localMessageId, {\n content: '',\n extraData: { plan },\n });\n }\n break;\n\n case 'plan_rejected':\n // 计划被拒绝\n console.log('[SSE] Plan rejected');\n setIsStreaming(false);\n setIsThinking(false);\n // 清理 Plan 状态\n clearPlanState();\n updateMessage(localMessageId, {\n status: 'completed',\n content: data.content || '计划已取消',\n });\n break;\n\n case 'step_start':\n // 步骤开始\n console.log('[SSE] Step start:', data.planStep);\n clearStreamingContent();\n if (data.plan) {\n // 解析 $ref 引用\n const rawPlan = data.plan as any;\n const resolvedSteps = rawPlan.steps?.map((s: any) => {\n if (s && s.$ref === '$.plan.currentStep') {\n return rawPlan.currentStep;\n }\n return s;\n }).filter((s: any) => s && s.type);\n\n const plan = {\n ...rawPlan,\n status: rawPlan.status || 'EXECUTING',\n steps: resolvedSteps,\n };\n setCurrentPlan(plan);\n updateMessage(localMessageId, {\n content: '',\n extraData: { plan },\n });\n }\n break;\n\n // ============ LLM 动态推理事件处理 ============\n\n case 'step_args_generating':\n // LLM 正在生成工具参数\n console.log('[SSE] Step args generating:', data.planStep);\n if (data.plan) {\n const rawPlan = data.plan as any;\n const resolvedSteps = rawPlan.steps?.map((s: any, index: number) => {\n if (s && s.$ref === '$.plan.currentStep') {\n return { ...rawPlan.currentStep, isGeneratingArgs: true };\n }\n // 更新当前步骤的状态\n if (data.planStep && (s.id === (data.planStep as any).id || s.index === (data.planStep as any).index)) {\n return { ...s, isGeneratingArgs: true };\n }\n return s;\n }).filter((s: any) => s && s.type);\n\n const plan = {\n ...rawPlan,\n status: rawPlan.status || 'EXECUTING',\n steps: resolvedSteps,\n };\n setCurrentPlan(plan);\n updateMessage(localMessageId, {\n extraData: { plan },\n });\n }\n // 显示参数生成的流式内容\n if (data.content) {\n appendStreamingContent(data.content);\n }\n break;\n\n case 'step_args_generated':\n // LLM 已生成工具参数\n console.log('[SSE] Step args generated:', data.planStep);\n clearStreamingContent();\n if (data.plan) {\n const rawPlan = data.plan as any;\n const resolvedSteps = rawPlan.steps?.map((s: any) => {\n if (s && s.$ref === '$.plan.currentStep') {\n const currentStep = rawPlan.currentStep || {};\n return {\n ...currentStep,\n isGeneratingArgs: false,\n // 保存计划参数和实际参数\n plannedArguments: currentStep.plannedArguments || currentStep.toolArguments,\n actualArguments: (data.planStep as any)?.actualArguments || currentStep.toolArguments,\n toolArguments: (data.planStep as any)?.actualArguments || currentStep.toolArguments,\n };\n }\n // 更新当前步骤\n if (data.planStep && (s.id === (data.planStep as any).id || s.index === (data.planStep as any).index)) {\n return {\n ...s,\n isGeneratingArgs: false,\n plannedArguments: s.toolArguments,\n actualArguments: (data.planStep as any)?.actualArguments || (data.planStep as any)?.toolArguments,\n toolArguments: (data.planStep as any)?.actualArguments || (data.planStep as any)?.toolArguments,\n };\n }\n return s;\n }).filter((s: any) => s && s.type);\n\n const plan = {\n ...rawPlan,\n status: rawPlan.status || 'EXECUTING',\n steps: resolvedSteps,\n };\n setCurrentPlan(plan);\n updateMessage(localMessageId, {\n extraData: { plan },\n });\n }\n break;\n\n case 'step_progress':\n // 步骤进度 - 支持中间输出流式展示\n console.log('[SSE] Step progress:', data.planStep, 'content:', data.content);\n\n // 处理中间输出内容(流式文本)\n if (data.content && typeof data.content === 'string') {\n appendStreamingContent(data.content);\n }\n\n if (data.plan) {\n // 解析 $ref 引用\n const rawPlan = data.plan as any;\n const resolvedSteps = rawPlan.steps?.map((s: any) => {\n if (s && s.$ref === '$.plan.currentStep') {\n return rawPlan.currentStep;\n }\n return s;\n }).filter((s: any) => s && s.type);\n\n const plan = {\n ...rawPlan,\n status: rawPlan.status || 'EXECUTING',\n steps: resolvedSteps,\n };\n setCurrentPlan(plan);\n updateMessage(localMessageId, {\n extraData: { plan },\n });\n }\n break;\n\n case 'step_complete':\n // 步骤完成\n console.log('[SSE] Step complete:', data.planStep);\n clearStreamingContent();\n if (data.plan) {\n // 解析 $ref 引用\n const rawPlan = data.plan as any;\n const resolvedSteps = rawPlan.steps?.map((s: any) => {\n if (s && s.$ref === '$.plan.currentStep') {\n return rawPlan.currentStep;\n }\n return s;\n }).filter((s: any) => s && s.type);\n\n const plan = {\n ...rawPlan,\n status: rawPlan.status || 'EXECUTING',\n steps: resolvedSteps,\n };\n setCurrentPlan(plan);\n updateMessage(localMessageId, {\n extraData: { plan },\n });\n }\n break;\n\n case 'step_failed':\n // 步骤失败 - 停止 streaming 状态,显示错误信息\n console.log('[SSE] Step failed:', data.planStep, 'error:', (data.plan as any)?.errorMessage);\n // 关键:停止 streaming 和 thinking 状态\n setIsStreaming(false);\n setIsThinking(false);\n clearStreamingContent();\n\n if (data.plan) {\n // 解析 $ref 引用\n const rawPlan = data.plan as any;\n\n // 如果 planStep 存在且 currentStep 是空对象,使用 planStep\n const currentStepData = (rawPlan.currentStep && Object.keys(rawPlan.currentStep).length > 0)\n ? rawPlan.currentStep\n : (data.planStep && Object.keys(data.planStep as object).length > 0 && !(data.planStep as any).$ref)\n ? data.planStep\n : null;\n\n const resolvedSteps = rawPlan.steps?.map((s: any) => {\n if (s && s.$ref === '$.plan.currentStep') {\n return currentStepData;\n }\n return s;\n }).filter((s: any) => s && s.type) || [];\n\n // 如果有 failedStepIndex,更新对应步骤的状态为 FAILED\n if (rawPlan.failedStepIndex !== undefined && resolvedSteps[rawPlan.failedStepIndex]) {\n resolvedSteps[rawPlan.failedStepIndex] = {\n ...resolvedSteps[rawPlan.failedStepIndex],\n status: 'FAILED',\n error: rawPlan.errorMessage,\n };\n }\n\n const plan = {\n ...rawPlan,\n status: rawPlan.status || 'PAUSED', // 确保状态为 PAUSED\n steps: resolvedSteps,\n };\n setCurrentPlan(plan);\n updateMessage(localMessageId, {\n extraData: { plan },\n });\n }\n break;\n\n case 'waiting_human_input':\n // 等待人工输入\n console.log('[SSE] Waiting for human input:', data.planStep);\n // 清空流式内容\n clearStreamingContent();\n\n // 设置等待的步骤(尝试多个可能的字段名)\n if (data.planStep) {\n const step = data.planStep as any;\n const stepId = step.publicId || step.id || step.stepId;\n console.log('[SSE] Waiting step ID:', stepId, 'from:', step);\n setWaitingStepId(stepId);\n setShowHumanInputDialog(true);\n\n // 获取当前 plan 状态\n const currentState = useAgentStore.getState();\n let plan = currentState.chatUI.currentPlan;\n\n // 如果有 data.plan,解析 $ref 引用\n if (data.plan) {\n const rawPlan = data.plan as any;\n let resolvedSteps = rawPlan.steps?.map((s: any) => {\n if (s && s.$ref === '$.plan.currentStep') {\n // 如果 currentStep 是空对象,用 planStep 替代\n if (!rawPlan.currentStep || Object.keys(rawPlan.currentStep).length === 0) {\n return step; // 使用 planStep\n }\n return rawPlan.currentStep;\n }\n return s;\n }).filter((s: any) => s && s.type) || [];\n\n // 检查 planStep 是否已在 steps 中,如果不在则添加\n const stepExists = resolvedSteps.some((s: any) => {\n const sId = s.publicId || s.id;\n return sId === stepId;\n });\n if (!stepExists && step.type) {\n // 按 index 插入到正确位置\n const insertIndex = step.index ?? 0;\n resolvedSteps.splice(insertIndex, 0, step);\n }\n\n plan = {\n ...rawPlan,\n status: rawPlan.status || 'EXECUTING',\n steps: resolvedSteps,\n };\n } else if (plan) {\n // 没有 data.plan,但有当前 plan,确保 planStep 在 steps 中\n let updatedSteps = [...(plan.steps || [])];\n\n // 检查 planStep 是否已在 steps 中\n const existingIndex = updatedSteps.findIndex((s: any) => {\n const sId = s.publicId || s.id;\n return sId === stepId;\n });\n\n if (existingIndex >= 0) {\n // 更新现有步骤的状态\n updatedSteps[existingIndex] = { ...updatedSteps[existingIndex], ...step, status: 'RUNNING' };\n } else {\n // 添加缺失的步骤\n const insertIndex = step.index ?? 0;\n updatedSteps.splice(insertIndex, 0, { ...step, status: 'RUNNING' });\n }\n\n plan = {\n ...plan,\n status: 'EXECUTING' as const,\n steps: updatedSteps,\n };\n }\n\n // 更新状态\n if (plan) {\n setCurrentPlan(plan as any);\n updateMessage(localMessageId, {\n content: '',\n extraData: { plan },\n });\n }\n }\n break;\n\n case 'human_input_received':\n // 人工输入已接收\n console.log('[SSE] Human input received');\n // 关闭人工输入弹窗\n setShowHumanInputDialog(false);\n setWaitingStepId(null);\n if (data.plan) {\n setCurrentPlan(data.plan as any);\n updateMessage(localMessageId, {\n extraData: {\n plan: data.plan,\n },\n });\n }\n break;\n\n case 'plan_summary':\n // 计划执行总结\n console.log('[SSE] Plan summary:', data.content);\n if (data.content) {\n appendStreamingContent(data.content);\n }\n break;\n\n case 'plan_completed':\n // 计划执行完成\n console.log('[SSE] Plan completed');\n setIsStreaming(false);\n setIsThinking(false);\n clearStreamingContent();\n // 清理 Plan 状态\n clearPlanState();\n updateMessage(localMessageId, {\n content: data.content || '',\n status: 'completed',\n extraData: {\n plan: data.plan,\n },\n });\n options?.onComplete?.(data.content as string || '');\n break;\n }\n }, [\n normalizeToolCalls,\n addThought,\n setIsThinking,\n setIsStreaming,\n appendStreamingContent,\n updateMessage,\n addPendingToolCall,\n updatePendingToolCall,\n removePendingToolCall,\n addPendingFrontendToolCall,\n updatePendingFrontendToolCall,\n removePendingFrontendToolCall,\n addPendingComponent,\n updatePendingComponent,\n removePendingComponent,\n setChatError,\n handleFinalEvent,\n setCurrentPlan,\n setShowPlanConfirmDialog,\n setShowHumanInputDialog,\n setWaitingStepId,\n clearPlanState,\n options,\n ]);\n\n /**\n * 处理 SSE 响应流(带心跳检测)\n */\n const processSSEStream = useCallback(async (\n response: Response,\n localMessageId: string,\n onMessageStart?: (backendMessageId: string) => void\n ) => {\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let currentEvent: string | undefined;\n let isStreamEnded = false;\n\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n console.log('[SSE] Start processing stream...');\n\n // 心跳超时处理函数\n const handleHeartbeatTimeout = async () => {\n if (isStreamEnded || isReconnectingRef.current) return;\n\n // 检查是否还有重连机会\n if (reconnectAttemptsRef.current >= MAX_RECONNECT_ATTEMPTS) {\n console.error('[SSE] 达到最大重连次数,停止重连');\n setChatError('连接超时,请刷新页面重试');\n return;\n }\n\n isReconnectingRef.current = true;\n reconnectAttemptsRef.current++;\n\n const delay = getReconnectDelay();\n console.log(`[SSE] 第 ${reconnectAttemptsRef.current} 次重连,等待 ${delay}ms...`);\n\n // 取消当前读取\n try {\n reader.cancel();\n } catch (e) {\n // 忽略取消错误\n }\n\n // 延迟后重连\n await new Promise(resolve => setTimeout(resolve, delay));\n\n if (currentMessageIdRef.current) {\n try {\n console.log(`[SSE] 正在重连 messageId: ${currentMessageIdRef.current}...`);\n const reconnectResponse = await messageService.getThoughtsStream(currentMessageIdRef.current);\n isReconnectingRef.current = false;\n // 递归处理新的流\n await processSSEStream(reconnectResponse, localMessageId, onMessageStart);\n } catch (error) {\n console.error('[SSE] 重连失败:', error);\n isReconnectingRef.current = false;\n // 继续尝试重连\n handleHeartbeatTimeout();\n }\n } else {\n isReconnectingRef.current = false;\n }\n };\n\n // 启动心跳检测\n resetHeartbeatTimeout(handleHeartbeatTimeout);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n console.log('[SSE] Stream done');\n isStreamEnded = true;\n break;\n }\n\n // 收到数据,重置心跳定时器,并重置重连计数\n resetHeartbeatTimeout(handleHeartbeatTimeout);\n reconnectAttemptsRef.current = 0;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n\n // 保留最后一个可能不完整的行\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const parsed = parseSSELine(line);\n if (!parsed) continue;\n\n if (parsed.event) {\n currentEvent = parsed.event;\n console.log(`[SSE] Got event type: ${currentEvent}`);\n } else if (parsed.data && currentEvent) {\n console.log(`[SSE] Got data for event ${currentEvent}:`, parsed.data);\n\n // 特殊处理 message_start 事件\n if (currentEvent === 'message_start' && parsed.data.messageId) {\n console.log(`[SSE] message_start, backend messageId: ${parsed.data.messageId}`);\n onMessageStart?.(parsed.data.messageId as string);\n } else {\n // 处理其他思考事件\n handleThoughtEvent(currentEvent, parsed.data, localMessageId);\n }\n\n // 重置 currentEvent,等待下一个事件\n currentEvent = undefined;\n }\n }\n }\n } finally {\n isStreamEnded = true;\n clearHeartbeatTimeout();\n try {\n reader.releaseLock();\n } catch (e) {\n // 忽略释放错误\n }\n }\n }, [handleThoughtEvent, resetHeartbeatTimeout, clearHeartbeatTimeout, getReconnectDelay, setChatError]);\n\n /**\n * 发送消息(流式)\n */\n const sendMessage = useCallback(async (sessionId: string, content: string, sendOptions?: { frontendTools?: FrontendToolDefinition[] }) => {\n // 取消之前的请求\n abortControllerRef.current?.abort();\n abortControllerRef.current = new AbortController();\n\n // 重置状态\n clearThoughts();\n clearStreamingContent();\n clearPendingToolCalls(); // 清理之前任务的 toolCalls,避免错误显示\n clearPendingFrontendToolCalls();\n clearPendingComponents();\n setChatError(undefined);\n\n // 重置重连相关状态\n reconnectAttemptsRef.current = 0;\n isReconnectingRef.current = false;\n clearHeartbeatTimeout();\n\n // 生成本地消息 ID\n const userMessageId = generateId();\n const assistantMessageId = generateId();\n\n // 保存当前会话信息用于可能的重连\n currentSessionIdRef.current = sessionId;\n currentLocalMessageIdRef.current = assistantMessageId;\n\n // 添加用户消息\n const userMessage: AgentMessage = {\n messageId: userMessageId,\n sessionId,\n role: 'user',\n content,\n status: 'completed',\n };\n addMessage(userMessage);\n\n // 添加助手消息占位\n const assistantMessage: AgentMessage = {\n messageId: assistantMessageId,\n sessionId,\n role: 'assistant',\n content: '',\n status: 'streaming',\n };\n addMessage(assistantMessage);\n\n setIsConnected(true);\n setIsStreaming(true, sessionId); // 传递 sessionId 实现 session 级别隔离\n setIsThinking(true);\n\n try {\n console.log('[SSE] Step 1: Sending message...');\n\n // Step 1: 发送消息,等待 message_start 获取 messageId\n const response = await messageService.sendStream(\n { sessionId, content, frontendTools: sendOptions?.frontendTools },\n abortControllerRef.current.signal\n );\n\n // 处理 /messages/stream,一旦获取到 messageId 就调用 thoughts/stream\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let currentEvent: string | undefined;\n let backendMessageId: string | null = null;\n\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n console.log('[SSE] Waiting for message_start...');\n\n // 只处理到获取 messageId 为止\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const parsed = parseSSELine(line);\n if (!parsed) continue;\n\n if (parsed.event) {\n currentEvent = parsed.event;\n } else if (parsed.data && currentEvent === 'message_start') {\n backendMessageId = parsed.data.messageId as string;\n console.log(`[SSE] Got backend messageId: ${backendMessageId}`);\n\n // 将后端 messageId 存入 metadata,避免修改主键导致 UI 闪烁\n if (backendMessageId) {\n updateMessage(assistantMessageId, {\n metadata: { backendId: backendMessageId }\n });\n }\n // 立即跳出循环,不再读取后续数据\n break;\n }\n }\n\n // 如果已获取到 messageId,跳出外层循环\n if (backendMessageId) break;\n }\n } finally {\n // 取消对 /messages/stream 的读取\n reader.cancel();\n reader.releaseLock();\n }\n\n // Step 2: 立即用 messageId 调用 thoughts/stream\n if (backendMessageId) {\n console.log(`[SSE] Step 2: Getting thoughts stream for ${backendMessageId}...`);\n currentMessageIdRef.current = backendMessageId; // 保存 messageId 用于取消\n\n const thoughtsResponse = await messageService.getThoughtsStream(backendMessageId);\n // 继续使用前端 ID 更新状态,保持 UI 稳定\n await processSSEStream(thoughtsResponse, assistantMessageId);\n } else {\n console.warn('[SSE] No backend messageId received');\n throw new Error('未获取到消息ID');\n }\n\n } catch (error) {\n // 清理心跳定时器\n clearHeartbeatTimeout();\n\n if ((error as Error).name === 'AbortError') {\n updateMessage(assistantMessageId, { status: 'failed' });\n } else {\n console.error('[SSE] Error:', error);\n\n // 对网络错误提供友好提示\n const errorMessage = (error as Error).message;\n let userFriendlyMessage = errorMessage;\n\n if (errorMessage.includes('network') || errorMessage.includes('ERR_INCOMPLETE_CHUNKED_ENCODING')) {\n userFriendlyMessage = '网络连接不稳定,请检查网络后重试';\n } else if (errorMessage.includes('timeout') || errorMessage.includes('超时')) {\n userFriendlyMessage = '请求超时,请稍后重试';\n }\n\n setChatError(userFriendlyMessage);\n updateMessage(assistantMessageId, { status: 'failed' });\n options?.onError?.(error as Error);\n }\n } finally {\n clearHeartbeatTimeout();\n setIsConnected(false);\n setIsStreaming(false);\n setIsThinking(false);\n currentMessageIdRef.current = null;\n currentSessionIdRef.current = null;\n currentLocalMessageIdRef.current = null;\n }\n }, [\n addMessage,\n updateMessage,\n clearThoughts,\n clearStreamingContent,\n clearPendingToolCalls,\n clearHeartbeatTimeout,\n setChatError,\n setIsStreaming,\n setIsThinking,\n processSSEStream,\n options,\n ]);\n\n /**\n * 断线重连 - 获取消息的思考过程\n */\n const reconnect = useCallback(async (messageId: string) => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = new AbortController();\n\n clearThoughts();\n clearStreamingContent();\n clearPendingToolCalls(); // 重连时也清理之前的 toolCalls\n setIsConnected(true);\n setIsThinking(true);\n setIsStreaming(true);\n currentMessageIdRef.current = messageId;\n\n try {\n console.log(`[SSE] Reconnecting for messageId: ${messageId}`);\n const response = await messageService.getThoughtsStream(messageId);\n await processSSEStream(response, messageId);\n } catch (error) {\n console.error('[SSE] Reconnect error:', error);\n options?.onError?.(error as Error);\n } finally {\n setIsConnected(false);\n setIsThinking(false);\n setIsStreaming(false);\n currentMessageIdRef.current = null;\n }\n }, [clearThoughts, clearStreamingContent, clearPendingToolCalls, setIsThinking, setIsStreaming, processSSEStream, options]);\n\n /**\n * 中断连接并取消后端执行\n */\n const abort = useCallback(async () => {\n // 清理心跳定时器\n clearHeartbeatTimeout();\n\n // 重置重连状态\n reconnectAttemptsRef.current = 0;\n isReconnectingRef.current = false;\n\n // 先中断前端连接\n abortControllerRef.current?.abort();\n\n // 调用后端取消接口\n if (currentMessageIdRef.current) {\n try {\n console.log(`[SSE] Cancelling message: ${currentMessageIdRef.current}`);\n await messageService.cancel(currentMessageIdRef.current);\n } catch (error) {\n console.error('[SSE] Failed to cancel:', error);\n }\n currentMessageIdRef.current = null;\n }\n\n setIsConnected(false);\n setIsStreaming(false);\n setIsThinking(false);\n currentSessionIdRef.current = null;\n currentLocalMessageIdRef.current = null;\n }, [clearHeartbeatTimeout, setIsStreaming, setIsThinking]);\n\n return {\n sendMessage,\n reconnect,\n abort,\n isConnected,\n };\n}\n\nexport default useSSE;","/**\n * SSE 连接管理工具\n * 提供 SSE 解析、流读取、心跳管理等功能\n */\n\n// ============ 常量配置 ============\n\n/** SSE 心跳超时时间(毫秒)- 超过此时间无数据则触发重连 */\nexport const SSE_HEARTBEAT_TIMEOUT = 45000; // 45秒,考虑到工具执行可能需要较长时间\n\n/** 最大重连次数 */\nexport const MAX_RECONNECT_ATTEMPTS = 3;\n\n/** 重连基础延迟(毫秒) */\nexport const RECONNECT_BASE_DELAY = 1000;\n\n// ============ 类型定义 ============\n\n/** SSE 解析结果 */\nexport interface SSEParsedResult {\n event?: string;\n data?: Record<string, unknown>;\n}\n\n/** 流读取器接口 */\nexport interface StreamReader {\n readLines(): AsyncGenerator<string>;\n cancel(): void;\n}\n\n/** 心跳管理器接口 */\nexport interface HeartbeatManager {\n reset(onTimeout: () => void): void;\n clear(): void;\n}\n\n/** 重连管理器接口 */\nexport interface ReconnectManager {\n getDelay(): number;\n incrementAttempts(): void;\n resetAttempts(): void;\n hasMoreAttempts(): boolean;\n getCurrentAttempts(): number;\n}\n\n// ============ 工具函数 ============\n\n/**\n * 解析后端返回的 SSE 格式\n * 支持格式:\n * - \"data:event: xxx\" - 事件类型\n * - \"data: {...}\" - JSON 数据\n */\nexport function parseSSELine(line: string): SSEParsedResult | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n\n // 解析 \"data:event: xxx\" 格式\n if (trimmed.startsWith('data:event:')) {\n return { event: trimmed.substring(11).trim() };\n }\n\n // 解析 \"data: {...}\" 格式\n if (trimmed.startsWith('data:')) {\n const dataStr = trimmed.substring(5).trim();\n if (dataStr) {\n try {\n return { data: JSON.parse(dataStr) };\n } catch {\n console.error('[SSE] Failed to parse JSON data:', dataStr);\n }\n }\n }\n // 兼容:尝试直接解析裸 JSON(业务层转发后可能没有 data: 前缀)\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n try {\n return { data: JSON.parse(trimmed) };\n } catch {\n // 不是有效的 JSON,忽略\n }\n }\n\n return null;\n}\n\n/**\n * 生成唯一 ID\n */\nexport function generateSSEId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * 创建 SSE 流读取器\n */\nexport function createStreamReader(response: Response): StreamReader {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n return {\n async *readLines(): AsyncGenerator<string> {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n yield line;\n }\n }\n\n // 处理剩余的 buffer\n if (buffer.trim()) {\n yield buffer;\n }\n } finally {\n reader.releaseLock();\n }\n },\n\n cancel() {\n reader.cancel();\n reader.releaseLock();\n },\n };\n}\n\n/**\n * 创建心跳管理器\n * 用于检测 SSE 连接是否超时\n */\nexport function createHeartbeatManager(timeout: number = SSE_HEARTBEAT_TIMEOUT): HeartbeatManager {\n let timeoutId: NodeJS.Timeout | null = null;\n let lastActivityTime = Date.now();\n\n return {\n reset(onTimeout: () => void) {\n lastActivityTime = Date.now();\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n console.warn(`[SSE] 心跳超时 (${timeout}ms 无数据),触发重连...`);\n onTimeout();\n }, timeout);\n },\n\n clear() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n },\n };\n}\n\n/**\n * 创建重连管理器\n * 使用指数退避策略管理重连延迟\n */\nexport function createReconnectManager(\n maxAttempts: number = MAX_RECONNECT_ATTEMPTS,\n baseDelay: number = RECONNECT_BASE_DELAY,\n maxDelay: number = 8000\n): ReconnectManager {\n let attempts = 0;\n\n return {\n getDelay(): number {\n // 指数退避:1s, 2s, 4s...\n const delay = baseDelay * Math.pow(2, attempts);\n return Math.min(delay, maxDelay);\n },\n\n incrementAttempts() {\n attempts++;\n },\n\n resetAttempts() {\n attempts = 0;\n },\n\n hasMoreAttempts(): boolean {\n return attempts < maxAttempts;\n },\n\n getCurrentAttempts(): number {\n return attempts;\n },\n };\n}\n\n/**\n * 计算重连延迟(指数退避)\n *\n * @param attempt 当前重连次数(0-based)\n * @param baseDelay 基础延迟(毫秒)\n * @param maxDelay 最大延迟(毫秒)\n * @returns 延迟时间(毫秒)\n */\nexport function calculateReconnectDelay(\n attempt: number,\n baseDelay: number = RECONNECT_BASE_DELAY,\n maxDelay: number = 8000\n): number {\n const delay = baseDelay * Math.pow(2, attempt);\n return Math.min(delay, maxDelay);\n}","/**\n * 思考内容解析工具\n * 用于解析和美化 Agent 的思考过程内容\n */\n\nimport type { AgentThought, ToolCall } from '../types/agent';\n\n// ============ ReAct 格式清理规则 ============\n\n/** ReAct 格式前缀正则表达式 */\nconst REACT_PREFIX_PATTERNS = [\n /Thought\\s*:\\s*/gi,\n /Action\\s*:\\s*\\w+\\s*/gi,\n /Action\\s+Input\\s*:\\s*/gi,\n /Observation\\s*:\\s*/gi,\n /Final\\s+Answer\\s*:\\s*/gi,\n];\n\n/** 需要过滤的行模式 */\nconst FILTER_LINE_PATTERNS = [\n /^comfy_[\\w]+$/i, // comfy 工具名\n /^\\{\".*\":\\s*[\"\\{\\d]/, // JSON 对象开头\n];\n\n// ============ 解析函数 ============\n\n/**\n * 清理 ReAct 格式的前缀\n */\nfunction cleanReActPrefixes(content: string): string {\n let cleaned = content;\n for (const pattern of REACT_PREFIX_PATTERNS) {\n cleaned = cleaned.replace(pattern, '');\n }\n return cleaned.trim();\n}\n\n/**\n * 检查行是否应该被过滤\n */\nfunction shouldFilterLine(line: string): boolean {\n const trimmed = line.trim();\n if (!trimmed) return true;\n\n // 检查是否是 JSON 对象\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n try {\n JSON.parse(trimmed);\n return true;\n } catch {\n // 不是有效 JSON,保留\n }\n }\n\n // 检查是否匹配过滤模式\n return FILTER_LINE_PATTERNS.some(pattern => pattern.test(trimmed));\n}\n\n/**\n * 去除连续重复的内容\n */\nfunction deduplicateContent(parts: string[]): string[] {\n const dedupedParts: string[] = [];\n for (const part of parts) {\n if (dedupedParts.length === 0 || dedupedParts[dedupedParts.length - 1] !== part) {\n dedupedParts.push(part);\n }\n }\n return dedupedParts;\n}\n\n/**\n * 解析并美化思考内容\n * @param rawContent 原始思考内容\n * @returns 清理后的思考内容\n */\nexport function parseThinkingContent(rawContent: string): string {\n if (!rawContent) return '';\n\n // 清理 ReAct 格式前缀\n const cleaned = cleanReActPrefixes(rawContent);\n\n // 按行处理\n const lines = cleaned.split(/\\n/);\n const cleanedParts: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!shouldFilterLine(trimmed)) {\n cleanedParts.push(trimmed);\n }\n }\n\n // 去重并合并\n const dedupedParts = deduplicateContent(cleanedParts);\n return dedupedParts.join('\\n\\n');\n}\n\n/**\n * 从思考事件中提取思考内容\n * @param thoughts 思考事件列表\n * @returns 合并后的思考内容\n */\nexport function extractThinkingContent(thoughts: AgentThought[]): string {\n const thinkingParts: string[] = [];\n const seenContent = new Set<string>();\n\n thoughts\n .filter(t => t.type === 'reasoning_start' || t.type === 'reasoning_delta' || t.type === 'thinking')\n .forEach(t => {\n const content = (t.content || '').trim();\n if (content && !seenContent.has(content)) {\n seenContent.add(content);\n thinkingParts.push(content);\n }\n });\n\n return parseThinkingContent(thinkingParts.join('\\n'));\n}\n\n/**\n * 从思考事件中提取工具调用(按 id 去重,保留最新状态)\n * 支持多种事件类型:action, observation, waiting_confirmation, tool_confirmed, tool_rejected\n * @param thoughts 思考事件列表\n * @returns 工具调用列表\n */\nexport function extractToolCalls(thoughts: AgentThought[]): ToolCall[] {\n const toolCallMap = new Map<string, ToolCall>();\n\n for (const thought of thoughts) {\n // 处理包含 toolCalls 的所有事件类型\n if (thought.toolCalls && thought.toolCalls.length > 0) {\n thought.toolCalls.forEach(tc => {\n const existing = toolCallMap.get(tc.id);\n\n // 根据事件类型更新状态\n let updatedStatus = tc.status;\n let updatedResult = tc.result;\n\n switch (thought.type) {\n case 'action':\n // action 事件:工具调用开始,状态为 pending\n updatedStatus = tc.status || 'pending';\n break;\n\n case 'waiting_confirmation':\n // 等待确认:状态为 waiting_confirmation\n updatedStatus = 'waiting_confirmation';\n break;\n\n case 'tool_confirmed':\n // 工具已确认:状态为 pending(等待执行)\n updatedStatus = 'pending';\n break;\n\n case 'tool_rejected':\n // 工具被拒绝:状态为 rejected\n updatedStatus = 'rejected';\n break;\n\n case 'observation':\n // observation 事件:工具执行完成\n updatedStatus = 'completed';\n updatedResult = tc.result || thought.observation;\n break;\n\n default:\n // 其他事件类型:保留原状态\n break;\n }\n\n // 合并更新\n toolCallMap.set(tc.id, {\n ...existing,\n ...tc,\n status: updatedStatus,\n result: updatedResult !== undefined ? updatedResult : existing?.result,\n });\n });\n }\n\n // 特殊处理:observation 事件可能没有 toolCalls 但有 observation 内容\n // 需要根据上下文关联到最近的 pending 工具调用\n if (thought.type === 'observation' && thought.observation && !thought.toolCalls) {\n // 找到最近一个 pending 状态的工具调用并更新\n const pendingCalls = Array.from(toolCallMap.values()).filter(tc => tc.status === 'pending');\n if (pendingCalls.length > 0) {\n const lastPending = pendingCalls[pendingCalls.length - 1];\n toolCallMap.set(lastPending.id, {\n ...lastPending,\n status: 'completed',\n result: thought.observation,\n });\n }\n }\n }\n\n // 按时间戳排序(如果有的话)\n const sortedCalls = Array.from(toolCallMap.values()).sort((a, b) => {\n const timeA = (a as any).timestamp || 0;\n const timeB = (b as any).timestamp || 0;\n return timeA - timeB;\n });\n\n return sortedCalls;\n}\n\n/**\n * 检查是否正在思考中\n * @param thoughts 思考事件列表\n * @returns 是否正在思考\n */\nexport function isCurrentlyThinking(thoughts: AgentThought[]): boolean {\n const hasThinkingEvent = thoughts.some(\n t => t.type === 'reasoning_start' || t.type === 'reasoning_delta' || t.type === 'thinking'\n );\n const hasEndEvent = thoughts.some(\n t => t.type === 'final' || t.type === 'error'\n );\n return hasThinkingEvent && !hasEndEvent;\n}\n\n/**\n * 解析思考事件的完整信息\n * @param thoughts 思考事件列表\n * @returns 解析后的思考信息\n */\nexport function parseThoughts(thoughts: AgentThought[]): {\n content: string;\n toolCalls: ToolCall[];\n isThinking: boolean;\n} {\n return {\n content: extractThinkingContent(thoughts),\n toolCalls: extractToolCalls(thoughts),\n isThinking: isCurrentlyThinking(thoughts),\n };\n}","/**\n * 参数格式化工具 - 将 JSON 参数转换为人类友好的展示\n *\n * 设计理念:\n * 1. 普通用户看到自然语言描述,而非技术细节\n * 2. 开发者可以展开查看原始数据\n * 3. 智能识别常见参数类型并优化展示\n */\n\n// 常见参数的中文友好名称映射\nconst PARAM_NAME_MAP: Record<string, string> = {\n // 通用参数\n prompt: '提示词',\n query: '搜索内容',\n content: '内容',\n text: '文本',\n message: '消息',\n input: '输入',\n output: '输出',\n\n // 图像相关\n image: '图片',\n image_url: '图片地址',\n imageUrl: '图片地址',\n images: '图片列表',\n width: '宽度',\n height: '高度',\n size: '尺寸',\n resolution: '分辨率',\n aspect_ratio: '宽高比',\n aspectRatio: '宽高比',\n\n // 生成相关\n model: '模型',\n style: '风格',\n seed: '随机种子',\n steps: '步数',\n cfg_scale: '引导系数',\n cfgScale: '引导系数',\n sampler: '采样器',\n scheduler: '调度器',\n batch_size: '批量大小',\n batchSize: '批量大小',\n\n // 文件相关\n file: '文件',\n file_url: '文件地址',\n fileUrl: '文件地址',\n filename: '文件名',\n path: '路径',\n url: '网址',\n\n // 工作流相关\n workflow: '工作流',\n workflow_id: '工作流 ID',\n workflowId: '工作流 ID',\n node: '节点',\n\n // 其他常见\n name: '名称',\n title: '标题',\n description: '描述',\n type: '类型',\n format: '格式',\n quality: '质量',\n count: '数量',\n limit: '限制',\n page: '页码',\n keyword: '关键词',\n keywords: '关键词',\n tags: '标签',\n category: '分类',\n language: '语言',\n locale: '语言区域',\n\n // 控制参数\n negative_prompt: '反向提示词',\n negativePrompt: '反向提示词',\n strength: '强度',\n denoising_strength: '去噪强度',\n denoisingStrength: '去噪强度',\n guidance_scale: '引导比例',\n guidanceScale: '引导比例',\n};\n\n// 参数值的智能格式化\nfunction formatParamValue(key: string, value: any): string {\n if (value === null || value === undefined) {\n return '未设置';\n }\n\n // 布尔值\n if (typeof value === 'boolean') {\n return value ? '是' : '否';\n }\n\n // 数字\n if (typeof value === 'number') {\n // 尺寸相关的数字\n if (['width', 'height', 'size'].includes(key.toLowerCase())) {\n return `${value} px`;\n }\n // 百分比相关\n if (['strength', 'denoising_strength', 'denoisingStrength', 'opacity'].includes(key)) {\n return `${Math.round(value * 100)}%`;\n }\n // 普通数字\n return String(value);\n }\n\n // 字符串\n if (typeof value === 'string') {\n // URL 检测\n if (value.startsWith('http://') || value.startsWith('https://')) {\n // 图片 URL\n if (/\\.(jpg|jpeg|png|gif|webp|svg)(\\?|$)/i.test(value)) {\n return '🖼️ [图片]';\n }\n // 视频 URL\n if (/\\.(mp4|mov|webm|avi)(\\?|$)/i.test(value)) {\n return '🎬 [视频]';\n }\n // 其他 URL - 显示简短域名\n try {\n const url = new URL(value);\n return `🔗 ${url.hostname}`;\n } catch {\n return '🔗 [链接]';\n }\n }\n\n // 长文本截断\n if (value.length > 100) {\n return value.slice(0, 100) + '...';\n }\n\n return value;\n }\n\n // 数组\n if (Array.isArray(value)) {\n if (value.length === 0) return '空列表';\n if (value.length <= 3) {\n return value.map(v => formatParamValue(key, v)).join('、');\n }\n return `${value.length} 项`;\n }\n\n // 对象\n if (typeof value === 'object') {\n const keys = Object.keys(value);\n if (keys.length === 0) return '空对象';\n if (keys.length <= 2) {\n return keys.map(k => `${k}: ${formatParamValue(k, value[k])}`).join(', ');\n }\n return `${keys.length} 个属性`;\n }\n\n return String(value);\n}\n\n// 获取参数的友好名称\nfunction getParamDisplayName(key: string): string {\n // 先查映射表\n if (PARAM_NAME_MAP[key]) {\n return PARAM_NAME_MAP[key];\n }\n\n // 驼峰转空格\n const spaced = key\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/_/g, ' ')\n .toLowerCase();\n\n // 首字母大写\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\n// 判断参数是否为\"重要\"参数(应该优先显示)\nfunction isImportantParam(key: string): boolean {\n const importantKeys = [\n 'prompt', 'query', 'content', 'text', 'message', 'input',\n 'image', 'image_url', 'imageUrl', 'file', 'file_url', 'fileUrl',\n 'model', 'style', 'width', 'height', 'size',\n 'name', 'title', 'description',\n ];\n return importantKeys.includes(key);\n}\n\n// 判断参数是否为\"技术性\"参数(可以隐藏)\nfunction isTechnicalParam(key: string): boolean {\n const technicalKeys = [\n 'seed', 'cfg_scale', 'cfgScale', 'steps', 'sampler', 'scheduler',\n 'batch_size', 'batchSize', 'denoising_strength', 'denoisingStrength',\n 'guidance_scale', 'guidanceScale', 'node', 'workflow_id', 'workflowId',\n 'callback_url', 'callbackUrl', 'webhook', 'api_key', 'apiKey',\n ];\n return technicalKeys.includes(key);\n}\n\nexport interface FormattedParam {\n key: string;\n displayName: string;\n value: any;\n displayValue: string;\n isImportant: boolean;\n isTechnical: boolean;\n}\n\n/**\n * 格式化参数对象为人类友好的展示\n */\nexport function formatParameters(params: Record<string, any>): FormattedParam[] {\n if (!params || typeof params !== 'object') {\n return [];\n }\n\n const formatted = Object.entries(params).map(([key, value]) => ({\n key,\n displayName: getParamDisplayName(key),\n value,\n displayValue: formatParamValue(key, value),\n isImportant: isImportantParam(key),\n isTechnical: isTechnicalParam(key),\n }));\n\n // 排序:重要参数在前,技术参数在后\n return formatted.sort((a, b) => {\n if (a.isImportant && !b.isImportant) return -1;\n if (!a.isImportant && b.isImportant) return 1;\n if (a.isTechnical && !b.isTechnical) return 1;\n if (!a.isTechnical && b.isTechnical) return -1;\n return 0;\n });\n}\n\n/**\n * 获取参数的摘要描述(用于紧凑显示)\n */\nexport function getParamsSummary(params: Record<string, any>, maxItems = 2): string {\n const formatted = formatParameters(params);\n const important = formatted.filter(p => p.isImportant).slice(0, maxItems);\n\n if (important.length === 0) {\n // 没有重要参数,取前几个非技术参数\n const nonTech = formatted.filter(p => !p.isTechnical).slice(0, maxItems);\n if (nonTech.length === 0) {\n return formatted.length > 0 ? `${formatted.length} 个参数` : '无参数';\n }\n return nonTech.map(p => `${p.displayName}: ${p.displayValue}`).join(' · ');\n }\n\n return important.map(p => `${p.displayName}: ${p.displayValue}`).join(' · ');\n}\n\n/**\n * 生成工具调用的自然语言描述\n */\nexport function generateToolCallDescription(toolName: string, params: Record<string, any>): string {\n const formatted = formatParameters(params);\n\n // 提取关键参数\n const prompt = formatted.find(p => p.key === 'prompt' || p.key === 'query' || p.key === 'content');\n const image = formatted.find(p => p.key === 'image' || p.key === 'image_url' || p.key === 'imageUrl');\n const style = formatted.find(p => p.key === 'style');\n const size = formatted.find(p => p.key === 'width' || p.key === 'size');\n\n // 根据工具类型生成描述\n const toolLower = toolName.toLowerCase();\n\n if (toolLower.includes('generate') || toolLower.includes('image') || toolLower.includes('art')) {\n if (prompt) {\n return `生成图像:${prompt.displayValue.slice(0, 50)}${prompt.displayValue.length > 50 ? '...' : ''}`;\n }\n if (style) {\n return `生成 ${style.displayValue} 风格的图像`;\n }\n return '生成图像';\n }\n\n if (toolLower.includes('search') || toolLower.includes('query')) {\n if (prompt) {\n return `搜索:${prompt.displayValue}`;\n }\n return '执行搜索';\n }\n\n if (toolLower.includes('translate')) {\n if (prompt) {\n return `翻译:${prompt.displayValue.slice(0, 30)}...`;\n }\n return '执行翻译';\n }\n\n if (toolLower.includes('analyze') || toolLower.includes('detect')) {\n if (image) {\n return '分析图像内容';\n }\n return '执行分析';\n }\n\n // 默认描述\n if (prompt) {\n return prompt.displayValue.slice(0, 60) + (prompt.displayValue.length > 60 ? '...' : '');\n }\n\n const paramCount = formatted.length;\n if (paramCount === 0) {\n return '无参数';\n }\n\n return `${paramCount} 个参数`;\n}","/**\n * 工具调用处理工具函数\n * 抽取自 MessageBubble.tsx 和 ChatWindow.tsx 中的公共逻辑\n */\n\nimport type { ToolCall, ToolCallStatus } from '../types/agent';\n\n// ============ 类型定义 ============\n\n/** 工具调用数据(扩展版,兼容各种数据源) */\nexport interface ToolCallData {\n id: string;\n name: string;\n displayName?: string;\n arguments?: Record<string, any>;\n status?: string;\n result?: any;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n// ============ 状态优先级 ============\n\n/**\n * 获取工具调用状态的优先级\n * 用于合并多个数据源时,选择优先级更高的状态\n *\n * 优先级说明:\n * - waiting_confirmation: 最高,需要用户确认\n * - executing: 正在执行\n * - confirmed: 已确认,等待执行\n * - pending: 等待中\n * - completed: 已完成\n * - failed: 执行失败\n * - rejected: 被拒绝\n *\n * @param status 工具调用状态\n * @returns 优先级数值,数值越大优先级越高\n */\nexport function getToolCallStatusPriority(status: string | ToolCallStatus | undefined): number {\n const statusLower = (status ?? '').toLowerCase();\n switch (statusLower) {\n case 'waiting_confirmation': return 100; // 最高优先级,需要用户确认\n case 'failed': return 90;\n case 'executing': return 80;\n case 'confirmed': return 70;\n case 'pending': return 60;\n case 'completed': return 40;\n case 'rejected': return 20;\n default: return 0;\n }\n}\n\n// ============ 工具调用合并 ============\n\n/**\n * 合并多个来源的工具调用数据\n * 按 id 去重,保留优先级更高的状态\n *\n * @param extraDataToolCalls 来自 extraData.tool_calls 的权威数据\n * @param thoughtsToolCalls 来自 thoughts 的实时数据\n * @param pendingToolCalls 来自 store 的待确认数据\n * @returns 合并后的工具调用列表\n */\nexport function mergeToolCalls(\n extraDataToolCalls: ToolCallData[] = [],\n thoughtsToolCalls: ToolCallData[] = [],\n pendingToolCalls: ToolCallData[] = []\n): ToolCallData[] {\n const toolCallMap = new Map<string, ToolCallData>();\n\n // 1. 先从 extraData.tool_calls 获取(权威数据)\n extraDataToolCalls.forEach(tc => {\n if (tc.id) {\n toolCallMap.set(tc.id, { ...tc });\n }\n });\n\n // 2. 从 thoughts 中提取的 toolCalls(实时数据)\n thoughtsToolCalls.forEach(tc => {\n if (!tc.id) return;\n\n const existing = toolCallMap.get(tc.id);\n if (existing) {\n // 比较状态优先级\n const existingPriority = getToolCallStatusPriority(existing.status);\n const tcPriority = getToolCallStatusPriority(tc.status);\n\n if (tcPriority >= existingPriority) {\n // 新状态优先级更高,合并并使用新状态\n toolCallMap.set(tc.id, { ...existing, ...tc });\n } else {\n // 保留原状态,但合并其他属性\n toolCallMap.set(tc.id, { ...tc, ...existing });\n }\n } else {\n toolCallMap.set(tc.id, { ...tc });\n }\n });\n\n // 3. 合并 pendingToolCalls 的实时状态(关键!)\n // pendingToolCalls 来自 useAgentStore,包含最新的工具调用状态(如 waiting_confirmation)\n pendingToolCalls.forEach(ptc => {\n if (!ptc.id) return;\n\n const existing = toolCallMap.get(ptc.id);\n if (existing) {\n // 比较状态优先级\n const existingPriority = getToolCallStatusPriority(existing.status);\n const ptcPriority = getToolCallStatusPriority(ptc.status);\n\n if (ptcPriority >= existingPriority) {\n // pendingToolCalls 的状态优先级更高,使用它\n toolCallMap.set(ptc.id, {\n ...existing,\n status: ptc.status || existing.status,\n displayName: ptc.displayName || existing.displayName,\n });\n }\n } else {\n // 新的工具调用,直接添加\n toolCallMap.set(ptc.id, {\n id: ptc.id,\n name: ptc.name || 'unknown',\n displayName: ptc.displayName,\n arguments: ptc.arguments || {},\n status: ptc.status || 'pending',\n });\n }\n });\n\n return Array.from(toolCallMap.values());\n}\n\n// ============ 状态判断 ============\n\n/**\n * 获取工具调用的显示状态\n * 用于 UI 展示\n *\n * @param tc 工具调用数据\n * @returns 显示状态:'pending' | 'waiting_confirmation' | 'success' | 'failed' | 'rejected'\n */\nexport function getToolCallDisplayStatus(tc: ToolCallData): 'pending' | 'waiting_confirmation' | 'success' | 'failed' | 'rejected' {\n const status = tc.status?.toLowerCase() || '';\n\n if (status === 'waiting_confirmation') {\n return 'waiting_confirmation';\n }\n\n if (status === 'completed') {\n return 'success';\n }\n\n if (status === 'failed' || tc.error) {\n return 'failed';\n }\n\n if (status === 'rejected') {\n return 'rejected';\n }\n\n return 'pending';\n}\n\n// ============ 工具调用规范化 ============\n\n/**\n * 规范化工具调用数据\n * 将不同格式的工具调用数据转换为标准格式\n *\n * @param rawToolCall 原始工具调用数据\n * @returns 标准格式的工具调用\n */\nexport function normalizeToolCall(rawToolCall: any): ToolCall {\n // 处理 id:优先使用 id,其次 toolCallId,最后 tool_call_id\n const id = rawToolCall.id || rawToolCall.toolCallId || rawToolCall.tool_call_id || '';\n\n // 处理 name:优先使用 name,其次 toolName,最后 tool_name\n const name = rawToolCall.name || rawToolCall.toolName || rawToolCall.tool_name || 'unknown';\n\n // 处理 displayName\n const displayName = rawToolCall.displayName || rawToolCall.display_name || name.replace('comfy_', '');\n\n // 处理 arguments:优先使用 arguments,其次 input\n let args: Record<string, any> = {};\n if (rawToolCall.arguments) {\n args = typeof rawToolCall.arguments === 'string'\n ? JSON.parse(rawToolCall.arguments)\n : rawToolCall.arguments;\n } else if (rawToolCall.input) {\n args = typeof rawToolCall.input === 'string'\n ? JSON.parse(rawToolCall.input)\n : rawToolCall.input;\n }\n\n // 处理 status:转为小写\n const status = (rawToolCall.status || 'pending').toLowerCase() as ToolCallStatus;\n\n // 处理 result:优先使用 result,其次 output,最后 observation\n const result = rawToolCall.result || rawToolCall.output || rawToolCall.observation;\n\n return {\n id,\n name,\n displayName,\n arguments: args,\n status,\n result,\n error: rawToolCall.error,\n startTime: rawToolCall.startTime || rawToolCall.start_time,\n endTime: rawToolCall.endTime || rawToolCall.end_time,\n };\n}\n\n/**\n * 批量规范化工具调用数据\n *\n * @param rawToolCalls 原始工具调用数据数组\n * @returns 标准格式的工具调用数组\n */\nexport function normalizeToolCalls(rawToolCalls: any[]): ToolCall[] {\n if (!Array.isArray(rawToolCalls)) return [];\n return rawToolCalls.map(normalizeToolCall).filter(tc => tc.id);\n}\n\n// ============ 检查函数 ============\n\n/**\n * 检查是否有待确认的工具调用\n *\n * @param toolCalls 工具调用列表\n * @returns 是否有 waiting_confirmation 状态的工具调用\n */\nexport function hasWaitingConfirmation(toolCalls: ToolCallData[]): boolean {\n return toolCalls.some(tc => tc.status?.toLowerCase() === 'waiting_confirmation');\n}\n\n/**\n * 检查是否有执行中的工具调用\n *\n * @param toolCalls 工具调用列表\n * @returns 是否有 pending 或 executing 状态的工具调用\n */\nexport function hasExecutingToolCalls(toolCalls: ToolCallData[]): boolean {\n return toolCalls.some(tc => {\n const status = tc.status?.toLowerCase();\n return status === 'pending' || status === 'executing' || status === 'confirmed';\n });\n}","/**\n * Count how often a character (or substring) is used in a string.\n *\n * @param {string} value\n * Value to search in.\n * @param {string} character\n * Character (or substring) to look for.\n * @return {number}\n * Number of times `character` occurred in `value`.\n */\nexport function ccount(value, character) {\n const source = String(value)\n\n if (typeof character !== 'string') {\n throw new TypeError('Expected character')\n }\n\n let count = 0\n let index = source.indexOf(character)\n\n while (index !== -1) {\n count++\n index = source.indexOf(character, index + character.length)\n }\n\n return count\n}\n","export function deprecate(fn) {\n return fn\n}\n\nexport function equal() {}\n\nexport function ok() {}\n\nexport function unreachable() {}\n","/**\n * @import {Code} from 'micromark-util-types'\n */\n\n/**\n * Check whether the character code represents an ASCII alpha (`a` through `z`,\n * case insensitive).\n *\n * An **ASCII alpha** is an ASCII upper alpha or ASCII lower alpha.\n *\n * An **ASCII upper alpha** is a character in the inclusive range U+0041 (`A`)\n * to U+005A (`Z`).\n *\n * An **ASCII lower alpha** is a character in the inclusive range U+0061 (`a`)\n * to U+007A (`z`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiAlpha = regexCheck(/[A-Za-z]/);\n\n/**\n * Check whether the character code represents an ASCII alphanumeric (`a`\n * through `z`, case insensitive, or `0` through `9`).\n *\n * An **ASCII alphanumeric** is an ASCII digit (see `asciiDigit`) or ASCII alpha\n * (see `asciiAlpha`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiAlphanumeric = regexCheck(/[\\dA-Za-z]/);\n\n/**\n * Check whether the character code represents an ASCII atext.\n *\n * atext is an ASCII alphanumeric (see `asciiAlphanumeric`), or a character in\n * the inclusive ranges U+0023 NUMBER SIGN (`#`) to U+0027 APOSTROPHE (`'`),\n * U+002A ASTERISK (`*`), U+002B PLUS SIGN (`+`), U+002D DASH (`-`), U+002F\n * SLASH (`/`), U+003D EQUALS TO (`=`), U+003F QUESTION MARK (`?`), U+005E\n * CARET (`^`) to U+0060 GRAVE ACCENT (`` ` ``), or U+007B LEFT CURLY BRACE\n * (`{`) to U+007E TILDE (`~`).\n *\n * See:\n * **\\[RFC5322]**:\n * [Internet Message Format](https://tools.ietf.org/html/rfc5322).\n * P. Resnick.\n * IETF.\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiAtext = regexCheck(/[#-'*+\\--9=?A-Z^-~]/);\n\n/**\n * Check whether a character code is an ASCII control character.\n *\n * An **ASCII control** is a character in the inclusive range U+0000 NULL (NUL)\n * to U+001F (US), or U+007F (DEL).\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function asciiControl(code) {\n return (\n // Special whitespace codes (which have negative values), C0 and Control\n // character DEL\n code !== null && (code < 32 || code === 127)\n );\n}\n\n/**\n * Check whether the character code represents an ASCII digit (`0` through `9`).\n *\n * An **ASCII digit** is a character in the inclusive range U+0030 (`0`) to\n * U+0039 (`9`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiDigit = regexCheck(/\\d/);\n\n/**\n * Check whether the character code represents an ASCII hex digit (`a` through\n * `f`, case insensitive, or `0` through `9`).\n *\n * An **ASCII hex digit** is an ASCII digit (see `asciiDigit`), ASCII upper hex\n * digit, or an ASCII lower hex digit.\n *\n * An **ASCII upper hex digit** is a character in the inclusive range U+0041\n * (`A`) to U+0046 (`F`).\n *\n * An **ASCII lower hex digit** is a character in the inclusive range U+0061\n * (`a`) to U+0066 (`f`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiHexDigit = regexCheck(/[\\dA-Fa-f]/);\n\n/**\n * Check whether the character code represents ASCII punctuation.\n *\n * An **ASCII punctuation** is a character in the inclusive ranges U+0021\n * EXCLAMATION MARK (`!`) to U+002F SLASH (`/`), U+003A COLON (`:`) to U+0040 AT\n * SIGN (`@`), U+005B LEFT SQUARE BRACKET (`[`) to U+0060 GRAVE ACCENT\n * (`` ` ``), or U+007B LEFT CURLY BRACE (`{`) to U+007E TILDE (`~`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiPunctuation = regexCheck(/[!-/:-@[-`{-~]/);\n\n/**\n * Check whether a character code is a markdown line ending.\n *\n * A **markdown line ending** is the virtual characters M-0003 CARRIAGE RETURN\n * LINE FEED (CRLF), M-0004 LINE FEED (LF) and M-0005 CARRIAGE RETURN (CR).\n *\n * In micromark, the actual character U+000A LINE FEED (LF) and U+000D CARRIAGE\n * RETURN (CR) are replaced by these virtual characters depending on whether\n * they occurred together.\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function markdownLineEnding(code) {\n return code !== null && code < -2;\n}\n\n/**\n * Check whether a character code is a markdown line ending (see\n * `markdownLineEnding`) or markdown space (see `markdownSpace`).\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function markdownLineEndingOrSpace(code) {\n return code !== null && (code < 0 || code === 32);\n}\n\n/**\n * Check whether a character code is a markdown space.\n *\n * A **markdown space** is the concrete character U+0020 SPACE (SP) and the\n * virtual characters M-0001 VIRTUAL SPACE (VS) and M-0002 HORIZONTAL TAB (HT).\n *\n * In micromark, the actual character U+0009 CHARACTER TABULATION (HT) is\n * replaced by one M-0002 HORIZONTAL TAB (HT) and between 0 and 3 M-0001 VIRTUAL\n * SPACE (VS) characters, depending on the column at which the tab occurred.\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function markdownSpace(code) {\n return code === -2 || code === -1 || code === 32;\n}\n\n// Size note: removing ASCII from the regex and using `asciiPunctuation` here\n// In fact adds to the bundle size.\n/**\n * Check whether the character code represents Unicode punctuation.\n *\n * A **Unicode punctuation** is a character in the Unicode `Pc` (Punctuation,\n * Connector), `Pd` (Punctuation, Dash), `Pe` (Punctuation, Close), `Pf`\n * (Punctuation, Final quote), `Pi` (Punctuation, Initial quote), `Po`\n * (Punctuation, Other), or `Ps` (Punctuation, Open) categories, or an ASCII\n * punctuation (see `asciiPunctuation`).\n *\n * See:\n * **\\[UNICODE]**:\n * [The Unicode Standard](https://www.unicode.org/versions/).\n * Unicode Consortium.\n *\n * @param code\n * Code.\n * @returns\n * Whether it matches.\n */\nexport const unicodePunctuation = regexCheck(/\\p{P}|\\p{S}/u);\n\n/**\n * Check whether the character code represents Unicode whitespace.\n *\n * Note that this does handle micromark specific markdown whitespace characters.\n * See `markdownLineEndingOrSpace` to check that.\n *\n * A **Unicode whitespace** is a character in the Unicode `Zs` (Separator,\n * Space) category, or U+0009 CHARACTER TABULATION (HT), U+000A LINE FEED (LF),\n * U+000C (FF), or U+000D CARRIAGE RETURN (CR) (**\\[UNICODE]**).\n *\n * See:\n * **\\[UNICODE]**:\n * [The Unicode Standard](https://www.unicode.org/versions/).\n * Unicode Consortium.\n *\n * @param code\n * Code.\n * @returns\n * Whether it matches.\n */\nexport const unicodeWhitespace = regexCheck(/\\s/);\n\n/**\n * Create a code check from a regex.\n *\n * @param {RegExp} regex\n * Expression.\n * @returns {(code: Code) => boolean}\n * Check.\n */\nfunction regexCheck(regex) {\n return check;\n\n /**\n * Check whether a code matches the bound regex.\n *\n * @param {Code} code\n * Character code.\n * @returns {boolean}\n * Whether the character code matches the bound regex.\n */\n function check(code) {\n return code !== null && code > -1 && regex.test(String.fromCharCode(code));\n }\n}","export default function escapeStringRegexp(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\t// Escape characters with special meaning either inside or outside character sets.\n\t// Use a simple backslash escape when it’s always valid, and a `\\xnn` escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar.\n\treturn string\n\t\t.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n\t\t.replace(/-/g, '\\\\x2d');\n}\n","/**\n * @import {Node, Parent} from 'unist'\n */\n\n/**\n * @template Fn\n * @template Fallback\n * @typedef {Fn extends (value: any) => value is infer Thing ? Thing : Fallback} Predicate\n */\n\n/**\n * @callback Check\n * Check that an arbitrary value is a node.\n * @param {unknown} this\n * The given context.\n * @param {unknown} [node]\n * Anything (typically a node).\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {boolean}\n * Whether this is a node and passes a test.\n *\n * @typedef {Record<string, unknown> | Node} Props\n * Object to check for equivalence.\n *\n * Note: `Node` is included as it is common but is not indexable.\n *\n * @typedef {Array<Props | TestFunction | string> | ReadonlyArray<Props | TestFunction | string> | Props | TestFunction | string | null | undefined} Test\n * Check for an arbitrary node.\n *\n * @callback TestFunction\n * Check if a node passes a test.\n * @param {unknown} this\n * The given context.\n * @param {Node} node\n * A node.\n * @param {number | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | undefined} [parent]\n * The node’s parent.\n * @returns {boolean | undefined | void}\n * Whether this node passes the test.\n *\n * Note: `void` is included until TS sees no return as `undefined`.\n */\n\n/**\n * Check if `node` is a `Node` and whether it passes the given test.\n *\n * @param {unknown} node\n * Thing to check, typically `Node`.\n * @param {Test} test\n * A check for a specific node.\n * @param {number | null | undefined} index\n * The node’s position in its parent.\n * @param {Parent | null | undefined} parent\n * The node’s parent.\n * @param {unknown} context\n * Context object (`this`) to pass to `test` functions.\n * @returns {boolean}\n * Whether `node` is a node and passes a test.\n */\nexport const is =\n // Note: overloads in JSDoc can’t yet use different `@template`s.\n /**\n * @type {(\n * (<Condition extends ReadonlyArray<string>>(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & {type: Condition[number]}) &\n * (<Condition extends Array<string>>(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & {type: Condition[number]}) &\n * (<Condition extends string>(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & {type: Condition}) &\n * (<Condition extends Props>(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & Condition) &\n * (<Condition extends TestFunction>(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & Predicate<Condition, Node>) &\n * ((node?: null | undefined) => false) &\n * ((node: unknown, test?: null | undefined, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node) &\n * ((node: unknown, test?: Test, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => boolean)\n * )}\n */\n (\n /**\n * @param {unknown} [node]\n * @param {Test} [test]\n * @param {number | null | undefined} [index]\n * @param {Parent | null | undefined} [parent]\n * @param {unknown} [context]\n * @returns {boolean}\n */\n // eslint-disable-next-line max-params\n function (node, test, index, parent, context) {\n const check = convert(test)\n\n if (\n index !== undefined &&\n index !== null &&\n (typeof index !== 'number' ||\n index < 0 ||\n index === Number.POSITIVE_INFINITY)\n ) {\n throw new Error('Expected positive finite index')\n }\n\n if (\n parent !== undefined &&\n parent !== null &&\n (!is(parent) || !parent.children)\n ) {\n throw new Error('Expected parent node')\n }\n\n if (\n (parent === undefined || parent === null) !==\n (index === undefined || index === null)\n ) {\n throw new Error('Expected both parent and index')\n }\n\n return looksLikeANode(node)\n ? check.call(context, node, index, parent)\n : false\n }\n )\n\n/**\n * Generate an assertion from a test.\n *\n * Useful if you’re going to test many nodes, for example when creating a\n * utility where something else passes a compatible test.\n *\n * The created function is a bit faster because it expects valid input only:\n * a `node`, `index`, and `parent`.\n *\n * @param {Test} test\n * * when nullish, checks if `node` is a `Node`.\n * * when `string`, works like passing `(node) => node.type === test`.\n * * when `function` checks if function passed the node is true.\n * * when `object`, checks that all keys in test are in node, and that they have (strictly) equal values.\n * * when `array`, checks if any one of the subtests pass.\n * @returns {Check}\n * An assertion.\n */\nexport const convert =\n // Note: overloads in JSDoc can’t yet use different `@template`s.\n /**\n * @type {(\n * (<Condition extends string>(test: Condition) => (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & {type: Condition}) &\n * (<Condition extends Props>(test: Condition) => (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & Condition) &\n * (<Condition extends TestFunction>(test: Condition) => (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & Predicate<Condition, Node>) &\n * ((test?: null | undefined) => (node?: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node) &\n * ((test?: Test) => Check)\n * )}\n */\n (\n /**\n * @param {Test} [test]\n * @returns {Check}\n */\n function (test) {\n if (test === null || test === undefined) {\n return ok\n }\n\n if (typeof test === 'function') {\n return castFactory(test)\n }\n\n if (typeof test === 'object') {\n return Array.isArray(test)\n ? anyFactory(test)\n : // Cast because `ReadonlyArray` goes into the above but `isArray`\n // narrows to `Array`.\n propertiesFactory(/** @type {Props} */ (test))\n }\n\n if (typeof test === 'string') {\n return typeFactory(test)\n }\n\n throw new Error('Expected function, string, or object as test')\n }\n )\n\n/**\n * @param {Array<Props | TestFunction | string>} tests\n * @returns {Check}\n */\nfunction anyFactory(tests) {\n /** @type {Array<Check>} */\n const checks = []\n let index = -1\n\n while (++index < tests.length) {\n checks[index] = convert(tests[index])\n }\n\n return castFactory(any)\n\n /**\n * @this {unknown}\n * @type {TestFunction}\n */\n function any(...parameters) {\n let index = -1\n\n while (++index < checks.length) {\n if (checks[index].apply(this, parameters)) return true\n }\n\n return false\n }\n}\n\n/**\n * Turn an object into a test for a node with a certain fields.\n *\n * @param {Props} check\n * @returns {Check}\n */\nfunction propertiesFactory(check) {\n const checkAsRecord = /** @type {Record<string, unknown>} */ (check)\n\n return castFactory(all)\n\n /**\n * @param {Node} node\n * @returns {boolean}\n */\n function all(node) {\n const nodeAsRecord = /** @type {Record<string, unknown>} */ (\n /** @type {unknown} */ (node)\n )\n\n /** @type {string} */\n let key\n\n for (key in check) {\n if (nodeAsRecord[key] !== checkAsRecord[key]) return false\n }\n\n return true\n }\n}\n\n/**\n * Turn a string into a test for a node with a certain type.\n *\n * @param {string} check\n * @returns {Check}\n */\nfunction typeFactory(check) {\n return castFactory(type)\n\n /**\n * @param {Node} node\n */\n function type(node) {\n return node && node.type === check\n }\n}\n\n/**\n * Turn a custom test into a test for a node that passes that test.\n *\n * @param {TestFunction} testFunction\n * @returns {Check}\n */\nfunction castFactory(testFunction) {\n return check\n\n /**\n * @this {unknown}\n * @type {Check}\n */\n function check(value, index, parent) {\n return Boolean(\n looksLikeANode(value) &&\n testFunction.call(\n this,\n value,\n typeof index === 'number' ? index : undefined,\n parent || undefined\n )\n )\n }\n}\n\nfunction ok() {\n return true\n}\n\n/**\n * @param {unknown} value\n * @returns {value is Node}\n */\nfunction looksLikeANode(value) {\n return value !== null && typeof value === 'object' && 'type' in value\n}\n","/**\n * @param {string} d\n * @returns {string}\n */\nexport function color(d) {\n return '\\u001B[33m' + d + '\\u001B[39m'\n}\n","/**\n * @import {Node as UnistNode, Parent as UnistParent} from 'unist'\n */\n\n/**\n * @typedef {Exclude<import('unist-util-is').Test, undefined> | undefined} Test\n * Test from `unist-util-is`.\n *\n * Note: we have remove and add `undefined`, because otherwise when generating\n * automatic `.d.ts` files, TS tries to flatten paths from a local perspective,\n * which doesn’t work when publishing on npm.\n */\n\n/**\n * @typedef {(\n * Fn extends (value: any) => value is infer Thing\n * ? Thing\n * : Fallback\n * )} Predicate\n * Get the value of a type guard `Fn`.\n * @template Fn\n * Value; typically function that is a type guard (such as `(x): x is Y`).\n * @template Fallback\n * Value to yield if `Fn` is not a type guard.\n */\n\n/**\n * @typedef {(\n * Check extends null | undefined // No test.\n * ? Value\n * : Value extends {type: Check} // String (type) test.\n * ? Value\n * : Value extends Check // Partial test.\n * ? Value\n * : Check extends Function // Function test.\n * ? Predicate<Check, Value> extends Value\n * ? Predicate<Check, Value>\n * : never\n * : never // Some other test?\n * )} MatchesOne\n * Check whether a node matches a primitive check in the type system.\n * @template Value\n * Value; typically unist `Node`.\n * @template Check\n * Value; typically `unist-util-is`-compatible test, but not arrays.\n */\n\n/**\n * @typedef {(\n * Check extends ReadonlyArray<infer T>\n * ? MatchesOne<Value, T>\n * : Check extends Array<infer T>\n * ? MatchesOne<Value, T>\n * : MatchesOne<Value, Check>\n * )} Matches\n * Check whether a node matches a check in the type system.\n * @template Value\n * Value; typically unist `Node`.\n * @template Check\n * Value; typically `unist-util-is`-compatible test.\n */\n\n/**\n * @typedef {0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10} Uint\n * Number; capped reasonably.\n */\n\n/**\n * @typedef {I extends 0 ? 1 : I extends 1 ? 2 : I extends 2 ? 3 : I extends 3 ? 4 : I extends 4 ? 5 : I extends 5 ? 6 : I extends 6 ? 7 : I extends 7 ? 8 : I extends 8 ? 9 : 10} Increment\n * Increment a number in the type system.\n * @template {Uint} [I=0]\n * Index.\n */\n\n/**\n * @typedef {(\n * Node extends UnistParent\n * ? Node extends {children: Array<infer Children>}\n * ? Child extends Children ? Node : never\n * : never\n * : never\n * )} InternalParent\n * Collect nodes that can be parents of `Child`.\n * @template {UnistNode} Node\n * All node types in a tree.\n * @template {UnistNode} Child\n * Node to search for.\n */\n\n/**\n * @typedef {InternalParent<InclusiveDescendant<Tree>, Child>} Parent\n * Collect nodes in `Tree` that can be parents of `Child`.\n * @template {UnistNode} Tree\n * All node types in a tree.\n * @template {UnistNode} Child\n * Node to search for.\n */\n\n/**\n * @typedef {(\n * Depth extends Max\n * ? never\n * :\n * | InternalParent<Node, Child>\n * | InternalAncestor<Node, InternalParent<Node, Child>, Max, Increment<Depth>>\n * )} InternalAncestor\n * Collect nodes in `Tree` that can be ancestors of `Child`.\n * @template {UnistNode} Node\n * All node types in a tree.\n * @template {UnistNode} Child\n * Node to search for.\n * @template {Uint} [Max=10]\n * Max; searches up to this depth.\n * @template {Uint} [Depth=0]\n * Current depth.\n */\n\n/**\n * @typedef {InternalAncestor<InclusiveDescendant<Tree>, Child>} Ancestor\n * Collect nodes in `Tree` that can be ancestors of `Child`.\n * @template {UnistNode} Tree\n * All node types in a tree.\n * @template {UnistNode} Child\n * Node to search for.\n */\n\n/**\n * @typedef {(\n * Tree extends UnistParent\n * ? Depth extends Max\n * ? Tree\n * : Tree | InclusiveDescendant<Tree['children'][number], Max, Increment<Depth>>\n * : Tree\n * )} InclusiveDescendant\n * Collect all (inclusive) descendants of `Tree`.\n *\n * > 👉 **Note**: for performance reasons, this seems to be the fastest way to\n * > recurse without actually running into an infinite loop, which the\n * > previous version did.\n * >\n * > Practically, a max of `2` is typically enough assuming a `Root` is\n * > passed, but it doesn’t improve performance.\n * > It gets higher with `List > ListItem > Table > TableRow > TableCell`.\n * > Using up to `10` doesn’t hurt or help either.\n * @template {UnistNode} Tree\n * Tree type.\n * @template {Uint} [Max=10]\n * Max; searches up to this depth.\n * @template {Uint} [Depth=0]\n * Current depth.\n */\n\n/**\n * @typedef {'skip' | boolean} Action\n * Union of the action types.\n *\n * @typedef {number} Index\n * Move to the sibling at `index` next (after node itself is completely\n * traversed).\n *\n * Useful if mutating the tree, such as removing the node the visitor is\n * currently on, or any of its previous siblings.\n * Results less than 0 or greater than or equal to `children.length` stop\n * traversing the parent.\n *\n * @typedef {[(Action | null | undefined | void)?, (Index | null | undefined)?]} ActionTuple\n * List with one or two values, the first an action, the second an index.\n *\n * @typedef {Action | ActionTuple | Index | null | undefined | void} VisitorResult\n * Any value that can be returned from a visitor.\n */\n\n/**\n * @callback Visitor\n * Handle a node (matching `test`, if given).\n *\n * Visitors are free to transform `node`.\n * They can also transform the parent of node (the last of `ancestors`).\n *\n * Replacing `node` itself, if `SKIP` is not returned, still causes its\n * descendants to be walked (which is a bug).\n *\n * When adding or removing previous siblings of `node` (or next siblings, in\n * case of reverse), the `Visitor` should return a new `Index` to specify the\n * sibling to traverse after `node` is traversed.\n * Adding or removing next siblings of `node` (or previous siblings, in case\n * of reverse) is handled as expected without needing to return a new `Index`.\n *\n * Removing the children property of an ancestor still results in them being\n * traversed.\n * @param {Visited} node\n * Found node.\n * @param {Array<VisitedParents>} ancestors\n * Ancestors of `node`.\n * @returns {VisitorResult}\n * What to do next.\n *\n * An `Index` is treated as a tuple of `[CONTINUE, Index]`.\n * An `Action` is treated as a tuple of `[Action]`.\n *\n * Passing a tuple back only makes sense if the `Action` is `SKIP`.\n * When the `Action` is `EXIT`, that action can be returned.\n * When the `Action` is `CONTINUE`, `Index` can be returned.\n * @template {UnistNode} [Visited=UnistNode]\n * Visited node type.\n * @template {UnistParent} [VisitedParents=UnistParent]\n * Ancestor type.\n */\n\n/**\n * @typedef {Visitor<Matches<InclusiveDescendant<Tree>, Check>, Ancestor<Tree, Matches<InclusiveDescendant<Tree>, Check>>>} BuildVisitor\n * Build a typed `Visitor` function from a tree and a test.\n *\n * It will infer which values are passed as `node` and which as `parents`.\n * @template {UnistNode} [Tree=UnistNode]\n * Tree type.\n * @template {Test} [Check=Test]\n * Test type.\n */\n\nimport {convert} from 'unist-util-is'\nimport {color} from 'unist-util-visit-parents/do-not-use-color'\n\n/** @type {Readonly<ActionTuple>} */\nconst empty = []\n\n/**\n * Continue traversing as normal.\n */\nexport const CONTINUE = true\n\n/**\n * Stop traversing immediately.\n */\nexport const EXIT = false\n\n/**\n * Do not traverse this node’s children.\n */\nexport const SKIP = 'skip'\n\n/**\n * Visit nodes, with ancestral information.\n *\n * This algorithm performs *depth-first* *tree traversal* in *preorder*\n * (**NLR**) or if `reverse` is given, in *reverse preorder* (**NRL**).\n *\n * You can choose for which nodes `visitor` is called by passing a `test`.\n * For complex tests, you should test yourself in `visitor`, as it will be\n * faster and will have improved type information.\n *\n * Walking the tree is an intensive task.\n * Make use of the return values of the visitor when possible.\n * Instead of walking a tree multiple times, walk it once, use `unist-util-is`\n * to check if a node matches, and then perform different operations.\n *\n * You can change the tree.\n * See `Visitor` for more info.\n *\n * @overload\n * @param {Tree} tree\n * @param {Check} check\n * @param {BuildVisitor<Tree, Check>} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {undefined}\n *\n * @overload\n * @param {Tree} tree\n * @param {BuildVisitor<Tree>} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {undefined}\n *\n * @param {UnistNode} tree\n * Tree to traverse.\n * @param {Visitor | Test} test\n * `unist-util-is`-compatible test\n * @param {Visitor | boolean | null | undefined} [visitor]\n * Handle each node.\n * @param {boolean | null | undefined} [reverse]\n * Traverse in reverse preorder (NRL) instead of the default preorder (NLR).\n * @returns {undefined}\n * Nothing.\n *\n * @template {UnistNode} Tree\n * Node type.\n * @template {Test} Check\n * `unist-util-is`-compatible test.\n */\nexport function visitParents(tree, test, visitor, reverse) {\n /** @type {Test} */\n let check\n\n if (typeof test === 'function' && typeof visitor !== 'function') {\n reverse = visitor\n // @ts-expect-error no visitor given, so `visitor` is test.\n visitor = test\n } else {\n // @ts-expect-error visitor given, so `test` isn’t a visitor.\n check = test\n }\n\n const is = convert(check)\n const step = reverse ? -1 : 1\n\n factory(tree, undefined, [])()\n\n /**\n * @param {UnistNode} node\n * @param {number | undefined} index\n * @param {Array<UnistParent>} parents\n */\n function factory(node, index, parents) {\n const value = /** @type {Record<string, unknown>} */ (\n node && typeof node === 'object' ? node : {}\n )\n\n if (typeof value.type === 'string') {\n const name =\n // `hast`\n typeof value.tagName === 'string'\n ? value.tagName\n : // `xast`\n typeof value.name === 'string'\n ? value.name\n : undefined\n\n Object.defineProperty(visit, 'name', {\n value:\n 'node (' + color(node.type + (name ? '<' + name + '>' : '')) + ')'\n })\n }\n\n return visit\n\n function visit() {\n /** @type {Readonly<ActionTuple>} */\n let result = empty\n /** @type {Readonly<ActionTuple>} */\n let subresult\n /** @type {number} */\n let offset\n /** @type {Array<UnistParent>} */\n let grandparents\n\n if (!test || is(node, index, parents[parents.length - 1] || undefined)) {\n // @ts-expect-error: `visitor` is now a visitor.\n result = toResult(visitor(node, parents))\n\n if (result[0] === EXIT) {\n return result\n }\n }\n\n if ('children' in node && node.children) {\n const nodeAsParent = /** @type {UnistParent} */ (node)\n\n if (nodeAsParent.children && result[0] !== SKIP) {\n offset = (reverse ? nodeAsParent.children.length : -1) + step\n grandparents = parents.concat(nodeAsParent)\n\n while (offset > -1 && offset < nodeAsParent.children.length) {\n const child = nodeAsParent.children[offset]\n\n subresult = factory(child, offset, grandparents)()\n\n if (subresult[0] === EXIT) {\n return subresult\n }\n\n offset =\n typeof subresult[1] === 'number' ? subresult[1] : offset + step\n }\n }\n }\n\n return result\n }\n }\n}\n\n/**\n * Turn a return value into a clean result.\n *\n * @param {VisitorResult} value\n * Valid return values from visitors.\n * @returns {Readonly<ActionTuple>}\n * Clean result.\n */\nfunction toResult(value) {\n if (Array.isArray(value)) {\n return value\n }\n\n if (typeof value === 'number') {\n return [CONTINUE, value]\n }\n\n return value === null || value === undefined ? empty : [value]\n}\n","/**\n * @import {Nodes, Parents, PhrasingContent, Root, Text} from 'mdast'\n * @import {BuildVisitor, Test, VisitorResult} from 'unist-util-visit-parents'\n */\n\n/**\n * @typedef RegExpMatchObject\n * Info on the match.\n * @property {number} index\n * The index of the search at which the result was found.\n * @property {string} input\n * A copy of the search string in the text node.\n * @property {[...Array<Parents>, Text]} stack\n * All ancestors of the text node, where the last node is the text itself.\n *\n * @typedef {RegExp | string} Find\n * Pattern to find.\n *\n * Strings are escaped and then turned into global expressions.\n *\n * @typedef {Array<FindAndReplaceTuple>} FindAndReplaceList\n * Several find and replaces, in array form.\n *\n * @typedef {[Find, Replace?]} FindAndReplaceTuple\n * Find and replace in tuple form.\n *\n * @typedef {ReplaceFunction | string | null | undefined} Replace\n * Thing to replace with.\n *\n * @callback ReplaceFunction\n * Callback called when a search matches.\n * @param {...any} parameters\n * The parameters are the result of corresponding search expression:\n *\n * * `value` (`string`) — whole match\n * * `...capture` (`Array<string>`) — matches from regex capture groups\n * * `match` (`RegExpMatchObject`) — info on the match\n * @returns {Array<PhrasingContent> | PhrasingContent | string | false | null | undefined}\n * Thing to replace with.\n *\n * * when `null`, `undefined`, `''`, remove the match\n * * …or when `false`, do not replace at all\n * * …or when `string`, replace with a text node of that value\n * * …or when `Node` or `Array<Node>`, replace with those nodes\n *\n * @typedef {[RegExp, ReplaceFunction]} Pair\n * Normalized find and replace.\n *\n * @typedef {Array<Pair>} Pairs\n * All find and replaced.\n *\n * @typedef Options\n * Configuration.\n * @property {Test | null | undefined} [ignore]\n * Test for which nodes to ignore (optional).\n */\n\nimport escape from 'escape-string-regexp'\nimport {visitParents} from 'unist-util-visit-parents'\nimport {convert} from 'unist-util-is'\n\n/**\n * Find patterns in a tree and replace them.\n *\n * The algorithm searches the tree in *preorder* for complete values in `Text`\n * nodes.\n * Partial matches are not supported.\n *\n * @param {Nodes} tree\n * Tree to change.\n * @param {FindAndReplaceList | FindAndReplaceTuple} list\n * Patterns to find.\n * @param {Options | null | undefined} [options]\n * Configuration (when `find` is not `Find`).\n * @returns {undefined}\n * Nothing.\n */\nexport function findAndReplace(tree, list, options) {\n const settings = options || {}\n const ignored = convert(settings.ignore || [])\n const pairs = toPairs(list)\n let pairIndex = -1\n\n while (++pairIndex < pairs.length) {\n visitParents(tree, 'text', visitor)\n }\n\n /** @type {BuildVisitor<Root, 'text'>} */\n function visitor(node, parents) {\n let index = -1\n /** @type {Parents | undefined} */\n let grandparent\n\n while (++index < parents.length) {\n const parent = parents[index]\n /** @type {Array<Nodes> | undefined} */\n const siblings = grandparent ? grandparent.children : undefined\n\n if (\n ignored(\n parent,\n siblings ? siblings.indexOf(parent) : undefined,\n grandparent\n )\n ) {\n return\n }\n\n grandparent = parent\n }\n\n if (grandparent) {\n return handler(node, parents)\n }\n }\n\n /**\n * Handle a text node which is not in an ignored parent.\n *\n * @param {Text} node\n * Text node.\n * @param {Array<Parents>} parents\n * Parents.\n * @returns {VisitorResult}\n * Result.\n */\n function handler(node, parents) {\n const parent = parents[parents.length - 1]\n const find = pairs[pairIndex][0]\n const replace = pairs[pairIndex][1]\n let start = 0\n /** @type {Array<Nodes>} */\n const siblings = parent.children\n const index = siblings.indexOf(node)\n let change = false\n /** @type {Array<PhrasingContent>} */\n let nodes = []\n\n find.lastIndex = 0\n\n let match = find.exec(node.value)\n\n while (match) {\n const position = match.index\n /** @type {RegExpMatchObject} */\n const matchObject = {\n index: match.index,\n input: match.input,\n stack: [...parents, node]\n }\n let value = replace(...match, matchObject)\n\n if (typeof value === 'string') {\n value = value.length > 0 ? {type: 'text', value} : undefined\n }\n\n // It wasn’t a match after all.\n if (value === false) {\n // False acts as if there was no match.\n // So we need to reset `lastIndex`, which currently being at the end of\n // the current match, to the beginning.\n find.lastIndex = position + 1\n } else {\n if (start !== position) {\n nodes.push({\n type: 'text',\n value: node.value.slice(start, position)\n })\n }\n\n if (Array.isArray(value)) {\n nodes.push(...value)\n } else if (value) {\n nodes.push(value)\n }\n\n start = position + match[0].length\n change = true\n }\n\n if (!find.global) {\n break\n }\n\n match = find.exec(node.value)\n }\n\n if (change) {\n if (start < node.value.length) {\n nodes.push({type: 'text', value: node.value.slice(start)})\n }\n\n parent.children.splice(index, 1, ...nodes)\n } else {\n nodes = [node]\n }\n\n return index + nodes.length\n }\n}\n\n/**\n * Turn a tuple or a list of tuples into pairs.\n *\n * @param {FindAndReplaceList | FindAndReplaceTuple} tupleOrList\n * Schema.\n * @returns {Pairs}\n * Clean pairs.\n */\nfunction toPairs(tupleOrList) {\n /** @type {Pairs} */\n const result = []\n\n if (!Array.isArray(tupleOrList)) {\n throw new TypeError('Expected find and replace tuple or list of tuples')\n }\n\n /** @type {FindAndReplaceList} */\n // @ts-expect-error: correct.\n const list =\n !tupleOrList[0] || Array.isArray(tupleOrList[0])\n ? tupleOrList\n : [tupleOrList]\n\n let index = -1\n\n while (++index < list.length) {\n const tuple = list[index]\n result.push([toExpression(tuple[0]), toFunction(tuple[1])])\n }\n\n return result\n}\n\n/**\n * Turn a find into an expression.\n *\n * @param {Find} find\n * Find.\n * @returns {RegExp}\n * Expression.\n */\nfunction toExpression(find) {\n return typeof find === 'string' ? new RegExp(escape(find), 'g') : find\n}\n\n/**\n * Turn a replace into a function.\n *\n * @param {Replace} replace\n * Replace.\n * @returns {ReplaceFunction}\n * Function.\n */\nfunction toFunction(replace) {\n return typeof replace === 'function'\n ? replace\n : function () {\n return replace\n }\n}\n","/**\n * @import {RegExpMatchObject, ReplaceFunction} from 'mdast-util-find-and-replace'\n * @import {CompileContext, Extension as FromMarkdownExtension, Handle as FromMarkdownHandle, Transform as FromMarkdownTransform} from 'mdast-util-from-markdown'\n * @import {ConstructName, Options as ToMarkdownExtension} from 'mdast-util-to-markdown'\n * @import {Link, PhrasingContent} from 'mdast'\n */\n\nimport {ccount} from 'ccount'\nimport {ok as assert} from 'devlop'\nimport {unicodePunctuation, unicodeWhitespace} from 'micromark-util-character'\nimport {findAndReplace} from 'mdast-util-find-and-replace'\n\n/** @type {ConstructName} */\nconst inConstruct = 'phrasing'\n/** @type {Array<ConstructName>} */\nconst notInConstruct = ['autolink', 'link', 'image', 'label']\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM autolink\n * literals in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM autolink literals.\n */\nexport function gfmAutolinkLiteralFromMarkdown() {\n return {\n transforms: [transformGfmAutolinkLiterals],\n enter: {\n literalAutolink: enterLiteralAutolink,\n literalAutolinkEmail: enterLiteralAutolinkValue,\n literalAutolinkHttp: enterLiteralAutolinkValue,\n literalAutolinkWww: enterLiteralAutolinkValue\n },\n exit: {\n literalAutolink: exitLiteralAutolink,\n literalAutolinkEmail: exitLiteralAutolinkEmail,\n literalAutolinkHttp: exitLiteralAutolinkHttp,\n literalAutolinkWww: exitLiteralAutolinkWww\n }\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM autolink\n * literals in markdown.\n *\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM autolink literals.\n */\nexport function gfmAutolinkLiteralToMarkdown() {\n return {\n unsafe: [\n {\n character: '@',\n before: '[+\\\\-.\\\\w]',\n after: '[\\\\-.\\\\w]',\n inConstruct,\n notInConstruct\n },\n {\n character: '.',\n before: '[Ww]',\n after: '[\\\\-.\\\\w]',\n inConstruct,\n notInConstruct\n },\n {\n character: ':',\n before: '[ps]',\n after: '\\\\/',\n inConstruct,\n notInConstruct\n }\n ]\n }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterLiteralAutolink(token) {\n this.enter({type: 'link', title: null, url: '', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterLiteralAutolinkValue(token) {\n this.config.enter.autolinkProtocol.call(this, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolinkHttp(token) {\n this.config.exit.autolinkProtocol.call(this, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolinkWww(token) {\n this.config.exit.data.call(this, token)\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'link')\n node.url = 'http://' + this.sliceSerialize(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolinkEmail(token) {\n this.config.exit.autolinkEmail.call(this, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolink(token) {\n this.exit(token)\n}\n\n/** @type {FromMarkdownTransform} */\nfunction transformGfmAutolinkLiterals(tree) {\n findAndReplace(\n tree,\n [\n [/(https?:\\/\\/|www(?=\\.))([-.\\w]+)([^ \\t\\r\\n]*)/gi, findUrl],\n [/(?<=^|\\s|\\p{P}|\\p{S})([-.\\w+]+)@([-\\w]+(?:\\.[-\\w]+)+)/gu, findEmail]\n ],\n {ignore: ['link', 'linkReference']}\n )\n}\n\n/**\n * @type {ReplaceFunction}\n * @param {string} _\n * @param {string} protocol\n * @param {string} domain\n * @param {string} path\n * @param {RegExpMatchObject} match\n * @returns {Array<PhrasingContent> | Link | false}\n */\n// eslint-disable-next-line max-params\nfunction findUrl(_, protocol, domain, path, match) {\n let prefix = ''\n\n // Not an expected previous character.\n if (!previous(match)) {\n return false\n }\n\n // Treat `www` as part of the domain.\n if (/^w/i.test(protocol)) {\n domain = protocol + domain\n protocol = ''\n prefix = 'http://'\n }\n\n if (!isCorrectDomain(domain)) {\n return false\n }\n\n const parts = splitUrl(domain + path)\n\n if (!parts[0]) return false\n\n /** @type {Link} */\n const result = {\n type: 'link',\n title: null,\n url: prefix + protocol + parts[0],\n children: [{type: 'text', value: protocol + parts[0]}]\n }\n\n if (parts[1]) {\n return [result, {type: 'text', value: parts[1]}]\n }\n\n return result\n}\n\n/**\n * @type {ReplaceFunction}\n * @param {string} _\n * @param {string} atext\n * @param {string} label\n * @param {RegExpMatchObject} match\n * @returns {Link | false}\n */\nfunction findEmail(_, atext, label, match) {\n if (\n // Not an expected previous character.\n !previous(match, true) ||\n // Label ends in not allowed character.\n /[-\\d_]$/.test(label)\n ) {\n return false\n }\n\n return {\n type: 'link',\n title: null,\n url: 'mailto:' + atext + '@' + label,\n children: [{type: 'text', value: atext + '@' + label}]\n }\n}\n\n/**\n * @param {string} domain\n * @returns {boolean}\n */\nfunction isCorrectDomain(domain) {\n const parts = domain.split('.')\n\n if (\n parts.length < 2 ||\n (parts[parts.length - 1] &&\n (/_/.test(parts[parts.length - 1]) ||\n !/[a-zA-Z\\d]/.test(parts[parts.length - 1]))) ||\n (parts[parts.length - 2] &&\n (/_/.test(parts[parts.length - 2]) ||\n !/[a-zA-Z\\d]/.test(parts[parts.length - 2])))\n ) {\n return false\n }\n\n return true\n}\n\n/**\n * @param {string} url\n * @returns {[string, string | undefined]}\n */\nfunction splitUrl(url) {\n const trailExec = /[!\"&'),.:;<>?\\]}]+$/.exec(url)\n\n if (!trailExec) {\n return [url, undefined]\n }\n\n url = url.slice(0, trailExec.index)\n\n let trail = trailExec[0]\n let closingParenIndex = trail.indexOf(')')\n const openingParens = ccount(url, '(')\n let closingParens = ccount(url, ')')\n\n while (closingParenIndex !== -1 && openingParens > closingParens) {\n url += trail.slice(0, closingParenIndex + 1)\n trail = trail.slice(closingParenIndex + 1)\n closingParenIndex = trail.indexOf(')')\n closingParens++\n }\n\n return [url, trail]\n}\n\n/**\n * @param {RegExpMatchObject} match\n * @param {boolean | null | undefined} [email=false]\n * @returns {boolean}\n */\nfunction previous(match, email) {\n const code = match.input.charCodeAt(match.index - 1)\n\n return (\n (match.index === 0 ||\n unicodeWhitespace(code) ||\n unicodePunctuation(code)) &&\n // If it’s an email, the previous character should not be a slash.\n (!email || code !== 47)\n )\n}\n","/**\n * Normalize an identifier (as found in references, definitions).\n *\n * Collapses markdown whitespace, trim, and then lower- and uppercase.\n *\n * Some characters are considered “uppercase”, such as U+03F4 (`ϴ`), but if their\n * lowercase counterpart (U+03B8 (`θ`)) is uppercased will result in a different\n * uppercase character (U+0398 (`Θ`)).\n * So, to get a canonical form, we perform both lower- and uppercase.\n *\n * Using uppercase last makes sure keys will never interact with default\n * prototypal values (such as `constructor`): nothing in the prototype of\n * `Object` is uppercase.\n *\n * @param {string} value\n * Identifier to normalize.\n * @returns {string}\n * Normalized identifier.\n */\nexport function normalizeIdentifier(value) {\n return value\n // Collapse markdown whitespace.\n .replace(/[\\t\\n\\r ]+/g, \" \")\n // Trim.\n .replace(/^ | $/g, '')\n // Some characters are considered “uppercase”, but if their lowercase\n // counterpart is uppercased will result in a different uppercase\n // character.\n // Hence, to get that form, we perform both lower- and uppercase.\n // Upper case makes sure keys will not interact with default prototypal\n // methods: no method is uppercase.\n .toLowerCase().toUpperCase();\n}","/**\n * @import {\n * CompileContext,\n * Extension as FromMarkdownExtension,\n * Handle as FromMarkdownHandle\n * } from 'mdast-util-from-markdown'\n * @import {ToMarkdownOptions} from 'mdast-util-gfm-footnote'\n * @import {\n * Handle as ToMarkdownHandle,\n * Map,\n * Options as ToMarkdownExtension\n * } from 'mdast-util-to-markdown'\n * @import {FootnoteDefinition, FootnoteReference} from 'mdast'\n */\n\nimport {ok as assert} from 'devlop'\nimport {normalizeIdentifier} from 'micromark-util-normalize-identifier'\n\nfootnoteReference.peek = footnoteReferencePeek\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteCallString() {\n this.buffer()\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteCall(token) {\n this.enter({type: 'footnoteReference', identifier: '', label: ''}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteDefinitionLabelString() {\n this.buffer()\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteDefinition(token) {\n this.enter(\n {type: 'footnoteDefinition', identifier: '', label: '', children: []},\n token\n )\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteCallString(token) {\n const label = this.resume()\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'footnoteReference')\n node.identifier = normalizeIdentifier(\n this.sliceSerialize(token)\n ).toLowerCase()\n node.label = label\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteCall(token) {\n this.exit(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteDefinitionLabelString(token) {\n const label = this.resume()\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'footnoteDefinition')\n node.identifier = normalizeIdentifier(\n this.sliceSerialize(token)\n ).toLowerCase()\n node.label = label\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteDefinition(token) {\n this.exit(token)\n}\n\n/** @type {ToMarkdownHandle} */\nfunction footnoteReferencePeek() {\n return '['\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {FootnoteReference} node\n */\nfunction footnoteReference(node, _, state, info) {\n const tracker = state.createTracker(info)\n let value = tracker.move('[^')\n const exit = state.enter('footnoteReference')\n const subexit = state.enter('reference')\n value += tracker.move(\n state.safe(state.associationId(node), {after: ']', before: value})\n )\n subexit()\n exit()\n value += tracker.move(']')\n return value\n}\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM footnotes\n * in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown`.\n */\nexport function gfmFootnoteFromMarkdown() {\n return {\n enter: {\n gfmFootnoteCallString: enterFootnoteCallString,\n gfmFootnoteCall: enterFootnoteCall,\n gfmFootnoteDefinitionLabelString: enterFootnoteDefinitionLabelString,\n gfmFootnoteDefinition: enterFootnoteDefinition\n },\n exit: {\n gfmFootnoteCallString: exitFootnoteCallString,\n gfmFootnoteCall: exitFootnoteCall,\n gfmFootnoteDefinitionLabelString: exitFootnoteDefinitionLabelString,\n gfmFootnoteDefinition: exitFootnoteDefinition\n }\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM footnotes\n * in markdown.\n *\n * @param {ToMarkdownOptions | null | undefined} [options]\n * Configuration (optional).\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown`.\n */\nexport function gfmFootnoteToMarkdown(options) {\n // To do: next major: change default.\n let firstLineBlank = false\n\n if (options && options.firstLineBlank) {\n firstLineBlank = true\n }\n\n return {\n handlers: {footnoteDefinition, footnoteReference},\n // This is on by default already.\n unsafe: [{character: '[', inConstruct: ['label', 'phrasing', 'reference']}]\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {FootnoteDefinition} node\n */\n function footnoteDefinition(node, _, state, info) {\n const tracker = state.createTracker(info)\n let value = tracker.move('[^')\n const exit = state.enter('footnoteDefinition')\n const subexit = state.enter('label')\n value += tracker.move(\n state.safe(state.associationId(node), {before: value, after: ']'})\n )\n subexit()\n\n value += tracker.move(']:')\n\n if (node.children && node.children.length > 0) {\n tracker.shift(4)\n\n value += tracker.move(\n (firstLineBlank ? '\\n' : ' ') +\n state.indentLines(\n state.containerFlow(node, tracker.current()),\n firstLineBlank ? mapAll : mapExceptFirst\n )\n )\n }\n\n exit()\n\n return value\n }\n}\n\n/** @type {Map} */\nfunction mapExceptFirst(line, index, blank) {\n return index === 0 ? line : mapAll(line, index, blank)\n}\n\n/** @type {Map} */\nfunction mapAll(line, index, blank) {\n return (blank ? '' : ' ') + line\n}\n","/**\n * @typedef {import('mdast').Delete} Delete\n *\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n *\n * @typedef {import('mdast-util-to-markdown').ConstructName} ConstructName\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n */\n\n/**\n * List of constructs that occur in phrasing (paragraphs, headings), but cannot\n * contain strikethrough.\n * So they sort of cancel each other out.\n * Note: could use a better name.\n *\n * Note: keep in sync with: <https://github.com/syntax-tree/mdast-util-to-markdown/blob/8ce8dbf/lib/unsafe.js#L14>\n *\n * @type {Array<ConstructName>}\n */\nconst constructsWithoutStrikethrough = [\n 'autolink',\n 'destinationLiteral',\n 'destinationRaw',\n 'reference',\n 'titleQuote',\n 'titleApostrophe'\n]\n\nhandleDelete.peek = peekDelete\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM\n * strikethrough in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown` to enable GFM strikethrough.\n */\nexport function gfmStrikethroughFromMarkdown() {\n return {\n canContainEols: ['delete'],\n enter: {strikethrough: enterStrikethrough},\n exit: {strikethrough: exitStrikethrough}\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM\n * strikethrough in markdown.\n *\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM strikethrough.\n */\nexport function gfmStrikethroughToMarkdown() {\n return {\n unsafe: [\n {\n character: '~',\n inConstruct: 'phrasing',\n notInConstruct: constructsWithoutStrikethrough\n }\n ],\n handlers: {delete: handleDelete}\n }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterStrikethrough(token) {\n this.enter({type: 'delete', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitStrikethrough(token) {\n this.exit(token)\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {Delete} node\n */\nfunction handleDelete(node, _, state, info) {\n const tracker = state.createTracker(info)\n const exit = state.enter('strikethrough')\n let value = tracker.move('~~')\n value += state.containerPhrasing(node, {\n ...tracker.current(),\n before: value,\n after: '~'\n })\n value += tracker.move('~~')\n exit()\n return value\n}\n\n/** @type {ToMarkdownHandle} */\nfunction peekDelete() {\n return '~'\n}\n","// To do: next major: remove.\n/**\n * @typedef {Options} MarkdownTableOptions\n * Configuration.\n */\n\n/**\n * @typedef Options\n * Configuration.\n * @property {boolean | null | undefined} [alignDelimiters=true]\n * Whether to align the delimiters (default: `true`);\n * they are aligned by default:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * Pass `false` to make them staggered:\n *\n * ```markdown\n * | Alpha | B |\n * | - | - |\n * | C | Delta |\n * ```\n * @property {ReadonlyArray<string | null | undefined> | string | null | undefined} [align]\n * How to align columns (default: `''`);\n * one style for all columns or styles for their respective columns;\n * each style is either `'l'` (left), `'r'` (right), or `'c'` (center);\n * other values are treated as `''`, which doesn’t place the colon in the\n * alignment row but does align left;\n * *only the lowercased first character is used, so `Right` is fine.*\n * @property {boolean | null | undefined} [delimiterEnd=true]\n * Whether to end each row with the delimiter (default: `true`).\n *\n * > 👉 **Note**: please don’t use this: it could create fragile structures\n * > that aren’t understandable to some markdown parsers.\n *\n * When `true`, there are ending delimiters:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * When `false`, there are no ending delimiters:\n *\n * ```markdown\n * | Alpha | B\n * | ----- | -----\n * | C | Delta\n * ```\n * @property {boolean | null | undefined} [delimiterStart=true]\n * Whether to begin each row with the delimiter (default: `true`).\n *\n * > 👉 **Note**: please don’t use this: it could create fragile structures\n * > that aren’t understandable to some markdown parsers.\n *\n * When `true`, there are starting delimiters:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * When `false`, there are no starting delimiters:\n *\n * ```markdown\n * Alpha | B |\n * ----- | ----- |\n * C | Delta |\n * ```\n * @property {boolean | null | undefined} [padding=true]\n * Whether to add a space of padding between delimiters and cells\n * (default: `true`).\n *\n * When `true`, there is padding:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * When `false`, there is no padding:\n *\n * ```markdown\n * |Alpha|B |\n * |-----|-----|\n * |C |Delta|\n * ```\n * @property {((value: string) => number) | null | undefined} [stringLength]\n * Function to detect the length of table cell content (optional);\n * this is used when aligning the delimiters (`|`) between table cells;\n * full-width characters and emoji mess up delimiter alignment when viewing\n * the markdown source;\n * to fix this, you can pass this function,\n * which receives the cell content and returns its “visible” size;\n * note that what is and isn’t visible depends on where the text is displayed.\n *\n * Without such a function, the following:\n *\n * ```js\n * markdownTable([\n * ['Alpha', 'Bravo'],\n * ['中文', 'Charlie'],\n * ['👩‍❤️‍👩', 'Delta']\n * ])\n * ```\n *\n * Yields:\n *\n * ```markdown\n * | Alpha | Bravo |\n * | - | - |\n * | 中文 | Charlie |\n * | 👩‍❤️‍👩 | Delta |\n * ```\n *\n * With [`string-width`](https://github.com/sindresorhus/string-width):\n *\n * ```js\n * import stringWidth from 'string-width'\n *\n * markdownTable(\n * [\n * ['Alpha', 'Bravo'],\n * ['中文', 'Charlie'],\n * ['👩‍❤️‍👩', 'Delta']\n * ],\n * {stringLength: stringWidth}\n * )\n * ```\n *\n * Yields:\n *\n * ```markdown\n * | Alpha | Bravo |\n * | ----- | ------- |\n * | 中文 | Charlie |\n * | 👩‍❤️‍👩 | Delta |\n * ```\n */\n\n/**\n * @param {string} value\n * Cell value.\n * @returns {number}\n * Cell size.\n */\nfunction defaultStringLength(value) {\n return value.length\n}\n\n/**\n * Generate a markdown\n * ([GFM](https://docs.github.com/en/github/writing-on-github/working-with-advanced-formatting/organizing-information-with-tables))\n * table.\n *\n * @param {ReadonlyArray<ReadonlyArray<string | null | undefined>>} table\n * Table data (matrix of strings).\n * @param {Readonly<Options> | null | undefined} [options]\n * Configuration (optional).\n * @returns {string}\n * Result.\n */\nexport function markdownTable(table, options) {\n const settings = options || {}\n // To do: next major: change to spread.\n const align = (settings.align || []).concat()\n const stringLength = settings.stringLength || defaultStringLength\n /** @type {Array<number>} Character codes as symbols for alignment per column. */\n const alignments = []\n /** @type {Array<Array<string>>} Cells per row. */\n const cellMatrix = []\n /** @type {Array<Array<number>>} Sizes of each cell per row. */\n const sizeMatrix = []\n /** @type {Array<number>} */\n const longestCellByColumn = []\n let mostCellsPerRow = 0\n let rowIndex = -1\n\n // This is a superfluous loop if we don’t align delimiters, but otherwise we’d\n // do superfluous work when aligning, so optimize for aligning.\n while (++rowIndex < table.length) {\n /** @type {Array<string>} */\n const row = []\n /** @type {Array<number>} */\n const sizes = []\n let columnIndex = -1\n\n if (table[rowIndex].length > mostCellsPerRow) {\n mostCellsPerRow = table[rowIndex].length\n }\n\n while (++columnIndex < table[rowIndex].length) {\n const cell = serialize(table[rowIndex][columnIndex])\n\n if (settings.alignDelimiters !== false) {\n const size = stringLength(cell)\n sizes[columnIndex] = size\n\n if (\n longestCellByColumn[columnIndex] === undefined ||\n size > longestCellByColumn[columnIndex]\n ) {\n longestCellByColumn[columnIndex] = size\n }\n }\n\n row.push(cell)\n }\n\n cellMatrix[rowIndex] = row\n sizeMatrix[rowIndex] = sizes\n }\n\n // Figure out which alignments to use.\n let columnIndex = -1\n\n if (typeof align === 'object' && 'length' in align) {\n while (++columnIndex < mostCellsPerRow) {\n alignments[columnIndex] = toAlignment(align[columnIndex])\n }\n } else {\n const code = toAlignment(align)\n\n while (++columnIndex < mostCellsPerRow) {\n alignments[columnIndex] = code\n }\n }\n\n // Inject the alignment row.\n columnIndex = -1\n /** @type {Array<string>} */\n const row = []\n /** @type {Array<number>} */\n const sizes = []\n\n while (++columnIndex < mostCellsPerRow) {\n const code = alignments[columnIndex]\n let before = ''\n let after = ''\n\n if (code === 99 /* `c` */) {\n before = ':'\n after = ':'\n } else if (code === 108 /* `l` */) {\n before = ':'\n } else if (code === 114 /* `r` */) {\n after = ':'\n }\n\n // There *must* be at least one hyphen-minus in each alignment cell.\n let size =\n settings.alignDelimiters === false\n ? 1\n : Math.max(\n 1,\n longestCellByColumn[columnIndex] - before.length - after.length\n )\n\n const cell = before + '-'.repeat(size) + after\n\n if (settings.alignDelimiters !== false) {\n size = before.length + size + after.length\n\n if (size > longestCellByColumn[columnIndex]) {\n longestCellByColumn[columnIndex] = size\n }\n\n sizes[columnIndex] = size\n }\n\n row[columnIndex] = cell\n }\n\n // Inject the alignment row.\n cellMatrix.splice(1, 0, row)\n sizeMatrix.splice(1, 0, sizes)\n\n rowIndex = -1\n /** @type {Array<string>} */\n const lines = []\n\n while (++rowIndex < cellMatrix.length) {\n const row = cellMatrix[rowIndex]\n const sizes = sizeMatrix[rowIndex]\n columnIndex = -1\n /** @type {Array<string>} */\n const line = []\n\n while (++columnIndex < mostCellsPerRow) {\n const cell = row[columnIndex] || ''\n let before = ''\n let after = ''\n\n if (settings.alignDelimiters !== false) {\n const size =\n longestCellByColumn[columnIndex] - (sizes[columnIndex] || 0)\n const code = alignments[columnIndex]\n\n if (code === 114 /* `r` */) {\n before = ' '.repeat(size)\n } else if (code === 99 /* `c` */) {\n if (size % 2) {\n before = ' '.repeat(size / 2 + 0.5)\n after = ' '.repeat(size / 2 - 0.5)\n } else {\n before = ' '.repeat(size / 2)\n after = before\n }\n } else {\n after = ' '.repeat(size)\n }\n }\n\n if (settings.delimiterStart !== false && !columnIndex) {\n line.push('|')\n }\n\n if (\n settings.padding !== false &&\n // Don’t add the opening space if we’re not aligning and the cell is\n // empty: there will be a closing space.\n !(settings.alignDelimiters === false && cell === '') &&\n (settings.delimiterStart !== false || columnIndex)\n ) {\n line.push(' ')\n }\n\n if (settings.alignDelimiters !== false) {\n line.push(before)\n }\n\n line.push(cell)\n\n if (settings.alignDelimiters !== false) {\n line.push(after)\n }\n\n if (settings.padding !== false) {\n line.push(' ')\n }\n\n if (\n settings.delimiterEnd !== false ||\n columnIndex !== mostCellsPerRow - 1\n ) {\n line.push('|')\n }\n }\n\n lines.push(\n settings.delimiterEnd === false\n ? line.join('').replace(/ +$/, '')\n : line.join('')\n )\n }\n\n return lines.join('\\n')\n}\n\n/**\n * @param {string | null | undefined} [value]\n * Value to serialize.\n * @returns {string}\n * Result.\n */\nfunction serialize(value) {\n return value === null || value === undefined ? '' : String(value)\n}\n\n/**\n * @param {string | null | undefined} value\n * Value.\n * @returns {number}\n * Alignment.\n */\nfunction toAlignment(value) {\n const code = typeof value === 'string' ? value.codePointAt(0) : 0\n\n return code === 67 /* `C` */ || code === 99 /* `c` */\n ? 99 /* `c` */\n : code === 76 /* `L` */ || code === 108 /* `l` */\n ? 108 /* `l` */\n : code === 82 /* `R` */ || code === 114 /* `r` */\n ? 114 /* `r` */\n : 0\n}\n","/**\n * @import {Blockquote, Parents} from 'mdast'\n * @import {Info, Map, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {Blockquote} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function blockquote(node, _, state, info) {\n const exit = state.enter('blockquote')\n const tracker = state.createTracker(info)\n tracker.move('> ')\n tracker.shift(2)\n const value = state.indentLines(\n state.containerFlow(node, tracker.current()),\n map\n )\n exit()\n return value\n}\n\n/** @type {Map} */\nfunction map(line, _, blank) {\n return '>' + (blank ? '' : ' ') + line\n}\n","/**\n * @import {ConstructName, Unsafe} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {Array<ConstructName>} stack\n * @param {Unsafe} pattern\n * @returns {boolean}\n */\nexport function patternInScope(stack, pattern) {\n return (\n listInScope(stack, pattern.inConstruct, true) &&\n !listInScope(stack, pattern.notInConstruct, false)\n )\n}\n\n/**\n * @param {Array<ConstructName>} stack\n * @param {Unsafe['inConstruct']} list\n * @param {boolean} none\n * @returns {boolean}\n */\nfunction listInScope(stack, list, none) {\n if (typeof list === 'string') {\n list = [list]\n }\n\n if (!list || list.length === 0) {\n return none\n }\n\n let index = -1\n\n while (++index < list.length) {\n if (stack.includes(list[index])) {\n return true\n }\n }\n\n return false\n}\n","/**\n * @import {Break, Parents} from 'mdast'\n * @import {Info, State} from 'mdast-util-to-markdown'\n */\n\nimport {patternInScope} from '../util/pattern-in-scope.js'\n\n/**\n * @param {Break} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function hardBreak(_, _1, state, info) {\n let index = -1\n\n while (++index < state.unsafe.length) {\n // If we can’t put eols in this construct (setext headings, tables), use a\n // space instead.\n if (\n state.unsafe[index].character === '\\n' &&\n patternInScope(state.stack, state.unsafe[index])\n ) {\n return /[ \\t]/.test(info.before) ? '' : ' '\n }\n }\n\n return '\\\\\\n'\n}\n","/**\n * Get the count of the longest repeating streak of `substring` in `value`.\n *\n * @param {string} value\n * Content to search in.\n * @param {string} substring\n * Substring to look for, typically one character.\n * @returns {number}\n * Count of most frequent adjacent `substring`s in `value`.\n */\nexport function longestStreak(value, substring) {\n const source = String(value)\n let index = source.indexOf(substring)\n let expected = index\n let count = 0\n let max = 0\n\n if (typeof substring !== 'string') {\n throw new TypeError('Expected substring')\n }\n\n while (index !== -1) {\n if (index === expected) {\n if (++count > max) {\n max = count\n }\n } else {\n count = 1\n }\n\n expected = index + substring.length\n index = source.indexOf(substring, expected)\n }\n\n return max\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Code} from 'mdast'\n */\n\n/**\n * @param {Code} node\n * @param {State} state\n * @returns {boolean}\n */\nexport function formatCodeAsIndented(node, state) {\n return Boolean(\n state.options.fences === false &&\n node.value &&\n // If there’s no info…\n !node.lang &&\n // And there’s a non-whitespace character…\n /[^ \\r\\n]/.test(node.value) &&\n // And the value doesn’t start or end in a blank…\n !/^[\\t ]*(?:[\\r\\n]|$)|(?:^|[\\r\\n])[\\t ]*$/.test(node.value)\n )\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['fence'], null | undefined>}\n */\nexport function checkFence(state) {\n const marker = state.options.fence || '`'\n\n if (marker !== '`' && marker !== '~') {\n throw new Error(\n 'Cannot serialize code with `' +\n marker +\n '` for `options.fence`, expected `` ` `` or `~`'\n )\n }\n\n return marker\n}\n","/**\n * @import {Info, Map, State} from 'mdast-util-to-markdown'\n * @import {Code, Parents} from 'mdast'\n */\n\nimport {longestStreak} from 'longest-streak'\nimport {formatCodeAsIndented} from '../util/format-code-as-indented.js'\nimport {checkFence} from '../util/check-fence.js'\n\n/**\n * @param {Code} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function code(node, _, state, info) {\n const marker = checkFence(state)\n const raw = node.value || ''\n const suffix = marker === '`' ? 'GraveAccent' : 'Tilde'\n\n if (formatCodeAsIndented(node, state)) {\n const exit = state.enter('codeIndented')\n const value = state.indentLines(raw, map)\n exit()\n return value\n }\n\n const tracker = state.createTracker(info)\n const sequence = marker.repeat(Math.max(longestStreak(raw, marker) + 1, 3))\n const exit = state.enter('codeFenced')\n let value = tracker.move(sequence)\n\n if (node.lang) {\n const subexit = state.enter(`codeFencedLang${suffix}`)\n value += tracker.move(\n state.safe(node.lang, {\n before: value,\n after: ' ',\n encode: ['`'],\n ...tracker.current()\n })\n )\n subexit()\n }\n\n if (node.lang && node.meta) {\n const subexit = state.enter(`codeFencedMeta${suffix}`)\n value += tracker.move(' ')\n value += tracker.move(\n state.safe(node.meta, {\n before: value,\n after: '\\n',\n encode: ['`'],\n ...tracker.current()\n })\n )\n subexit()\n }\n\n value += tracker.move('\\n')\n\n if (raw) {\n value += tracker.move(raw + '\\n')\n }\n\n value += tracker.move(sequence)\n exit()\n return value\n}\n\n/** @type {Map} */\nfunction map(line, _, blank) {\n return (blank ? '' : ' ') + line\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['quote'], null | undefined>}\n */\nexport function checkQuote(state) {\n const marker = state.options.quote || '\"'\n\n if (marker !== '\"' && marker !== \"'\") {\n throw new Error(\n 'Cannot serialize title with `' +\n marker +\n '` for `options.quote`, expected `\"`, or `\\'`'\n )\n }\n\n return marker\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Definition, Parents} from 'mdast'\n */\n\nimport {checkQuote} from '../util/check-quote.js'\n\n/**\n * @param {Definition} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function definition(node, _, state, info) {\n const quote = checkQuote(state)\n const suffix = quote === '\"' ? 'Quote' : 'Apostrophe'\n const exit = state.enter('definition')\n let subexit = state.enter('label')\n const tracker = state.createTracker(info)\n let value = tracker.move('[')\n value += tracker.move(\n state.safe(state.associationId(node), {\n before: value,\n after: ']',\n ...tracker.current()\n })\n )\n value += tracker.move(']: ')\n\n subexit()\n\n if (\n // If there’s no url, or…\n !node.url ||\n // If there are control characters or whitespace.\n /[\\0- \\u007F]/.test(node.url)\n ) {\n subexit = state.enter('destinationLiteral')\n value += tracker.move('<')\n value += tracker.move(\n state.safe(node.url, {before: value, after: '>', ...tracker.current()})\n )\n value += tracker.move('>')\n } else {\n // No whitespace, raw is prettier.\n subexit = state.enter('destinationRaw')\n value += tracker.move(\n state.safe(node.url, {\n before: value,\n after: node.title ? ' ' : '\\n',\n ...tracker.current()\n })\n )\n }\n\n subexit()\n\n if (node.title) {\n subexit = state.enter(`title${suffix}`)\n value += tracker.move(' ' + quote)\n value += tracker.move(\n state.safe(node.title, {\n before: value,\n after: quote,\n ...tracker.current()\n })\n )\n value += tracker.move(quote)\n subexit()\n }\n\n exit()\n\n return value\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['emphasis'], null | undefined>}\n */\nexport function checkEmphasis(state) {\n const marker = state.options.emphasis || '*'\n\n if (marker !== '*' && marker !== '_') {\n throw new Error(\n 'Cannot serialize emphasis with `' +\n marker +\n '` for `options.emphasis`, expected `*`, or `_`'\n )\n }\n\n return marker\n}\n","/**\n * Encode a code point as a character reference.\n *\n * @param {number} code\n * Code point to encode.\n * @returns {string}\n * Encoded character reference.\n */\nexport function encodeCharacterReference(code) {\n return '&#x' + code.toString(16).toUpperCase() + ';'\n}\n","/**\n * @import {Code} from 'micromark-util-types'\n */\n\nimport { markdownLineEndingOrSpace, unicodePunctuation, unicodeWhitespace } from 'micromark-util-character';\n/**\n * Classify whether a code represents whitespace, punctuation, or something\n * else.\n *\n * Used for attention (emphasis, strong), whose sequences can open or close\n * based on the class of surrounding characters.\n *\n * > 👉 **Note**: eof (`null`) is seen as whitespace.\n *\n * @param {Code} code\n * Code.\n * @returns {typeof constants.characterGroupWhitespace | typeof constants.characterGroupPunctuation | undefined}\n * Group.\n */\nexport function classifyCharacter(code) {\n if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n return 1;\n }\n if (unicodePunctuation(code)) {\n return 2;\n }\n}","/**\n * @import {EncodeSides} from '../types.js'\n */\n\nimport {classifyCharacter} from 'micromark-util-classify-character'\n\n/**\n * Check whether to encode (as a character reference) the characters\n * surrounding an attention run.\n *\n * Which characters are around an attention run influence whether it works or\n * not.\n *\n * See <https://github.com/orgs/syntax-tree/discussions/60> for more info.\n * See this markdown in a particular renderer to see what works:\n *\n * ```markdown\n * | | A (letter inside) | B (punctuation inside) | C (whitespace inside) | D (nothing inside) |\n * | ----------------------- | ----------------- | ---------------------- | --------------------- | ------------------ |\n * | 1 (letter outside) | x*y*z | x*.*z | x* *z | x**z |\n * | 2 (punctuation outside) | .*y*. | .*.*. | .* *. | .**. |\n * | 3 (whitespace outside) | x *y* z | x *.* z | x * * z | x ** z |\n * | 4 (nothing outside) | *x* | *.* | * * | ** |\n * ```\n *\n * @param {number} outside\n * Code point on the outer side of the run.\n * @param {number} inside\n * Code point on the inner side of the run.\n * @param {'*' | '_'} marker\n * Marker of the run.\n * Underscores are handled more strictly (they form less often) than\n * asterisks.\n * @returns {EncodeSides}\n * Whether to encode characters.\n */\n// Important: punctuation must never be encoded.\n// Punctuation is solely used by markdown constructs.\n// And by encoding itself.\n// Encoding them will break constructs or double encode things.\nexport function encodeInfo(outside, inside, marker) {\n const outsideKind = classifyCharacter(outside)\n const insideKind = classifyCharacter(inside)\n\n // Letter outside:\n if (outsideKind === undefined) {\n return insideKind === undefined\n ? // Letter inside:\n // we have to encode *both* letters for `_` as it is looser.\n // it already forms for `*` (and GFMs `~`).\n marker === '_'\n ? {inside: true, outside: true}\n : {inside: false, outside: false}\n : insideKind === 1\n ? // Whitespace inside: encode both (letter, whitespace).\n {inside: true, outside: true}\n : // Punctuation inside: encode outer (letter)\n {inside: false, outside: true}\n }\n\n // Whitespace outside:\n if (outsideKind === 1) {\n return insideKind === undefined\n ? // Letter inside: already forms.\n {inside: false, outside: false}\n : insideKind === 1\n ? // Whitespace inside: encode both (whitespace).\n {inside: true, outside: true}\n : // Punctuation inside: already forms.\n {inside: false, outside: false}\n }\n\n // Punctuation outside:\n return insideKind === undefined\n ? // Letter inside: already forms.\n {inside: false, outside: false}\n : insideKind === 1\n ? // Whitespace inside: encode inner (whitespace).\n {inside: true, outside: false}\n : // Punctuation inside: already forms.\n {inside: false, outside: false}\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Emphasis, Parents} from 'mdast'\n */\n\nimport {checkEmphasis} from '../util/check-emphasis.js'\nimport {encodeCharacterReference} from '../util/encode-character-reference.js'\nimport {encodeInfo} from '../util/encode-info.js'\n\nemphasis.peek = emphasisPeek\n\n/**\n * @param {Emphasis} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function emphasis(node, _, state, info) {\n const marker = checkEmphasis(state)\n const exit = state.enter('emphasis')\n const tracker = state.createTracker(info)\n const before = tracker.move(marker)\n\n let between = tracker.move(\n state.containerPhrasing(node, {\n after: marker,\n before,\n ...tracker.current()\n })\n )\n const betweenHead = between.charCodeAt(0)\n const open = encodeInfo(\n info.before.charCodeAt(info.before.length - 1),\n betweenHead,\n marker\n )\n\n if (open.inside) {\n between = encodeCharacterReference(betweenHead) + between.slice(1)\n }\n\n const betweenTail = between.charCodeAt(between.length - 1)\n const close = encodeInfo(info.after.charCodeAt(0), betweenTail, marker)\n\n if (close.inside) {\n between = between.slice(0, -1) + encodeCharacterReference(betweenTail)\n }\n\n const after = tracker.move(marker)\n\n exit()\n\n state.attentionEncodeSurroundingInfo = {\n after: close.outside,\n before: open.outside\n }\n return before + between + after\n}\n\n/**\n * @param {Emphasis} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @returns {string}\n */\nfunction emphasisPeek(_, _1, state) {\n return state.options.emphasis || '*'\n}\n","/**\n * @typedef {import('unist').Node} UnistNode\n * @typedef {import('unist').Parent} UnistParent\n * @typedef {import('unist-util-visit-parents').VisitorResult} VisitorResult\n */\n\n/**\n * @typedef {Exclude<import('unist-util-is').Test, undefined> | undefined} Test\n * Test from `unist-util-is`.\n *\n * Note: we have remove and add `undefined`, because otherwise when generating\n * automatic `.d.ts` files, TS tries to flatten paths from a local perspective,\n * which doesn’t work when publishing on npm.\n */\n\n// To do: use types from `unist-util-visit-parents` when it’s released.\n\n/**\n * @typedef {(\n * Fn extends (value: any) => value is infer Thing\n * ? Thing\n * : Fallback\n * )} Predicate\n * Get the value of a type guard `Fn`.\n * @template Fn\n * Value; typically function that is a type guard (such as `(x): x is Y`).\n * @template Fallback\n * Value to yield if `Fn` is not a type guard.\n */\n\n/**\n * @typedef {(\n * Check extends null | undefined // No test.\n * ? Value\n * : Value extends {type: Check} // String (type) test.\n * ? Value\n * : Value extends Check // Partial test.\n * ? Value\n * : Check extends Function // Function test.\n * ? Predicate<Check, Value> extends Value\n * ? Predicate<Check, Value>\n * : never\n * : never // Some other test?\n * )} MatchesOne\n * Check whether a node matches a primitive check in the type system.\n * @template Value\n * Value; typically unist `Node`.\n * @template Check\n * Value; typically `unist-util-is`-compatible test, but not arrays.\n */\n\n/**\n * @typedef {(\n * Check extends Array<any>\n * ? MatchesOne<Value, Check[keyof Check]>\n * : MatchesOne<Value, Check>\n * )} Matches\n * Check whether a node matches a check in the type system.\n * @template Value\n * Value; typically unist `Node`.\n * @template Check\n * Value; typically `unist-util-is`-compatible test.\n */\n\n/**\n * @typedef {0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10} Uint\n * Number; capped reasonably.\n */\n\n/**\n * @typedef {I extends 0 ? 1 : I extends 1 ? 2 : I extends 2 ? 3 : I extends 3 ? 4 : I extends 4 ? 5 : I extends 5 ? 6 : I extends 6 ? 7 : I extends 7 ? 8 : I extends 8 ? 9 : 10} Increment\n * Increment a number in the type system.\n * @template {Uint} [I=0]\n * Index.\n */\n\n/**\n * @typedef {(\n * Node extends UnistParent\n * ? Node extends {children: Array<infer Children>}\n * ? Child extends Children ? Node : never\n * : never\n * : never\n * )} InternalParent\n * Collect nodes that can be parents of `Child`.\n * @template {UnistNode} Node\n * All node types in a tree.\n * @template {UnistNode} Child\n * Node to search for.\n */\n\n/**\n * @typedef {InternalParent<InclusiveDescendant<Tree>, Child>} Parent\n * Collect nodes in `Tree` that can be parents of `Child`.\n * @template {UnistNode} Tree\n * All node types in a tree.\n * @template {UnistNode} Child\n * Node to search for.\n */\n\n/**\n * @typedef {(\n * Depth extends Max\n * ? never\n * :\n * | InternalParent<Node, Child>\n * | InternalAncestor<Node, InternalParent<Node, Child>, Max, Increment<Depth>>\n * )} InternalAncestor\n * Collect nodes in `Tree` that can be ancestors of `Child`.\n * @template {UnistNode} Node\n * All node types in a tree.\n * @template {UnistNode} Child\n * Node to search for.\n * @template {Uint} [Max=10]\n * Max; searches up to this depth.\n * @template {Uint} [Depth=0]\n * Current depth.\n */\n\n/**\n * @typedef {(\n * Tree extends UnistParent\n * ? Depth extends Max\n * ? Tree\n * : Tree | InclusiveDescendant<Tree['children'][number], Max, Increment<Depth>>\n * : Tree\n * )} InclusiveDescendant\n * Collect all (inclusive) descendants of `Tree`.\n *\n * > 👉 **Note**: for performance reasons, this seems to be the fastest way to\n * > recurse without actually running into an infinite loop, which the\n * > previous version did.\n * >\n * > Practically, a max of `2` is typically enough assuming a `Root` is\n * > passed, but it doesn’t improve performance.\n * > It gets higher with `List > ListItem > Table > TableRow > TableCell`.\n * > Using up to `10` doesn’t hurt or help either.\n * @template {UnistNode} Tree\n * Tree type.\n * @template {Uint} [Max=10]\n * Max; searches up to this depth.\n * @template {Uint} [Depth=0]\n * Current depth.\n */\n\n/**\n * @callback Visitor\n * Handle a node (matching `test`, if given).\n *\n * Visitors are free to transform `node`.\n * They can also transform `parent`.\n *\n * Replacing `node` itself, if `SKIP` is not returned, still causes its\n * descendants to be walked (which is a bug).\n *\n * When adding or removing previous siblings of `node` (or next siblings, in\n * case of reverse), the `Visitor` should return a new `Index` to specify the\n * sibling to traverse after `node` is traversed.\n * Adding or removing next siblings of `node` (or previous siblings, in case\n * of reverse) is handled as expected without needing to return a new `Index`.\n *\n * Removing the children property of `parent` still results in them being\n * traversed.\n * @param {Visited} node\n * Found node.\n * @param {Visited extends UnistNode ? number | undefined : never} index\n * Index of `node` in `parent`.\n * @param {Ancestor extends UnistParent ? Ancestor | undefined : never} parent\n * Parent of `node`.\n * @returns {VisitorResult}\n * What to do next.\n *\n * An `Index` is treated as a tuple of `[CONTINUE, Index]`.\n * An `Action` is treated as a tuple of `[Action]`.\n *\n * Passing a tuple back only makes sense if the `Action` is `SKIP`.\n * When the `Action` is `EXIT`, that action can be returned.\n * When the `Action` is `CONTINUE`, `Index` can be returned.\n * @template {UnistNode} [Visited=UnistNode]\n * Visited node type.\n * @template {UnistParent} [Ancestor=UnistParent]\n * Ancestor type.\n */\n\n/**\n * @typedef {Visitor<Visited, Parent<Ancestor, Visited>>} BuildVisitorFromMatch\n * Build a typed `Visitor` function from a node and all possible parents.\n *\n * It will infer which values are passed as `node` and which as `parent`.\n * @template {UnistNode} Visited\n * Node type.\n * @template {UnistParent} Ancestor\n * Parent type.\n */\n\n/**\n * @typedef {(\n * BuildVisitorFromMatch<\n * Matches<Descendant, Check>,\n * Extract<Descendant, UnistParent>\n * >\n * )} BuildVisitorFromDescendants\n * Build a typed `Visitor` function from a list of descendants and a test.\n *\n * It will infer which values are passed as `node` and which as `parent`.\n * @template {UnistNode} Descendant\n * Node type.\n * @template {Test} Check\n * Test type.\n */\n\n/**\n * @typedef {(\n * BuildVisitorFromDescendants<\n * InclusiveDescendant<Tree>,\n * Check\n * >\n * )} BuildVisitor\n * Build a typed `Visitor` function from a tree and a test.\n *\n * It will infer which values are passed as `node` and which as `parent`.\n * @template {UnistNode} [Tree=UnistNode]\n * Node type.\n * @template {Test} [Check=Test]\n * Test type.\n */\n\nimport {visitParents} from 'unist-util-visit-parents'\n\nexport {CONTINUE, EXIT, SKIP} from 'unist-util-visit-parents'\n\n/**\n * Visit nodes.\n *\n * This algorithm performs *depth-first* *tree traversal* in *preorder*\n * (**NLR**) or if `reverse` is given, in *reverse preorder* (**NRL**).\n *\n * You can choose for which nodes `visitor` is called by passing a `test`.\n * For complex tests, you should test yourself in `visitor`, as it will be\n * faster and will have improved type information.\n *\n * Walking the tree is an intensive task.\n * Make use of the return values of the visitor when possible.\n * Instead of walking a tree multiple times, walk it once, use `unist-util-is`\n * to check if a node matches, and then perform different operations.\n *\n * You can change the tree.\n * See `Visitor` for more info.\n *\n * @overload\n * @param {Tree} tree\n * @param {Check} check\n * @param {BuildVisitor<Tree, Check>} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {undefined}\n *\n * @overload\n * @param {Tree} tree\n * @param {BuildVisitor<Tree>} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {undefined}\n *\n * @param {UnistNode} tree\n * Tree to traverse.\n * @param {Visitor | Test} testOrVisitor\n * `unist-util-is`-compatible test (optional, omit to pass a visitor).\n * @param {Visitor | boolean | null | undefined} [visitorOrReverse]\n * Handle each node (when test is omitted, pass `reverse`).\n * @param {boolean | null | undefined} [maybeReverse=false]\n * Traverse in reverse preorder (NRL) instead of the default preorder (NLR).\n * @returns {undefined}\n * Nothing.\n *\n * @template {UnistNode} Tree\n * Node type.\n * @template {Test} Check\n * `unist-util-is`-compatible test.\n */\nexport function visit(tree, testOrVisitor, visitorOrReverse, maybeReverse) {\n /** @type {boolean | null | undefined} */\n let reverse\n /** @type {Test} */\n let test\n /** @type {Visitor} */\n let visitor\n\n if (\n typeof testOrVisitor === 'function' &&\n typeof visitorOrReverse !== 'function'\n ) {\n test = undefined\n visitor = testOrVisitor\n reverse = visitorOrReverse\n } else {\n // @ts-expect-error: assume the overload with test was given.\n test = testOrVisitor\n // @ts-expect-error: assume the overload with test was given.\n visitor = visitorOrReverse\n reverse = maybeReverse\n }\n\n visitParents(tree, test, overload, reverse)\n\n /**\n * @param {UnistNode} node\n * @param {Array<UnistParent>} parents\n */\n function overload(node, parents) {\n const parent = parents[parents.length - 1]\n const index = parent ? parent.children.indexOf(node) : undefined\n return visitor(node, index, parent)\n }\n}\n","/**\n * @typedef {import('mdast').Nodes} Nodes\n *\n * @typedef Options\n * Configuration (optional).\n * @property {boolean | null | undefined} [includeImageAlt=true]\n * Whether to use `alt` for `image`s (default: `true`).\n * @property {boolean | null | undefined} [includeHtml=true]\n * Whether to use `value` of HTML (default: `true`).\n */\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/**\n * Get the text content of a node or list of nodes.\n *\n * Prefers the node’s plain-text fields, otherwise serializes its children,\n * and if the given value is an array, serialize the nodes in it.\n *\n * @param {unknown} [value]\n * Thing to serialize, typically `Node`.\n * @param {Options | null | undefined} [options]\n * Configuration (optional).\n * @returns {string}\n * Serialized `value`.\n */\nexport function toString(value, options) {\n const settings = options || emptyOptions\n const includeImageAlt =\n typeof settings.includeImageAlt === 'boolean'\n ? settings.includeImageAlt\n : true\n const includeHtml =\n typeof settings.includeHtml === 'boolean' ? settings.includeHtml : true\n\n return one(value, includeImageAlt, includeHtml)\n}\n\n/**\n * One node or several nodes.\n *\n * @param {unknown} value\n * Thing to serialize.\n * @param {boolean} includeImageAlt\n * Include image `alt`s.\n * @param {boolean} includeHtml\n * Include HTML.\n * @returns {string}\n * Serialized node.\n */\nfunction one(value, includeImageAlt, includeHtml) {\n if (node(value)) {\n if ('value' in value) {\n return value.type === 'html' && !includeHtml ? '' : value.value\n }\n\n if (includeImageAlt && 'alt' in value && value.alt) {\n return value.alt\n }\n\n if ('children' in value) {\n return all(value.children, includeImageAlt, includeHtml)\n }\n }\n\n if (Array.isArray(value)) {\n return all(value, includeImageAlt, includeHtml)\n }\n\n return ''\n}\n\n/**\n * Serialize a list of nodes.\n *\n * @param {Array<unknown>} values\n * Thing to serialize.\n * @param {boolean} includeImageAlt\n * Include image `alt`s.\n * @param {boolean} includeHtml\n * Include HTML.\n * @returns {string}\n * Serialized nodes.\n */\nfunction all(values, includeImageAlt, includeHtml) {\n /** @type {Array<string>} */\n const result = []\n let index = -1\n\n while (++index < values.length) {\n result[index] = one(values[index], includeImageAlt, includeHtml)\n }\n\n return result.join('')\n}\n\n/**\n * Check if `value` looks like a node.\n *\n * @param {unknown} value\n * Thing.\n * @returns {value is Nodes}\n * Whether `value` is a node.\n */\nfunction node(value) {\n return Boolean(value && typeof value === 'object')\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Heading} from 'mdast'\n */\n\nimport {EXIT, visit} from 'unist-util-visit'\nimport {toString} from 'mdast-util-to-string'\n\n/**\n * @param {Heading} node\n * @param {State} state\n * @returns {boolean}\n */\nexport function formatHeadingAsSetext(node, state) {\n let literalWithBreak = false\n\n // Look for literals with a line break.\n // Note that this also\n visit(node, function (node) {\n if (\n ('value' in node && /\\r?\\n|\\r/.test(node.value)) ||\n node.type === 'break'\n ) {\n literalWithBreak = true\n return EXIT\n }\n })\n\n return Boolean(\n (!node.depth || node.depth < 3) &&\n toString(node) &&\n (state.options.setext || literalWithBreak)\n )\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Heading, Parents} from 'mdast'\n */\n\nimport {encodeCharacterReference} from '../util/encode-character-reference.js'\nimport {formatHeadingAsSetext} from '../util/format-heading-as-setext.js'\n\n/**\n * @param {Heading} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function heading(node, _, state, info) {\n const rank = Math.max(Math.min(6, node.depth || 1), 1)\n const tracker = state.createTracker(info)\n\n if (formatHeadingAsSetext(node, state)) {\n const exit = state.enter('headingSetext')\n const subexit = state.enter('phrasing')\n const value = state.containerPhrasing(node, {\n ...tracker.current(),\n before: '\\n',\n after: '\\n'\n })\n subexit()\n exit()\n\n return (\n value +\n '\\n' +\n (rank === 1 ? '=' : '-').repeat(\n // The whole size…\n value.length -\n // Minus the position of the character after the last EOL (or\n // 0 if there is none)…\n (Math.max(value.lastIndexOf('\\r'), value.lastIndexOf('\\n')) + 1)\n )\n )\n }\n\n const sequence = '#'.repeat(rank)\n const exit = state.enter('headingAtx')\n const subexit = state.enter('phrasing')\n\n // Note: for proper tracking, we should reset the output positions when there\n // is no content returned, because then the space is not output.\n // Practically, in that case, there is no content, so it doesn’t matter that\n // we’ve tracked one too many characters.\n tracker.move(sequence + ' ')\n\n let value = state.containerPhrasing(node, {\n before: '# ',\n after: '\\n',\n ...tracker.current()\n })\n\n if (/^[\\t ]/.test(value)) {\n // To do: what effect has the character reference on tracking?\n value = encodeCharacterReference(value.charCodeAt(0)) + value.slice(1)\n }\n\n value = value ? sequence + ' ' + value : sequence\n\n if (state.options.closeAtx) {\n value += ' ' + sequence\n }\n\n subexit()\n exit()\n\n return value\n}\n","/**\n * @import {Html} from 'mdast'\n */\n\nhtml.peek = htmlPeek\n\n/**\n * @param {Html} node\n * @returns {string}\n */\nexport function html(node) {\n return node.value || ''\n}\n\n/**\n * @returns {string}\n */\nfunction htmlPeek() {\n return '<'\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Image, Parents} from 'mdast'\n */\n\nimport {checkQuote} from '../util/check-quote.js'\n\nimage.peek = imagePeek\n\n/**\n * @param {Image} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function image(node, _, state, info) {\n const quote = checkQuote(state)\n const suffix = quote === '\"' ? 'Quote' : 'Apostrophe'\n const exit = state.enter('image')\n let subexit = state.enter('label')\n const tracker = state.createTracker(info)\n let value = tracker.move('![')\n value += tracker.move(\n state.safe(node.alt, {before: value, after: ']', ...tracker.current()})\n )\n value += tracker.move('](')\n\n subexit()\n\n if (\n // If there’s no url but there is a title…\n (!node.url && node.title) ||\n // If there are control characters or whitespace.\n /[\\0- \\u007F]/.test(node.url)\n ) {\n subexit = state.enter('destinationLiteral')\n value += tracker.move('<')\n value += tracker.move(\n state.safe(node.url, {before: value, after: '>', ...tracker.current()})\n )\n value += tracker.move('>')\n } else {\n // No whitespace, raw is prettier.\n subexit = state.enter('destinationRaw')\n value += tracker.move(\n state.safe(node.url, {\n before: value,\n after: node.title ? ' ' : ')',\n ...tracker.current()\n })\n )\n }\n\n subexit()\n\n if (node.title) {\n subexit = state.enter(`title${suffix}`)\n value += tracker.move(' ' + quote)\n value += tracker.move(\n state.safe(node.title, {\n before: value,\n after: quote,\n ...tracker.current()\n })\n )\n value += tracker.move(quote)\n subexit()\n }\n\n value += tracker.move(')')\n exit()\n\n return value\n}\n\n/**\n * @returns {string}\n */\nfunction imagePeek() {\n return '!'\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {ImageReference, Parents} from 'mdast'\n */\n\nimageReference.peek = imageReferencePeek\n\n/**\n * @param {ImageReference} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function imageReference(node, _, state, info) {\n const type = node.referenceType\n const exit = state.enter('imageReference')\n let subexit = state.enter('label')\n const tracker = state.createTracker(info)\n let value = tracker.move('![')\n const alt = state.safe(node.alt, {\n before: value,\n after: ']',\n ...tracker.current()\n })\n value += tracker.move(alt + '][')\n\n subexit()\n // Hide the fact that we’re in phrasing, because escapes don’t work.\n const stack = state.stack\n state.stack = []\n subexit = state.enter('reference')\n // Note: for proper tracking, we should reset the output positions when we end\n // up making a `shortcut` reference, because then there is no brace output.\n // Practically, in that case, there is no content, so it doesn’t matter that\n // we’ve tracked one too many characters.\n const reference = state.safe(state.associationId(node), {\n before: value,\n after: ']',\n ...tracker.current()\n })\n subexit()\n state.stack = stack\n exit()\n\n if (type === 'full' || !alt || alt !== reference) {\n value += tracker.move(reference + ']')\n } else if (type === 'shortcut') {\n // Remove the unwanted `[`.\n value = value.slice(0, -1)\n } else {\n value += tracker.move(']')\n }\n\n return value\n}\n\n/**\n * @returns {string}\n */\nfunction imageReferencePeek() {\n return '!'\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {InlineCode, Parents} from 'mdast'\n */\n\ninlineCode.peek = inlineCodePeek\n\n/**\n * @param {InlineCode} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @returns {string}\n */\nexport function inlineCode(node, _, state) {\n let value = node.value || ''\n let sequence = '`'\n let index = -1\n\n // If there is a single grave accent on its own in the code, use a fence of\n // two.\n // If there are two in a row, use one.\n while (new RegExp('(^|[^`])' + sequence + '([^`]|$)').test(value)) {\n sequence += '`'\n }\n\n // If this is not just spaces or eols (tabs don’t count), and either the\n // first or last character are a space, eol, or tick, then pad with spaces.\n if (\n /[^ \\r\\n]/.test(value) &&\n ((/^[ \\r\\n]/.test(value) && /[ \\r\\n]$/.test(value)) || /^`|`$/.test(value))\n ) {\n value = ' ' + value + ' '\n }\n\n // We have a potential problem: certain characters after eols could result in\n // blocks being seen.\n // For example, if someone injected the string `'\\n# b'`, then that would\n // result in an ATX heading.\n // We can’t escape characters in `inlineCode`, but because eols are\n // transformed to spaces when going from markdown to HTML anyway, we can swap\n // them out.\n while (++index < state.unsafe.length) {\n const pattern = state.unsafe[index]\n const expression = state.compilePattern(pattern)\n /** @type {RegExpExecArray | null} */\n let match\n\n // Only look for `atBreak`s.\n // Btw: note that `atBreak` patterns will always start the regex at LF or\n // CR.\n if (!pattern.atBreak) continue\n\n while ((match = expression.exec(value))) {\n let position = match.index\n\n // Support CRLF (patterns only look for one of the characters).\n if (\n value.charCodeAt(position) === 10 /* `\\n` */ &&\n value.charCodeAt(position - 1) === 13 /* `\\r` */\n ) {\n position--\n }\n\n value = value.slice(0, position) + ' ' + value.slice(match.index + 1)\n }\n }\n\n return sequence + value + sequence\n}\n\n/**\n * @returns {string}\n */\nfunction inlineCodePeek() {\n return '`'\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Link} from 'mdast'\n */\n\nimport {toString} from 'mdast-util-to-string'\n\n/**\n * @param {Link} node\n * @param {State} state\n * @returns {boolean}\n */\nexport function formatLinkAsAutolink(node, state) {\n const raw = toString(node)\n\n return Boolean(\n !state.options.resourceLink &&\n // If there’s a url…\n node.url &&\n // And there’s a no title…\n !node.title &&\n // And the content of `node` is a single text node…\n node.children &&\n node.children.length === 1 &&\n node.children[0].type === 'text' &&\n // And if the url is the same as the content…\n (raw === node.url || 'mailto:' + raw === node.url) &&\n // And that starts w/ a protocol…\n /^[a-z][a-z+.-]+:/i.test(node.url) &&\n // And that doesn’t contain ASCII control codes (character escapes and\n // references don’t work), space, or angle brackets…\n !/[\\0- <>\\u007F]/.test(node.url)\n )\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Link, Parents} from 'mdast'\n * @import {Exit} from '../types.js'\n */\n\nimport {checkQuote} from '../util/check-quote.js'\nimport {formatLinkAsAutolink} from '../util/format-link-as-autolink.js'\n\nlink.peek = linkPeek\n\n/**\n * @param {Link} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function link(node, _, state, info) {\n const quote = checkQuote(state)\n const suffix = quote === '\"' ? 'Quote' : 'Apostrophe'\n const tracker = state.createTracker(info)\n /** @type {Exit} */\n let exit\n /** @type {Exit} */\n let subexit\n\n if (formatLinkAsAutolink(node, state)) {\n // Hide the fact that we’re in phrasing, because escapes don’t work.\n const stack = state.stack\n state.stack = []\n exit = state.enter('autolink')\n let value = tracker.move('<')\n value += tracker.move(\n state.containerPhrasing(node, {\n before: value,\n after: '>',\n ...tracker.current()\n })\n )\n value += tracker.move('>')\n exit()\n state.stack = stack\n return value\n }\n\n exit = state.enter('link')\n subexit = state.enter('label')\n let value = tracker.move('[')\n value += tracker.move(\n state.containerPhrasing(node, {\n before: value,\n after: '](',\n ...tracker.current()\n })\n )\n value += tracker.move('](')\n subexit()\n\n if (\n // If there’s no url but there is a title…\n (!node.url && node.title) ||\n // If there are control characters or whitespace.\n /[\\0- \\u007F]/.test(node.url)\n ) {\n subexit = state.enter('destinationLiteral')\n value += tracker.move('<')\n value += tracker.move(\n state.safe(node.url, {before: value, after: '>', ...tracker.current()})\n )\n value += tracker.move('>')\n } else {\n // No whitespace, raw is prettier.\n subexit = state.enter('destinationRaw')\n value += tracker.move(\n state.safe(node.url, {\n before: value,\n after: node.title ? ' ' : ')',\n ...tracker.current()\n })\n )\n }\n\n subexit()\n\n if (node.title) {\n subexit = state.enter(`title${suffix}`)\n value += tracker.move(' ' + quote)\n value += tracker.move(\n state.safe(node.title, {\n before: value,\n after: quote,\n ...tracker.current()\n })\n )\n value += tracker.move(quote)\n subexit()\n }\n\n value += tracker.move(')')\n\n exit()\n return value\n}\n\n/**\n * @param {Link} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @returns {string}\n */\nfunction linkPeek(node, _, state) {\n return formatLinkAsAutolink(node, state) ? '<' : '['\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {LinkReference, Parents} from 'mdast'\n */\n\nlinkReference.peek = linkReferencePeek\n\n/**\n * @param {LinkReference} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function linkReference(node, _, state, info) {\n const type = node.referenceType\n const exit = state.enter('linkReference')\n let subexit = state.enter('label')\n const tracker = state.createTracker(info)\n let value = tracker.move('[')\n const text = state.containerPhrasing(node, {\n before: value,\n after: ']',\n ...tracker.current()\n })\n value += tracker.move(text + '][')\n\n subexit()\n // Hide the fact that we’re in phrasing, because escapes don’t work.\n const stack = state.stack\n state.stack = []\n subexit = state.enter('reference')\n // Note: for proper tracking, we should reset the output positions when we end\n // up making a `shortcut` reference, because then there is no brace output.\n // Practically, in that case, there is no content, so it doesn’t matter that\n // we’ve tracked one too many characters.\n const reference = state.safe(state.associationId(node), {\n before: value,\n after: ']',\n ...tracker.current()\n })\n subexit()\n state.stack = stack\n exit()\n\n if (type === 'full' || !text || text !== reference) {\n value += tracker.move(reference + ']')\n } else if (type === 'shortcut') {\n // Remove the unwanted `[`.\n value = value.slice(0, -1)\n } else {\n value += tracker.move(']')\n }\n\n return value\n}\n\n/**\n * @returns {string}\n */\nfunction linkReferencePeek() {\n return '['\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['bullet'], null | undefined>}\n */\nexport function checkBullet(state) {\n const marker = state.options.bullet || '*'\n\n if (marker !== '*' && marker !== '+' && marker !== '-') {\n throw new Error(\n 'Cannot serialize items with `' +\n marker +\n '` for `options.bullet`, expected `*`, `+`, or `-`'\n )\n }\n\n return marker\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\nimport {checkBullet} from './check-bullet.js'\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['bullet'], null | undefined>}\n */\nexport function checkBulletOther(state) {\n const bullet = checkBullet(state)\n const bulletOther = state.options.bulletOther\n\n if (!bulletOther) {\n return bullet === '*' ? '-' : '*'\n }\n\n if (bulletOther !== '*' && bulletOther !== '+' && bulletOther !== '-') {\n throw new Error(\n 'Cannot serialize items with `' +\n bulletOther +\n '` for `options.bulletOther`, expected `*`, `+`, or `-`'\n )\n }\n\n if (bulletOther === bullet) {\n throw new Error(\n 'Expected `bullet` (`' +\n bullet +\n '`) and `bulletOther` (`' +\n bulletOther +\n '`) to be different'\n )\n }\n\n return bulletOther\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['bulletOrdered'], null | undefined>}\n */\nexport function checkBulletOrdered(state) {\n const marker = state.options.bulletOrdered || '.'\n\n if (marker !== '.' && marker !== ')') {\n throw new Error(\n 'Cannot serialize items with `' +\n marker +\n '` for `options.bulletOrdered`, expected `.` or `)`'\n )\n }\n\n return marker\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['rule'], null | undefined>}\n */\nexport function checkRule(state) {\n const marker = state.options.rule || '*'\n\n if (marker !== '*' && marker !== '-' && marker !== '_') {\n throw new Error(\n 'Cannot serialize rules with `' +\n marker +\n '` for `options.rule`, expected `*`, `-`, or `_`'\n )\n }\n\n return marker\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {List, Parents} from 'mdast'\n */\n\nimport {checkBullet} from '../util/check-bullet.js'\nimport {checkBulletOther} from '../util/check-bullet-other.js'\nimport {checkBulletOrdered} from '../util/check-bullet-ordered.js'\nimport {checkRule} from '../util/check-rule.js'\n\n/**\n * @param {List} node\n * @param {Parents | undefined} parent\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function list(node, parent, state, info) {\n const exit = state.enter('list')\n const bulletCurrent = state.bulletCurrent\n /** @type {string} */\n let bullet = node.ordered ? checkBulletOrdered(state) : checkBullet(state)\n /** @type {string} */\n const bulletOther = node.ordered\n ? bullet === '.'\n ? ')'\n : '.'\n : checkBulletOther(state)\n let useDifferentMarker =\n parent && state.bulletLastUsed ? bullet === state.bulletLastUsed : false\n\n if (!node.ordered) {\n const firstListItem = node.children ? node.children[0] : undefined\n\n // If there’s an empty first list item directly in two list items,\n // we have to use a different bullet:\n //\n // ```markdown\n // * - *\n // ```\n //\n // …because otherwise it would become one big thematic break.\n if (\n // Bullet could be used as a thematic break marker:\n (bullet === '*' || bullet === '-') &&\n // Empty first list item:\n firstListItem &&\n (!firstListItem.children || !firstListItem.children[0]) &&\n // Directly in two other list items:\n state.stack[state.stack.length - 1] === 'list' &&\n state.stack[state.stack.length - 2] === 'listItem' &&\n state.stack[state.stack.length - 3] === 'list' &&\n state.stack[state.stack.length - 4] === 'listItem' &&\n // That are each the first child.\n state.indexStack[state.indexStack.length - 1] === 0 &&\n state.indexStack[state.indexStack.length - 2] === 0 &&\n state.indexStack[state.indexStack.length - 3] === 0\n ) {\n useDifferentMarker = true\n }\n\n // If there’s a thematic break at the start of the first list item,\n // we have to use a different bullet:\n //\n // ```markdown\n // * ---\n // ```\n //\n // …because otherwise it would become one big thematic break.\n if (checkRule(state) === bullet && firstListItem) {\n let index = -1\n\n while (++index < node.children.length) {\n const item = node.children[index]\n\n if (\n item &&\n item.type === 'listItem' &&\n item.children &&\n item.children[0] &&\n item.children[0].type === 'thematicBreak'\n ) {\n useDifferentMarker = true\n break\n }\n }\n }\n }\n\n if (useDifferentMarker) {\n bullet = bulletOther\n }\n\n state.bulletCurrent = bullet\n const value = state.containerFlow(node, info)\n state.bulletLastUsed = bullet\n state.bulletCurrent = bulletCurrent\n exit()\n return value\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['listItemIndent'], null | undefined>}\n */\nexport function checkListItemIndent(state) {\n const style = state.options.listItemIndent || 'one'\n\n if (style !== 'tab' && style !== 'one' && style !== 'mixed') {\n throw new Error(\n 'Cannot serialize items with `' +\n style +\n '` for `options.listItemIndent`, expected `tab`, `one`, or `mixed`'\n )\n }\n\n return style\n}\n","/**\n * @import {Info, Map, State} from 'mdast-util-to-markdown'\n * @import {ListItem, Parents} from 'mdast'\n */\n\nimport {checkBullet} from '../util/check-bullet.js'\nimport {checkListItemIndent} from '../util/check-list-item-indent.js'\n\n/**\n * @param {ListItem} node\n * @param {Parents | undefined} parent\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function listItem(node, parent, state, info) {\n const listItemIndent = checkListItemIndent(state)\n let bullet = state.bulletCurrent || checkBullet(state)\n\n // Add the marker value for ordered lists.\n if (parent && parent.type === 'list' && parent.ordered) {\n bullet =\n (typeof parent.start === 'number' && parent.start > -1\n ? parent.start\n : 1) +\n (state.options.incrementListMarker === false\n ? 0\n : parent.children.indexOf(node)) +\n bullet\n }\n\n let size = bullet.length + 1\n\n if (\n listItemIndent === 'tab' ||\n (listItemIndent === 'mixed' &&\n ((parent && parent.type === 'list' && parent.spread) || node.spread))\n ) {\n size = Math.ceil(size / 4) * 4\n }\n\n const tracker = state.createTracker(info)\n tracker.move(bullet + ' '.repeat(size - bullet.length))\n tracker.shift(size)\n const exit = state.enter('listItem')\n const value = state.indentLines(\n state.containerFlow(node, tracker.current()),\n map\n )\n exit()\n\n return value\n\n /** @type {Map} */\n function map(line, index, blank) {\n if (index) {\n return (blank ? '' : ' '.repeat(size)) + line\n }\n\n return (blank ? bullet : bullet + ' '.repeat(size - bullet.length)) + line\n }\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Paragraph, Parents} from 'mdast'\n */\n\n/**\n * @param {Paragraph} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function paragraph(node, _, state, info) {\n const exit = state.enter('paragraph')\n const subexit = state.enter('phrasing')\n const value = state.containerPhrasing(node, info)\n subexit()\n exit()\n return value\n}\n","/**\n * @typedef {import('mdast').Html} Html\n * @typedef {import('mdast').PhrasingContent} PhrasingContent\n */\n\nimport {convert} from 'unist-util-is'\n\n/**\n * Check if the given value is *phrasing content*.\n *\n * > 👉 **Note**: Excludes `html`, which can be both phrasing or flow.\n *\n * @param node\n * Thing to check, typically `Node`.\n * @returns\n * Whether `value` is phrasing content.\n */\n\nexport const phrasing =\n /** @type {(node?: unknown) => node is Exclude<PhrasingContent, Html>} */\n (\n convert([\n 'break',\n 'delete',\n 'emphasis',\n // To do: next major: removed since footnotes were added to GFM.\n 'footnote',\n 'footnoteReference',\n 'image',\n 'imageReference',\n 'inlineCode',\n // Enabled by `mdast-util-math`:\n 'inlineMath',\n 'link',\n 'linkReference',\n // Enabled by `mdast-util-mdx`:\n 'mdxJsxTextElement',\n // Enabled by `mdast-util-mdx`:\n 'mdxTextExpression',\n 'strong',\n 'text',\n // Enabled by `mdast-util-directive`:\n 'textDirective'\n ])\n )\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Parents, Root} from 'mdast'\n */\n\nimport {phrasing} from 'mdast-util-phrasing'\n\n/**\n * @param {Root} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function root(node, _, state, info) {\n // Note: `html` nodes are ambiguous.\n const hasPhrasing = node.children.some(function (d) {\n return phrasing(d)\n })\n\n const container = hasPhrasing ? state.containerPhrasing : state.containerFlow\n return container.call(state, node, info)\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['strong'], null | undefined>}\n */\nexport function checkStrong(state) {\n const marker = state.options.strong || '*'\n\n if (marker !== '*' && marker !== '_') {\n throw new Error(\n 'Cannot serialize strong with `' +\n marker +\n '` for `options.strong`, expected `*`, or `_`'\n )\n }\n\n return marker\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Parents, Strong} from 'mdast'\n */\n\nimport {checkStrong} from '../util/check-strong.js'\nimport {encodeCharacterReference} from '../util/encode-character-reference.js'\nimport {encodeInfo} from '../util/encode-info.js'\n\nstrong.peek = strongPeek\n\n/**\n * @param {Strong} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function strong(node, _, state, info) {\n const marker = checkStrong(state)\n const exit = state.enter('strong')\n const tracker = state.createTracker(info)\n const before = tracker.move(marker + marker)\n\n let between = tracker.move(\n state.containerPhrasing(node, {\n after: marker,\n before,\n ...tracker.current()\n })\n )\n const betweenHead = between.charCodeAt(0)\n const open = encodeInfo(\n info.before.charCodeAt(info.before.length - 1),\n betweenHead,\n marker\n )\n\n if (open.inside) {\n between = encodeCharacterReference(betweenHead) + between.slice(1)\n }\n\n const betweenTail = between.charCodeAt(between.length - 1)\n const close = encodeInfo(info.after.charCodeAt(0), betweenTail, marker)\n\n if (close.inside) {\n between = between.slice(0, -1) + encodeCharacterReference(betweenTail)\n }\n\n const after = tracker.move(marker + marker)\n\n exit()\n\n state.attentionEncodeSurroundingInfo = {\n after: close.outside,\n before: open.outside\n }\n return before + between + after\n}\n\n/**\n * @param {Strong} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @returns {string}\n */\nfunction strongPeek(_, _1, state) {\n return state.options.strong || '*'\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Parents, Text} from 'mdast'\n */\n\n/**\n * @param {Text} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function text(node, _, state, info) {\n return state.safe(node.value, info)\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['ruleRepetition'], null | undefined>}\n */\nexport function checkRuleRepetition(state) {\n const repetition = state.options.ruleRepetition || 3\n\n if (repetition < 3) {\n throw new Error(\n 'Cannot serialize rules with repetition `' +\n repetition +\n '` for `options.ruleRepetition`, expected `3` or more'\n )\n }\n\n return repetition\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Parents, ThematicBreak} from 'mdast'\n */\n\nimport {checkRuleRepetition} from '../util/check-rule-repetition.js'\nimport {checkRule} from '../util/check-rule.js'\n\n/**\n * @param {ThematicBreak} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @returns {string}\n */\nexport function thematicBreak(_, _1, state) {\n const value = (\n checkRule(state) + (state.options.ruleSpaces ? ' ' : '')\n ).repeat(checkRuleRepetition(state))\n\n return state.options.ruleSpaces ? value.slice(0, -1) : value\n}\n","import {blockquote} from './blockquote.js'\nimport {hardBreak} from './break.js'\nimport {code} from './code.js'\nimport {definition} from './definition.js'\nimport {emphasis} from './emphasis.js'\nimport {heading} from './heading.js'\nimport {html} from './html.js'\nimport {image} from './image.js'\nimport {imageReference} from './image-reference.js'\nimport {inlineCode} from './inline-code.js'\nimport {link} from './link.js'\nimport {linkReference} from './link-reference.js'\nimport {list} from './list.js'\nimport {listItem} from './list-item.js'\nimport {paragraph} from './paragraph.js'\nimport {root} from './root.js'\nimport {strong} from './strong.js'\nimport {text} from './text.js'\nimport {thematicBreak} from './thematic-break.js'\n\n/**\n * Default (CommonMark) handlers.\n */\nexport const handle = {\n blockquote,\n break: hardBreak,\n code,\n definition,\n emphasis,\n hardBreak,\n heading,\n html,\n image,\n imageReference,\n inlineCode,\n link,\n linkReference,\n list,\n listItem,\n paragraph,\n root,\n strong,\n text,\n thematicBreak\n}\n","/**\n * @typedef {import('mdast').InlineCode} InlineCode\n * @typedef {import('mdast').Table} Table\n * @typedef {import('mdast').TableCell} TableCell\n * @typedef {import('mdast').TableRow} TableRow\n *\n * @typedef {import('markdown-table').Options} MarkdownTableOptions\n *\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n *\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').State} State\n * @typedef {import('mdast-util-to-markdown').Info} Info\n */\n\n/**\n * @typedef Options\n * Configuration.\n * @property {boolean | null | undefined} [tableCellPadding=true]\n * Whether to add a space of padding between delimiters and cells (default:\n * `true`).\n * @property {boolean | null | undefined} [tablePipeAlign=true]\n * Whether to align the delimiters (default: `true`).\n * @property {MarkdownTableOptions['stringLength'] | null | undefined} [stringLength]\n * Function to detect the length of table cell content, used when aligning\n * the delimiters between cells (optional).\n */\n\nimport {ok as assert} from 'devlop'\nimport {markdownTable} from 'markdown-table'\nimport {defaultHandlers} from 'mdast-util-to-markdown'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM tables in\n * markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown` to enable GFM tables.\n */\nexport function gfmTableFromMarkdown() {\n return {\n enter: {\n table: enterTable,\n tableData: enterCell,\n tableHeader: enterCell,\n tableRow: enterRow\n },\n exit: {\n codeText: exitCodeText,\n table: exitTable,\n tableData: exit,\n tableHeader: exit,\n tableRow: exit\n }\n }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterTable(token) {\n const align = token._align\n assert(align, 'expected `_align` on table')\n this.enter(\n {\n type: 'table',\n align: align.map(function (d) {\n return d === 'none' ? null : d\n }),\n children: []\n },\n token\n )\n this.data.inTable = true\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitTable(token) {\n this.exit(token)\n this.data.inTable = undefined\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterRow(token) {\n this.enter({type: 'tableRow', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exit(token) {\n this.exit(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterCell(token) {\n this.enter({type: 'tableCell', children: []}, token)\n}\n\n// Overwrite the default code text data handler to unescape escaped pipes when\n// they are in tables.\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitCodeText(token) {\n let value = this.resume()\n\n if (this.data.inTable) {\n value = value.replace(/\\\\([\\\\|])/g, replace)\n }\n\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'inlineCode')\n node.value = value\n this.exit(token)\n}\n\n/**\n * @param {string} $0\n * @param {string} $1\n * @returns {string}\n */\nfunction replace($0, $1) {\n // Pipes work, backslashes don’t (but can’t escape pipes).\n return $1 === '|' ? $1 : $0\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM tables in\n * markdown.\n *\n * @param {Options | null | undefined} [options]\n * Configuration.\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM tables.\n */\nexport function gfmTableToMarkdown(options) {\n const settings = options || {}\n const padding = settings.tableCellPadding\n const alignDelimiters = settings.tablePipeAlign\n const stringLength = settings.stringLength\n const around = padding ? ' ' : '|'\n\n return {\n unsafe: [\n {character: '\\r', inConstruct: 'tableCell'},\n {character: '\\n', inConstruct: 'tableCell'},\n // A pipe, when followed by a tab or space (padding), or a dash or colon\n // (unpadded delimiter row), could result in a table.\n {atBreak: true, character: '|', after: '[\\t :-]'},\n // A pipe in a cell must be encoded.\n {character: '|', inConstruct: 'tableCell'},\n // A colon must be followed by a dash, in which case it could start a\n // delimiter row.\n {atBreak: true, character: ':', after: '-'},\n // A delimiter row can also start with a dash, when followed by more\n // dashes, a colon, or a pipe.\n // This is a stricter version than the built in check for lists, thematic\n // breaks, and setex heading underlines though:\n // <https://github.com/syntax-tree/mdast-util-to-markdown/blob/51a2038/lib/unsafe.js#L57>\n {atBreak: true, character: '-', after: '[:|-]'}\n ],\n handlers: {\n inlineCode: inlineCodeWithTable,\n table: handleTable,\n tableCell: handleTableCell,\n tableRow: handleTableRow\n }\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {Table} node\n */\n function handleTable(node, _, state, info) {\n return serializeData(handleTableAsData(node, state, info), node.align)\n }\n\n /**\n * This function isn’t really used normally, because we handle rows at the\n * table level.\n * But, if someone passes in a table row, this ensures we make somewhat sense.\n *\n * @type {ToMarkdownHandle}\n * @param {TableRow} node\n */\n function handleTableRow(node, _, state, info) {\n const row = handleTableRowAsData(node, state, info)\n const value = serializeData([row])\n // `markdown-table` will always add an align row\n return value.slice(0, value.indexOf('\\n'))\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {TableCell} node\n */\n function handleTableCell(node, _, state, info) {\n const exit = state.enter('tableCell')\n const subexit = state.enter('phrasing')\n const value = state.containerPhrasing(node, {\n ...info,\n before: around,\n after: around\n })\n subexit()\n exit()\n return value\n }\n\n /**\n * @param {Array<Array<string>>} matrix\n * @param {Array<string | null | undefined> | null | undefined} [align]\n */\n function serializeData(matrix, align) {\n return markdownTable(matrix, {\n align,\n // @ts-expect-error: `markdown-table` types should support `null`.\n alignDelimiters,\n // @ts-expect-error: `markdown-table` types should support `null`.\n padding,\n // @ts-expect-error: `markdown-table` types should support `null`.\n stringLength\n })\n }\n\n /**\n * @param {Table} node\n * @param {State} state\n * @param {Info} info\n */\n function handleTableAsData(node, state, info) {\n const children = node.children\n let index = -1\n /** @type {Array<Array<string>>} */\n const result = []\n const subexit = state.enter('table')\n\n while (++index < children.length) {\n result[index] = handleTableRowAsData(children[index], state, info)\n }\n\n subexit()\n\n return result\n }\n\n /**\n * @param {TableRow} node\n * @param {State} state\n * @param {Info} info\n */\n function handleTableRowAsData(node, state, info) {\n const children = node.children\n let index = -1\n /** @type {Array<string>} */\n const result = []\n const subexit = state.enter('tableRow')\n\n while (++index < children.length) {\n // Note: the positional info as used here is incorrect.\n // Making it correct would be impossible due to aligning cells?\n // And it would need copy/pasting `markdown-table` into this project.\n result[index] = handleTableCell(children[index], node, state, info)\n }\n\n subexit()\n\n return result\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {InlineCode} node\n */\n function inlineCodeWithTable(node, parent, state) {\n let value = defaultHandlers.inlineCode(node, parent, state)\n\n if (state.stack.includes('tableCell')) {\n value = value.replace(/\\|/g, '\\\\$&')\n }\n\n return value\n }\n}\n","/**\n * @typedef {import('mdast').ListItem} ListItem\n * @typedef {import('mdast').Paragraph} Paragraph\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n */\n\nimport {ok as assert} from 'devlop'\nimport {defaultHandlers} from 'mdast-util-to-markdown'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM task\n * list items in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown` to enable GFM task list items.\n */\nexport function gfmTaskListItemFromMarkdown() {\n return {\n exit: {\n taskListCheckValueChecked: exitCheck,\n taskListCheckValueUnchecked: exitCheck,\n paragraph: exitParagraphWithTaskListItem\n }\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM task list\n * items in markdown.\n *\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM task list items.\n */\nexport function gfmTaskListItemToMarkdown() {\n return {\n unsafe: [{atBreak: true, character: '-', after: '[:|-]'}],\n handlers: {listItem: listItemWithTaskListItem}\n }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitCheck(token) {\n // We’re always in a paragraph, in a list item.\n const node = this.stack[this.stack.length - 2]\n assert(node.type === 'listItem')\n node.checked = token.type === 'taskListCheckValueChecked'\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitParagraphWithTaskListItem(token) {\n const parent = this.stack[this.stack.length - 2]\n\n if (\n parent &&\n parent.type === 'listItem' &&\n typeof parent.checked === 'boolean'\n ) {\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'paragraph')\n const head = node.children[0]\n\n if (head && head.type === 'text') {\n const siblings = parent.children\n let index = -1\n /** @type {Paragraph | undefined} */\n let firstParaghraph\n\n while (++index < siblings.length) {\n const sibling = siblings[index]\n if (sibling.type === 'paragraph') {\n firstParaghraph = sibling\n break\n }\n }\n\n if (firstParaghraph === node) {\n // Must start with a space or a tab.\n head.value = head.value.slice(1)\n\n if (head.value.length === 0) {\n node.children.shift()\n } else if (\n node.position &&\n head.position &&\n typeof head.position.start.offset === 'number'\n ) {\n head.position.start.column++\n head.position.start.offset++\n node.position.start = Object.assign({}, head.position.start)\n }\n }\n }\n }\n\n this.exit(token)\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {ListItem} node\n */\nfunction listItemWithTaskListItem(node, parent, state, info) {\n const head = node.children[0]\n const checkable =\n typeof node.checked === 'boolean' && head && head.type === 'paragraph'\n const checkbox = '[' + (node.checked ? 'x' : ' ') + '] '\n const tracker = state.createTracker(info)\n\n if (checkable) {\n tracker.move(checkbox)\n }\n\n let value = defaultHandlers.listItem(node, parent, state, {\n ...info,\n ...tracker.current()\n })\n\n if (checkable) {\n value = value.replace(/^(?:[*+-]|\\d+\\.)([\\r\\n]| {1,3})/, check)\n }\n\n return value\n\n /**\n * @param {string} $0\n * @returns {string}\n */\n function check($0) {\n return $0 + checkbox\n }\n}\n","/**\n * @import {Extension as FromMarkdownExtension} from 'mdast-util-from-markdown'\n * @import {Options} from 'mdast-util-gfm'\n * @import {Options as ToMarkdownExtension} from 'mdast-util-to-markdown'\n */\n\nimport {\n gfmAutolinkLiteralFromMarkdown,\n gfmAutolinkLiteralToMarkdown\n} from 'mdast-util-gfm-autolink-literal'\nimport {\n gfmFootnoteFromMarkdown,\n gfmFootnoteToMarkdown\n} from 'mdast-util-gfm-footnote'\nimport {\n gfmStrikethroughFromMarkdown,\n gfmStrikethroughToMarkdown\n} from 'mdast-util-gfm-strikethrough'\nimport {gfmTableFromMarkdown, gfmTableToMarkdown} from 'mdast-util-gfm-table'\nimport {\n gfmTaskListItemFromMarkdown,\n gfmTaskListItemToMarkdown\n} from 'mdast-util-gfm-task-list-item'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM (autolink\n * literals, footnotes, strikethrough, tables, tasklists).\n *\n * @returns {Array<FromMarkdownExtension>}\n * Extension for `mdast-util-from-markdown` to enable GFM (autolink literals,\n * footnotes, strikethrough, tables, tasklists).\n */\nexport function gfmFromMarkdown() {\n return [\n gfmAutolinkLiteralFromMarkdown(),\n gfmFootnoteFromMarkdown(),\n gfmStrikethroughFromMarkdown(),\n gfmTableFromMarkdown(),\n gfmTaskListItemFromMarkdown()\n ]\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM (autolink\n * literals, footnotes, strikethrough, tables, tasklists).\n *\n * @param {Options | null | undefined} [options]\n * Configuration (optional).\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM (autolink literals,\n * footnotes, strikethrough, tables, tasklists).\n */\nexport function gfmToMarkdown(options) {\n return {\n extensions: [\n gfmAutolinkLiteralToMarkdown(),\n gfmFootnoteToMarkdown(options),\n gfmStrikethroughToMarkdown(),\n gfmTableToMarkdown(options),\n gfmTaskListItemToMarkdown()\n ]\n }\n}\n","/**\n * Like `Array#splice`, but smarter for giant arrays.\n *\n * `Array#splice` takes all items to be inserted as individual argument which\n * causes a stack overflow in V8 when trying to insert 100k items for instance.\n *\n * Otherwise, this does not return the removed items, and takes `items` as an\n * array instead of rest parameters.\n *\n * @template {unknown} T\n * Item type.\n * @param {Array<T>} list\n * List to operate on.\n * @param {number} start\n * Index to remove/insert at (can be negative).\n * @param {number} remove\n * Number of items to remove.\n * @param {Array<T>} items\n * Items to inject into `list`.\n * @returns {undefined}\n * Nothing.\n */\nexport function splice(list, start, remove, items) {\n const end = list.length;\n let chunkStart = 0;\n /** @type {Array<unknown>} */\n let parameters;\n\n // Make start between zero and `end` (included).\n if (start < 0) {\n start = -start > end ? 0 : end + start;\n } else {\n start = start > end ? end : start;\n }\n remove = remove > 0 ? remove : 0;\n\n // No need to chunk the items if there’s only a couple (10k) items.\n if (items.length < 10000) {\n parameters = Array.from(items);\n parameters.unshift(start, remove);\n // @ts-expect-error Hush, it’s fine.\n list.splice(...parameters);\n } else {\n // Delete `remove` items starting from `start`\n if (remove) list.splice(start, remove);\n\n // Insert the items in chunks to not cause stack overflows.\n while (chunkStart < items.length) {\n parameters = items.slice(chunkStart, chunkStart + 10000);\n parameters.unshift(start, 0);\n // @ts-expect-error Hush, it’s fine.\n list.splice(...parameters);\n chunkStart += 10000;\n start += 10000;\n }\n }\n}\n\n/**\n * Append `items` (an array) at the end of `list` (another array).\n * When `list` was empty, returns `items` instead.\n *\n * This prevents a potentially expensive operation when `list` is empty,\n * and adds items in batches to prevent V8 from hanging.\n *\n * @template {unknown} T\n * Item type.\n * @param {Array<T>} list\n * List to operate on.\n * @param {Array<T>} items\n * Items to add to `list`.\n * @returns {Array<T>}\n * Either `list` or `items`.\n */\nexport function push(list, items) {\n if (list.length > 0) {\n splice(list, list.length, 0, items);\n return list;\n }\n return items;\n}","/**\n * @import {\n * Extension,\n * Handles,\n * HtmlExtension,\n * NormalizedExtension\n * } from 'micromark-util-types'\n */\n\nimport {splice} from 'micromark-util-chunked'\n\nconst hasOwnProperty = {}.hasOwnProperty\n\n/**\n * Combine multiple syntax extensions into one.\n *\n * @param {ReadonlyArray<Extension>} extensions\n * List of syntax extensions.\n * @returns {NormalizedExtension}\n * A single combined extension.\n */\nexport function combineExtensions(extensions) {\n /** @type {NormalizedExtension} */\n const all = {}\n let index = -1\n\n while (++index < extensions.length) {\n syntaxExtension(all, extensions[index])\n }\n\n return all\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {NormalizedExtension} all\n * Extension to merge into.\n * @param {Extension} extension\n * Extension to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction syntaxExtension(all, extension) {\n /** @type {keyof Extension} */\n let hook\n\n for (hook in extension) {\n const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n /** @type {Record<string, unknown>} */\n const left = maybe || (all[hook] = {})\n /** @type {Record<string, unknown> | undefined} */\n const right = extension[hook]\n /** @type {string} */\n let code\n\n if (right) {\n for (code in right) {\n if (!hasOwnProperty.call(left, code)) left[code] = []\n const value = right[code]\n constructs(\n // @ts-expect-error Looks like a list.\n left[code],\n Array.isArray(value) ? value : value ? [value] : []\n )\n }\n }\n }\n}\n\n/**\n * Merge `list` into `existing` (both lists of constructs).\n * Mutates `existing`.\n *\n * @param {Array<unknown>} existing\n * List of constructs to merge into.\n * @param {Array<unknown>} list\n * List of constructs to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction constructs(existing, list) {\n let index = -1\n /** @type {Array<unknown>} */\n const before = []\n\n while (++index < list.length) {\n // @ts-expect-error Looks like an object.\n ;(list[index].add === 'after' ? existing : before).push(list[index])\n }\n\n splice(existing, 0, 0, before)\n}\n\n/**\n * Combine multiple HTML extensions into one.\n *\n * @param {ReadonlyArray<HtmlExtension>} htmlExtensions\n * List of HTML extensions.\n * @returns {HtmlExtension}\n * Single combined HTML extension.\n */\nexport function combineHtmlExtensions(htmlExtensions) {\n /** @type {HtmlExtension} */\n const handlers = {}\n let index = -1\n\n while (++index < htmlExtensions.length) {\n htmlExtension(handlers, htmlExtensions[index])\n }\n\n return handlers\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {HtmlExtension} all\n * Extension to merge into.\n * @param {HtmlExtension} extension\n * Extension to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction htmlExtension(all, extension) {\n /** @type {keyof HtmlExtension} */\n let hook\n\n for (hook in extension) {\n const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n const left = maybe || (all[hook] = {})\n const right = extension[hook]\n /** @type {keyof Handles} */\n let type\n\n if (right) {\n for (type in right) {\n // @ts-expect-error assume document vs regular handler are managed correctly.\n left[type] = right[type]\n }\n }\n }\n}\n","/**\n * @import {Code, ConstructRecord, Event, Extension, Previous, State, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { asciiAlpha, asciiAlphanumeric, asciiControl, markdownLineEndingOrSpace, unicodePunctuation, unicodeWhitespace } from 'micromark-util-character';\nconst wwwPrefix = {\n tokenize: tokenizeWwwPrefix,\n partial: true\n};\nconst domain = {\n tokenize: tokenizeDomain,\n partial: true\n};\nconst path = {\n tokenize: tokenizePath,\n partial: true\n};\nconst trail = {\n tokenize: tokenizeTrail,\n partial: true\n};\nconst emailDomainDotTrail = {\n tokenize: tokenizeEmailDomainDotTrail,\n partial: true\n};\nconst wwwAutolink = {\n name: 'wwwAutolink',\n tokenize: tokenizeWwwAutolink,\n previous: previousWww\n};\nconst protocolAutolink = {\n name: 'protocolAutolink',\n tokenize: tokenizeProtocolAutolink,\n previous: previousProtocol\n};\nconst emailAutolink = {\n name: 'emailAutolink',\n tokenize: tokenizeEmailAutolink,\n previous: previousEmail\n};\n\n/** @type {ConstructRecord} */\nconst text = {};\n\n/**\n * Create an extension for `micromark` to support GitHub autolink literal\n * syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions` to enable GFM\n * autolink literal syntax.\n */\nexport function gfmAutolinkLiteral() {\n return {\n text\n };\n}\n\n/** @type {Code} */\nlet code = 48;\n\n// Add alphanumerics.\nwhile (code < 123) {\n text[code] = emailAutolink;\n code++;\n if (code === 58) code = 65;else if (code === 91) code = 97;\n}\ntext[43] = emailAutolink;\ntext[45] = emailAutolink;\ntext[46] = emailAutolink;\ntext[95] = emailAutolink;\ntext[72] = [emailAutolink, protocolAutolink];\ntext[104] = [emailAutolink, protocolAutolink];\ntext[87] = [emailAutolink, wwwAutolink];\ntext[119] = [emailAutolink, wwwAutolink];\n\n// To do: perform email autolink literals on events, afterwards.\n// That’s where `markdown-rs` and `cmark-gfm` perform it.\n// It should look for `@`, then for atext backwards, and then for a label\n// forwards.\n// To do: `mailto:`, `xmpp:` protocol as prefix.\n\n/**\n * Email autolink literal.\n *\n * ```markdown\n * > | a contact@example.org b\n * ^^^^^^^^^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeEmailAutolink(effects, ok, nok) {\n const self = this;\n /** @type {boolean | undefined} */\n let dot;\n /** @type {boolean} */\n let data;\n return start;\n\n /**\n * Start of email autolink literal.\n *\n * ```markdown\n * > | a contact@example.org b\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n if (!gfmAtext(code) || !previousEmail.call(self, self.previous) || previousUnbalanced(self.events)) {\n return nok(code);\n }\n effects.enter('literalAutolink');\n effects.enter('literalAutolinkEmail');\n return atext(code);\n }\n\n /**\n * In email atext.\n *\n * ```markdown\n * > | a contact@example.org b\n * ^\n * ```\n *\n * @type {State}\n */\n function atext(code) {\n if (gfmAtext(code)) {\n effects.consume(code);\n return atext;\n }\n if (code === 64) {\n effects.consume(code);\n return emailDomain;\n }\n return nok(code);\n }\n\n /**\n * In email domain.\n *\n * The reference code is a bit overly complex as it handles the `@`, of which\n * there may be just one.\n * Source: <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L318>\n *\n * ```markdown\n * > | a contact@example.org b\n * ^\n * ```\n *\n * @type {State}\n */\n function emailDomain(code) {\n // Dot followed by alphanumerical (not `-` or `_`).\n if (code === 46) {\n return effects.check(emailDomainDotTrail, emailDomainAfter, emailDomainDot)(code);\n }\n\n // Alphanumerical, `-`, and `_`.\n if (code === 45 || code === 95 || asciiAlphanumeric(code)) {\n data = true;\n effects.consume(code);\n return emailDomain;\n }\n\n // To do: `/` if xmpp.\n\n // Note: normally we’d truncate trailing punctuation from the link.\n // However, email autolink literals cannot contain any of those markers,\n // except for `.`, but that can only occur if it isn’t trailing.\n // So we can ignore truncating!\n return emailDomainAfter(code);\n }\n\n /**\n * In email domain, on dot that is not a trail.\n *\n * ```markdown\n * > | a contact@example.org b\n * ^\n * ```\n *\n * @type {State}\n */\n function emailDomainDot(code) {\n effects.consume(code);\n dot = true;\n return emailDomain;\n }\n\n /**\n * After email domain.\n *\n * ```markdown\n * > | a contact@example.org b\n * ^\n * ```\n *\n * @type {State}\n */\n function emailDomainAfter(code) {\n // Domain must not be empty, must include a dot, and must end in alphabetical.\n // Source: <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L332>.\n if (data && dot && asciiAlpha(self.previous)) {\n effects.exit('literalAutolinkEmail');\n effects.exit('literalAutolink');\n return ok(code);\n }\n return nok(code);\n }\n}\n\n/**\n * `www` autolink literal.\n *\n * ```markdown\n * > | a www.example.org b\n * ^^^^^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeWwwAutolink(effects, ok, nok) {\n const self = this;\n return wwwStart;\n\n /**\n * Start of www autolink literal.\n *\n * ```markdown\n * > | www.example.com/a?b#c\n * ^\n * ```\n *\n * @type {State}\n */\n function wwwStart(code) {\n if (code !== 87 && code !== 119 || !previousWww.call(self, self.previous) || previousUnbalanced(self.events)) {\n return nok(code);\n }\n effects.enter('literalAutolink');\n effects.enter('literalAutolinkWww');\n // Note: we *check*, so we can discard the `www.` we parsed.\n // If it worked, we consider it as a part of the domain.\n return effects.check(wwwPrefix, effects.attempt(domain, effects.attempt(path, wwwAfter), nok), nok)(code);\n }\n\n /**\n * After a www autolink literal.\n *\n * ```markdown\n * > | www.example.com/a?b#c\n * ^\n * ```\n *\n * @type {State}\n */\n function wwwAfter(code) {\n effects.exit('literalAutolinkWww');\n effects.exit('literalAutolink');\n return ok(code);\n }\n}\n\n/**\n * Protocol autolink literal.\n *\n * ```markdown\n * > | a https://example.org b\n * ^^^^^^^^^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeProtocolAutolink(effects, ok, nok) {\n const self = this;\n let buffer = '';\n let seen = false;\n return protocolStart;\n\n /**\n * Start of protocol autolink literal.\n *\n * ```markdown\n * > | https://example.com/a?b#c\n * ^\n * ```\n *\n * @type {State}\n */\n function protocolStart(code) {\n if ((code === 72 || code === 104) && previousProtocol.call(self, self.previous) && !previousUnbalanced(self.events)) {\n effects.enter('literalAutolink');\n effects.enter('literalAutolinkHttp');\n buffer += String.fromCodePoint(code);\n effects.consume(code);\n return protocolPrefixInside;\n }\n return nok(code);\n }\n\n /**\n * In protocol.\n *\n * ```markdown\n * > | https://example.com/a?b#c\n * ^^^^^\n * ```\n *\n * @type {State}\n */\n function protocolPrefixInside(code) {\n // `5` is size of `https`\n if (asciiAlpha(code) && buffer.length < 5) {\n // @ts-expect-error: definitely number.\n buffer += String.fromCodePoint(code);\n effects.consume(code);\n return protocolPrefixInside;\n }\n if (code === 58) {\n const protocol = buffer.toLowerCase();\n if (protocol === 'http' || protocol === 'https') {\n effects.consume(code);\n return protocolSlashesInside;\n }\n }\n return nok(code);\n }\n\n /**\n * In slashes.\n *\n * ```markdown\n * > | https://example.com/a?b#c\n * ^^\n * ```\n *\n * @type {State}\n */\n function protocolSlashesInside(code) {\n if (code === 47) {\n effects.consume(code);\n if (seen) {\n return afterProtocol;\n }\n seen = true;\n return protocolSlashesInside;\n }\n return nok(code);\n }\n\n /**\n * After protocol, before domain.\n *\n * ```markdown\n * > | https://example.com/a?b#c\n * ^\n * ```\n *\n * @type {State}\n */\n function afterProtocol(code) {\n // To do: this is different from `markdown-rs`:\n // https://github.com/wooorm/markdown-rs/blob/b3a921c761309ae00a51fe348d8a43adbc54b518/src/construct/gfm_autolink_literal.rs#L172-L182\n return code === null || asciiControl(code) || markdownLineEndingOrSpace(code) || unicodeWhitespace(code) || unicodePunctuation(code) ? nok(code) : effects.attempt(domain, effects.attempt(path, protocolAfter), nok)(code);\n }\n\n /**\n * After a protocol autolink literal.\n *\n * ```markdown\n * > | https://example.com/a?b#c\n * ^\n * ```\n *\n * @type {State}\n */\n function protocolAfter(code) {\n effects.exit('literalAutolinkHttp');\n effects.exit('literalAutolink');\n return ok(code);\n }\n}\n\n/**\n * `www` prefix.\n *\n * ```markdown\n * > | a www.example.org b\n * ^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeWwwPrefix(effects, ok, nok) {\n let size = 0;\n return wwwPrefixInside;\n\n /**\n * In www prefix.\n *\n * ```markdown\n * > | www.example.com\n * ^^^^\n * ```\n *\n * @type {State}\n */\n function wwwPrefixInside(code) {\n if ((code === 87 || code === 119) && size < 3) {\n size++;\n effects.consume(code);\n return wwwPrefixInside;\n }\n if (code === 46 && size === 3) {\n effects.consume(code);\n return wwwPrefixAfter;\n }\n return nok(code);\n }\n\n /**\n * After www prefix.\n *\n * ```markdown\n * > | www.example.com\n * ^\n * ```\n *\n * @type {State}\n */\n function wwwPrefixAfter(code) {\n // If there is *anything*, we can link.\n return code === null ? nok(code) : ok(code);\n }\n}\n\n/**\n * Domain.\n *\n * ```markdown\n * > | a https://example.org b\n * ^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDomain(effects, ok, nok) {\n /** @type {boolean | undefined} */\n let underscoreInLastSegment;\n /** @type {boolean | undefined} */\n let underscoreInLastLastSegment;\n /** @type {boolean | undefined} */\n let seen;\n return domainInside;\n\n /**\n * In domain.\n *\n * ```markdown\n * > | https://example.com/a\n * ^^^^^^^^^^^\n * ```\n *\n * @type {State}\n */\n function domainInside(code) {\n // Check whether this marker, which is a trailing punctuation\n // marker, optionally followed by more trailing markers, and then\n // followed by an end.\n if (code === 46 || code === 95) {\n return effects.check(trail, domainAfter, domainAtPunctuation)(code);\n }\n\n // GH documents that only alphanumerics (other than `-`, `.`, and `_`) can\n // occur, which sounds like ASCII only, but they also support `www.點看.com`,\n // so that’s Unicode.\n // Instead of some new production for Unicode alphanumerics, markdown\n // already has that for Unicode punctuation and whitespace, so use those.\n // Source: <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L12>.\n if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code) || code !== 45 && unicodePunctuation(code)) {\n return domainAfter(code);\n }\n seen = true;\n effects.consume(code);\n return domainInside;\n }\n\n /**\n * In domain, at potential trailing punctuation, that was not trailing.\n *\n * ```markdown\n * > | https://example.com\n * ^\n * ```\n *\n * @type {State}\n */\n function domainAtPunctuation(code) {\n // There is an underscore in the last segment of the domain\n if (code === 95) {\n underscoreInLastSegment = true;\n }\n // Otherwise, it’s a `.`: save the last segment underscore in the\n // penultimate segment slot.\n else {\n underscoreInLastLastSegment = underscoreInLastSegment;\n underscoreInLastSegment = undefined;\n }\n effects.consume(code);\n return domainInside;\n }\n\n /**\n * After domain.\n *\n * ```markdown\n * > | https://example.com/a\n * ^\n * ```\n *\n * @type {State} */\n function domainAfter(code) {\n // Note: that’s GH says a dot is needed, but it’s not true:\n // <https://github.com/github/cmark-gfm/issues/279>\n if (underscoreInLastLastSegment || underscoreInLastSegment || !seen) {\n return nok(code);\n }\n return ok(code);\n }\n}\n\n/**\n * Path.\n *\n * ```markdown\n * > | a https://example.org/stuff b\n * ^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizePath(effects, ok) {\n let sizeOpen = 0;\n let sizeClose = 0;\n return pathInside;\n\n /**\n * In path.\n *\n * ```markdown\n * > | https://example.com/a\n * ^^\n * ```\n *\n * @type {State}\n */\n function pathInside(code) {\n if (code === 40) {\n sizeOpen++;\n effects.consume(code);\n return pathInside;\n }\n\n // To do: `markdown-rs` also needs this.\n // If this is a paren, and there are less closings than openings,\n // we don’t check for a trail.\n if (code === 41 && sizeClose < sizeOpen) {\n return pathAtPunctuation(code);\n }\n\n // Check whether this trailing punctuation marker is optionally\n // followed by more trailing markers, and then followed\n // by an end.\n if (code === 33 || code === 34 || code === 38 || code === 39 || code === 41 || code === 42 || code === 44 || code === 46 || code === 58 || code === 59 || code === 60 || code === 63 || code === 93 || code === 95 || code === 126) {\n return effects.check(trail, ok, pathAtPunctuation)(code);\n }\n if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n return ok(code);\n }\n effects.consume(code);\n return pathInside;\n }\n\n /**\n * In path, at potential trailing punctuation, that was not trailing.\n *\n * ```markdown\n * > | https://example.com/a\"b\n * ^\n * ```\n *\n * @type {State}\n */\n function pathAtPunctuation(code) {\n // Count closing parens.\n if (code === 41) {\n sizeClose++;\n }\n effects.consume(code);\n return pathInside;\n }\n}\n\n/**\n * Trail.\n *\n * This calls `ok` if this *is* the trail, followed by an end, which means\n * the entire trail is not part of the link.\n * It calls `nok` if this *is* part of the link.\n *\n * ```markdown\n * > | https://example.com\").\n * ^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTrail(effects, ok, nok) {\n return trail;\n\n /**\n * In trail of domain or path.\n *\n * ```markdown\n * > | https://example.com\").\n * ^\n * ```\n *\n * @type {State}\n */\n function trail(code) {\n // Regular trailing punctuation.\n if (code === 33 || code === 34 || code === 39 || code === 41 || code === 42 || code === 44 || code === 46 || code === 58 || code === 59 || code === 63 || code === 95 || code === 126) {\n effects.consume(code);\n return trail;\n }\n\n // `&` followed by one or more alphabeticals and then a `;`, is\n // as a whole considered as trailing punctuation.\n // In all other cases, it is considered as continuation of the URL.\n if (code === 38) {\n effects.consume(code);\n return trailCharacterReferenceStart;\n }\n\n // Needed because we allow literals after `[`, as we fix:\n // <https://github.com/github/cmark-gfm/issues/278>.\n // Check that it is not followed by `(` or `[`.\n if (code === 93) {\n effects.consume(code);\n return trailBracketAfter;\n }\n if (\n // `<` is an end.\n code === 60 ||\n // So is whitespace.\n code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n return ok(code);\n }\n return nok(code);\n }\n\n /**\n * In trail, after `]`.\n *\n * > 👉 **Note**: this deviates from `cmark-gfm` to fix a bug.\n * > See end of <https://github.com/github/cmark-gfm/issues/278> for more.\n *\n * ```markdown\n * > | https://example.com](\n * ^\n * ```\n *\n * @type {State}\n */\n function trailBracketAfter(code) {\n // Whitespace or something that could start a resource or reference is the end.\n // Switch back to trail otherwise.\n if (code === null || code === 40 || code === 91 || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n return ok(code);\n }\n return trail(code);\n }\n\n /**\n * In character-reference like trail, after `&`.\n *\n * ```markdown\n * > | https://example.com&amp;).\n * ^\n * ```\n *\n * @type {State}\n */\n function trailCharacterReferenceStart(code) {\n // When non-alpha, it’s not a trail.\n return asciiAlpha(code) ? trailCharacterReferenceInside(code) : nok(code);\n }\n\n /**\n * In character-reference like trail.\n *\n * ```markdown\n * > | https://example.com&amp;).\n * ^\n * ```\n *\n * @type {State}\n */\n function trailCharacterReferenceInside(code) {\n // Switch back to trail if this is well-formed.\n if (code === 59) {\n effects.consume(code);\n return trail;\n }\n if (asciiAlpha(code)) {\n effects.consume(code);\n return trailCharacterReferenceInside;\n }\n\n // It’s not a trail.\n return nok(code);\n }\n}\n\n/**\n * Dot in email domain trail.\n *\n * This calls `ok` if this *is* the trail, followed by an end, which means\n * the trail is not part of the link.\n * It calls `nok` if this *is* part of the link.\n *\n * ```markdown\n * > | contact@example.org.\n * ^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeEmailDomainDotTrail(effects, ok, nok) {\n return start;\n\n /**\n * Dot.\n *\n * ```markdown\n * > | contact@example.org.\n * ^ ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // Must be dot.\n effects.consume(code);\n return after;\n }\n\n /**\n * After dot.\n *\n * ```markdown\n * > | contact@example.org.\n * ^ ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n // Not a trail if alphanumeric.\n return asciiAlphanumeric(code) ? nok(code) : ok(code);\n }\n}\n\n/**\n * See:\n * <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L156>.\n *\n * @type {Previous}\n */\nfunction previousWww(code) {\n return code === null || code === 40 || code === 42 || code === 95 || code === 91 || code === 93 || code === 126 || markdownLineEndingOrSpace(code);\n}\n\n/**\n * See:\n * <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L214>.\n *\n * @type {Previous}\n */\nfunction previousProtocol(code) {\n return !asciiAlpha(code);\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Previous}\n */\nfunction previousEmail(code) {\n // Do not allow a slash “inside” atext.\n // The reference code is a bit weird, but that’s what it results in.\n // Source: <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L307>.\n // Other than slash, every preceding character is allowed.\n return !(code === 47 || gfmAtext(code));\n}\n\n/**\n * @param {Code} code\n * @returns {boolean}\n */\nfunction gfmAtext(code) {\n return code === 43 || code === 45 || code === 46 || code === 95 || asciiAlphanumeric(code);\n}\n\n/**\n * @param {Array<Event>} events\n * @returns {boolean}\n */\nfunction previousUnbalanced(events) {\n let index = events.length;\n let result = false;\n while (index--) {\n const token = events[index][1];\n if ((token.type === 'labelLink' || token.type === 'labelImage') && !token._balanced) {\n result = true;\n break;\n }\n\n // If we’ve seen this token, and it was marked as not having any unbalanced\n // bracket before it, we can exit.\n if (token._gfmAutolinkLiteralWalkedInto) {\n result = false;\n break;\n }\n }\n if (events.length > 0 && !result) {\n // Mark the last token as “walked into” w/o finding\n // anything.\n events[events.length - 1][1]._gfmAutolinkLiteralWalkedInto = true;\n }\n return result;\n}","/**\n * @import {Event, Resolver, TokenizeContext} from 'micromark-util-types'\n */\n\n/**\n * Call all `resolveAll`s.\n *\n * @param {ReadonlyArray<{resolveAll?: Resolver | undefined}>} constructs\n * List of constructs, optionally with `resolveAll`s.\n * @param {Array<Event>} events\n * List of events.\n * @param {TokenizeContext} context\n * Context used by `tokenize`.\n * @returns {Array<Event>}\n * Changed events.\n */\nexport function resolveAll(constructs, events, context) {\n /** @type {Array<Resolver>} */\n const called = []\n let index = -1\n\n while (++index < constructs.length) {\n const resolve = constructs[index].resolveAll\n\n if (resolve && !called.includes(resolve)) {\n events = resolve(events, context)\n called.push(resolve)\n }\n }\n\n return events\n}\n","/**\n * @import {Effects, State, TokenType} from 'micromark-util-types'\n */\n\nimport { markdownSpace } from 'micromark-util-character';\n\n// To do: implement `spaceOrTab`, `spaceOrTabMinMax`, `spaceOrTabWithOptions`.\n\n/**\n * Parse spaces and tabs.\n *\n * There is no `nok` parameter:\n *\n * * spaces in markdown are often optional, in which case this factory can be\n * used and `ok` will be switched to whether spaces were found or not\n * * one line ending or space can be detected with `markdownSpace(code)` right\n * before using `factorySpace`\n *\n * ###### Examples\n *\n * Where `␉` represents a tab (plus how much it expands) and `␠` represents a\n * single space.\n *\n * ```markdown\n * ␉\n * ␠␠␠␠\n * ␉␠\n * ```\n *\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @param {TokenType} type\n * Type (`' \\t'`).\n * @param {number | undefined} [max=Infinity]\n * Max (exclusive).\n * @returns {State}\n * Start state.\n */\nexport function factorySpace(effects, ok, type, max) {\n const limit = max ? max - 1 : Number.POSITIVE_INFINITY;\n let size = 0;\n return start;\n\n /** @type {State} */\n function start(code) {\n if (markdownSpace(code)) {\n effects.enter(type);\n return prefix(code);\n }\n return ok(code);\n }\n\n /** @type {State} */\n function prefix(code) {\n if (markdownSpace(code) && size++ < limit) {\n effects.consume(code);\n return prefix;\n }\n effects.exit(type);\n return ok(code);\n }\n}","/**\n * @import {\n * Construct,\n * State,\n * TokenizeContext,\n * Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const blankLine = {\n partial: true,\n tokenize: tokenizeBlankLine\n};\n\n/**\n * @this {TokenizeContext}\n * Context.\n * @type {Tokenizer}\n */\nfunction tokenizeBlankLine(effects, ok, nok) {\n return start;\n\n /**\n * Start of blank line.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n return markdownSpace(code) ? factorySpace(effects, after, \"linePrefix\")(code) : after(code);\n }\n\n /**\n * At eof/eol, after optional whitespace.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n return code === null || markdownLineEnding(code) ? ok(code) : nok(code);\n }\n}","/**\n * @import {Event, Exiter, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { blankLine } from 'micromark-core-commonmark';\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEndingOrSpace } from 'micromark-util-character';\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier';\nconst indent = {\n tokenize: tokenizeIndent,\n partial: true\n};\n\n// To do: micromark should support a `_hiddenGfmFootnoteSupport`, which only\n// affects label start (image).\n// That will let us drop `tokenizePotentialGfmFootnote*`.\n// It currently has a `_hiddenFootnoteSupport`, which affects that and more.\n// That can be removed when `micromark-extension-footnote` is archived.\n\n/**\n * Create an extension for `micromark` to enable GFM footnote syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions` to\n * enable GFM footnote syntax.\n */\nexport function gfmFootnote() {\n /** @type {Extension} */\n return {\n document: {\n [91]: {\n name: 'gfmFootnoteDefinition',\n tokenize: tokenizeDefinitionStart,\n continuation: {\n tokenize: tokenizeDefinitionContinuation\n },\n exit: gfmFootnoteDefinitionEnd\n }\n },\n text: {\n [91]: {\n name: 'gfmFootnoteCall',\n tokenize: tokenizeGfmFootnoteCall\n },\n [93]: {\n name: 'gfmPotentialFootnoteCall',\n add: 'after',\n tokenize: tokenizePotentialGfmFootnoteCall,\n resolveTo: resolveToPotentialGfmFootnoteCall\n }\n }\n };\n}\n\n// To do: remove after micromark update.\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizePotentialGfmFootnoteCall(effects, ok, nok) {\n const self = this;\n let index = self.events.length;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n /** @type {Token} */\n let labelStart;\n\n // Find an opening.\n while (index--) {\n const token = self.events[index][1];\n if (token.type === \"labelImage\") {\n labelStart = token;\n break;\n }\n\n // Exit if we’ve walked far enough.\n if (token.type === 'gfmFootnoteCall' || token.type === \"labelLink\" || token.type === \"label\" || token.type === \"image\" || token.type === \"link\") {\n break;\n }\n }\n return start;\n\n /**\n * @type {State}\n */\n function start(code) {\n if (!labelStart || !labelStart._balanced) {\n return nok(code);\n }\n const id = normalizeIdentifier(self.sliceSerialize({\n start: labelStart.end,\n end: self.now()\n }));\n if (id.codePointAt(0) !== 94 || !defined.includes(id.slice(1))) {\n return nok(code);\n }\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n return ok(code);\n }\n}\n\n// To do: remove after micromark update.\n/** @type {Resolver} */\nfunction resolveToPotentialGfmFootnoteCall(events, context) {\n let index = events.length;\n /** @type {Token | undefined} */\n let labelStart;\n\n // Find an opening.\n while (index--) {\n if (events[index][1].type === \"labelImage\" && events[index][0] === 'enter') {\n labelStart = events[index][1];\n break;\n }\n }\n // Change the `labelImageMarker` to a `data`.\n events[index + 1][1].type = \"data\";\n events[index + 3][1].type = 'gfmFootnoteCallLabelMarker';\n\n // The whole (without `!`):\n /** @type {Token} */\n const call = {\n type: 'gfmFootnoteCall',\n start: Object.assign({}, events[index + 3][1].start),\n end: Object.assign({}, events[events.length - 1][1].end)\n };\n // The `^` marker\n /** @type {Token} */\n const marker = {\n type: 'gfmFootnoteCallMarker',\n start: Object.assign({}, events[index + 3][1].end),\n end: Object.assign({}, events[index + 3][1].end)\n };\n // Increment the end 1 character.\n marker.end.column++;\n marker.end.offset++;\n marker.end._bufferIndex++;\n /** @type {Token} */\n const string = {\n type: 'gfmFootnoteCallString',\n start: Object.assign({}, marker.end),\n end: Object.assign({}, events[events.length - 1][1].start)\n };\n /** @type {Token} */\n const chunk = {\n type: \"chunkString\",\n contentType: 'string',\n start: Object.assign({}, string.start),\n end: Object.assign({}, string.end)\n };\n\n /** @type {Array<Event>} */\n const replacement = [\n // Take the `labelImageMarker` (now `data`, the `!`)\n events[index + 1], events[index + 2], ['enter', call, context],\n // The `[`\n events[index + 3], events[index + 4],\n // The `^`.\n ['enter', marker, context], ['exit', marker, context],\n // Everything in between.\n ['enter', string, context], ['enter', chunk, context], ['exit', chunk, context], ['exit', string, context],\n // The ending (`]`, properly parsed and labelled).\n events[events.length - 2], events[events.length - 1], ['exit', call, context]];\n events.splice(index, events.length - index + 1, ...replacement);\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeGfmFootnoteCall(effects, ok, nok) {\n const self = this;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n let size = 0;\n /** @type {boolean} */\n let data;\n\n // Note: the implementation of `markdown-rs` is different, because it houses\n // core *and* extensions in one project.\n // Therefore, it can include footnote logic inside `label-end`.\n // We can’t do that, but luckily, we can parse footnotes in a simpler way than\n // needed for labels.\n return start;\n\n /**\n * Start of footnote label.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter('gfmFootnoteCall');\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n return callStart;\n }\n\n /**\n * After `[`, at `^`.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function callStart(code) {\n if (code !== 94) return nok(code);\n effects.enter('gfmFootnoteCallMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallMarker');\n effects.enter('gfmFootnoteCallString');\n effects.enter('chunkString').contentType = 'string';\n return callData;\n }\n\n /**\n * In label.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function callData(code) {\n if (\n // Too long.\n size > 999 ||\n // Closing brace with nothing.\n code === 93 && !data ||\n // Space or tab is not supported by GFM for some reason.\n // `\\n` and `[` not being supported makes sense.\n code === null || code === 91 || markdownLineEndingOrSpace(code)) {\n return nok(code);\n }\n if (code === 93) {\n effects.exit('chunkString');\n const token = effects.exit('gfmFootnoteCallString');\n if (!defined.includes(normalizeIdentifier(self.sliceSerialize(token)))) {\n return nok(code);\n }\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n effects.exit('gfmFootnoteCall');\n return ok;\n }\n if (!markdownLineEndingOrSpace(code)) {\n data = true;\n }\n size++;\n effects.consume(code);\n return code === 92 ? callEscape : callData;\n }\n\n /**\n * On character after escape.\n *\n * ```markdown\n * > | a [^b\\c] d\n * ^\n * ```\n *\n * @type {State}\n */\n function callEscape(code) {\n if (code === 91 || code === 92 || code === 93) {\n effects.consume(code);\n size++;\n return callData;\n }\n return callData(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinitionStart(effects, ok, nok) {\n const self = this;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n /** @type {string} */\n let identifier;\n let size = 0;\n /** @type {boolean | undefined} */\n let data;\n return start;\n\n /**\n * Start of GFM footnote definition.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter('gfmFootnoteDefinition')._container = true;\n effects.enter('gfmFootnoteDefinitionLabel');\n effects.enter('gfmFootnoteDefinitionLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionLabelMarker');\n return labelAtMarker;\n }\n\n /**\n * In label, at caret.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelAtMarker(code) {\n if (code === 94) {\n effects.enter('gfmFootnoteDefinitionMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionMarker');\n effects.enter('gfmFootnoteDefinitionLabelString');\n effects.enter('chunkString').contentType = 'string';\n return labelInside;\n }\n return nok(code);\n }\n\n /**\n * In label.\n *\n * > 👉 **Note**: `cmark-gfm` prevents whitespace from occurring in footnote\n * > definition labels.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelInside(code) {\n if (\n // Too long.\n size > 999 ||\n // Closing brace with nothing.\n code === 93 && !data ||\n // Space or tab is not supported by GFM for some reason.\n // `\\n` and `[` not being supported makes sense.\n code === null || code === 91 || markdownLineEndingOrSpace(code)) {\n return nok(code);\n }\n if (code === 93) {\n effects.exit('chunkString');\n const token = effects.exit('gfmFootnoteDefinitionLabelString');\n identifier = normalizeIdentifier(self.sliceSerialize(token));\n effects.enter('gfmFootnoteDefinitionLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionLabelMarker');\n effects.exit('gfmFootnoteDefinitionLabel');\n return labelAfter;\n }\n if (!markdownLineEndingOrSpace(code)) {\n data = true;\n }\n size++;\n effects.consume(code);\n return code === 92 ? labelEscape : labelInside;\n }\n\n /**\n * After `\\`, at a special character.\n *\n * > 👉 **Note**: `cmark-gfm` currently does not support escaped brackets:\n * > <https://github.com/github/cmark-gfm/issues/240>\n *\n * ```markdown\n * > | [^a\\*b]: c\n * ^\n * ```\n *\n * @type {State}\n */\n function labelEscape(code) {\n if (code === 91 || code === 92 || code === 93) {\n effects.consume(code);\n size++;\n return labelInside;\n }\n return labelInside(code);\n }\n\n /**\n * After definition label.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelAfter(code) {\n if (code === 58) {\n effects.enter('definitionMarker');\n effects.consume(code);\n effects.exit('definitionMarker');\n if (!defined.includes(identifier)) {\n defined.push(identifier);\n }\n\n // Any whitespace after the marker is eaten, forming indented code\n // is not possible.\n // No space is also fine, just like a block quote marker.\n return factorySpace(effects, whitespaceAfter, 'gfmFootnoteDefinitionWhitespace');\n }\n return nok(code);\n }\n\n /**\n * After definition prefix.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function whitespaceAfter(code) {\n // `markdown-rs` has a wrapping token for the prefix that is closed here.\n return ok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinitionContinuation(effects, ok, nok) {\n /// Start of footnote definition continuation.\n ///\n /// ```markdown\n /// | [^a]: b\n /// > | c\n /// ^\n /// ```\n //\n // Either a blank line, which is okay, or an indented thing.\n return effects.check(blankLine, ok, effects.attempt(indent, ok, nok));\n}\n\n/** @type {Exiter} */\nfunction gfmFootnoteDefinitionEnd(effects) {\n effects.exit('gfmFootnoteDefinition');\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeIndent(effects, ok, nok) {\n const self = this;\n return factorySpace(effects, afterPrefix, 'gfmFootnoteDefinitionIndent', 4 + 1);\n\n /**\n * @type {State}\n */\n function afterPrefix(code) {\n const tail = self.events[self.events.length - 1];\n return tail && tail[1].type === 'gfmFootnoteDefinitionIndent' && tail[2].sliceSerialize(tail[1], true).length === 4 ? ok(code) : nok(code);\n }\n}","/**\n * @import {Options} from 'micromark-extension-gfm-strikethrough'\n * @import {Event, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { splice } from 'micromark-util-chunked';\nimport { classifyCharacter } from 'micromark-util-classify-character';\nimport { resolveAll } from 'micromark-util-resolve-all';\n/**\n * Create an extension for `micromark` to enable GFM strikethrough syntax.\n *\n * @param {Options | null | undefined} [options={}]\n * Configuration.\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions`, to\n * enable GFM strikethrough syntax.\n */\nexport function gfmStrikethrough(options) {\n const options_ = options || {};\n let single = options_.singleTilde;\n const tokenizer = {\n name: 'strikethrough',\n tokenize: tokenizeStrikethrough,\n resolveAll: resolveAllStrikethrough\n };\n if (single === null || single === undefined) {\n single = true;\n }\n return {\n text: {\n [126]: tokenizer\n },\n insideSpan: {\n null: [tokenizer]\n },\n attentionMarkers: {\n null: [126]\n }\n };\n\n /**\n * Take events and resolve strikethrough.\n *\n * @type {Resolver}\n */\n function resolveAllStrikethrough(events, context) {\n let index = -1;\n\n // Walk through all events.\n while (++index < events.length) {\n // Find a token that can close.\n if (events[index][0] === 'enter' && events[index][1].type === 'strikethroughSequenceTemporary' && events[index][1]._close) {\n let open = index;\n\n // Now walk back to find an opener.\n while (open--) {\n // Find a token that can open the closer.\n if (events[open][0] === 'exit' && events[open][1].type === 'strikethroughSequenceTemporary' && events[open][1]._open &&\n // If the sizes are the same:\n events[index][1].end.offset - events[index][1].start.offset === events[open][1].end.offset - events[open][1].start.offset) {\n events[index][1].type = 'strikethroughSequence';\n events[open][1].type = 'strikethroughSequence';\n\n /** @type {Token} */\n const strikethrough = {\n type: 'strikethrough',\n start: Object.assign({}, events[open][1].start),\n end: Object.assign({}, events[index][1].end)\n };\n\n /** @type {Token} */\n const text = {\n type: 'strikethroughText',\n start: Object.assign({}, events[open][1].end),\n end: Object.assign({}, events[index][1].start)\n };\n\n // Opening.\n /** @type {Array<Event>} */\n const nextEvents = [['enter', strikethrough, context], ['enter', events[open][1], context], ['exit', events[open][1], context], ['enter', text, context]];\n const insideSpan = context.parser.constructs.insideSpan.null;\n if (insideSpan) {\n // Between.\n splice(nextEvents, nextEvents.length, 0, resolveAll(insideSpan, events.slice(open + 1, index), context));\n }\n\n // Closing.\n splice(nextEvents, nextEvents.length, 0, [['exit', text, context], ['enter', events[index][1], context], ['exit', events[index][1], context], ['exit', strikethrough, context]]);\n splice(events, open - 1, index - open + 3, nextEvents);\n index = open + nextEvents.length - 2;\n break;\n }\n }\n }\n }\n index = -1;\n while (++index < events.length) {\n if (events[index][1].type === 'strikethroughSequenceTemporary') {\n events[index][1].type = \"data\";\n }\n }\n return events;\n }\n\n /**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\n function tokenizeStrikethrough(effects, ok, nok) {\n const previous = this.previous;\n const events = this.events;\n let size = 0;\n return start;\n\n /** @type {State} */\n function start(code) {\n if (previous === 126 && events[events.length - 1][1].type !== \"characterEscape\") {\n return nok(code);\n }\n effects.enter('strikethroughSequenceTemporary');\n return more(code);\n }\n\n /** @type {State} */\n function more(code) {\n const before = classifyCharacter(previous);\n if (code === 126) {\n // If this is the third marker, exit.\n if (size > 1) return nok(code);\n effects.consume(code);\n size++;\n return more;\n }\n if (size < 2 && !single) return nok(code);\n const token = effects.exit('strikethroughSequenceTemporary');\n const after = classifyCharacter(code);\n token._open = !after || after === 2 && Boolean(before);\n token._close = !before || before === 2 && Boolean(after);\n return ok(code);\n }\n }\n}","/**\n * @import {Event} from 'micromark-util-types'\n */\n\n// Port of `edit_map.rs` from `markdown-rs`.\n// This should move to `markdown-js` later.\n\n// Deal with several changes in events, batching them together.\n//\n// Preferably, changes should be kept to a minimum.\n// Sometimes, it’s needed to change the list of events, because parsing can be\n// messy, and it helps to expose a cleaner interface of events to the compiler\n// and other users.\n// It can also help to merge many adjacent similar events.\n// And, in other cases, it’s needed to parse subcontent: pass some events\n// through another tokenizer and inject the result.\n\n/**\n * @typedef {[number, number, Array<Event>]} Change\n * @typedef {[number, number, number]} Jump\n */\n\n/**\n * Tracks a bunch of edits.\n */\nexport class EditMap {\n /**\n * Create a new edit map.\n */\n constructor() {\n /**\n * Record of changes.\n *\n * @type {Array<Change>}\n */\n this.map = [];\n }\n\n /**\n * Create an edit: a remove and/or add at a certain place.\n *\n * @param {number} index\n * @param {number} remove\n * @param {Array<Event>} add\n * @returns {undefined}\n */\n add(index, remove, add) {\n addImplementation(this, index, remove, add);\n }\n\n // To do: add this when moving to `micromark`.\n // /**\n // * Create an edit: but insert `add` before existing additions.\n // *\n // * @param {number} index\n // * @param {number} remove\n // * @param {Array<Event>} add\n // * @returns {undefined}\n // */\n // addBefore(index, remove, add) {\n // addImplementation(this, index, remove, add, true)\n // }\n\n /**\n * Done, change the events.\n *\n * @param {Array<Event>} events\n * @returns {undefined}\n */\n consume(events) {\n this.map.sort(function (a, b) {\n return a[0] - b[0];\n });\n\n /* c8 ignore next 3 -- `resolve` is never called without tables, so without edits. */\n if (this.map.length === 0) {\n return;\n }\n\n // To do: if links are added in events, like they are in `markdown-rs`,\n // this is needed.\n // // Calculate jumps: where items in the current list move to.\n // /** @type {Array<Jump>} */\n // const jumps = []\n // let index = 0\n // let addAcc = 0\n // let removeAcc = 0\n // while (index < this.map.length) {\n // const [at, remove, add] = this.map[index]\n // removeAcc += remove\n // addAcc += add.length\n // jumps.push([at, removeAcc, addAcc])\n // index += 1\n // }\n //\n // . shiftLinks(events, jumps)\n\n let index = this.map.length;\n /** @type {Array<Array<Event>>} */\n const vecs = [];\n while (index > 0) {\n index -= 1;\n vecs.push(events.slice(this.map[index][0] + this.map[index][1]), this.map[index][2]);\n\n // Truncate rest.\n events.length = this.map[index][0];\n }\n vecs.push(events.slice());\n events.length = 0;\n let slice = vecs.pop();\n while (slice) {\n for (const element of slice) {\n events.push(element);\n }\n slice = vecs.pop();\n }\n\n // Truncate everything.\n this.map.length = 0;\n }\n}\n\n/**\n * Create an edit.\n *\n * @param {EditMap} editMap\n * @param {number} at\n * @param {number} remove\n * @param {Array<Event>} add\n * @returns {undefined}\n */\nfunction addImplementation(editMap, at, remove, add) {\n let index = 0;\n\n /* c8 ignore next 3 -- `resolve` is never called without tables, so without edits. */\n if (remove === 0 && add.length === 0) {\n return;\n }\n while (index < editMap.map.length) {\n if (editMap.map[index][0] === at) {\n editMap.map[index][1] += remove;\n\n // To do: before not used by tables, use when moving to micromark.\n // if (before) {\n // add.push(...editMap.map[index][2])\n // editMap.map[index][2] = add\n // } else {\n editMap.map[index][2].push(...add);\n // }\n\n return;\n }\n index += 1;\n }\n editMap.map.push([at, remove, add]);\n}\n\n// /**\n// * Shift `previous` and `next` links according to `jumps`.\n// *\n// * This fixes links in case there are events removed or added between them.\n// *\n// * @param {Array<Event>} events\n// * @param {Array<Jump>} jumps\n// */\n// function shiftLinks(events, jumps) {\n// let jumpIndex = 0\n// let index = 0\n// let add = 0\n// let rm = 0\n\n// while (index < events.length) {\n// const rmCurr = rm\n\n// while (jumpIndex < jumps.length && jumps[jumpIndex][0] <= index) {\n// add = jumps[jumpIndex][2]\n// rm = jumps[jumpIndex][1]\n// jumpIndex += 1\n// }\n\n// // Ignore items that will be removed.\n// if (rm > rmCurr) {\n// index += rm - rmCurr\n// } else {\n// // ?\n// // if let Some(link) = &events[index].link {\n// // if let Some(next) = link.next {\n// // events[next].link.as_mut().unwrap().previous = Some(index + add - rm);\n// // while jumpIndex < jumps.len() && jumps[jumpIndex].0 <= next {\n// // add = jumps[jumpIndex].2;\n// // rm = jumps[jumpIndex].1;\n// // jumpIndex += 1;\n// // }\n// // events[index].link.as_mut().unwrap().next = Some(next + add - rm);\n// // index = next;\n// // continue;\n// // }\n// // }\n// index += 1\n// }\n// }\n// }","/**\n * @import {Event} from 'micromark-util-types'\n */\n\n/**\n * @typedef {'center' | 'left' | 'none' | 'right'} Align\n */\n\n/**\n * Figure out the alignment of a GFM table.\n *\n * @param {Readonly<Array<Event>>} events\n * List of events.\n * @param {number} index\n * Table enter event.\n * @returns {Array<Align>}\n * List of aligns.\n */\nexport function gfmTableAlign(events, index) {\n let inDelimiterRow = false;\n /** @type {Array<Align>} */\n const align = [];\n while (index < events.length) {\n const event = events[index];\n if (inDelimiterRow) {\n if (event[0] === 'enter') {\n // Start of alignment value: set a new column.\n // To do: `markdown-rs` uses `tableDelimiterCellValue`.\n if (event[1].type === 'tableContent') {\n align.push(events[index + 1][1].type === 'tableDelimiterMarker' ? 'left' : 'none');\n }\n }\n // Exits:\n // End of alignment value: change the column.\n // To do: `markdown-rs` uses `tableDelimiterCellValue`.\n else if (event[1].type === 'tableContent') {\n if (events[index - 1][1].type === 'tableDelimiterMarker') {\n const alignIndex = align.length - 1;\n align[alignIndex] = align[alignIndex] === 'left' ? 'center' : 'right';\n }\n }\n // Done!\n else if (event[1].type === 'tableDelimiterRow') {\n break;\n }\n } else if (event[0] === 'enter' && event[1].type === 'tableDelimiterRow') {\n inDelimiterRow = true;\n }\n index += 1;\n }\n return align;\n}","/**\n * @import {Event, Extension, Point, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\n/**\n * @typedef {[number, number, number, number]} Range\n * Cell info.\n *\n * @typedef {0 | 1 | 2 | 3} RowKind\n * Where we are: `1` for head row, `2` for delimiter row, `3` for body row.\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nimport { EditMap } from './edit-map.js';\nimport { gfmTableAlign } from './infer.js';\n\n/**\n * Create an HTML extension for `micromark` to support GitHub tables syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions` to enable GFM\n * table syntax.\n */\nexport function gfmTable() {\n return {\n flow: {\n null: {\n name: 'table',\n tokenize: tokenizeTable,\n resolveAll: resolveTable\n }\n }\n };\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTable(effects, ok, nok) {\n const self = this;\n let size = 0;\n let sizeB = 0;\n /** @type {boolean | undefined} */\n let seen;\n return start;\n\n /**\n * Start of a GFM table.\n *\n * If there is a valid table row or table head before, then we try to parse\n * another row.\n * Otherwise, we try to parse a head.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * > | | b |\n * ^\n * ```\n * @type {State}\n */\n function start(code) {\n let index = self.events.length - 1;\n while (index > -1) {\n const type = self.events[index][1].type;\n if (type === \"lineEnding\" ||\n // Note: markdown-rs uses `whitespace` instead of `linePrefix`\n type === \"linePrefix\") index--;else break;\n }\n const tail = index > -1 ? self.events[index][1].type : null;\n const next = tail === 'tableHead' || tail === 'tableRow' ? bodyRowStart : headRowBefore;\n\n // Don’t allow lazy body rows.\n if (next === bodyRowStart && self.parser.lazy[self.now().line]) {\n return nok(code);\n }\n return next(code);\n }\n\n /**\n * Before table head row.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowBefore(code) {\n effects.enter('tableHead');\n effects.enter('tableRow');\n return headRowStart(code);\n }\n\n /**\n * Before table head row, after whitespace.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowStart(code) {\n if (code === 124) {\n return headRowBreak(code);\n }\n\n // To do: micromark-js should let us parse our own whitespace in extensions,\n // like `markdown-rs`:\n //\n // ```js\n // // 4+ spaces.\n // if (markdownSpace(code)) {\n // return nok(code)\n // }\n // ```\n\n seen = true;\n // Count the first character, that isn’t a pipe, double.\n sizeB += 1;\n return headRowBreak(code);\n }\n\n /**\n * At break in table head row.\n *\n * ```markdown\n * > | | a |\n * ^\n * ^\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowBreak(code) {\n if (code === null) {\n // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n return nok(code);\n }\n if (markdownLineEnding(code)) {\n // If anything other than one pipe (ignoring whitespace) was used, it’s fine.\n if (sizeB > 1) {\n sizeB = 0;\n // To do: check if this works.\n // Feel free to interrupt:\n self.interrupt = true;\n effects.exit('tableRow');\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return headDelimiterStart;\n }\n\n // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n return nok(code);\n }\n if (markdownSpace(code)) {\n // To do: check if this is fine.\n // effects.attempt(State::Next(StateName::GfmTableHeadRowBreak), State::Nok)\n // State::Retry(space_or_tab(tokenizer))\n return factorySpace(effects, headRowBreak, \"whitespace\")(code);\n }\n sizeB += 1;\n if (seen) {\n seen = false;\n // Header cell count.\n size += 1;\n }\n if (code === 124) {\n effects.enter('tableCellDivider');\n effects.consume(code);\n effects.exit('tableCellDivider');\n // Whether a delimiter was seen.\n seen = true;\n return headRowBreak;\n }\n\n // Anything else is cell data.\n effects.enter(\"data\");\n return headRowData(code);\n }\n\n /**\n * In table head row data.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowData(code) {\n if (code === null || code === 124 || markdownLineEndingOrSpace(code)) {\n effects.exit(\"data\");\n return headRowBreak(code);\n }\n effects.consume(code);\n return code === 92 ? headRowEscape : headRowData;\n }\n\n /**\n * In table head row escape.\n *\n * ```markdown\n * > | | a\\-b |\n * ^\n * | | ---- |\n * | | c |\n * ```\n *\n * @type {State}\n */\n function headRowEscape(code) {\n if (code === 92 || code === 124) {\n effects.consume(code);\n return headRowData;\n }\n return headRowData(code);\n }\n\n /**\n * Before delimiter row.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headDelimiterStart(code) {\n // Reset `interrupt`.\n self.interrupt = false;\n\n // Note: in `markdown-rs`, we need to handle piercing here too.\n if (self.parser.lazy[self.now().line]) {\n return nok(code);\n }\n effects.enter('tableDelimiterRow');\n // Track if we’ve seen a `:` or `|`.\n seen = false;\n if (markdownSpace(code)) {\n return factorySpace(effects, headDelimiterBefore, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code);\n }\n return headDelimiterBefore(code);\n }\n\n /**\n * Before delimiter row, after optional whitespace.\n *\n * Reused when a `|` is found later, to parse another cell.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headDelimiterBefore(code) {\n if (code === 45 || code === 58) {\n return headDelimiterValueBefore(code);\n }\n if (code === 124) {\n seen = true;\n // If we start with a pipe, we open a cell marker.\n effects.enter('tableCellDivider');\n effects.consume(code);\n effects.exit('tableCellDivider');\n return headDelimiterCellBefore;\n }\n\n // More whitespace / empty row not allowed at start.\n return headDelimiterNok(code);\n }\n\n /**\n * After `|`, before delimiter cell.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterCellBefore(code) {\n if (markdownSpace(code)) {\n return factorySpace(effects, headDelimiterValueBefore, \"whitespace\")(code);\n }\n return headDelimiterValueBefore(code);\n }\n\n /**\n * Before delimiter cell value.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterValueBefore(code) {\n // Align: left.\n if (code === 58) {\n sizeB += 1;\n seen = true;\n effects.enter('tableDelimiterMarker');\n effects.consume(code);\n effects.exit('tableDelimiterMarker');\n return headDelimiterLeftAlignmentAfter;\n }\n\n // Align: none.\n if (code === 45) {\n sizeB += 1;\n // To do: seems weird that this *isn’t* left aligned, but that state is used?\n return headDelimiterLeftAlignmentAfter(code);\n }\n if (code === null || markdownLineEnding(code)) {\n return headDelimiterCellAfter(code);\n }\n return headDelimiterNok(code);\n }\n\n /**\n * After delimiter cell left alignment marker.\n *\n * ```markdown\n * | | a |\n * > | | :- |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterLeftAlignmentAfter(code) {\n if (code === 45) {\n effects.enter('tableDelimiterFiller');\n return headDelimiterFiller(code);\n }\n\n // Anything else is not ok after the left-align colon.\n return headDelimiterNok(code);\n }\n\n /**\n * In delimiter cell filler.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterFiller(code) {\n if (code === 45) {\n effects.consume(code);\n return headDelimiterFiller;\n }\n\n // Align is `center` if it was `left`, `right` otherwise.\n if (code === 58) {\n seen = true;\n effects.exit('tableDelimiterFiller');\n effects.enter('tableDelimiterMarker');\n effects.consume(code);\n effects.exit('tableDelimiterMarker');\n return headDelimiterRightAlignmentAfter;\n }\n effects.exit('tableDelimiterFiller');\n return headDelimiterRightAlignmentAfter(code);\n }\n\n /**\n * After delimiter cell right alignment marker.\n *\n * ```markdown\n * | | a |\n * > | | -: |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterRightAlignmentAfter(code) {\n if (markdownSpace(code)) {\n return factorySpace(effects, headDelimiterCellAfter, \"whitespace\")(code);\n }\n return headDelimiterCellAfter(code);\n }\n\n /**\n * After delimiter cell.\n *\n * ```markdown\n * | | a |\n * > | | -: |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterCellAfter(code) {\n if (code === 124) {\n return headDelimiterBefore(code);\n }\n if (code === null || markdownLineEnding(code)) {\n // Exit when:\n // * there was no `:` or `|` at all (it’s a thematic break or setext\n // underline instead)\n // * the header cell count is not the delimiter cell count\n if (!seen || size !== sizeB) {\n return headDelimiterNok(code);\n }\n\n // Note: in markdown-rs`, a reset is needed here.\n effects.exit('tableDelimiterRow');\n effects.exit('tableHead');\n // To do: in `markdown-rs`, resolvers need to be registered manually.\n // effects.register_resolver(ResolveName::GfmTable)\n return ok(code);\n }\n return headDelimiterNok(code);\n }\n\n /**\n * In delimiter row, at a disallowed byte.\n *\n * ```markdown\n * | | a |\n * > | | x |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterNok(code) {\n // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n return nok(code);\n }\n\n /**\n * Before table body row.\n *\n * ```markdown\n * | | a |\n * | | - |\n * > | | b |\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowStart(code) {\n // Note: in `markdown-rs` we need to manually take care of a prefix,\n // but in `micromark-js` that is done for us, so if we’re here, we’re\n // never at whitespace.\n effects.enter('tableRow');\n return bodyRowBreak(code);\n }\n\n /**\n * At break in table body row.\n *\n * ```markdown\n * | | a |\n * | | - |\n * > | | b |\n * ^\n * ^\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowBreak(code) {\n if (code === 124) {\n effects.enter('tableCellDivider');\n effects.consume(code);\n effects.exit('tableCellDivider');\n return bodyRowBreak;\n }\n if (code === null || markdownLineEnding(code)) {\n effects.exit('tableRow');\n return ok(code);\n }\n if (markdownSpace(code)) {\n return factorySpace(effects, bodyRowBreak, \"whitespace\")(code);\n }\n\n // Anything else is cell content.\n effects.enter(\"data\");\n return bodyRowData(code);\n }\n\n /**\n * In table body row data.\n *\n * ```markdown\n * | | a |\n * | | - |\n * > | | b |\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowData(code) {\n if (code === null || code === 124 || markdownLineEndingOrSpace(code)) {\n effects.exit(\"data\");\n return bodyRowBreak(code);\n }\n effects.consume(code);\n return code === 92 ? bodyRowEscape : bodyRowData;\n }\n\n /**\n * In table body row escape.\n *\n * ```markdown\n * | | a |\n * | | ---- |\n * > | | b\\-c |\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowEscape(code) {\n if (code === 92 || code === 124) {\n effects.consume(code);\n return bodyRowData;\n }\n return bodyRowData(code);\n }\n}\n\n/** @type {Resolver} */\n\nfunction resolveTable(events, context) {\n let index = -1;\n let inFirstCellAwaitingPipe = true;\n /** @type {RowKind} */\n let rowKind = 0;\n /** @type {Range} */\n let lastCell = [0, 0, 0, 0];\n /** @type {Range} */\n let cell = [0, 0, 0, 0];\n let afterHeadAwaitingFirstBodyRow = false;\n let lastTableEnd = 0;\n /** @type {Token | undefined} */\n let currentTable;\n /** @type {Token | undefined} */\n let currentBody;\n /** @type {Token | undefined} */\n let currentCell;\n const map = new EditMap();\n while (++index < events.length) {\n const event = events[index];\n const token = event[1];\n if (event[0] === 'enter') {\n // Start of head.\n if (token.type === 'tableHead') {\n afterHeadAwaitingFirstBodyRow = false;\n\n // Inject previous (body end and) table end.\n if (lastTableEnd !== 0) {\n flushTableEnd(map, context, lastTableEnd, currentTable, currentBody);\n currentBody = undefined;\n lastTableEnd = 0;\n }\n\n // Inject table start.\n currentTable = {\n type: 'table',\n start: Object.assign({}, token.start),\n // Note: correct end is set later.\n end: Object.assign({}, token.end)\n };\n map.add(index, 0, [['enter', currentTable, context]]);\n } else if (token.type === 'tableRow' || token.type === 'tableDelimiterRow') {\n inFirstCellAwaitingPipe = true;\n currentCell = undefined;\n lastCell = [0, 0, 0, 0];\n cell = [0, index + 1, 0, 0];\n\n // Inject table body start.\n if (afterHeadAwaitingFirstBodyRow) {\n afterHeadAwaitingFirstBodyRow = false;\n currentBody = {\n type: 'tableBody',\n start: Object.assign({}, token.start),\n // Note: correct end is set later.\n end: Object.assign({}, token.end)\n };\n map.add(index, 0, [['enter', currentBody, context]]);\n }\n rowKind = token.type === 'tableDelimiterRow' ? 2 : currentBody ? 3 : 1;\n }\n // Cell data.\n else if (rowKind && (token.type === \"data\" || token.type === 'tableDelimiterMarker' || token.type === 'tableDelimiterFiller')) {\n inFirstCellAwaitingPipe = false;\n\n // First value in cell.\n if (cell[2] === 0) {\n if (lastCell[1] !== 0) {\n cell[0] = cell[1];\n currentCell = flushCell(map, context, lastCell, rowKind, undefined, currentCell);\n lastCell = [0, 0, 0, 0];\n }\n cell[2] = index;\n }\n } else if (token.type === 'tableCellDivider') {\n if (inFirstCellAwaitingPipe) {\n inFirstCellAwaitingPipe = false;\n } else {\n if (lastCell[1] !== 0) {\n cell[0] = cell[1];\n currentCell = flushCell(map, context, lastCell, rowKind, undefined, currentCell);\n }\n lastCell = cell;\n cell = [lastCell[1], index, 0, 0];\n }\n }\n }\n // Exit events.\n else if (token.type === 'tableHead') {\n afterHeadAwaitingFirstBodyRow = true;\n lastTableEnd = index;\n } else if (token.type === 'tableRow' || token.type === 'tableDelimiterRow') {\n lastTableEnd = index;\n if (lastCell[1] !== 0) {\n cell[0] = cell[1];\n currentCell = flushCell(map, context, lastCell, rowKind, index, currentCell);\n } else if (cell[1] !== 0) {\n currentCell = flushCell(map, context, cell, rowKind, index, currentCell);\n }\n rowKind = 0;\n } else if (rowKind && (token.type === \"data\" || token.type === 'tableDelimiterMarker' || token.type === 'tableDelimiterFiller')) {\n cell[3] = index;\n }\n }\n if (lastTableEnd !== 0) {\n flushTableEnd(map, context, lastTableEnd, currentTable, currentBody);\n }\n map.consume(context.events);\n\n // To do: move this into `html`, when events are exposed there.\n // That’s what `markdown-rs` does.\n // That needs updates to `mdast-util-gfm-table`.\n index = -1;\n while (++index < context.events.length) {\n const event = context.events[index];\n if (event[0] === 'enter' && event[1].type === 'table') {\n event[1]._align = gfmTableAlign(context.events, index);\n }\n }\n return events;\n}\n\n/**\n * Generate a cell.\n *\n * @param {EditMap} map\n * @param {Readonly<TokenizeContext>} context\n * @param {Readonly<Range>} range\n * @param {RowKind} rowKind\n * @param {number | undefined} rowEnd\n * @param {Token | undefined} previousCell\n * @returns {Token | undefined}\n */\n// eslint-disable-next-line max-params\nfunction flushCell(map, context, range, rowKind, rowEnd, previousCell) {\n // `markdown-rs` uses:\n // rowKind === 2 ? 'tableDelimiterCell' : 'tableCell'\n const groupName = rowKind === 1 ? 'tableHeader' : rowKind === 2 ? 'tableDelimiter' : 'tableData';\n // `markdown-rs` uses:\n // rowKind === 2 ? 'tableDelimiterCellValue' : 'tableCellText'\n const valueName = 'tableContent';\n\n // Insert an exit for the previous cell, if there is one.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- exit\n // ^^^^-- this cell\n // ```\n if (range[0] !== 0) {\n previousCell.end = Object.assign({}, getPoint(context.events, range[0]));\n map.add(range[0], 0, [['exit', previousCell, context]]);\n }\n\n // Insert enter of this cell.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- enter\n // ^^^^-- this cell\n // ```\n const now = getPoint(context.events, range[1]);\n previousCell = {\n type: groupName,\n start: Object.assign({}, now),\n // Note: correct end is set later.\n end: Object.assign({}, now)\n };\n map.add(range[1], 0, [['enter', previousCell, context]]);\n\n // Insert text start at first data start and end at last data end, and\n // remove events between.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- enter\n // ^-- exit\n // ^^^^-- this cell\n // ```\n if (range[2] !== 0) {\n const relatedStart = getPoint(context.events, range[2]);\n const relatedEnd = getPoint(context.events, range[3]);\n /** @type {Token} */\n const valueToken = {\n type: valueName,\n start: Object.assign({}, relatedStart),\n end: Object.assign({}, relatedEnd)\n };\n map.add(range[2], 0, [['enter', valueToken, context]]);\n if (rowKind !== 2) {\n // Fix positional info on remaining events\n const start = context.events[range[2]];\n const end = context.events[range[3]];\n start[1].end = Object.assign({}, end[1].end);\n start[1].type = \"chunkText\";\n start[1].contentType = \"text\";\n\n // Remove if needed.\n if (range[3] > range[2] + 1) {\n const a = range[2] + 1;\n const b = range[3] - range[2] - 1;\n map.add(a, b, []);\n }\n }\n map.add(range[3] + 1, 0, [['exit', valueToken, context]]);\n }\n\n // Insert an exit for the last cell, if at the row end.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- exit\n // ^^^^^^-- this cell (the last one contains two “between” parts)\n // ```\n if (rowEnd !== undefined) {\n previousCell.end = Object.assign({}, getPoint(context.events, rowEnd));\n map.add(rowEnd, 0, [['exit', previousCell, context]]);\n previousCell = undefined;\n }\n return previousCell;\n}\n\n/**\n * Generate table end (and table body end).\n *\n * @param {Readonly<EditMap>} map\n * @param {Readonly<TokenizeContext>} context\n * @param {number} index\n * @param {Token} table\n * @param {Token | undefined} tableBody\n */\n// eslint-disable-next-line max-params\nfunction flushTableEnd(map, context, index, table, tableBody) {\n /** @type {Array<Event>} */\n const exits = [];\n const related = getPoint(context.events, index);\n if (tableBody) {\n tableBody.end = Object.assign({}, related);\n exits.push(['exit', tableBody, context]);\n }\n table.end = Object.assign({}, related);\n exits.push(['exit', table, context]);\n map.add(index + 1, 0, exits);\n}\n\n/**\n * @param {Readonly<Array<Event>>} events\n * @param {number} index\n * @returns {Readonly<Point>}\n */\nfunction getPoint(events, index) {\n const event = events[index];\n const side = event[0] === 'enter' ? 'start' : 'end';\n return event[1][side];\n}","/**\n * @import {Extension, State, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nconst tasklistCheck = {\n name: 'tasklistCheck',\n tokenize: tokenizeTasklistCheck\n};\n\n/**\n * Create an HTML extension for `micromark` to support GFM task list items\n * syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `htmlExtensions` to\n * support GFM task list items when serializing to HTML.\n */\nexport function gfmTaskListItem() {\n return {\n text: {\n [91]: tasklistCheck\n }\n };\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTasklistCheck(effects, ok, nok) {\n const self = this;\n return open;\n\n /**\n * At start of task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function open(code) {\n if (\n // Exit if there’s stuff before.\n self.previous !== null ||\n // Exit if not in the first content that is the first child of a list\n // item.\n !self._gfmTasklistFirstContentOfListItem) {\n return nok(code);\n }\n effects.enter('taskListCheck');\n effects.enter('taskListCheckMarker');\n effects.consume(code);\n effects.exit('taskListCheckMarker');\n return inside;\n }\n\n /**\n * In task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function inside(code) {\n // Currently we match how GH works in files.\n // To match how GH works in comments, use `markdownSpace` (`[\\t ]`) instead\n // of `markdownLineEndingOrSpace` (`[\\t\\n\\r ]`).\n if (markdownLineEndingOrSpace(code)) {\n effects.enter('taskListCheckValueUnchecked');\n effects.consume(code);\n effects.exit('taskListCheckValueUnchecked');\n return close;\n }\n if (code === 88 || code === 120) {\n effects.enter('taskListCheckValueChecked');\n effects.consume(code);\n effects.exit('taskListCheckValueChecked');\n return close;\n }\n return nok(code);\n }\n\n /**\n * At close of task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function close(code) {\n if (code === 93) {\n effects.enter('taskListCheckMarker');\n effects.consume(code);\n effects.exit('taskListCheckMarker');\n effects.exit('taskListCheck');\n return after;\n }\n return nok(code);\n }\n\n /**\n * @type {State}\n */\n function after(code) {\n // EOL in paragraph means there must be something else after it.\n if (markdownLineEnding(code)) {\n return ok(code);\n }\n\n // Space or tab?\n // Check what comes after.\n if (markdownSpace(code)) {\n return effects.check({\n tokenize: spaceThenNonSpace\n }, ok, nok)(code);\n }\n\n // EOF, or non-whitespace, both wrong.\n return nok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction spaceThenNonSpace(effects, ok, nok) {\n return factorySpace(effects, after, \"whitespace\");\n\n /**\n * After whitespace, after task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n // EOF means there was nothing, so bad.\n // EOL means there’s content after it, so good.\n // Impossible to have more spaces.\n // Anything else is good.\n return code === null ? nok(code) : ok(code);\n }\n}","/**\n * @typedef {import('micromark-extension-gfm-footnote').HtmlOptions} HtmlOptions\n * @typedef {import('micromark-extension-gfm-strikethrough').Options} Options\n * @typedef {import('micromark-util-types').Extension} Extension\n * @typedef {import('micromark-util-types').HtmlExtension} HtmlExtension\n */\n\nimport {\n combineExtensions,\n combineHtmlExtensions\n} from 'micromark-util-combine-extensions'\nimport {\n gfmAutolinkLiteral,\n gfmAutolinkLiteralHtml\n} from 'micromark-extension-gfm-autolink-literal'\nimport {gfmFootnote, gfmFootnoteHtml} from 'micromark-extension-gfm-footnote'\nimport {\n gfmStrikethrough,\n gfmStrikethroughHtml\n} from 'micromark-extension-gfm-strikethrough'\nimport {gfmTable, gfmTableHtml} from 'micromark-extension-gfm-table'\nimport {gfmTagfilterHtml} from 'micromark-extension-gfm-tagfilter'\nimport {\n gfmTaskListItem,\n gfmTaskListItemHtml\n} from 'micromark-extension-gfm-task-list-item'\n\n/**\n * Create an extension for `micromark` to enable GFM syntax.\n *\n * @param {Options | null | undefined} [options]\n * Configuration (optional).\n *\n * Passed to `micromark-extens-gfm-strikethrough`.\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions` to enable GFM\n * syntax.\n */\nexport function gfm(options) {\n return combineExtensions([\n gfmAutolinkLiteral(),\n gfmFootnote(),\n gfmStrikethrough(options),\n gfmTable(),\n gfmTaskListItem()\n ])\n}\n\n/**\n * Create an extension for `micromark` to support GFM when serializing to HTML.\n *\n * @param {HtmlOptions | null | undefined} [options]\n * Configuration (optional).\n *\n * Passed to `micromark-extens-gfm-footnote`.\n * @returns {HtmlExtension}\n * Extension for `micromark` that can be passed in `htmlExtensions` to\n * support GFM when serializing to HTML.\n */\nexport function gfmHtml(options) {\n return combineHtmlExtensions([\n gfmAutolinkLiteralHtml(),\n gfmFootnoteHtml(options),\n gfmStrikethroughHtml(),\n gfmTableHtml(),\n gfmTagfilterHtml(),\n gfmTaskListItemHtml()\n ])\n}\n","/**\n * @import {Root} from 'mdast'\n * @import {Options} from 'remark-gfm'\n * @import {} from 'remark-parse'\n * @import {} from 'remark-stringify'\n * @import {Processor} from 'unified'\n */\n\nimport {gfmFromMarkdown, gfmToMarkdown} from 'mdast-util-gfm'\nimport {gfm} from 'micromark-extension-gfm'\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/**\n * Add support GFM (autolink literals, footnotes, strikethrough, tables,\n * tasklists).\n *\n * @param {Options | null | undefined} [options]\n * Configuration (optional).\n * @returns {undefined}\n * Nothing.\n */\nexport default function remarkGfm(options) {\n // @ts-expect-error: TS is wrong about `this`.\n // eslint-disable-next-line unicorn/no-this-assignment\n const self = /** @type {Processor<Root>} */ (this)\n const settings = options || emptyOptions\n const data = self.data()\n\n const micromarkExtensions =\n data.micromarkExtensions || (data.micromarkExtensions = [])\n const fromMarkdownExtensions =\n data.fromMarkdownExtensions || (data.fromMarkdownExtensions = [])\n const toMarkdownExtensions =\n data.toMarkdownExtensions || (data.toMarkdownExtensions = [])\n\n micromarkExtensions.push(gfm(settings))\n fromMarkdownExtensions.push(gfmFromMarkdown())\n toMarkdownExtensions.push(gfmToMarkdown(settings))\n}\n","import type { AgentConfig, Asset, AssetRenderInfo, AssetType } from '../types/components';\nimport { resolveMediaUrl } from '../services/file';\n\nexport const isHttpUrl = (value: string): boolean => {\n if (!value) return false;\n try {\n const url = new URL(value);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n};\n\nexport const isVideoUrl = (url?: string) => {\n if (!url) return false;\n try {\n const urlObj = new URL(url, 'http://dummy');\n const pathname = urlObj.pathname.toLowerCase();\n return /\\.(mp4|mov|webm|avi|mkv|m4v)$/i.test(pathname);\n } catch {\n const lower = url.toLowerCase();\n return /\\.(mp4|mov|webm|avi|mkv|m4v)(\\?|#|$)/i.test(lower);\n }\n};\n\nexport const inferAssetTypeFromFile = (file?: File): AssetType => {\n if (!file) return 'file';\n if (file.type?.startsWith('video/')) return 'video';\n if (file.type?.startsWith('image/')) return 'image';\n return 'file';\n};\n\nexport const inferAssetTypeFromUrl = (url?: string): AssetType => {\n if (!url) return 'file';\n return isVideoUrl(url) ? 'video' : 'image';\n};\n\nexport const createAssetFromSource = (options: { fileId?: string; fileUrl?: string; type?: AssetType }): Asset | null => {\n const { fileId, fileUrl, type } = options;\n if (!fileId && !fileUrl) return null;\n const url = fileUrl && isHttpUrl(fileUrl) ? fileUrl : undefined;\n const inferredFileId = fileId || (!url && fileUrl ? fileUrl : undefined);\n const assetType = type || (url ? inferAssetTypeFromUrl(url) : 'image');\n return {\n type: assetType,\n fileId: inferredFileId,\n url\n };\n};\n\nexport const resolveAssetForDisplay = async (\n asset: Asset,\n config?: AgentConfig\n): Promise<AssetRenderInfo | null> => {\n let working: Asset = asset;\n const strategy = config?.asset;\n\n if (strategy?.resolve && !working.url) {\n working = await strategy.resolve(working);\n }\n\n if (strategy?.transform) {\n working = strategy.transform(working);\n }\n\n if (strategy?.render) {\n return strategy.render(working);\n }\n\n if (working.url) {\n return {\n url: working.url,\n hdUrl: working.url,\n isVideo: working.type === 'video' || inferAssetTypeFromUrl(working.url) === 'video'\n };\n }\n\n if (working.fileId) {\n const resolved = resolveMediaUrl({ fileId: working.fileId });\n if (resolved) return resolved;\n }\n\n return null;\n};\n","'use client';\n\nimport React, { useState, useMemo, memo } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport { \n Bot, \n Brain, \n Zap, \n Eye, \n CheckCircle2, \n AlertCircle, \n Clock, \n ChevronDown, \n ChevronUp,\n Loader2,\n Check,\n ExternalLink,\n Download,\n Users\n} from 'lucide-react';\nimport type { AgentThought } from '../types/agent';\nimport { resolveMediaUrl } from '../services/file';\n\n// ============ 类型定义 ============\n\ninterface MultiAgentThoughtsProps {\n thoughts: AgentThought[];\n isStreaming?: boolean;\n}\n\ninterface ThoughtStep {\n id: string;\n type: string;\n content?: string;\n agentId?: string;\n agentName?: string;\n toolCalls?: any[];\n observation?: string;\n timestamp: number;\n}\n\ninterface SubAgentInfo {\n agentId: string;\n agentName: string;\n toolCallCount: number;\n}\n\n// ============ 工具函数 ============\n\n/** 格式化时间戳 */\nfunction formatTime(timestamp: number): string {\n const date = new Date(timestamp);\n return date.toLocaleTimeString('zh-CN', { \n hour: '2-digit', \n minute: '2-digit', \n second: '2-digit' \n });\n}\n\n/** 获取步骤类型的图标和样式 */\nfunction getStepTypeInfo(type: string): { \n icon: React.ReactNode; \n label: string; \n bgColor: string;\n textColor: string;\n} {\n switch (type) {\n case 'thinking':\n case 'reasoning_start':\n case 'reasoning_delta':\n case 'reasoning_end':\n return { \n icon: <Brain size={14} />, \n label: '思考中',\n bgColor: 'bg-blue-500/20',\n textColor: 'text-blue-400'\n };\n case 'action':\n return { \n icon: <Zap size={14} />, \n label: '执行动作',\n bgColor: 'bg-amber-500/20',\n textColor: 'text-amber-400'\n };\n case 'observation':\n return { \n icon: <Eye size={14} />, \n label: '观察结果',\n bgColor: 'bg-purple-500/20',\n textColor: 'text-purple-400'\n };\n case 'final':\n return { \n icon: <CheckCircle2 size={14} />, \n label: '最终答案',\n bgColor: 'bg-green-500/20',\n textColor: 'text-green-400'\n };\n case 'error':\n return { \n icon: <AlertCircle size={14} />, \n label: '错误',\n bgColor: 'bg-red-500/20',\n textColor: 'text-red-400'\n };\n default:\n return { \n icon: <Clock size={14} />, \n label: type,\n bgColor: 'bg-zinc-500/20',\n textColor: 'text-zinc-400'\n };\n }\n}\n\n// ============ 子组件 ============\n\n/** 工具调用卡片 */\nconst ToolCallCard = memo(function ToolCallCard({ toolCall }: { toolCall: any }) {\n const [expanded, setExpanded] = useState(false);\n \n const status = toolCall.status?.toUpperCase?.() || 'PENDING';\n const isPending = status === 'PENDING';\n const isSuccess = status === 'SUCCESS' || status === 'COMPLETED';\n const isFailed = status === 'FAILED' || status === 'ERROR';\n \n const toolName = toolCall.name || toolCall.toolName || 'unknown';\n const result = toolCall.result;\n \n // 解析媒体结果,优先使用 fileId\n const mediaUrls: Array<{ url: string; hdUrl: string; isVideo: boolean }> = [];\n \n // 1. 检查 result.works(结构化结果)\n if (result?.works && Array.isArray(result.works)) {\n result.works.forEach((w: any) => {\n const resolved = resolveMediaUrl({ fileId: w.fileId, fileUrl: w.fileUrl });\n if (resolved) {\n mediaUrls.push(resolved);\n }\n });\n }\n \n // 2. 检查 result.outputs.images\n if (result?.outputs?.images && mediaUrls.length === 0) {\n const resolved = resolveMediaUrl({ fileUrl: result.outputs.images });\n if (resolved) {\n mediaUrls.push(resolved);\n }\n }\n \n // 3. 检查 result 是否直接是图片/视频 URL 字符串\n const isDirectImageUrl = typeof result === 'string' && \n (result.match(/\\.(jpg|jpeg|png|gif|webp|mp4|mov|webm)$/i) || result.includes('oss'));\n if (isDirectImageUrl && mediaUrls.length === 0) {\n const resolved = resolveMediaUrl({ fileUrl: result });\n if (resolved) {\n mediaUrls.push(resolved);\n }\n }\n \n const hasMediaResults = mediaUrls.length > 0;\n\n return (\n <div className=\"rounded-lg overflow-hidden bg-zinc-800/60 border border-zinc-700/50\">\n <div \n className=\"flex items-center justify-between px-3 py-2 cursor-pointer hover:bg-zinc-700/30 transition-colors\"\n onClick={() => setExpanded(!expanded)}\n >\n <div className=\"flex items-center gap-2\">\n <div className={`w-5 h-5 rounded flex items-center justify-center ${\n isPending ? 'bg-amber-500/20' : isSuccess ? 'bg-green-500/20' : 'bg-red-500/20'\n }`}>\n {isPending ? (\n <Loader2 size={12} className=\"text-amber-400 animate-spin\" />\n ) : isSuccess ? (\n <Check size={12} className=\"text-green-400\" />\n ) : (\n <AlertCircle size={12} className=\"text-red-400\" />\n )}\n </div>\n <span className=\"text-xs text-zinc-300 font-mono\">{toolName}</span>\n <span className={`text-[10px] px-1.5 py-0.5 rounded ${\n isPending ? 'bg-amber-500/10 text-amber-400' :\n isSuccess ? 'bg-green-500/10 text-green-400' :\n 'bg-red-500/10 text-red-400'\n }`}>\n {isPending ? '执行中' : isSuccess ? 'SUCCESS' : 'FAILED'}\n </span>\n </div>\n {expanded ? (\n <ChevronUp size={14} className=\"text-zinc-500\" />\n ) : (\n <ChevronDown size={14} className=\"text-zinc-500\" />\n )}\n </div>\n \n {expanded && (\n <div className=\"px-3 pb-3 space-y-2 border-t border-zinc-700/50\">\n {/* 参数 */}\n {toolCall.arguments && Object.keys(toolCall.arguments).length > 0 && (\n <div className=\"mt-2\">\n <div className=\"text-[10px] text-zinc-500 uppercase tracking-wide mb-1\">参数</div>\n <pre className=\"text-[11px] text-zinc-400 bg-zinc-900/50 rounded p-2 overflow-x-auto font-mono whitespace-pre-wrap break-all\">\n {JSON.stringify(toolCall.arguments, null, 2)}\n </pre>\n </div>\n )}\n \n {/* 媒体结果(图片/视频) */}\n {hasMediaResults && (\n <div>\n <div className=\"text-[10px] text-zinc-500 uppercase tracking-wide mb-1\">结果</div>\n <div className=\"space-y-2\">\n {mediaUrls.map((media, i) => (\n <div key={i} className=\"relative group\">\n {media.isVideo ? (\n <video \n src={media.url} \n controls \n className=\"max-w-full max-h-60 rounded-lg object-contain bg-zinc-900\"\n preload=\"metadata\"\n />\n ) : (\n <img \n src={media.url} // 使用缩略图\n alt=\"Tool result\" \n className=\"max-w-full max-h-60 rounded-lg object-contain bg-zinc-900\"\n />\n )}\n <div className=\"absolute top-2 right-2 flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <a\n href={media.hdUrl} // 使用高清图\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"p-1.5 bg-black/60 hover:bg-black/80 rounded-lg backdrop-blur-sm transition-colors\"\n >\n <ExternalLink size={12} className=\"text-white\" />\n </a>\n <a\n href={media.hdUrl} // 下载使用高清图\n download\n className=\"p-1.5 bg-black/60 hover:bg-black/80 rounded-lg backdrop-blur-sm transition-colors\"\n >\n <Download size={12} className=\"text-white\" />\n </a>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n \n {/* 非媒体结果 */}\n {result && !hasMediaResults && (\n <div>\n <div className=\"text-[10px] text-zinc-500 uppercase tracking-wide mb-1\">结果</div>\n <pre className=\"text-[11px] text-zinc-400 bg-zinc-900/50 rounded p-2 overflow-x-auto font-mono whitespace-pre-wrap break-all\">\n {typeof result === 'string' ? result : JSON.stringify(result, null, 2)}\n </pre>\n </div>\n )}\n </div>\n )}\n </div>\n );\n});\n\n/** 单个思考步骤 */\nconst ThoughtStepCard = memo(function ThoughtStepCard({ \n step, \n isSubAgent,\n isStreaming \n}: { \n step: ThoughtStep; \n isSubAgent: boolean;\n isStreaming?: boolean;\n}) {\n const typeInfo = getStepTypeInfo(step.type);\n const hasToolCalls = step.toolCalls && step.toolCalls.length > 0;\n \n // 检查内容是否包含 Markdown 图片\n const hasMarkdownImage = step.content?.includes('![') || step.observation?.includes('![');\n \n return (\n <div className={`relative min-w-0 ${isSubAgent ? 'ml-4 pl-3 border-l-2 border-purple-500/30' : ''}`}>\n {/* 子 Agent 标识 */}\n {isSubAgent && step.agentName && (\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"w-5 h-5 rounded bg-purple-500/20 flex items-center justify-center flex-shrink-0\">\n <Bot size={12} className=\"text-purple-400\" />\n </div>\n <span className=\"text-xs font-medium text-purple-400 truncate\">{step.agentName}</span>\n </div>\n )}\n \n {/* 步骤卡片 */}\n <div className=\"bg-zinc-800/40 rounded-lg border border-zinc-700/30 overflow-hidden min-w-0\">\n {/* 步骤头部 */}\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-zinc-700/30\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <div className={`w-5 h-5 rounded flex items-center justify-center flex-shrink-0 ${typeInfo.bgColor}`}>\n <span className={typeInfo.textColor}>{typeInfo.icon}</span>\n </div>\n <span className={`text-xs font-medium ${typeInfo.textColor}`}>{typeInfo.label}</span>\n {isStreaming && step.type.includes('thinking') && (\n <Loader2 size={12} className=\"text-blue-400 animate-spin flex-shrink-0\" />\n )}\n </div>\n <span className=\"text-[10px] text-zinc-500 flex-shrink-0 ml-2\">{formatTime(step.timestamp)}</span>\n </div>\n \n {/* 步骤内容 */}\n <div className=\"px-3 py-2 space-y-2 overflow-hidden\">\n {/* 文本内容 */}\n {step.content && (\n <div className=\"text-sm text-zinc-300 leading-relaxed break-all\">\n {hasMarkdownImage ? (\n <ReactMarkdown \n remarkPlugins={[remarkGfm]}\n components={{\n img: ({ src, alt }) => {\n // 使用 resolveMediaUrl 处理图片 URL\n const resolved = resolveMediaUrl({ fileUrl: src });\n if (!resolved) return null;\n return (\n <img \n src={resolved.url}\n alt={alt || 'image'} \n className=\"max-w-full max-h-60 rounded-lg object-contain my-2\"\n />\n );\n },\n p: ({ children }) => <p className=\"mb-2 last:mb-0 break-all\">{children}</p>,\n }}\n >\n {step.content}\n </ReactMarkdown>\n ) : (\n <p className=\"break-all\">{step.content}</p>\n )}\n </div>\n )}\n \n {/* 观察结果 */}\n {step.observation && !step.content && (\n <div className=\"text-sm text-zinc-300 leading-relaxed break-all\">\n {hasMarkdownImage ? (\n <ReactMarkdown \n remarkPlugins={[remarkGfm]}\n components={{\n img: ({ src, alt }) => {\n // 使用 resolveMediaUrl 处理图片 URL\n const resolved = resolveMediaUrl({ fileUrl: src });\n if (!resolved) return null;\n return (\n <img \n src={resolved.url}\n alt={alt || 'image'} \n className=\"max-w-full max-h-60 rounded-lg object-contain my-2\"\n />\n );\n },\n p: ({ children }) => <p className=\"mb-2 last:mb-0 break-all\">{children}</p>,\n }}\n >\n {step.observation}\n </ReactMarkdown>\n ) : (\n <p className=\"break-all\">{step.observation}</p>\n )}\n </div>\n )}\n \n {/* 工具调用 */}\n {hasToolCalls && (\n <div className=\"space-y-2 mt-2\">\n {step.toolCalls!.map((tc, i) => (\n <ToolCallCard key={tc.id || i} toolCall={tc} />\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n});\n\n/** 子 Agent 摘要卡片 */\nconst SubAgentsSummary = memo(function SubAgentsSummary({ \n subAgents \n}: { \n subAgents: SubAgentInfo[] \n}) {\n if (subAgents.length === 0) return null;\n \n return (\n <div className=\"bg-zinc-800/40 rounded-lg border border-zinc-700/30 p-3 mb-4\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Users size={14} className=\"text-purple-400\" />\n <span className=\"text-xs font-medium text-zinc-300\">\n 参与的子 Agent ({subAgents.length})\n </span>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {subAgents.map((agent) => (\n <div \n key={agent.agentId}\n className=\"flex items-center gap-2 px-2 py-1 bg-purple-500/10 rounded-lg border border-purple-500/20\"\n >\n <Bot size={12} className=\"text-purple-400\" />\n <span className=\"text-xs text-purple-300\">{agent.agentName}</span>\n {agent.toolCallCount > 0 && (\n <span className=\"text-[10px] text-purple-400/70\">\n ({agent.toolCallCount} 个工具调用)\n </span>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n});\n\n/** 判断是否为思考类型 */\nfunction isThinkingType(type: string): boolean {\n return type === 'thinking' || type === 'reasoning_start' || type === 'reasoning_delta' || type === 'reasoning_end';\n}\n\n/** 合并连续的同类型同 Agent 的思考步骤 */\nfunction mergeConsecutiveSteps(steps: ThoughtStep[]): ThoughtStep[] {\n if (steps.length === 0) return [];\n \n const merged: ThoughtStep[] = [];\n let currentGroup: ThoughtStep | null = null;\n \n for (const step of steps) {\n const isThinking = isThinkingType(step.type);\n \n // 如果是思考类型,尝试合并\n if (isThinking) {\n if (currentGroup && \n isThinkingType(currentGroup.type) && \n currentGroup.agentId === step.agentId) {\n \n // 合并内容:追加到当前组\n const rawContent = step.content || '';\n \n if (step.type === 'reasoning_delta') {\n // 流式增量:直接拼接,保留空白符,不去重\n if (!currentGroup.content) {\n currentGroup.content = rawContent;\n } else {\n currentGroup.content += rawContent;\n }\n } else {\n // 块状内容:当作新段落\n const newContent = rawContent.trim();\n if (newContent) {\n if (currentGroup.content) {\n // 简单去重检查 (仅针对块状内容)\n if (!currentGroup.content.includes(newContent)) {\n currentGroup.content = currentGroup.content + '\\n\\n' + newContent;\n }\n } else {\n currentGroup.content = newContent;\n }\n }\n }\n \n // 更新时间戳为最新的\n currentGroup.timestamp = step.timestamp;\n } else {\n // 保存之前的组,开始新组\n if (currentGroup) {\n merged.push(currentGroup);\n }\n currentGroup = { ...step, type: 'thinking' }; // 统一为 thinking 类型\n }\n } else {\n // 非思考类型,先保存当前组,然后直接添加\n if (currentGroup) {\n merged.push(currentGroup);\n currentGroup = null;\n }\n merged.push(step);\n }\n }\n \n // 保存最后一个组\n if (currentGroup) {\n merged.push(currentGroup);\n }\n \n return merged;\n}\n\n// ============ 主组件 ============\n\nconst MultiAgentThoughts = memo(function MultiAgentThoughts({ \n thoughts, \n isStreaming \n}: MultiAgentThoughtsProps) {\n // 处理思考步骤:按时间排序,合并连续思考,提取子 Agent 信息\n const { sortedSteps, subAgents, isMultiAgent } = useMemo(() => {\n // 按时间戳排序\n const rawSteps: ThoughtStep[] = thoughts\n .map(t => ({\n id: t.id,\n type: t.type,\n content: t.content?.trim(),\n agentId: t.agentId || (t as any).agent_id,\n agentName: t.agentName || (t as any).agent_name,\n toolCalls: t.toolCalls || (t as any).tool_calls,\n observation: t.observation,\n timestamp: t.timestamp || (t as any).gmt_create || Date.now(),\n }))\n .sort((a, b) => a.timestamp - b.timestamp);\n \n // 合并连续的思考步骤\n const mergedSteps = mergeConsecutiveSteps(rawSteps);\n \n // 提取子 Agent 信息\n const agentMap = new Map<string, SubAgentInfo>();\n rawSteps.forEach(step => {\n if (step.agentId && step.agentName) {\n const existing = agentMap.get(step.agentId);\n if (existing) {\n existing.toolCallCount += (step.toolCalls?.length || 0);\n } else {\n agentMap.set(step.agentId, {\n agentId: step.agentId,\n agentName: step.agentName,\n toolCallCount: step.toolCalls?.length || 0,\n });\n }\n }\n });\n \n return {\n sortedSteps: mergedSteps,\n subAgents: Array.from(agentMap.values()),\n isMultiAgent: agentMap.size > 0,\n };\n }, [thoughts]);\n \n if (sortedSteps.length === 0) {\n return null;\n }\n \n return (\n <div className=\"space-y-3\">\n {/* 子 Agent 摘要 */}\n {isMultiAgent && <SubAgentsSummary subAgents={subAgents} />}\n \n {/* 时间线步骤 */}\n <div className=\"space-y-3\">\n {sortedSteps.map((step, index) => (\n <ThoughtStepCard \n key={step.id || index}\n step={step}\n isSubAgent={!!step.agentId}\n isStreaming={isStreaming && index === sortedSteps.length - 1}\n />\n ))}\n </div>\n </div>\n );\n});\n\nexport default MultiAgentThoughts;\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import {\n AnyClassGroupIds,\n AnyConfig,\n AnyThemeGroupIds,\n ClassGroup,\n ClassValidator,\n Config,\n ThemeGetter,\n ThemeObject,\n} from './types'\n\nexport interface ClassPartObject {\n nextPart: Map<string, ClassPartObject>\n validators: ClassValidatorObject[]\n classGroupId?: AnyClassGroupIds\n}\n\ninterface ClassValidatorObject {\n classGroupId: AnyClassGroupIds\n validator: ClassValidator\n}\n\nconst CLASS_PART_SEPARATOR = '-'\n\nexport const createClassGroupUtils = (config: AnyConfig) => {\n const classMap = createClassMap(config)\n const { conflictingClassGroups, conflictingClassGroupModifiers } = config\n\n const getClassGroupId = (className: string) => {\n const classParts = className.split(CLASS_PART_SEPARATOR)\n\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift()\n }\n\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className)\n }\n\n const getConflictingClassGroupIds = (\n classGroupId: AnyClassGroupIds,\n hasPostfixModifier: boolean,\n ) => {\n const conflicts = conflictingClassGroups[classGroupId] || []\n\n if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {\n return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]!]\n }\n\n return conflicts\n }\n\n return {\n getClassGroupId,\n getConflictingClassGroupIds,\n }\n}\n\nconst getGroupRecursive = (\n classParts: string[],\n classPartObject: ClassPartObject,\n): AnyClassGroupIds | undefined => {\n if (classParts.length === 0) {\n return classPartObject.classGroupId\n }\n\n const currentClassPart = classParts[0]!\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart)\n const classGroupFromNextClassPart = nextClassPartObject\n ? getGroupRecursive(classParts.slice(1), nextClassPartObject)\n : undefined\n\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart\n }\n\n if (classPartObject.validators.length === 0) {\n return undefined\n }\n\n const classRest = classParts.join(CLASS_PART_SEPARATOR)\n\n return classPartObject.validators.find(({ validator }) => validator(classRest))?.classGroupId\n}\n\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/\n\nconst getGroupIdForArbitraryProperty = (className: string) => {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)![1]\n const property = arbitraryPropertyClassName?.substring(\n 0,\n arbitraryPropertyClassName.indexOf(':'),\n )\n\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property\n }\n }\n}\n\n/**\n * Exported for testing only\n */\nexport const createClassMap = (config: Config<AnyClassGroupIds, AnyThemeGroupIds>) => {\n const { theme, prefix } = config\n const classMap: ClassPartObject = {\n nextPart: new Map<string, ClassPartObject>(),\n validators: [],\n }\n\n const prefixedClassGroupEntries = getPrefixedClassGroupEntries(\n Object.entries(config.classGroups),\n prefix,\n )\n\n prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {\n processClassesRecursively(classGroup, classMap, classGroupId, theme)\n })\n\n return classMap\n}\n\nconst processClassesRecursively = (\n classGroup: ClassGroup<AnyThemeGroupIds>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n classGroup.forEach((classDefinition) => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit =\n classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition)\n classPartObjectToEdit.classGroupId = classGroupId\n return\n }\n\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(\n classDefinition(theme),\n classPartObject,\n classGroupId,\n theme,\n )\n return\n }\n\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId,\n })\n\n return\n }\n\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(\n classGroup,\n getPart(classPartObject, key),\n classGroupId,\n theme,\n )\n })\n })\n}\n\nconst getPart = (classPartObject: ClassPartObject, path: string) => {\n let currentClassPartObject = classPartObject\n\n path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => {\n if (!currentClassPartObject.nextPart.has(pathPart)) {\n currentClassPartObject.nextPart.set(pathPart, {\n nextPart: new Map(),\n validators: [],\n })\n }\n\n currentClassPartObject = currentClassPartObject.nextPart.get(pathPart)!\n })\n\n return currentClassPartObject\n}\n\nconst isThemeGetter = (func: ClassValidator | ThemeGetter): func is ThemeGetter =>\n (func as ThemeGetter).isThemeGetter\n\nconst getPrefixedClassGroupEntries = (\n classGroupEntries: Array<[classGroupId: string, classGroup: ClassGroup<AnyThemeGroupIds>]>,\n prefix: string | undefined,\n): Array<[classGroupId: string, classGroup: ClassGroup<AnyThemeGroupIds>]> => {\n if (!prefix) {\n return classGroupEntries\n }\n\n return classGroupEntries.map(([classGroupId, classGroup]) => {\n const prefixedClassGroup = classGroup.map((classDefinition) => {\n if (typeof classDefinition === 'string') {\n return prefix + classDefinition\n }\n\n if (typeof classDefinition === 'object') {\n return Object.fromEntries(\n Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]),\n )\n }\n\n return classDefinition\n })\n\n return [classGroupId, prefixedClassGroup]\n })\n}\n","// Export is needed because TypeScript complains about an error otherwise:\n// Error: …/tailwind-merge/src/config-utils.ts(8,17): semantic error TS4058: Return type of exported function has or is using name 'LruCache' from external module \"…/tailwind-merge/src/lru-cache\" but cannot be named.\nexport interface LruCache<Key, Value> {\n get(key: Key): Value | undefined\n set(key: Key, value: Value): void\n}\n\n// LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance\nexport const createLruCache = <Key, Value>(maxCacheSize: number): LruCache<Key, Value> => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {},\n }\n }\n\n let cacheSize = 0\n let cache = new Map<Key, Value>()\n let previousCache = new Map<Key, Value>()\n\n const update = (key: Key, value: Value) => {\n cache.set(key, value)\n cacheSize++\n\n if (cacheSize > maxCacheSize) {\n cacheSize = 0\n previousCache = cache\n cache = new Map()\n }\n }\n\n return {\n get(key) {\n let value = cache.get(key)\n\n if (value !== undefined) {\n return value\n }\n if ((value = previousCache.get(key)) !== undefined) {\n update(key, value)\n return value\n }\n },\n set(key, value) {\n if (cache.has(key)) {\n cache.set(key, value)\n } else {\n update(key, value)\n }\n },\n }\n}\n","import { AnyConfig } from './types'\n\nexport const IMPORTANT_MODIFIER = '!'\n\nexport const createParseClassName = (config: AnyConfig) => {\n const { separator, experimentalParseClassName } = config\n const isSeparatorSingleCharacter = separator.length === 1\n const firstSeparatorCharacter = separator[0]\n const separatorLength = separator.length\n\n // parseClassName inspired by https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n const parseClassName = (className: string) => {\n const modifiers = []\n\n let bracketDepth = 0\n let modifierStart = 0\n let postfixModifierPosition: number | undefined\n\n for (let index = 0; index < className.length; index++) {\n let currentCharacter = className[index]\n\n if (bracketDepth === 0) {\n if (\n currentCharacter === firstSeparatorCharacter &&\n (isSeparatorSingleCharacter ||\n className.slice(index, index + separatorLength) === separator)\n ) {\n modifiers.push(className.slice(modifierStart, index))\n modifierStart = index + separatorLength\n continue\n }\n\n if (currentCharacter === '/') {\n postfixModifierPosition = index\n continue\n }\n }\n\n if (currentCharacter === '[') {\n bracketDepth++\n } else if (currentCharacter === ']') {\n bracketDepth--\n }\n }\n\n const baseClassNameWithImportantModifier =\n modifiers.length === 0 ? className : className.substring(modifierStart)\n const hasImportantModifier =\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)\n const baseClassName = hasImportantModifier\n ? baseClassNameWithImportantModifier.substring(1)\n : baseClassNameWithImportantModifier\n\n const maybePostfixModifierPosition =\n postfixModifierPosition && postfixModifierPosition > modifierStart\n ? postfixModifierPosition - modifierStart\n : undefined\n\n return {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n }\n }\n\n if (experimentalParseClassName) {\n return (className: string) => experimentalParseClassName({ className, parseClassName })\n }\n\n return parseClassName\n}\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nexport const sortModifiers = (modifiers: string[]) => {\n if (modifiers.length <= 1) {\n return modifiers\n }\n\n const sortedModifiers: string[] = []\n let unsortedModifiers: string[] = []\n\n modifiers.forEach((modifier) => {\n const isArbitraryVariant = modifier[0] === '['\n\n if (isArbitraryVariant) {\n sortedModifiers.push(...unsortedModifiers.sort(), modifier)\n unsortedModifiers = []\n } else {\n unsortedModifiers.push(modifier)\n }\n })\n\n sortedModifiers.push(...unsortedModifiers.sort())\n\n return sortedModifiers\n}\n","import { createClassGroupUtils } from './class-group-utils'\nimport { createLruCache } from './lru-cache'\nimport { createParseClassName } from './parse-class-name'\nimport { AnyConfig } from './types'\n\nexport type ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createConfigUtils = (config: AnyConfig) => ({\n cache: createLruCache<string, string>(config.cacheSize),\n parseClassName: createParseClassName(config),\n ...createClassGroupUtils(config),\n})\n","import { ConfigUtils } from './config-utils'\nimport { IMPORTANT_MODIFIER, sortModifiers } from './parse-class-name'\n\nconst SPLIT_CLASSES_REGEX = /\\s+/\n\nexport const mergeClassList = (classList: string, configUtils: ConfigUtils) => {\n const { parseClassName, getClassGroupId, getConflictingClassGroupIds } = configUtils\n\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict: string[] = []\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX)\n\n let result = ''\n\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index]!\n\n const { modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition } =\n parseClassName(originalClassName)\n\n let hasPostfixModifier = Boolean(maybePostfixModifierPosition)\n let classGroupId = getClassGroupId(\n hasPostfixModifier\n ? baseClassName.substring(0, maybePostfixModifierPosition)\n : baseClassName,\n )\n\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n classGroupId = getClassGroupId(baseClassName)\n\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n hasPostfixModifier = false\n }\n\n const variantModifier = sortModifiers(modifiers).join(':')\n\n const modifierId = hasImportantModifier\n ? variantModifier + IMPORTANT_MODIFIER\n : variantModifier\n\n const classId = modifierId + classGroupId\n\n if (classGroupsInConflict.includes(classId)) {\n // Tailwind class omitted due to conflict\n continue\n }\n\n classGroupsInConflict.push(classId)\n\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier)\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i]!\n classGroupsInConflict.push(modifierId + group)\n }\n\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n }\n\n return result\n}\n","/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\n\nexport type ClassNameValue = ClassNameArray | string | null | undefined | 0 | 0n | false\ntype ClassNameArray = ClassNameValue[]\n\nexport function twJoin(...classLists: ClassNameValue[]): string\nexport function twJoin() {\n let index = 0\n let argument: ClassNameValue\n let resolvedValue: string\n let string = ''\n\n while (index < arguments.length) {\n if ((argument = arguments[index++])) {\n if ((resolvedValue = toValue(argument))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n return string\n}\n\nconst toValue = (mix: ClassNameArray | string) => {\n if (typeof mix === 'string') {\n return mix\n }\n\n let resolvedValue: string\n let string = ''\n\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if ((resolvedValue = toValue(mix[k] as ClassNameArray | string))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n\n return string\n}\n","import { createConfigUtils } from './config-utils'\nimport { mergeClassList } from './merge-classlist'\nimport { ClassNameValue, twJoin } from './tw-join'\nimport { AnyConfig } from './types'\n\ntype CreateConfigFirst = () => AnyConfig\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\ntype TailwindMerge = (...classLists: ClassNameValue[]) => string\ntype ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport function createTailwindMerge(\n createConfigFirst: CreateConfigFirst,\n ...createConfigRest: CreateConfigSubsequent[]\n): TailwindMerge {\n let configUtils: ConfigUtils\n let cacheGet: ConfigUtils['cache']['get']\n let cacheSet: ConfigUtils['cache']['set']\n let functionToCall = initTailwindMerge\n\n function initTailwindMerge(classList: string) {\n const config = createConfigRest.reduce(\n (previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig),\n createConfigFirst() as AnyConfig,\n )\n\n configUtils = createConfigUtils(config)\n cacheGet = configUtils.cache.get\n cacheSet = configUtils.cache.set\n functionToCall = tailwindMerge\n\n return tailwindMerge(classList)\n }\n\n function tailwindMerge(classList: string) {\n const cachedResult = cacheGet(classList)\n\n if (cachedResult) {\n return cachedResult\n }\n\n const result = mergeClassList(classList, configUtils)\n cacheSet(classList, result)\n\n return result\n }\n\n return function callTailwindMerge() {\n return functionToCall(twJoin.apply(null, arguments as any))\n }\n}\n","import { DefaultThemeGroupIds, NoInfer, ThemeGetter, ThemeObject } from './types'\n\nexport const fromTheme = <\n AdditionalThemeGroupIds extends string = never,\n DefaultThemeGroupIdsInner extends string = DefaultThemeGroupIds,\n>(key: NoInfer<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>): ThemeGetter => {\n const themeGetter = (theme: ThemeObject<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>) =>\n theme[key] || []\n\n themeGetter.isThemeGetter = true as const\n\n return themeGetter\n}\n","const arbitraryValueRegex = /^\\[(?:([a-z-]+):)?(.+)\\]$/i\nconst fractionRegex = /^\\d+\\/\\d+$/\nconst stringLengths = new Set(['px', 'full', 'screen'])\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/\nconst lengthUnitRegex =\n /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch))\\(.+\\)$/\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/\nconst imageRegex =\n /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/\n\nexport const isLength = (value: string) =>\n isNumber(value) || stringLengths.has(value) || fractionRegex.test(value)\n\nexport const isArbitraryLength = (value: string) =>\n getIsArbitraryValue(value, 'length', isLengthOnly)\n\nexport const isNumber = (value: string) => Boolean(value) && !Number.isNaN(Number(value))\n\nexport const isArbitraryNumber = (value: string) => getIsArbitraryValue(value, 'number', isNumber)\n\nexport const isInteger = (value: string) => Boolean(value) && Number.isInteger(Number(value))\n\nexport const isPercent = (value: string) => value.endsWith('%') && isNumber(value.slice(0, -1))\n\nexport const isArbitraryValue = (value: string) => arbitraryValueRegex.test(value)\n\nexport const isTshirtSize = (value: string) => tshirtUnitRegex.test(value)\n\nconst sizeLabels = new Set(['length', 'size', 'percentage'])\n\nexport const isArbitrarySize = (value: string) => getIsArbitraryValue(value, sizeLabels, isNever)\n\nexport const isArbitraryPosition = (value: string) =>\n getIsArbitraryValue(value, 'position', isNever)\n\nconst imageLabels = new Set(['image', 'url'])\n\nexport const isArbitraryImage = (value: string) => getIsArbitraryValue(value, imageLabels, isImage)\n\nexport const isArbitraryShadow = (value: string) => getIsArbitraryValue(value, '', isShadow)\n\nexport const isAny = () => true\n\nconst getIsArbitraryValue = (\n value: string,\n label: string | Set<string>,\n testValue: (value: string) => boolean,\n) => {\n const result = arbitraryValueRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return typeof label === 'string' ? result[1] === label : label.has(result[1])\n }\n\n return testValue(result[2]!)\n }\n\n return false\n}\n\nconst isLengthOnly = (value: string) =>\n // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n // For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\n lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)\n\nconst isNever = () => false\n\nconst isShadow = (value: string) => shadowRegex.test(value)\n\nconst isImage = (value: string) => imageRegex.test(value)\n","import { fromTheme } from './from-theme'\nimport { Config, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\nimport {\n isAny,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isInteger,\n isLength,\n isNumber,\n isPercent,\n isTshirtSize,\n} from './validators'\n\nexport const getDefaultConfig = () => {\n const colors = fromTheme('colors')\n const spacing = fromTheme('spacing')\n const blur = fromTheme('blur')\n const brightness = fromTheme('brightness')\n const borderColor = fromTheme('borderColor')\n const borderRadius = fromTheme('borderRadius')\n const borderSpacing = fromTheme('borderSpacing')\n const borderWidth = fromTheme('borderWidth')\n const contrast = fromTheme('contrast')\n const grayscale = fromTheme('grayscale')\n const hueRotate = fromTheme('hueRotate')\n const invert = fromTheme('invert')\n const gap = fromTheme('gap')\n const gradientColorStops = fromTheme('gradientColorStops')\n const gradientColorStopPositions = fromTheme('gradientColorStopPositions')\n const inset = fromTheme('inset')\n const margin = fromTheme('margin')\n const opacity = fromTheme('opacity')\n const padding = fromTheme('padding')\n const saturate = fromTheme('saturate')\n const scale = fromTheme('scale')\n const sepia = fromTheme('sepia')\n const skew = fromTheme('skew')\n const space = fromTheme('space')\n const translate = fromTheme('translate')\n\n const getOverscroll = () => ['auto', 'contain', 'none'] as const\n const getOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'] as const\n const getSpacingWithAutoAndArbitrary = () => ['auto', isArbitraryValue, spacing] as const\n const getSpacingWithArbitrary = () => [isArbitraryValue, spacing] as const\n const getLengthWithEmptyAndArbitrary = () => ['', isLength, isArbitraryLength] as const\n const getNumberWithAutoAndArbitrary = () => ['auto', isNumber, isArbitraryValue] as const\n const getPositions = () =>\n [\n 'bottom',\n 'center',\n 'left',\n 'left-bottom',\n 'left-top',\n 'right',\n 'right-bottom',\n 'right-top',\n 'top',\n ] as const\n const getLineStyles = () => ['solid', 'dashed', 'dotted', 'double', 'none'] as const\n const getBlendModes = () =>\n [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ] as const\n const getAlign = () =>\n ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch'] as const\n const getZeroAndEmpty = () => ['', '0', isArbitraryValue] as const\n const getBreaks = () =>\n ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'] as const\n const getNumberAndArbitrary = () => [isNumber, isArbitraryValue]\n\n return {\n cacheSize: 500,\n separator: ':',\n theme: {\n colors: [isAny],\n spacing: [isLength, isArbitraryLength],\n blur: ['none', '', isTshirtSize, isArbitraryValue],\n brightness: getNumberAndArbitrary(),\n borderColor: [colors],\n borderRadius: ['none', '', 'full', isTshirtSize, isArbitraryValue],\n borderSpacing: getSpacingWithArbitrary(),\n borderWidth: getLengthWithEmptyAndArbitrary(),\n contrast: getNumberAndArbitrary(),\n grayscale: getZeroAndEmpty(),\n hueRotate: getNumberAndArbitrary(),\n invert: getZeroAndEmpty(),\n gap: getSpacingWithArbitrary(),\n gradientColorStops: [colors],\n gradientColorStopPositions: [isPercent, isArbitraryLength],\n inset: getSpacingWithAutoAndArbitrary(),\n margin: getSpacingWithAutoAndArbitrary(),\n opacity: getNumberAndArbitrary(),\n padding: getSpacingWithArbitrary(),\n saturate: getNumberAndArbitrary(),\n scale: getNumberAndArbitrary(),\n sepia: getZeroAndEmpty(),\n skew: getNumberAndArbitrary(),\n space: getSpacingWithArbitrary(),\n translate: getSpacingWithArbitrary(),\n },\n classGroups: {\n // Layout\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{ aspect: ['auto', 'square', 'video', isArbitraryValue] }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{ columns: [isTshirtSize] }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{ 'break-after': getBreaks() }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{ 'break-before': getBreaks() }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{ 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column'] }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{ 'box-decoration': ['slice', 'clone'] }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{ box: ['border', 'content'] }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: [\n 'block',\n 'inline-block',\n 'inline',\n 'flex',\n 'inline-flex',\n 'table',\n 'inline-table',\n 'table-caption',\n 'table-cell',\n 'table-column',\n 'table-column-group',\n 'table-footer-group',\n 'table-header-group',\n 'table-row-group',\n 'table-row',\n 'flow-root',\n 'grid',\n 'inline-grid',\n 'contents',\n 'list-item',\n 'hidden',\n ],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{ float: ['right', 'left', 'none', 'start', 'end'] }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{ clear: ['left', 'right', 'both', 'none', 'start', 'end'] }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{ object: ['contain', 'cover', 'fill', 'none', 'scale-down'] }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{ object: [...getPositions(), isArbitraryValue] }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{ overflow: getOverflow() }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{ 'overflow-x': getOverflow() }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{ 'overflow-y': getOverflow() }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{ overscroll: getOverscroll() }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{ 'overscroll-x': getOverscroll() }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{ 'overscroll-y': getOverscroll() }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{ inset: [inset] }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{ 'inset-x': [inset] }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{ 'inset-y': [inset] }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{ start: [inset] }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{ end: [inset] }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{ top: [inset] }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{ right: [inset] }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{ bottom: [inset] }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{ left: [inset] }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{ z: ['auto', isInteger, isArbitraryValue] }],\n // Flexbox and Grid\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{ basis: getSpacingWithAutoAndArbitrary() }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{ flex: ['row', 'row-reverse', 'col', 'col-reverse'] }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{ flex: ['wrap', 'wrap-reverse', 'nowrap'] }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{ flex: ['1', 'auto', 'initial', 'none', isArbitraryValue] }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{ grow: getZeroAndEmpty() }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{ shrink: getZeroAndEmpty() }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{ order: ['first', 'last', 'none', isInteger, isArbitraryValue] }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{ 'grid-cols': [isAny] }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [\n {\n col: [\n 'auto',\n { span: ['full', isInteger, isArbitraryValue] },\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{ 'col-start': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{ 'col-end': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{ 'grid-rows': [isAny] }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [\n { row: ['auto', { span: [isInteger, isArbitraryValue] }, isArbitraryValue] },\n ],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{ 'row-start': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{ 'row-end': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{ 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense'] }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{ 'auto-cols': ['auto', 'min', 'max', 'fr', isArbitraryValue] }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{ 'auto-rows': ['auto', 'min', 'max', 'fr', isArbitraryValue] }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{ gap: [gap] }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{ 'gap-x': [gap] }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{ 'gap-y': [gap] }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{ justify: ['normal', ...getAlign()] }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{ 'justify-items': ['start', 'end', 'center', 'stretch'] }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{ 'justify-self': ['auto', 'start', 'end', 'center', 'stretch'] }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{ content: ['normal', ...getAlign(), 'baseline'] }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{ items: ['start', 'end', 'center', 'baseline', 'stretch'] }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{ self: ['auto', 'start', 'end', 'center', 'stretch', 'baseline'] }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{ 'place-content': [...getAlign(), 'baseline'] }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{ 'place-items': ['start', 'end', 'center', 'baseline', 'stretch'] }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{ 'place-self': ['auto', 'start', 'end', 'center', 'stretch'] }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{ p: [padding] }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{ px: [padding] }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{ py: [padding] }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{ ps: [padding] }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{ pe: [padding] }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{ pt: [padding] }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{ pr: [padding] }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{ pb: [padding] }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{ pl: [padding] }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{ m: [margin] }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{ mx: [margin] }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{ my: [margin] }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{ ms: [margin] }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{ me: [margin] }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{ mt: [margin] }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{ mr: [margin] }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{ mb: [margin] }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{ ml: [margin] }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x': [{ 'space-x': [space] }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y': [{ 'space-y': [space] }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y-reverse': ['space-y-reverse'],\n // Sizing\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [\n {\n w: [\n 'auto',\n 'min',\n 'max',\n 'fit',\n 'svw',\n 'lvw',\n 'dvw',\n isArbitraryValue,\n spacing,\n ],\n },\n ],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{ 'min-w': [isArbitraryValue, spacing, 'min', 'max', 'fit'] }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [\n {\n 'max-w': [\n isArbitraryValue,\n spacing,\n 'none',\n 'full',\n 'min',\n 'max',\n 'fit',\n 'prose',\n { screen: [isTshirtSize] },\n isTshirtSize,\n ],\n },\n ],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [\n {\n h: [\n isArbitraryValue,\n spacing,\n 'auto',\n 'min',\n 'max',\n 'fit',\n 'svh',\n 'lvh',\n 'dvh',\n ],\n },\n ],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [\n { 'min-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh'] },\n ],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [\n { 'max-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh'] },\n ],\n /**\n * Size\n * @see https://tailwindcss.com/docs/size\n */\n size: [{ size: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit'] }],\n // Typography\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{ text: ['base', isTshirtSize, isArbitraryLength] }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [\n {\n font: [\n 'thin',\n 'extralight',\n 'light',\n 'normal',\n 'medium',\n 'semibold',\n 'bold',\n 'extrabold',\n 'black',\n isArbitraryNumber,\n ],\n },\n ],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{ font: [isAny] }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [\n {\n tracking: [\n 'tighter',\n 'tight',\n 'normal',\n 'wide',\n 'wider',\n 'widest',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{ 'line-clamp': ['none', isNumber, isArbitraryNumber] }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [\n {\n leading: [\n 'none',\n 'tight',\n 'snug',\n 'normal',\n 'relaxed',\n 'loose',\n isLength,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{ 'list-image': ['none', isArbitraryValue] }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{ list: ['none', 'disc', 'decimal', isArbitraryValue] }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{ list: ['inside', 'outside'] }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{ placeholder: [colors] }],\n /**\n * Placeholder Opacity\n * @see https://tailwindcss.com/docs/placeholder-opacity\n */\n 'placeholder-opacity': [{ 'placeholder-opacity': [opacity] }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{ text: ['left', 'center', 'right', 'justify', 'start', 'end'] }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{ text: [colors] }],\n /**\n * Text Opacity\n * @see https://tailwindcss.com/docs/text-opacity\n */\n 'text-opacity': [{ 'text-opacity': [opacity] }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{ decoration: [...getLineStyles(), 'wavy'] }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [\n { decoration: ['auto', 'from-font', isLength, isArbitraryLength] },\n ],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{ 'underline-offset': ['auto', isLength, isArbitraryValue] }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{ decoration: [colors] }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{ text: ['wrap', 'nowrap', 'balance', 'pretty'] }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{ indent: getSpacingWithArbitrary() }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [\n {\n align: [\n 'baseline',\n 'top',\n 'middle',\n 'bottom',\n 'text-top',\n 'text-bottom',\n 'sub',\n 'super',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [\n { whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces'] },\n ],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{ break: ['normal', 'words', 'all', 'keep'] }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{ hyphens: ['none', 'manual', 'auto'] }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{ content: ['none', isArbitraryValue] }],\n // Backgrounds\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{ bg: ['fixed', 'local', 'scroll'] }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{ 'bg-clip': ['border', 'padding', 'content', 'text'] }],\n /**\n * Background Opacity\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/background-opacity\n */\n 'bg-opacity': [{ 'bg-opacity': [opacity] }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{ 'bg-origin': ['border', 'padding', 'content'] }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{ bg: [...getPositions(), isArbitraryPosition] }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{ bg: ['no-repeat', { repeat: ['', 'x', 'y', 'round', 'space'] }] }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{ bg: ['auto', 'cover', 'contain', isArbitrarySize] }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [\n {\n bg: [\n 'none',\n { 'gradient-to': ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl'] },\n isArbitraryImage,\n ],\n },\n ],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{ bg: [colors] }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{ from: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{ via: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{ to: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{ from: [gradientColorStops] }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{ via: [gradientColorStops] }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{ to: [gradientColorStops] }],\n // Borders\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{ rounded: [borderRadius] }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{ 'rounded-s': [borderRadius] }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{ 'rounded-e': [borderRadius] }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{ 'rounded-t': [borderRadius] }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{ 'rounded-r': [borderRadius] }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{ 'rounded-b': [borderRadius] }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{ 'rounded-l': [borderRadius] }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{ 'rounded-ss': [borderRadius] }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{ 'rounded-se': [borderRadius] }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{ 'rounded-ee': [borderRadius] }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{ 'rounded-es': [borderRadius] }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{ 'rounded-tl': [borderRadius] }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{ 'rounded-tr': [borderRadius] }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{ 'rounded-br': [borderRadius] }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{ 'rounded-bl': [borderRadius] }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{ border: [borderWidth] }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{ 'border-x': [borderWidth] }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{ 'border-y': [borderWidth] }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{ 'border-s': [borderWidth] }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{ 'border-e': [borderWidth] }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{ 'border-t': [borderWidth] }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{ 'border-r': [borderWidth] }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{ 'border-b': [borderWidth] }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{ 'border-l': [borderWidth] }],\n /**\n * Border Opacity\n * @see https://tailwindcss.com/docs/border-opacity\n */\n 'border-opacity': [{ 'border-opacity': [opacity] }],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{ border: [...getLineStyles(), 'hidden'] }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x': [{ 'divide-x': [borderWidth] }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y': [{ 'divide-y': [borderWidth] }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Divide Opacity\n * @see https://tailwindcss.com/docs/divide-opacity\n */\n 'divide-opacity': [{ 'divide-opacity': [opacity] }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/divide-style\n */\n 'divide-style': [{ divide: getLineStyles() }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{ border: [borderColor] }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{ 'border-x': [borderColor] }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{ 'border-y': [borderColor] }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{ 'border-s': [borderColor] }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{ 'border-e': [borderColor] }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{ 'border-t': [borderColor] }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{ 'border-r': [borderColor] }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{ 'border-b': [borderColor] }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{ 'border-l': [borderColor] }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{ divide: [borderColor] }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{ outline: ['', ...getLineStyles()] }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{ 'outline-offset': [isLength, isArbitraryValue] }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{ outline: [isLength, isArbitraryLength] }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{ outline: [colors] }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w': [{ ring: getLengthWithEmptyAndArbitrary() }],\n /**\n * Ring Width Inset\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/ring-color\n */\n 'ring-color': [{ ring: [colors] }],\n /**\n * Ring Opacity\n * @see https://tailwindcss.com/docs/ring-opacity\n */\n 'ring-opacity': [{ 'ring-opacity': [opacity] }],\n /**\n * Ring Offset Width\n * @see https://tailwindcss.com/docs/ring-offset-width\n */\n 'ring-offset-w': [{ 'ring-offset': [isLength, isArbitraryLength] }],\n /**\n * Ring Offset Color\n * @see https://tailwindcss.com/docs/ring-offset-color\n */\n 'ring-offset-color': [{ 'ring-offset': [colors] }],\n // Effects\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{ shadow: ['', 'inner', 'none', isTshirtSize, isArbitraryShadow] }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow-color\n */\n 'shadow-color': [{ shadow: [isAny] }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{ opacity: [opacity] }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{ 'mix-blend': [...getBlendModes(), 'plus-lighter', 'plus-darker'] }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{ 'bg-blend': getBlendModes() }],\n // Filters\n /**\n * Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{ filter: ['', 'none'] }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{ blur: [blur] }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{ brightness: [brightness] }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{ contrast: [contrast] }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{ 'drop-shadow': ['', 'none', isTshirtSize, isArbitraryValue] }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{ grayscale: [grayscale] }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{ 'hue-rotate': [hueRotate] }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{ invert: [invert] }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{ saturate: [saturate] }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{ sepia: [sepia] }],\n /**\n * Backdrop Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{ 'backdrop-filter': ['', 'none'] }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{ 'backdrop-blur': [blur] }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{ 'backdrop-brightness': [brightness] }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{ 'backdrop-contrast': [contrast] }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{ 'backdrop-grayscale': [grayscale] }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{ 'backdrop-hue-rotate': [hueRotate] }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{ 'backdrop-invert': [invert] }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{ 'backdrop-opacity': [opacity] }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{ 'backdrop-saturate': [saturate] }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{ 'backdrop-sepia': [sepia] }],\n // Tables\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{ border: ['collapse', 'separate'] }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{ 'border-spacing': [borderSpacing] }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{ 'border-spacing-x': [borderSpacing] }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{ 'border-spacing-y': [borderSpacing] }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{ table: ['auto', 'fixed'] }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{ caption: ['top', 'bottom'] }],\n // Transitions and Animation\n /**\n * Tranisition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [\n {\n transition: [\n 'none',\n 'all',\n '',\n 'colors',\n 'opacity',\n 'shadow',\n 'transform',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{ duration: getNumberAndArbitrary() }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{ ease: ['linear', 'in', 'out', 'in-out', isArbitraryValue] }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{ delay: getNumberAndArbitrary() }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{ animate: ['none', 'spin', 'ping', 'pulse', 'bounce', isArbitraryValue] }],\n // Transforms\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{ transform: ['', 'gpu', 'none'] }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{ scale: [scale] }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{ 'scale-x': [scale] }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{ 'scale-y': [scale] }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{ rotate: [isInteger, isArbitraryValue] }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{ 'translate-x': [translate] }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{ 'translate-y': [translate] }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{ 'skew-x': [skew] }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{ 'skew-y': [skew] }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [\n {\n origin: [\n 'center',\n 'top',\n 'top-right',\n 'right',\n 'bottom-right',\n 'bottom',\n 'bottom-left',\n 'left',\n 'top-left',\n isArbitraryValue,\n ],\n },\n ],\n // Interactivity\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{ accent: ['auto', colors] }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{ appearance: ['none', 'auto'] }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [\n {\n cursor: [\n 'auto',\n 'default',\n 'pointer',\n 'wait',\n 'text',\n 'move',\n 'help',\n 'not-allowed',\n 'none',\n 'context-menu',\n 'progress',\n 'cell',\n 'crosshair',\n 'vertical-text',\n 'alias',\n 'copy',\n 'no-drop',\n 'grab',\n 'grabbing',\n 'all-scroll',\n 'col-resize',\n 'row-resize',\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n 'ew-resize',\n 'ns-resize',\n 'nesw-resize',\n 'nwse-resize',\n 'zoom-in',\n 'zoom-out',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{ caret: [colors] }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{ 'pointer-events': ['none', 'auto'] }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{ resize: ['none', 'y', 'x', ''] }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{ scroll: ['auto', 'smooth'] }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{ 'scroll-m': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{ 'scroll-mx': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{ 'scroll-my': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{ 'scroll-ms': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{ 'scroll-me': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{ 'scroll-mt': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{ 'scroll-mr': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{ 'scroll-mb': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{ 'scroll-ml': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{ 'scroll-p': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{ 'scroll-px': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{ 'scroll-py': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{ 'scroll-ps': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{ 'scroll-pe': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{ 'scroll-pt': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{ 'scroll-pr': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{ 'scroll-pb': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{ 'scroll-pl': getSpacingWithArbitrary() }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{ snap: ['start', 'end', 'center', 'align-none'] }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{ snap: ['normal', 'always'] }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{ snap: ['none', 'x', 'y', 'both'] }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{ snap: ['mandatory', 'proximity'] }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [\n {\n touch: ['auto', 'none', 'manipulation'],\n },\n ],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [\n {\n 'touch-pan': ['x', 'left', 'right'],\n },\n ],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [\n {\n 'touch-pan': ['y', 'up', 'down'],\n },\n ],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{ select: ['none', 'text', 'all', 'auto'] }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [\n { 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryValue] },\n ],\n // SVG\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{ fill: [colors, 'none'] }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{ stroke: [isLength, isArbitraryLength, isArbitraryNumber] }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{ stroke: [colors, 'none'] }],\n // Accessibility\n /**\n * Screen Readers\n * @see https://tailwindcss.com/docs/screen-readers\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{ 'forced-color-adjust': ['auto', 'none'] }],\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': [\n 'fvn-ordinal',\n 'fvn-slashed-zero',\n 'fvn-figure',\n 'fvn-spacing',\n 'fvn-fraction',\n ],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: [\n 'rounded-s',\n 'rounded-e',\n 'rounded-t',\n 'rounded-r',\n 'rounded-b',\n 'rounded-l',\n 'rounded-ss',\n 'rounded-se',\n 'rounded-ee',\n 'rounded-es',\n 'rounded-tl',\n 'rounded-tr',\n 'rounded-br',\n 'rounded-bl',\n ],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': [\n 'border-w-s',\n 'border-w-e',\n 'border-w-t',\n 'border-w-r',\n 'border-w-b',\n 'border-w-l',\n ],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': [\n 'border-color-s',\n 'border-color-e',\n 'border-color-t',\n 'border-color-r',\n 'border-color-b',\n 'border-color-l',\n ],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n 'scroll-m': [\n 'scroll-mx',\n 'scroll-my',\n 'scroll-ms',\n 'scroll-me',\n 'scroll-mt',\n 'scroll-mr',\n 'scroll-mb',\n 'scroll-ml',\n ],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': [\n 'scroll-px',\n 'scroll-py',\n 'scroll-ps',\n 'scroll-pe',\n 'scroll-pt',\n 'scroll-pr',\n 'scroll-pb',\n 'scroll-pl',\n ],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch'],\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading'],\n },\n } as const satisfies Config<DefaultClassGroupIds, DefaultThemeGroupIds>\n}\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\n\nexport const twMerge = createTailwindMerge(getDefaultConfig)\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","'use client';\n\nimport React, { memo, useMemo } from 'react';\nimport { cn } from '@/lib/utils';\n\ninterface StreamingJsonDisplayProps {\n content: string;\n className?: string;\n}\n\n// JSON 语法高亮颜色配置(主题变量驱动)\nconst COLORS = {\n key: 'var(--agent-json-key)',\n string: 'var(--agent-json-string)',\n number: 'var(--agent-json-number)',\n boolean: 'var(--agent-json-boolean)',\n null: 'var(--agent-json-null)',\n bracket: 'var(--agent-json-bracket)',\n colon: 'var(--agent-json-colon)',\n};\n\n/**\n * 检测字符串是否看起来像 JSON\n * 支持纯 JSON 和 markdown 代码块包裹的 JSON\n */\nexport function looksLikeJson(content: string): boolean {\n const trimmed = content.trim();\n // 以 { 或 [ 开头\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return true;\n }\n // 检测 markdown 代码块包裹的 JSON(如 ```json {...} ```)\n if (trimmed.startsWith('```')) {\n const codeBlockMatch = trimmed.match(/^```(?:json)?\\s*\\n?([\\s\\S]*)/);\n if (codeBlockMatch) {\n const innerContent = codeBlockMatch[1].trim();\n return innerContent.startsWith('{') || innerContent.startsWith('[');\n }\n }\n return false;\n}\n\n/**\n * 从可能被 markdown 代码块包裹的内容中提取 JSON\n */\nexport function extractJsonContent(content: string): string {\n const trimmed = content.trim();\n // 检测完整的 markdown 代码块\n const fullBlockMatch = trimmed.match(/^```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```$/);\n if (fullBlockMatch) {\n return fullBlockMatch[1].trim();\n }\n // 检测不完整的 markdown 代码块(流式时可能没有结束标记)\n const partialBlockMatch = trimmed.match(/^```(?:json)?\\s*\\n?([\\s\\S]*)/);\n if (partialBlockMatch) {\n return partialBlockMatch[1].trim();\n }\n return trimmed;\n}\n\n/**\n * 格式化不完整的 JSON 字符串\n * 逐字符解析并添加适当的缩进\n */\nfunction formatPartialJson(content: string): string {\n let result = '';\n let indent = 0;\n let inString = false;\n let escapeNext = false;\n \n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n \n if (escapeNext) {\n result += char;\n escapeNext = false;\n continue;\n }\n \n if (char === '\\\\' && inString) {\n result += char;\n escapeNext = true;\n continue;\n }\n \n if (char === '\"' && !escapeNext) {\n inString = !inString;\n result += char;\n continue;\n }\n \n if (inString) {\n result += char;\n continue;\n }\n \n // 忽略原有的空白字符\n if (/\\s/.test(char)) {\n continue;\n }\n \n if (char === '{' || char === '[') {\n result += char + '\\n' + ' '.repeat(indent + 1);\n indent++;\n } else if (char === '}' || char === ']') {\n indent = Math.max(0, indent - 1);\n result += '\\n' + ' '.repeat(indent) + char;\n } else if (char === ',') {\n result += char + '\\n' + ' '.repeat(indent);\n } else if (char === ':') {\n result += ': ';\n } else {\n result += char;\n }\n }\n \n return result;\n}\n\n/**\n * 简单的流式 JSON 语法高亮\n */\nfunction highlightJson(content: string): React.ReactNode[] {\n const tokens: React.ReactNode[] = [];\n let i = 0;\n let keyId = 0;\n \n let inString = false;\n let isKey = false;\n let stringStart = -1;\n let escapeNext = false;\n let lastNonWhitespace = '';\n \n const pushToken = (text: string, color: string) => {\n tokens.push(\n <span key={keyId++} style={{ color }}>\n {text}\n </span>\n );\n };\n \n while (i < content.length) {\n const char = content[i];\n \n if (escapeNext) {\n escapeNext = false;\n i++;\n continue;\n }\n \n if (char === '\\\\' && inString) {\n escapeNext = true;\n i++;\n continue;\n }\n \n if (char === '\"') {\n if (!inString) {\n inString = true;\n stringStart = i;\n isKey = ['{', ',', '[', ''].includes(lastNonWhitespace);\n } else {\n const str = content.slice(stringStart, i + 1);\n pushToken(str, isKey ? COLORS.key : COLORS.string);\n inString = false;\n stringStart = -1;\n }\n i++;\n continue;\n }\n \n if (inString) {\n i++;\n continue;\n }\n \n if (char === '{' || char === '}' || char === '[' || char === ']') {\n pushToken(char, COLORS.bracket);\n if (char !== '}' && char !== ']') {\n lastNonWhitespace = char;\n }\n i++;\n continue;\n }\n \n if (char === ':') {\n pushToken(char, COLORS.colon);\n lastNonWhitespace = ':';\n i++;\n continue;\n }\n \n if (char === ',') {\n pushToken(char, COLORS.colon);\n lastNonWhitespace = ',';\n i++;\n continue;\n }\n \n if (/[0-9.-]/.test(char)) {\n let numStr = '';\n while (i < content.length && /[0-9.eE+-]/.test(content[i])) {\n numStr += content[i];\n i++;\n }\n pushToken(numStr, COLORS.number);\n continue;\n }\n \n if (content.slice(i, i + 4) === 'true') {\n pushToken('true', COLORS.boolean);\n i += 4;\n continue;\n }\n if (content.slice(i, i + 5) === 'false') {\n pushToken('false', COLORS.boolean);\n i += 5;\n continue;\n }\n if (content.slice(i, i + 4) === 'null') {\n pushToken('null', COLORS.null);\n i += 4;\n continue;\n }\n \n if (/\\s/.test(char)) {\n let ws = '';\n while (i < content.length && /\\s/.test(content[i])) {\n ws += content[i];\n i++;\n }\n tokens.push(<span key={keyId++}>{ws}</span>);\n continue;\n }\n \n tokens.push(<span key={keyId++}>{char}</span>);\n lastNonWhitespace = char;\n i++;\n }\n \n if (inString && stringStart >= 0) {\n const str = content.slice(stringStart);\n pushToken(str, isKey ? COLORS.key : COLORS.string);\n }\n \n return tokens;\n}\n\n/**\n * 流式 JSON 展示组件 - 科技感设计\n */\nexport const StreamingJsonDisplay = memo(function StreamingJsonDisplay({\n content,\n className\n}: StreamingJsonDisplayProps) {\n \n // 先提取 JSON 内容(去掉 markdown 代码块包裹)\n const jsonContent = useMemo(() => extractJsonContent(content), [content]);\n \n // 格式化 JSON\n const formattedContent = useMemo(() => {\n try {\n const parsed = JSON.parse(jsonContent);\n return JSON.stringify(parsed, null, 2);\n } catch {\n // 不完整的 JSON,使用自定义格式化\n return formatPartialJson(jsonContent);\n }\n }, [jsonContent]);\n \n // 语法高亮\n const highlightedTokens = useMemo(() => {\n return highlightJson(formattedContent);\n }, [formattedContent]);\n \n return (\n <div className={cn(\n \"relative rounded-lg overflow-hidden border border-zinc-700/60 agent-json-display\",\n className\n )}>\n {/* 顶部装饰栏 */}\n <div className=\"flex items-center gap-2 px-3 py-2 bg-zinc-800/50 border-b border-zinc-700/50\">\n <div className=\"flex gap-1.5\">\n <span className=\"agent-json-dot agent-json-dot-red w-2.5 h-2.5 rounded-full\" />\n <span className=\"agent-json-dot agent-json-dot-amber w-2.5 h-2.5 rounded-full\" />\n <span className=\"agent-json-dot agent-json-dot-green w-2.5 h-2.5 rounded-full\" />\n </div>\n <div className=\"flex-1\" />\n <span className=\"text-[10px] text-zinc-500 font-medium tracking-wide\">\n GENERATING\n </span>\n <span className=\"agent-json-pulse w-1.5 h-1.5 rounded-full animate-pulse\" />\n </div>\n \n {/* 代码区域 */}\n <div className=\"p-4 overflow-x-auto max-h-72 overflow-y-auto\">\n <pre className=\"font-mono text-[13px] leading-6 text-zinc-300\">\n <code>\n {highlightedTokens}\n <span className=\"agent-json-caret inline-block w-[2px] h-[18px] animate-pulse ml-0.5 align-middle\" />\n </code>\n </pre>\n </div>\n </div>\n );\n});\n\nexport default StreamingJsonDisplay;\n","'use client';\n\nimport React, { useState, memo, useMemo, useEffect, useCallback } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport { \n Check, \n Loader2, \n ChevronDown, \n ChevronUp,\n Play,\n X,\n Zap,\n Bot,\n UserCheck,\n AlertCircle,\n Clock,\n Pencil,\n Copy,\n RotateCcw,\n SkipForward,\n Square,\n AlertTriangle,\n Image as ImageIcon,\n Download,\n Maximize2,\n Sparkles\n} from 'lucide-react';\nimport type { ExecutionPlan, PlanStep } from '@/types/agent';\nimport { createAssetFromSource, inferAssetTypeFromUrl, resolveAssetForDisplay } from '../utils/asset';\nimport { isMechanicalSummary } from '@/services/agent';\nimport { StreamingJsonDisplay, looksLikeJson } from './StreamingJsonDisplay';\n\nimport type { AgentConfig, Asset, AssetRenderInfo } from '../types/components';\n\ninterface PlanCardProps {\n plan: ExecutionPlan;\n isProcessing?: boolean;\n waitingStepId?: string | null; // 当前等待输入的步骤 ID\n streamingContent?: string; // 当前步骤的流式输出内容\n onConfirm?: () => void;\n onReject?: () => void;\n onModify?: () => void; // 修改计划\n onHumanInput?: (stepId: string, input: string) => void;\n // 执行中控制回调\n onPause?: () => void; // 暂停执行\n onResume?: () => void; // 恢复执行\n // 失败处理回调\n onRetry?: () => void; // 重试失败步骤\n onSkip?: () => void; // 跳过失败步骤\n onCancel?: () => void; // 终止计划\n config?: AgentConfig; // 配置参数\n}\n\n// 获取步骤图标\nconst getStepIcon = (type: string) => {\n switch (type) {\n case 'TOOL_CALL':\n return <Zap className=\"w-3.5 h-3.5\" />;\n case 'LLM_REASONING':\n return <Bot className=\"w-3.5 h-3.5\" />;\n case 'HUMAN_INPUT':\n return <UserCheck className=\"w-3.5 h-3.5\" />;\n default:\n return <AlertCircle className=\"w-3.5 h-3.5\" />;\n }\n};\n\n// 获取步骤状态样式\nconst getStepStatusStyle = (status: string) => {\n switch (status) {\n case 'COMPLETED':\n return {\n bg: 'bg-green-500/10',\n border: 'border-green-500/30',\n icon: 'text-green-400',\n text: 'text-green-400',\n };\n case 'RUNNING':\n return {\n bg: 'bg-[#d8ff00]/10',\n border: 'border-[#d8ff00]/30',\n icon: 'text-[#d8ff00]',\n text: 'text-[#d8ff00]',\n };\n case 'FAILED':\n return {\n bg: 'bg-red-500/10',\n border: 'border-red-500/30',\n icon: 'text-red-400',\n text: 'text-red-400',\n };\n default: // PENDING, SKIPPED\n return {\n bg: 'bg-zinc-800/50',\n border: 'border-zinc-700/50',\n icon: 'text-zinc-500',\n text: 'text-zinc-500',\n };\n }\n};\n\n// 媒体结果类型\ninterface MediaResult {\n url: string; // 缩略图/预览 URL\n hdUrl: string; // 高清/下载 URL\n isVideo: boolean;\n}\n\nconst extractTextContent = (result: any): string => {\n if (!result) return '';\n if (typeof result === 'string') return result;\n if (typeof result !== 'object') return String(result);\n if (result.error) return result.error;\n if (result.message && typeof result.message === 'string') return result.message;\n return '';\n};\n\nconst collectMediaAssetsFromResult = (result: any): Asset[] => {\n const assets: Asset[] = [];\n if (!result || typeof result !== 'object') {\n if (typeof result === 'string') {\n const asset = createAssetFromSource({ fileUrl: result, type: inferAssetTypeFromUrl(result) });\n if (asset) assets.push(asset);\n }\n return assets;\n }\n\n if (result.works && Array.isArray(result.works)) {\n result.works.forEach((w: any) => {\n const asset = createAssetFromSource({ fileId: w.fileId, fileUrl: w.fileUrl, type: 'image' });\n if (asset) assets.push(asset);\n });\n }\n\n if (result.outputs?.images) {\n const imgValue = result.outputs.images;\n if (typeof imgValue === 'string') {\n const asset = createAssetFromSource({ fileUrl: imgValue, type: 'image' });\n if (asset) assets.push(asset);\n } else if (Array.isArray(imgValue)) {\n imgValue.forEach((url: string) => {\n const asset = createAssetFromSource({ fileUrl: url, type: 'image' });\n if (asset) assets.push(asset);\n });\n }\n }\n\n if (result.outputs?.videos || result.outputs?.video) {\n const vidValue = result.outputs?.videos || result.outputs?.video;\n if (typeof vidValue === 'string') {\n const asset = createAssetFromSource({ fileUrl: vidValue, type: 'video' });\n if (asset) assets.push(asset);\n } else if (Array.isArray(vidValue)) {\n vidValue.forEach((url: string) => {\n const asset = createAssetFromSource({ fileUrl: url, type: 'video' });\n if (asset) assets.push(asset);\n });\n }\n }\n\n return assets;\n};\n\n// 高品质 Markdown 渲染组件 - 参考 MessageBubble 实现\nconst PlanMarkdownContent = memo(function PlanMarkdownContent({ \n content,\n className = ''\n}: { \n content: string;\n className?: string;\n}) {\n return (\n <div className={`text-sm text-zinc-300 leading-relaxed ${className}`}>\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={{\n // 段落 - 合理的间距\n p: ({ children }) => (\n <p className=\"mb-3 last:mb-0 leading-relaxed\">{children}</p>\n ),\n // 标题 - 明显的层次区分\n h1: ({ children }) => (\n <h1 className=\"text-lg font-bold text-white mb-3 mt-4 first:mt-0 pb-2 border-b border-zinc-700\">\n {children}\n </h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"text-base font-bold text-white mb-2 mt-4 first:mt-0\">\n {children}\n </h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"text-sm font-semibold text-zinc-200 mb-2 mt-3 first:mt-0\">\n {children}\n </h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"text-sm font-medium text-zinc-300 mb-1.5 mt-2 first:mt-0\">\n {children}\n </h4>\n ),\n // 列表 - 清晰的结构\n ul: ({ children }) => (\n <ul className=\"list-disc list-inside mb-3 space-y-1.5 text-zinc-300\">\n {children}\n </ul>\n ),\n ol: ({ children }) => (\n <ol className=\"list-decimal list-inside mb-3 space-y-1.5 text-zinc-300\">\n {children}\n </ol>\n ),\n li: ({ children }) => (\n <li className=\"leading-relaxed pl-1\">{children}</li>\n ),\n // 代码 - 内联和块级\n code: ({ className, children, ...props }) => {\n const isBlock = className?.includes('language-') || String(children).includes('\\n');\n if (isBlock) {\n return (\n <pre className=\"bg-zinc-900 border border-zinc-800 rounded-lg p-3 my-3 overflow-x-auto\">\n <code className=\"text-xs font-mono text-zinc-300\" {...props}>\n {children}\n </code>\n </pre>\n );\n }\n return (\n <code className=\"px-1.5 py-0.5 bg-zinc-800 rounded text-[#d8ff00] text-xs font-mono\" {...props}>\n {children}\n </code>\n );\n },\n pre: ({ children }) => <>{children}</>,\n // 引用\n blockquote: ({ children }) => (\n <blockquote className=\"border-l-3 border-[#d8ff00]/50 pl-4 my-3 text-zinc-400 italic bg-zinc-900/30 py-2 pr-3 rounded-r\">\n {children}\n </blockquote>\n ),\n // 表格\n table: ({ children }) => (\n <div className=\"overflow-x-auto my-3\">\n <table className=\"min-w-full border-collapse text-xs\">\n {children}\n </table>\n </div>\n ),\n thead: ({ children }) => (\n <thead className=\"bg-zinc-800\">{children}</thead>\n ),\n th: ({ children }) => (\n <th className=\"border border-zinc-700 px-3 py-2 text-left font-medium text-zinc-200\">\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"border border-zinc-700 px-3 py-2 text-zinc-400\">\n {children}\n </td>\n ),\n // 链接\n a: ({ href, children }) => (\n <a \n href={href} \n target=\"_blank\" \n rel=\"noopener noreferrer\" \n className=\"text-[#d8ff00] hover:underline hover:text-[#e8ff40] transition-colors\"\n >\n {children}\n </a>\n ),\n // 分割线\n hr: () => <hr className=\"my-4 border-zinc-700\" />,\n // 强调\n strong: ({ children }) => (\n <strong className=\"font-semibold text-white\">{children}</strong>\n ),\n em: ({ children }) => (\n <em className=\"italic text-zinc-400\">{children}</em>\n ),\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n});\n\n// 图片预览弹窗组件\nconst ImagePreviewModal = memo(function ImagePreviewModal({ \n src, \n onClose,\n config\n}: { \n src: string; \n onClose: () => void;\n config?: AgentConfig;\n}) {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [onClose]);\n\n const handleDownload = (e: React.MouseEvent) => {\n e.stopPropagation();\n const strategy = config?.asset;\n if (strategy?.download) {\n strategy.download({ type: 'image', url: src }, src);\n return;\n }\n const link = document.createElement('a');\n link.href = src;\n link.download = `image-${Date.now()}.png`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n return (\n <div \n className=\"fixed inset-0 z-[100] flex items-center justify-center bg-black/90 backdrop-blur-sm p-4 animate-in fade-in duration-200\"\n onClick={onClose}\n >\n <button\n onClick={onClose}\n className=\"absolute top-4 right-4 p-2 text-white/50 hover:text-white bg-white/10 hover:bg-white/20 rounded-full transition-colors\"\n >\n <X size={24} />\n </button>\n \n <img\n src={src}\n alt=\"Preview\"\n className=\"max-w-full max-h-[90vh] object-contain shadow-2xl rounded-lg\"\n onClick={(e) => e.stopPropagation()}\n />\n \n <div className=\"absolute bottom-6 left-1/2 -translate-x-1/2 flex gap-4\">\n <button\n onClick={handleDownload}\n className=\"flex items-center gap-2 px-4 py-2 bg-[#d8ff00] hover:bg-[#c2e600] text-black rounded-full shadow-lg transition-colors text-sm font-medium\"\n >\n <Download size={16} />\n 下载\n </button>\n </div>\n </div>\n );\n});\n\n// 智能结果渲染组件\nconst StepResultRenderer = memo(function StepResultRenderer({ \n result, \n stepType,\n toolInput,\n stepStatus,\n config,\n}: { \n result: any; \n stepType: string;\n toolInput?: any; // 工具调用参数(计划阶段的预估参数)\n stepStatus?: string; // 步骤状态\n config?: any; // 配置参数\n}) {\n const [showDetails, setShowDetails] = useState(false);\n const [showPlannedParams, setShowPlannedParams] = useState(false);\n const [copied, setCopied] = useState(false);\n const [previewImage, setPreviewImage] = useState<string | null>(null);\n const [imgLoaded, setImgLoaded] = useState<Record<number, boolean>>({});\n const [imgError, setImgError] = useState<Record<number, boolean>>({});\n \n // 使用新的提取函数,优先使用 works.fileId\n const [media, setMedia] = useState<MediaResult[]>([]);\n const text = useMemo(() => extractTextContent(result), [result]);\n\n useEffect(() => {\n let active = true;\n\n const loadMedia = async () => {\n const assets = collectMediaAssetsFromResult(result);\n if (assets.length === 0) {\n if (active) setMedia([]);\n return;\n }\n\n const resolved = await Promise.all(\n assets.map(asset => resolveAssetForDisplay(asset, config))\n );\n\n if (!active) return;\n\n const normalized = resolved\n .filter(Boolean)\n .map((mediaItem) => ({\n url: (mediaItem as AssetRenderInfo).url,\n hdUrl: (mediaItem as AssetRenderInfo).hdUrl || (mediaItem as AssetRenderInfo).url,\n isVideo: (mediaItem as AssetRenderInfo).isVideo ?? inferAssetTypeFromUrl((mediaItem as AssetRenderInfo).url) === 'video'\n }));\n\n const unique = normalized.filter((item, index, arr) => {\n const key = `${item.url}|${item.hdUrl}|${item.isVideo ? 'v' : 'i'}`;\n return arr.findIndex((other) => `${other.url}|${other.hdUrl}|${other.isVideo ? 'v' : 'i'}` === key) === index;\n });\n\n setMedia(unique);\n };\n\n loadMedia();\n return () => { active = false; };\n }, [result, config]);\n \n // TOOL_CALL 类型显示参数,其他类型显示结果\n const isToolCall = stepType === 'TOOL_CALL';\n const isCompleted = stepStatus === 'COMPLETED';\n \n // 从结果中提取实际执行参数(如果有)\n const actualParams = useMemo(() => {\n if (!result || typeof result !== 'object') return null;\n // 尝试从不同字段提取实际参数\n return result.actualArguments || result.executedArguments || result.input || null;\n }, [result]);\n \n // 检测参数是否有变化\n const paramsChanged = useMemo(() => {\n if (!toolInput || !actualParams) return false;\n return JSON.stringify(toolInput) !== JSON.stringify(actualParams);\n }, [toolInput, actualParams]);\n \n const detailsJson = isToolCall && toolInput \n ? JSON.stringify(toolInput, null, 2)\n : (typeof result === 'string' ? result : JSON.stringify(result, null, 2));\n const detailsLabel = isToolCall ? '计划参数' : '原始数据';\n \n // 分离图片和视频\n const imageMedia = media.filter(m => !m.isVideo);\n const videoMedia = media.filter(m => m.isVideo);\n const hasMedia = media.length > 0;\n \n const handleCopy = async () => {\n await navigator.clipboard.writeText(detailsJson);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const handleImgLoad = (index: number) => {\n setImgLoaded(prev => ({ ...prev, [index]: true }));\n };\n \n const handleImgError = (index: number) => {\n setImgError(prev => ({ ...prev, [index]: true }));\n // 加载失败也要隐藏 loading\n setImgLoaded(prev => ({ ...prev, [index]: true }));\n };\n \n // 简单文本结果 - 使用 Markdown 渲染\n if (!hasMedia && text) {\n return (\n <div className=\"space-y-2\">\n <PlanMarkdownContent content={text} className=\"text-xs !text-zinc-400\" />\n {/* TOOL_CALL 类型可以查看调用参数 */}\n {isToolCall && toolInput && (\n <div>\n <button\n onClick={() => setShowDetails(!showDetails)}\n className=\"flex items-center gap-1 text-[10px] text-zinc-600 hover:text-zinc-400 transition-colors\"\n >\n {showDetails ? (\n <><ChevronUp className=\"w-3 h-3\" /> 收起</>\n ) : (\n <><ChevronDown className=\"w-3 h-3\" /> 查看{detailsLabel}</>\n )}\n </button>\n {showDetails && (\n <div className=\"mt-1.5 relative group/plan-raw\">\n {/* 参数类型标识 */}\n <div className=\"flex items-center gap-1.5 mb-1.5\">\n <span className={`text-[10px] px-1.5 py-0.5 rounded border ${\n isCompleted \n ? 'bg-green-500/10 text-green-400 border-green-500/20' \n : 'bg-amber-500/10 text-amber-400 border-amber-500/20'\n }`}>\n {isCompleted ? '执行参数' : '预估参数'}\n </span>\n {paramsChanged && (\n <span className=\"text-[10px] text-[#d8ff00]\">\n (参数已由 AI 动态调整)\n </span>\n )}\n </div>\n <pre className=\"text-[10px] text-zinc-500 bg-zinc-900/80 rounded p-2 overflow-x-auto max-h-[120px] overflow-y-auto font-mono\">\n {detailsJson}\n </pre>\n <button\n onClick={handleCopy}\n className=\"absolute top-6 right-1 p-1 bg-zinc-800 hover:bg-zinc-700 rounded opacity-0 group-hover/plan-raw:opacity-100 transition-opacity\"\n title=\"复制\"\n >\n {copied ? <Check className=\"w-2.5 h-2.5 text-green-400\" /> : <Copy className=\"w-2.5 h-2.5 text-zinc-400\" />}\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n \n // 没有任何内容\n if (!hasMedia && !text && typeof result === 'object') {\n return null;\n }\n \n return (\n <>\n {/* 图片预览弹窗 */}\n {previewImage && (\n <ImagePreviewModal src={previewImage} onClose={() => setPreviewImage(null)} config={config} />\n )}\n \n <div className=\"space-y-2\">\n {/* 图片结果 - 小尺寸缩略图,点击放大 */}\n {imageMedia.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {imageMedia.map((item, i) => (\n <div\n key={i}\n className=\"relative group/plan-img cursor-zoom-in\"\n onClick={() => setPreviewImage(item.hdUrl)}\n >\n {/* Loading 状态 */}\n {!imgLoaded[i] && !imgError[i] && (\n <div className=\"w-20 h-20 rounded-lg bg-zinc-800 flex items-center justify-center\">\n <Loader2 className=\"w-4 h-4 text-zinc-600 animate-spin\" />\n </div>\n )}\n {/* 加载失败 fallback */}\n {imgError[i] && (\n <div className=\"w-20 h-20 rounded-lg bg-zinc-800 flex items-center justify-center border border-zinc-700\">\n <ImageIcon className=\"w-5 h-5 text-zinc-600\" />\n </div>\n )}\n {/* 图片 - 用 opacity 而不是 hidden */}\n <img\n src={item.url}\n alt={`结果 ${i + 1}`}\n className={`w-20 h-20 object-cover rounded-lg border border-zinc-700 hover:border-[#d8ff00]/50 transition-colors ${\n imgLoaded[i] && !imgError[i] ? 'opacity-100' : 'absolute opacity-0 pointer-events-none'\n }`}\n onLoad={() => handleImgLoad(i)}\n onError={() => handleImgError(i)}\n />\n {/* Hover 遮罩 */}\n {imgLoaded[i] && !imgError[i] && (\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover/plan-img:opacity-100 transition-opacity rounded-lg flex items-center justify-center\">\n <Maximize2 className=\"w-4 h-4 text-white\" />\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n \n {/* 视频结果 */}\n {videoMedia.length > 0 && (\n <div className=\"space-y-2\">\n {videoMedia.map((item, i) => (\n <div key={i} className=\"relative rounded-lg overflow-hidden bg-black border border-zinc-800\">\n <video\n src={item.url}\n controls\n className=\"w-full max-h-48 object-contain\"\n preload=\"metadata\"\n />\n </div>\n ))}\n </div>\n )}\n \n {/* 文本结果 - 使用 Markdown 渲染 */}\n {text && hasMedia && (\n <PlanMarkdownContent content={text} className=\"text-xs !text-zinc-400\" />\n )}\n \n {/* 调用参数/原始数据展开 - TOOL_CALL 显示参数,其他显示结果 */}\n {((isToolCall && toolInput) || (!isToolCall && typeof result === 'object')) && (\n <div>\n <button\n onClick={() => setShowDetails(!showDetails)}\n className=\"flex items-center gap-1 text-[10px] text-zinc-600 hover:text-zinc-400 transition-colors\"\n >\n {showDetails ? (\n <><ChevronUp className=\"w-3 h-3\" /> 收起</>\n ) : (\n <><ChevronDown className=\"w-3 h-3\" /> 查看{detailsLabel}</>\n )}\n </button>\n {showDetails && (\n <div className=\"mt-1.5 relative group/plan-raw\">\n {/* 参数类型标识 */}\n {isToolCall && (\n <div className=\"flex items-center gap-1.5 mb-1.5\">\n <span className={`text-[10px] px-1.5 py-0.5 rounded border ${\n isCompleted \n ? 'bg-green-500/10 text-green-400 border-green-500/20' \n : 'bg-amber-500/10 text-amber-400 border-amber-500/20'\n }`}>\n {isCompleted ? '执行参数' : '预估参数'}\n </span>\n {paramsChanged && (\n <span className=\"text-[10px] text-[#d8ff00]\">\n (参数已由 AI 动态调整)\n </span>\n )}\n </div>\n )}\n <pre className=\"text-[10px] text-zinc-500 bg-zinc-900/80 rounded p-2 overflow-x-auto max-h-[120px] overflow-y-auto font-mono\">\n {detailsJson}\n </pre>\n <button\n onClick={handleCopy}\n className={`absolute ${isToolCall ? 'top-6' : 'top-1'} right-1 p-1 bg-zinc-800 hover:bg-zinc-700 rounded opacity-0 group-hover/plan-raw:opacity-100 transition-opacity`}\n title=\"复制\"\n >\n {copied ? <Check className=\"w-2.5 h-2.5 text-green-400\" /> : <Copy className=\"w-2.5 h-2.5 text-zinc-400\" />}\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n </>\n );\n});\n\n// 步骤项组件 - 支持智能结果渲染 + 执行中状态优化 + 流式输出\nconst StepItem = memo(function StepItem({ \n step, \n index,\n isWaitingInput,\n isCurrentStep,\n streamingContent,\n onHumanInput,\n}: { \n step: PlanStep; \n index: number;\n isWaitingInput?: boolean;\n isCurrentStep?: boolean; // 是否是当前正在执行的步骤\n streamingContent?: string; // 流式输出内容\n onHumanInput?: (input: string) => void;\n}) {\n const [inputValue, setInputValue] = useState('');\n const [submitting, setSubmitting] = useState(false);\n const style = getStepStatusStyle(step.status);\n // 执行中状态:step.status === 'RUNNING' 或 isCurrentStep 且未完成\n const isRunning = step.status === 'RUNNING' || (isCurrentStep && step.status !== 'COMPLETED' && step.status !== 'FAILED');\n \n const handleSubmit = async () => {\n if (!inputValue.trim() || !onHumanInput) return;\n setSubmitting(true);\n await onHumanInput(inputValue);\n setSubmitting(false);\n setInputValue('');\n };\n\n // 计算执行时间\n const executionTime = useMemo(() => {\n const s = step as any;\n if (s.startTime && s.endTime) {\n const duration = s.endTime - s.startTime;\n if (duration < 1000) return `${duration}ms`;\n return `${(duration / 1000).toFixed(1)}s`;\n }\n return null;\n }, [step]);\n\n return (\n <div className={`rounded-lg border ${style.border} ${style.bg} transition-all ${\n isRunning ? 'ring-1 ring-[#d8ff00]/30 shadow-[0_0_15px_-3px_rgba(216,255,0,0.15)]' : ''\n }`}>\n <div className=\"flex items-start gap-2.5 p-3\">\n {/* 序号 - 执行中状态有脉冲动画 */}\n <div className={`relative w-6 h-6 rounded-full flex items-center justify-center text-[10px] font-bold flex-shrink-0 ${\n step.status === 'COMPLETED' ? 'bg-green-500/20 text-green-400' :\n isRunning ? 'bg-[#d8ff00]/20 text-[#d8ff00]' :\n step.status === 'FAILED' ? 'bg-red-500/20 text-red-400' :\n 'bg-zinc-700 text-zinc-400'\n }`}>\n {/* 脉冲动画圈 */}\n {isRunning && (\n <div className=\"absolute inset-0 rounded-full bg-[#d8ff00]/20 animate-ping\" />\n )}\n {step.status === 'COMPLETED' ? (\n <Check className=\"w-3.5 h-3.5\" />\n ) : isRunning ? (\n <Loader2 className=\"w-3.5 h-3.5 animate-spin\" />\n ) : step.status === 'FAILED' ? (\n <X className=\"w-3.5 h-3.5\" />\n ) : (\n index + 1\n )}\n </div>\n \n {/* 内容 */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className={style.icon}>{getStepIcon(step.type)}</span>\n <span className={`text-sm font-medium ${\n step.status === 'PENDING' ? 'text-zinc-400' : 'text-zinc-200'\n }`}>\n {step.title || `步骤 ${index + 1}`}\n </span>\n \n {/* 状态标签 */}\n {isRunning && (\n <span className=\"text-[10px] px-2 py-0.5 rounded-full bg-[#d8ff00]/10 text-[#d8ff00] border border-[#d8ff00]/20 flex items-center gap-1\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-[#d8ff00] animate-pulse\" />\n 执行中\n </span>\n )}\n {step.type === 'HUMAN_INPUT' && step.status !== 'COMPLETED' && !isRunning && (\n <span className=\"text-[10px] px-1.5 py-0.5 rounded bg-amber-500/10 text-amber-400\">\n 需确认\n </span>\n )}\n {executionTime && (\n <span className=\"text-[10px] text-zinc-600 flex items-center gap-0.5\">\n <Clock className=\"w-3 h-3\" />\n {executionTime}\n </span>\n )}\n </div>\n \n {/* 描述 - 未执行时显示 */}\n {step.description && step.status === 'PENDING' && (\n <p className=\"text-xs text-zinc-500 mt-1.5 leading-relaxed\">{step.description}</p>\n )}\n \n {/* 执行中状态 - 显示流式输出或执行提示 */}\n {isRunning && (\n <div className=\"mt-2\">\n {/* LLM 动态参数生成状态 */}\n {(step as any).isGeneratingArgs ? (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2 text-xs text-[#d8ff00]/80\">\n <Sparkles className=\"w-3.5 h-3.5 animate-pulse\" />\n <span>AI 正在生成执行参数...</span>\n </div>\n {/* 参数生成的流式内容 - 智能判断是 JSON 还是普通文本 */}\n {streamingContent && (\n looksLikeJson(streamingContent) ? (\n <StreamingJsonDisplay content={streamingContent} />\n ) : (\n <div className=\"text-xs text-zinc-300 bg-zinc-800/50 rounded-lg p-2.5 border border-zinc-700/50\">\n <PlanMarkdownContent content={streamingContent} className=\"!text-xs\" />\n <span className=\"inline-block w-0.5 h-3 bg-[#d8ff00] animate-pulse ml-0.5 align-middle\" />\n </div>\n )\n )}\n </div>\n ) : streamingContent ? (\n /* 有流式内容时 - 智能判断是 JSON 还是普通文本 */\n looksLikeJson(streamingContent) ? (\n <StreamingJsonDisplay content={streamingContent} />\n ) : (\n <div className=\"text-xs text-zinc-300 bg-zinc-800/50 rounded-lg p-2.5 border border-zinc-700/50\">\n <PlanMarkdownContent content={streamingContent} className=\"!text-xs\" />\n <span className=\"inline-block w-0.5 h-3 bg-[#d8ff00] animate-pulse ml-0.5 align-middle\" />\n </div>\n )\n ) : (\n /* 无流式内容时显示默认提示 */\n step.type === 'TOOL_CALL' ? (\n <div className=\"flex items-center gap-2 text-xs text-[#d8ff00]/80\">\n <div className=\"flex gap-1\">\n <span className=\"w-1 h-1 rounded-full bg-[#d8ff00] animate-bounce\" style={{ animationDelay: '0ms' }} />\n <span className=\"w-1 h-1 rounded-full bg-[#d8ff00] animate-bounce\" style={{ animationDelay: '150ms' }} />\n <span className=\"w-1 h-1 rounded-full bg-[#d8ff00] animate-bounce\" style={{ animationDelay: '300ms' }} />\n </div>\n <span>正在调用工具...</span>\n </div>\n ) : step.type === 'LLM_REASONING' ? (\n <div className=\"flex items-center gap-2 text-xs text-[#d8ff00]/80\">\n <Bot className=\"w-3.5 h-3.5 animate-pulse\" />\n <span>AI 正在思考...</span>\n </div>\n ) : null\n )}\n </div>\n )}\n \n {/* 执行结果 - 智能渲染 */}\n {step.result && (\n <div className=\"mt-3\">\n <StepResultRenderer \n result={step.result} \n stepType={step.type} \n toolInput={(step as any).toolArguments || (step as any).arguments}\n stepStatus={step.status}\n />\n </div>\n )}\n \n {/* 错误信息 */}\n {(step.error || (step as any).errorMessage) && (\n <div className=\"mt-2 flex items-start gap-2 text-xs text-red-400 bg-red-500/10 rounded-lg p-2.5 border border-red-500/20\">\n <AlertTriangle className=\"w-3.5 h-3.5 flex-shrink-0 mt-0.5\" />\n <span>{step.error || (step as any).errorMessage}</span>\n </div>\n )}\n </div>\n </div>\n \n {/* 人工输入区域 */}\n {isWaitingInput && step.type === 'HUMAN_INPUT' && (\n <div className=\"px-3 pb-3 pt-0\">\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n placeholder=\"请输入...\"\n className=\"flex-1 px-3 py-2 bg-zinc-900 border border-zinc-700 rounded-lg text-sm text-white placeholder-zinc-500 focus:outline-none focus:border-[#d8ff00]/50 transition-colors\"\n onKeyDown={(e) => e.key === 'Enter' && handleSubmit()}\n />\n <button\n onClick={handleSubmit}\n disabled={!inputValue.trim() || submitting}\n className=\"px-4 py-2 bg-[#d8ff00] hover:bg-[#c2e600] disabled:bg-zinc-700 text-black disabled:text-zinc-500 text-sm font-medium rounded-lg transition-colors\"\n >\n {submitting ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : '提交'}\n </button>\n </div>\n </div>\n )}\n </div>\n );\n});\n\n/**\n * 计划卡片组件 - 内嵌在消息中\n */\nconst PlanCard = memo(function PlanCard({\n plan = {},\n isProcessing = false,\n waitingStepId,\n streamingContent,\n onConfirm,\n onReject,\n onModify,\n onHumanInput,\n onPause,\n onResume,\n onRetry,\n onSkip,\n onCancel,\n}: PlanCardProps) {\n const [expanded, setExpanded] = useState(true);\n \n // 获取步骤数组(兼容两种格式:直接数组 或 { steps: [...] } 对象)\n const rawSteps = Array.isArray(plan?.steps) \n ? plan?.steps \n : (plan?.steps as any)?.steps || [];\n \n // 过滤有效步骤(排除 $ref 引用)\n const validSteps: PlanStep[] = rawSteps.filter((step: any) => step && step.type && !('$ref' in step)) || [];\n \n // 调试日志 - 帮助排查刷新后数据问题\n useEffect(() => {\n console.log('[PlanCard] ===== 数据诊断 =====');\n console.log('[PlanCard] plan.status:', plan.status);\n console.log('[PlanCard] 后端 completedSteps:', (plan as any).completedSteps, '(注意: 后端有bug,可能多1)');\n console.log('[PlanCard] 后端 totalSteps:', (plan as any).totalSteps);\n console.log('[PlanCard] validSteps 数量:', validSteps.length, ', rawSteps 数量:', rawSteps.length);\n console.log('[PlanCard] 各步骤状态:', validSteps.map((s, i) => `Step${i + 1}:${s.status || 'undefined'}`).join(', '));\n console.log('[PlanCard] plan.summary:', plan.summary ? `存在(${plan.summary.substring(0, 50)}...)` : 'null');\n console.log('[PlanCard] ========================');\n }, [plan, validSteps, rawSteps]);\n \n // 计划状态\n const isDraft = plan.status === 'DRAFT';\n const isExecuting = plan.status === 'EXECUTING';\n const isCompleted = plan.status === 'COMPLETED';\n const isPaused = plan.status === 'PAUSED';\n const isCancelled = plan.status === 'CANCELLED';\n // 检查是否有错误(PAUSED 状态 + errorMessage)\n const hasError = isPaused && !!(plan as any).errorMessage;\n \n // 获取失败的步骤\n const failedStep = useMemo(() => {\n if (hasError) {\n const failedIndex = (plan as any).failedStepIndex;\n if (failedIndex !== undefined && failedIndex >= 0) {\n return validSteps[failedIndex];\n }\n // 回退:查找 FAILED 状态的步骤\n return validSteps.find(s => s.status === 'FAILED');\n }\n return null;\n }, [hasError, plan, validSteps]);\n \n // 基于有效步骤计算完成数量(不依赖后端的 completedSteps,因为后端可能有统计 bug)\n const completedCount = useMemo(() => {\n // 基于 step.status 计算完成数(支持多种格式)\n const count = validSteps.filter(s => {\n const status = (s.status || '').toUpperCase();\n return status === 'COMPLETED' || status === 'SUCCESS' || status === 'DONE';\n }).length;\n // 防御性边界:完成数不应超过总步骤数\n return Math.min(count, validSteps.length);\n }, [validSteps]);\n \n // 检测「所有步骤已完成」的情况(用于 summary 等待状态)\n // 不依赖后端的 completedSteps/totalSteps,因为后端可能有 bug\n const allStepsCompleted = useMemo(() => {\n if (validSteps.length === 0) return false;\n // 所有 step.status 都是完成状态(支持多种格式)\n return validSteps.every(s => {\n const status = (s.status || '').toUpperCase();\n return status === 'COMPLETED' || status === 'SKIPPED' || status === 'SUCCESS' || status === 'DONE';\n });\n }, [validSteps]);\n \n // 找到等待输入的步骤(优先使用外部传入的 waitingStepId,否则根据状态判断)\n const waitingStep = useMemo(() => {\n if (waitingStepId) {\n return validSteps.find(s => {\n const stepId = (s as any).publicId || s.id;\n return stepId === waitingStepId;\n });\n }\n // 回退:仅在执行中状态且是 HUMAN_INPUT 类型且状态为 RUNNING 时显示输入框\n if (isExecuting) {\n return validSteps.find(s => s.type === 'HUMAN_INPUT' && s.status === 'RUNNING');\n }\n return null;\n }, [waitingStepId, validSteps, isExecuting]);\n\n // 检测是否是智能总结(由后端生成,非机械化模板)\n const isIntelligentSummary = useMemo(() => {\n if (!plan.summary) return false;\n return !isMechanicalSummary(plan.summary);\n }, [plan.summary]);\n\n return (\n <div className=\"agent-plan-card rounded-xl border border-zinc-700/50 bg-zinc-900/50 overflow-hidden\">\n {/* 头部 */}\n <div \n className=\"agent-plan-header flex items-center justify-between px-4 py-3 cursor-pointer hover:bg-zinc-800/30 transition-colors\"\n onClick={() => setExpanded(!expanded)}\n >\n <div className=\"flex items-center gap-3\">\n <div className={`w-8 h-8 rounded-lg flex items-center justify-center ${\n isCompleted ? 'bg-green-500/20' :\n isExecuting ? 'bg-[#d8ff00]/20' :\n isCancelled ? 'bg-red-500/20' :\n hasError ? 'bg-red-500/20' :\n isPaused ? 'bg-amber-500/20' :\n 'bg-zinc-800'\n }`}>\n {isExecuting ? (\n <Loader2 className=\"w-4 h-4 text-[#d8ff00] animate-spin\" />\n ) : isCompleted ? (\n <Check className=\"w-4 h-4 text-green-400\" />\n ) : isCancelled ? (\n <X className=\"w-4 h-4 text-red-400\" />\n ) : hasError ? (\n <AlertTriangle className=\"w-4 h-4 text-red-400\" />\n ) : isPaused ? (\n <AlertTriangle className=\"w-4 h-4 text-amber-400\" />\n ) : (\n <Play className=\"w-4 h-4 text-zinc-400\" />\n )}\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"agent-plan-title text-sm font-medium text-white\">\n {plan.title || '执行计划'}\n </span>\n <span className={`text-[10px] px-1.5 py-0.5 rounded ${\n isCompleted ? 'bg-green-500/10 text-green-400' :\n isExecuting ? 'bg-[#d8ff00]/10 text-[#d8ff00]' :\n isCancelled ? 'bg-red-500/10 text-red-400' :\n hasError ? 'bg-red-500/10 text-red-400' :\n isPaused ? 'bg-amber-500/10 text-amber-400' :\n 'bg-zinc-700 text-zinc-400'\n }`}>\n {isCompleted ? '已完成' :\n isExecuting ? '执行中' :\n isCancelled ? '已取消' :\n hasError ? '执行失败' :\n isPaused ? '已暂停' :\n '待确认'}\n </span>\n </div>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className=\"text-xs text-zinc-500\">\n {completedCount}/{validSteps.length} 步骤\n </span>\n </div>\n </div>\n </div>\n <ChevronDown className={`w-4 h-4 text-zinc-500 transition-transform ${expanded ? 'rotate-180' : ''}`} />\n </div>\n \n {/* 展开内容 */}\n {expanded && (\n <div className=\"px-4 pb-4 space-y-3\">\n {/* 计划描述 */}\n {plan.description && (\n <p className=\"text-sm text-zinc-400\">{plan.description}</p>\n )}\n \n {/* 错误信息 - PAUSED 状态且有错误 */}\n {hasError && (\n <div className=\"flex items-start gap-2 p-3 bg-red-500/10 border border-red-500/20 rounded-lg\">\n <AlertTriangle className=\"w-4 h-4 text-red-400 flex-shrink-0 mt-0.5\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-red-400\">\n 步骤 {((plan as any).failedStepIndex ?? 0) + 1} 执行失败\n </p>\n <p className=\"text-xs text-red-400/80 mt-0.5\">\n {(plan as any).errorMessage}\n </p>\n </div>\n </div>\n )}\n \n {/* 步骤列表 */}\n <div className=\"space-y-2\">\n {validSteps.map((step, index) => {\n // 获取步骤 ID(后端可能返回 publicId 或 id)\n const stepId = (step as any).publicId || step.id;\n // 判断是否是当前执行的步骤\n const isCurrentStep = isExecuting && (plan as any).currentStepIndex === index;\n return (\n <StepItem\n key={stepId || index}\n step={step}\n index={index}\n isWaitingInput={!!(waitingStep && stepId === ((waitingStep as any).publicId || waitingStep.id))}\n isCurrentStep={isCurrentStep}\n streamingContent={isCurrentStep ? streamingContent : undefined}\n onHumanInput={onHumanInput && stepId ? (input) => onHumanInput(stepId, input) : undefined}\n />\n );\n })}\n </div>\n \n {/* 操作按钮 - DRAFT 状态 */}\n {isDraft && onConfirm && (onReject || onModify) && (\n <div className=\"flex items-center gap-2 pt-2 border-t border-zinc-800\">\n <button\n onClick={onConfirm}\n disabled={isProcessing}\n className=\"flex-1 flex items-center justify-center gap-2 px-4 py-2 bg-[#d8ff00] hover:bg-[#c2e600] disabled:bg-zinc-700 text-black disabled:text-zinc-500 text-sm font-medium rounded-lg transition-colors\"\n >\n {isProcessing ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Play className=\"w-4 h-4\" />\n )}\n 确认执行\n </button>\n {onModify && (\n <button\n onClick={onModify}\n disabled={isProcessing}\n className=\"flex items-center justify-center gap-1.5 px-3 py-2 text-zinc-400 hover:text-white hover:bg-zinc-800 text-sm rounded-lg transition-colors\"\n >\n <Pencil className=\"w-3.5 h-3.5\" />\n 修改\n </button>\n )}\n {onReject && (\n <button\n onClick={onReject}\n disabled={isProcessing}\n className=\"px-3 py-2 text-zinc-400 hover:text-white hover:bg-zinc-800 text-sm rounded-lg transition-colors\"\n >\n 取消\n </button>\n )}\n </div>\n )}\n \n {/* 操作按钮 - EXECUTING 状态 */}\n {isExecuting && (onPause || onCancel) && (\n <div className=\"flex items-center gap-2 pt-2 border-t border-zinc-800\">\n {onPause && (\n <button\n onClick={onPause}\n disabled={isProcessing}\n className=\"flex items-center justify-center gap-1.5 px-3 py-2 text-amber-400 hover:text-amber-300 hover:bg-amber-500/10 text-sm rounded-lg transition-colors border border-amber-500/30\"\n >\n {isProcessing ? (\n <Loader2 className=\"w-3.5 h-3.5 animate-spin\" />\n ) : (\n <AlertCircle className=\"w-3.5 h-3.5\" />\n )}\n 暂停\n </button>\n )}\n {onCancel && (\n <button\n onClick={onCancel}\n disabled={isProcessing}\n className=\"flex items-center justify-center gap-1.5 px-3 py-2 text-red-400 hover:text-red-300 hover:bg-red-500/10 text-sm rounded-lg transition-colors\"\n >\n <Square className=\"w-3.5 h-3.5\" />\n 终止\n </button>\n )}\n </div>\n )}\n \n {/* 操作按钮 - PAUSED 状态(无错误) */}\n {isPaused && !hasError && onResume && (\n <div className=\"flex items-center gap-2 pt-2 border-t border-zinc-800\">\n <button\n onClick={onResume}\n disabled={isProcessing}\n className=\"flex-1 flex items-center justify-center gap-2 px-4 py-2 bg-[#d8ff00] hover:bg-[#c2e600] disabled:bg-zinc-700 text-black disabled:text-zinc-500 text-sm font-medium rounded-lg transition-colors\"\n >\n {isProcessing ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Play className=\"w-4 h-4\" />\n )}\n 继续执行\n </button>\n {onCancel && (\n <button\n onClick={onCancel}\n disabled={isProcessing}\n className=\"flex items-center justify-center gap-1.5 px-3 py-2 text-red-400 hover:text-red-300 hover:bg-red-500/10 text-sm rounded-lg transition-colors\"\n >\n <Square className=\"w-3.5 h-3.5\" />\n 终止\n </button>\n )}\n </div>\n )}\n \n {/* 操作按钮 - PAUSED 状态且有错误 */}\n {hasError && (onRetry || onSkip || onCancel) && (\n <div className=\"flex items-center gap-2 pt-2 border-t border-zinc-800\">\n {onRetry && (\n <button\n onClick={onRetry}\n disabled={isProcessing}\n className=\"flex-1 flex items-center justify-center gap-2 px-4 py-2 bg-[#d8ff00] hover:bg-[#c2e600] disabled:bg-zinc-700 text-black disabled:text-zinc-500 text-sm font-medium rounded-lg transition-colors\"\n >\n {isProcessing ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <RotateCcw className=\"w-4 h-4\" />\n )}\n 重试\n </button>\n )}\n {onSkip && (\n <button\n onClick={onSkip}\n disabled={isProcessing}\n className=\"flex items-center justify-center gap-1.5 px-3 py-2 text-zinc-400 hover:text-white hover:bg-zinc-800 text-sm rounded-lg transition-colors\"\n >\n <SkipForward className=\"w-3.5 h-3.5\" />\n 跳过\n </button>\n )}\n {onCancel && (\n <button\n onClick={onCancel}\n disabled={isProcessing}\n className=\"flex items-center justify-center gap-1.5 px-3 py-2 text-red-400 hover:text-red-300 hover:bg-red-500/10 text-sm rounded-lg transition-colors\"\n >\n <Square className=\"w-3.5 h-3.5\" />\n 终止\n </button>\n )}\n </div>\n )}\n \n {/* 执行摘要 - 智能总结标识(由后端生成) */}\n {plan.summary ? (\n <div className=\"pt-4 border-t border-zinc-800\">\n {/* 智能总结标识 - 仅当后端返回的是智能总结时显示 */}\n {isIntelligentSummary && (\n <div className=\"flex items-center gap-1.5 mb-3\">\n <Sparkles className=\"w-3.5 h-3.5 text-[#d8ff00]\" />\n <span className=\"text-[10px] text-[#d8ff00] font-medium\">AI 智能总结</span>\n </div>\n )}\n \n {/* 总结内容 */}\n <PlanMarkdownContent content={plan.summary} />\n </div>\n ) : (isCompleted || isCancelled || allStepsCompleted) && (\n /* 计划完成/取消/所有步骤已完成 但总结还未生成时,显示优雅的等待状态 */\n <div className=\"pt-4 border-t border-zinc-800\">\n <div className=\"flex items-center gap-2.5 py-3 px-4 bg-zinc-800/30 rounded-lg border border-zinc-700/50\">\n <div className=\"relative\">\n <Sparkles className=\"w-4 h-4 text-[#d8ff00]\" />\n <div className=\"absolute inset-0 animate-ping\">\n <Sparkles className=\"w-4 h-4 text-[#d8ff00]/30\" />\n </div>\n </div>\n <div className=\"flex-1\">\n <div className=\"text-sm text-zinc-300 font-medium\">正在生成执行总结</div>\n <div className=\"text-xs text-zinc-500 mt-0.5\">AI 正在分析执行结果,请稍候...</div>\n </div>\n <div className=\"flex gap-1\">\n <span className=\"w-1.5 h-1.5 bg-[#d8ff00] rounded-full animate-bounce\" style={{ animationDelay: '0ms' }} />\n <span className=\"w-1.5 h-1.5 bg-[#d8ff00] rounded-full animate-bounce\" style={{ animationDelay: '150ms' }} />\n <span className=\"w-1.5 h-1.5 bg-[#d8ff00] rounded-full animate-bounce\" style={{ animationDelay: '300ms' }} />\n </div>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n});\n\nexport default PlanCard;\n","import React, { createContext, useContext } from 'react';\nimport { AgentComponents } from '../types/components';\n\n// 创建组件上下文\nconst ComponentContext = createContext<AgentComponents | undefined>(undefined);\n\n// Provider 组件\ninterface ComponentProviderProps {\n components?: AgentComponents;\n children: React.ReactNode;\n}\n\nexport const ComponentProvider: React.FC<ComponentProviderProps> = ({ \n components = {}, \n children \n}) => {\n return (\n <ComponentContext.Provider value={components}>\n {children}\n </ComponentContext.Provider>\n );\n};\n\n// 自定义 Hook 用于获取组件\nexport const useComponents = (): AgentComponents => {\n const context = useContext(ComponentContext);\n if (!context) {\n // 返回空对象,组件将在使用处回退到默认值\n return {};\n }\n return context;\n};\n\n// 用于获取特定组件,如果未提供则返回 undefined\nexport function useComponent<T extends keyof AgentComponents>(\n componentName: T\n): AgentComponents[T] | undefined {\n const components = useComponents();\n return components[componentName];\n}","'use client';\n\nimport React from 'react';\nimport { User, Bot } from 'lucide-react';\n\ninterface MessageAvatarProps {\n isUser: boolean;\n avatarUrl?: string;\n avatarText?: string;\n displayName?: string;\n className?: string;\n}\n\nexport function MessageAvatar({\n isUser,\n avatarUrl,\n avatarText,\n displayName,\n className,\n}: MessageAvatarProps) {\n return (\n <div\n className={`agent-avatar w-8 h-8 rounded-lg flex items-center justify-center flex-shrink-0 ${\n isUser ? 'agent-avatar-user' : 'agent-avatar-bot'\n } ${className || ''}`}\n >\n {avatarUrl ? (\n <img src={avatarUrl} alt={displayName || (isUser ? 'User' : 'Assistant')} className=\"w-full h-full object-cover rounded-lg\" />\n ) : avatarText ? (\n <span className=\"text-xs font-semibold text-white/90\">{avatarText}</span>\n ) : isUser ? (\n <User size={16} className=\"agent-avatar-icon agent-avatar-icon-user\" />\n ) : (\n <Bot size={16} className=\"agent-avatar-icon agent-avatar-icon-bot\" />\n )}\n </div>\n );\n}\n\ninterface MessageIdentityMetaProps {\n isUser: boolean;\n displayName?: string;\n description?: string;\n showName?: boolean;\n showDescription?: boolean;\n}\n\nexport function MessageIdentityMeta({\n isUser,\n displayName,\n description,\n showName,\n showDescription,\n}: MessageIdentityMetaProps) {\n if (!showName && !showDescription) return null;\n return (\n <div className={`flex flex-col ${isUser ? 'items-end' : 'items-start'}`}>\n {showName && displayName && (\n <div className=\"text-xs text-zinc-400\">{displayName}</div>\n )}\n {showDescription && description && (\n <div className=\"text-[11px] text-zinc-500\">{description}</div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport React, { useMemo } from 'react';\n\nexport interface TimelineItem {\n kind: 'toolcall' | 'component' | 'plan' | 'thought' | 'message';\n id: string;\n data?: any;\n}\n\ninterface MessageTimelineProps {\n items: TimelineItem[];\n className?: string;\n renderToolCall: (item: TimelineItem) => React.ReactNode;\n renderComponent: (item: TimelineItem) => React.ReactNode;\n renderPlan: (item: TimelineItem) => React.ReactNode;\n /** 渲染 thought 项目,支持传递索引和所有 thought 项目以便判断是否是最后一个 */\n renderThought: (item: TimelineItem, index: number, allThoughtItems: TimelineItem[]) => React.ReactNode;\n renderMessage: (item: TimelineItem) => React.ReactNode;\n}\n\nexport function MessageTimeline({\n items,\n className,\n renderToolCall,\n renderComponent,\n renderPlan,\n renderThought,\n renderMessage,\n}: MessageTimelineProps) {\n if (!items || items.length === 0) return null;\n\n // 预先筛选出所有 thought 项目,用于判断索引\n const thoughtItems = useMemo(() => items.filter(item => item.kind === 'thought'), [items]);\n\n // 记录当前渲染的 thought 索引\n let thoughtIndex = 0;\n\n return (\n <div className={className || 'mt-3 space-y-3 w-full'}>\n {items.map((item) => {\n if (item.kind === 'thought') {\n const currentIndex = thoughtIndex;\n thoughtIndex++;\n return renderThought(item, currentIndex, thoughtItems);\n }\n if (item.kind === 'toolcall') return renderToolCall(item);\n if (item.kind === 'component') return renderComponent(item);\n // if (item.kind === 'message') return renderMessage(item);\n return item ? renderPlan(item) : null;\n })}\n </div>\n );\n}\n","'use client';\n\nimport React, { memo, useEffect, useState } from 'react';\nimport { Image, X } from 'lucide-react';\nimport { cn } from '../../lib/utils';\nimport { createAssetFromSource, inferAssetTypeFromUrl, isHttpUrl, resolveAssetForDisplay } from '../../utils/asset';\nimport { useComponent } from '../../context/ComponentContext';\nimport type { AgentConfig, AssetRenderInfo } from '../../types/components';\nimport { isVideoUrl } from './utils';\n\n// 全局图片加载状态缓存,避免重复加载导致闪烁\nconst imageLoadedCache = new Map<string, 'loading' | 'loaded' | 'error'>();\n\nexport const MessageImageInternal = memo(function MessageImageInternal({ src, alt, className }: { src: string; alt?: string; className?: string }) {\n // 检查缓存中的加载状态\n const cachedStatus = imageLoadedCache.get(src);\n const [loaded, setLoaded] = useState(cachedStatus === 'loaded');\n const [error, setError] = useState(cachedStatus === 'error');\n const imgRef = React.useRef<HTMLImageElement | null>(null);\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n const ImagePreviewComp = useComponent('ImagePreview') || ImagePreviewInternal;\n\n useEffect(() => {\n // 只有当 src 变化且不在缓存中时才重置状态\n const status = imageLoadedCache.get(src);\n if (status === 'loaded') {\n setLoaded(true);\n setError(false);\n } else if (status === 'error') {\n setLoaded(false);\n setError(true);\n } else {\n // 新图片,标记为加载中\n imageLoadedCache.set(src, 'loading');\n setLoaded(false);\n setError(false);\n }\n }, [src]);\n\n useEffect(() => {\n const img = imgRef.current;\n if (!img) return;\n if (img.complete && img.naturalWidth > 0) {\n imageLoadedCache.set(src, 'loaded');\n setLoaded(true);\n }\n }, [src]);\n\n const handleLoad = () => {\n imageLoadedCache.set(src, 'loaded');\n setLoaded(true);\n };\n\n const handleError = () => {\n imageLoadedCache.set(src, 'error');\n setError(true);\n };\n\n if (error) {\n return (\n <div className=\"flex items-center gap-2 p-3 bg-zinc-800/50 rounded-lg text-zinc-500 text-sm\">\n <Image size={16} />\n <span>图片加载失败</span>\n </div>\n );\n }\n\n return (\n <div className=\"relative cursor-pointer overflow-hidden rounded-lg my-2\">\n {previewUrl && (\n <ImagePreviewComp\n src={previewUrl}\n onClose={() => setPreviewUrl(null)}\n />\n )}\n {!loaded && (\n <div className=\"absolute inset-0 bg-zinc-800 animate-pulse rounded-lg\" style={{ minHeight: '100px' }} />\n )}\n <img\n src={src}\n alt={alt || 'image'}\n ref={imgRef}\n onLoad={handleLoad}\n onError={handleError}\n onClick={() => setPreviewUrl(src)}\n className={cn('rounded-lg cursor-zoom-in', className, !loaded && 'opacity-0')}\n style={{ maxHeight: '400px' }}\n />\n </div>\n );\n});\n\nexport const MessageVideoInternal = memo(function MessageVideoInternal({ src, className }: { src: string; className?: string }) {\n return (\n <div className=\"my-2 relative rounded-lg overflow-hidden bg-zinc-900 border border-zinc-800\">\n <video\n src={src}\n controls\n className={cn('max-w-full rounded-lg max-h-[400px] w-full', className)}\n preload=\"metadata\"\n >\n 您的浏览器不支持视频播放\n </video>\n </div>\n );\n});\n\nexport const ImagePreviewInternal = memo(function ImagePreviewInternal({\n src,\n alt,\n onClose\n}: {\n src: string;\n alt?: string;\n onClose: () => void;\n}) {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [onClose]);\n\n const handleDownload = (e: React.MouseEvent) => {\n e.stopPropagation();\n const link = document.createElement('a');\n link.href = src;\n link.download = `image-${Date.now()}.png`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n return (\n <div\n className=\"fixed inset-0 z-[100] flex items-center justify-center bg-black/90 backdrop-blur-sm p-4 animate-in fade-in duration-200\"\n onClick={onClose}\n >\n <button\n onClick={onClose}\n className=\"absolute top-4 right-4 p-2 text-white/50 hover:text-white bg-white/10 hover:bg-white/20 rounded-full transition-colors\"\n >\n <X size={24} />\n </button>\n\n <img\n src={src}\n alt={alt}\n className=\"max-w-full max-h-[90vh] object-contain shadow-2xl rounded-lg\"\n onClick={(e) => e.stopPropagation()}\n />\n\n <div className=\"absolute bottom-6 left-1/2 -translate-x-1/2 flex gap-4\">\n <button\n onClick={handleDownload}\n className=\"flex items-center gap-2 px-4 py-2 bg-[#d8ff00] hover:bg-[#c2e600] text-black rounded-full shadow-lg transition-colors text-sm font-medium\"\n >\n 下载\n </button>\n </div>\n </div>\n );\n});\n\nexport const VideoPreviewInternal = memo(function VideoPreviewInternal({\n src,\n onClose\n}: {\n src: string;\n onClose: () => void;\n}) {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [onClose]);\n\n return (\n <div\n className=\"fixed inset-0 z-[100] flex items-center justify-center bg-black/90 backdrop-blur-sm p-4 animate-in fade-in duration-200\"\n onClick={onClose}\n >\n <button\n onClick={onClose}\n className=\"absolute top-4 right-4 p-2 text-white/50 hover:text-white bg-white/10 hover:bg-white/20 rounded-full transition-colors\"\n >\n <X size={24} />\n </button>\n <div className=\"w-full max-w-[980px] max-h-[90vh]\">\n <video\n src={src}\n controls\n autoPlay\n className=\"w-full max-h-[90vh] object-contain rounded-lg shadow-2xl\"\n />\n </div>\n </div>\n );\n});\n\n// 全局媒体解析缓存,避免重复解析导致闪烁\nconst mediaResolveCache = new Map<string, AssetRenderInfo | null>();\n\nexport const ResolvedMarkdownMedia = memo(function ResolvedMarkdownMedia({\n src,\n alt,\n skipImages,\n config\n}: {\n src?: string;\n alt?: string;\n skipImages?: boolean;\n config?: AgentConfig;\n}) {\n // 生成缓存 key\n const cacheKey = src || '';\n const cachedMedia = mediaResolveCache.get(cacheKey);\n \n const [media, setMedia] = useState<AssetRenderInfo | null>(cachedMedia ?? null);\n\n useEffect(() => {\n let active = true;\n const load = async () => {\n if (!src) {\n if (active) setMedia(null);\n return;\n }\n\n // 如果已有缓存,直接使用\n const cached = mediaResolveCache.get(cacheKey);\n if (cached !== undefined) {\n if (active) setMedia(cached);\n return;\n }\n\n const asset = createAssetFromSource({\n fileUrl: src,\n fileId: isHttpUrl(src) ? undefined : src,\n type: inferAssetTypeFromUrl(src)\n });\n\n if (!asset) {\n mediaResolveCache.set(cacheKey, null);\n if (active) setMedia(null);\n return;\n }\n\n const resolved = await resolveAssetForDisplay(asset, config);\n mediaResolveCache.set(cacheKey, resolved);\n if (active) setMedia(resolved);\n };\n\n load();\n return () => { active = false; };\n }, [src, cacheKey, config]);\n\n if (!media) return null;\n if (skipImages && !media.isVideo) return null;\n\n const MessageImageComp = useComponent('MessageImage') || MessageImageInternal;\n const MessageVideoComp = useComponent('MessageVideo') || MessageVideoInternal;\n\n if (media.isVideo) {\n return <MessageVideoComp src={media.url} />;\n }\n\n return <MessageImageComp src={media.url} alt={alt} />;\n});\n","export interface ToolCallData {\n id: string;\n name: string;\n displayName?: string;\n gmtCreate?: number;\n arguments: Record<string, any>;\n status: 'PENDING' | 'WAITING_CONFIRMATION' | 'CONFIRMED' | 'REJECTED' | 'EXECUTING' | 'COMPLETED' | 'FAILED' | string;\n result?: {\n success?: boolean;\n error?: string;\n code?: string;\n outputs?: { images?: string };\n works?: Array<{ fileUrl: string; publicId?: string; fileId?: string }>;\n state?: string;\n taskId?: string;\n };\n error?: string;\n}\n\nexport const isVideoUrl = (url?: string) => {\n if (!url) return false;\n try {\n const urlObj = new URL(url, 'http://dummy');\n const pathname = urlObj.pathname.toLowerCase();\n return /\\.(mp4|mov|webm|avi|mkv|m4v)$/i.test(pathname);\n } catch {\n const lower = url.toLowerCase();\n return /\\.(mp4|mov|webm|avi|mkv|m4v)(\\?|#|$)/i.test(lower);\n }\n};\n\nexport const sanitizeMarkdownContent = (content?: string): string => {\n if (!content) return '';\n let fixed = content;\n fixed = fixed.replace(/```(?:mdx|markdown)\\s*\\n([\\s\\S]*?)\\n```/gi, '$1');\n const lines = fixed.split('\\n');\n const fixedLines = lines.map((line) => {\n const trimmed = line.trimStart();\n if (/^```(thought|final|action|observation|analysis|reasoning|mdx|markdown)/i.test(trimmed)) {\n return line.replace('```', '');\n }\n return line;\n });\n fixed = fixedLines.join('\\n');\n\n // 移除空的代码块(只有 ``` 没有内容的)\n fixed = fixed.replace(/```[\\s\\n]*```/g, '');\n fixed = fixed.replace(/```\\s*```/g, '');\n // 移除只包含空白的代码块\n fixed = fixed.replace(/```\\n\\s*\\n```/g, '');\n \n // 移除孤立的 ``` 行(没有配对的)\n const _lines = fixed.split('\\n');\n const resultLines: string[] = [];\n let inCodeBlock = false;\n \n for (const line of _lines) {\n const trimmedLine = line.trim();\n if (trimmedLine.startsWith('```')) {\n if (!inCodeBlock) {\n // 开始代码块,检查是否有实际内容\n inCodeBlock = true;\n resultLines.push(line);\n } else {\n // 结束代码块\n inCodeBlock = false;\n resultLines.push(line);\n }\n } else {\n resultLines.push(line);\n }\n }\n \n // 如果最后还在代码块中(没有闭合),移除开始的 ```\n if (inCodeBlock) {\n // 找到最后一个开始的 ``` 并移除\n for (let i = resultLines.length - 1; i >= 0; i--) {\n if (resultLines[i].trim().startsWith('```')) {\n resultLines.splice(i, 1);\n break;\n }\n }\n }\n \n fixed = resultLines.join('\\n');\n \n // 最终清理:移除只有 ``` 的结果\n if (fixed.trim() === '```' || fixed.trim() === '```\\n```') {\n return '';\n }\n \n return fixed;\n};\n\nexport const stripComponentTags = (content: string, componentNames: string[]): string => {\n if (!content) return '';\n const names = componentNames.filter(Boolean);\n if (names.length === 0) return content;\n\n const escapeRegexChars = (str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const tagPattern = names.map(escapeRegexChars).join('|');\n if (!tagPattern) return content;\n\n // 提取代码块,避免误处理\n const fenceRegex = /```[\\s\\S]*?```/g;\n const codeBlocks: { start: number; end: number }[] = [];\n let fenceMatch: RegExpExecArray | null;\n while ((fenceMatch = fenceRegex.exec(content)) !== null) {\n codeBlocks.push({\n start: fenceMatch.index,\n end: fenceMatch.index + fenceMatch[0].length,\n });\n }\n\n const isInCodeBlock = (index: number) => codeBlocks.some((b) => index >= b.start && index < b.end);\n\n let result = content;\n\n // 1. 移除完整的多行组件标签(包括自闭合和成对标签)\n for (const name of names) {\n const escapedName = escapeRegexChars(name);\n // 自闭合标签(可能跨多行,包含复杂属性)\n const selfClosingRegex = new RegExp('<' + escapedName + '[\\\\s\\\\S]*?\\\\/>', 'gi');\n // 成对标签\n const pairedRegex = new RegExp('<' + escapedName + '[\\\\s\\\\S]*?<\\\\/' + escapedName + '>', 'gi');\n\n result = result.replace(selfClosingRegex, (match, offset) => (isInCodeBlock(offset) ? match : ''));\n result = result.replace(pairedRegex, (match, offset) => (isInCodeBlock(offset) ? match : ''));\n }\n\n // 2. 移除不完整的组件标签开头(流式传输时可能出现)\n const incompleteOpenTagRegex = new RegExp('<(?:' + tagPattern + ')(?:\\\\s[^>]*)?$', 'gim');\n result = result.replace(incompleteOpenTagRegex, '');\n\n // 3. 移除残留的 JSON 片段(通常是组件属性的一部分)\n result = result.replace(/^[\\s]*[,}{\\[\\]]\\s*\"[^\"]*\"\\s*:\\s*\"[^\"]*\"[}\\]]*\\s*$/gm, '');\n result = result.replace(/^[\\s]*[,}{\\[\\]]\\s*\"[^\"]*\"\\s*:\\s*\\{[^}]*\\}[}\\]]*\\s*$/gm, '');\n result = result.replace(/^[\\s]*[}\\]]+\\s*$/gm, '');\n\n // 移除行内的 JSON 残留(如: ]}\", ]}\"})\n // 匹配行尾的简单 JSON 闭合符号残留\n result = result.replace(/\\s*[\\]\\}]+[\"']?\\}?\\s*$/gm, (match, offset, str) => {\n // 检查这一行前面是否有正常的中文/英文内容\n const lineStart = str.lastIndexOf('\\n', offset - 1) + 1;\n const beforeMatch = str.slice(lineStart, offset);\n // 如果前面有正常文本内容,则移除 JSON 残留\n if (beforeMatch.trim() && /[\\u4e00-\\u9fa5a-zA-Z]/.test(beforeMatch)) {\n return '';\n }\n return match;\n });\n // 匹配文本末尾的 JSON 片段:]\", \"key\": \"value\"} 或类似模式\n result = result.replace(/\\s*[\\]\\}]\"\\s*,\\s*\"[^\"]*\"\\s*:\\s*\"[^\"]*\"\\s*\\}?\\s*$/gm, '');\n // 匹配 , {\"type\": \"xxx\", \"url\": \"xxx\"}]\", \"key\": \"value\"} 这种复杂模式\n result = result.replace(/\\s*,\\s*\\{[^}]*\\}\\s*[\\]\\}]\"\\s*,\\s*\"[^\"]*\"\\s*:\\s*\"[^\"]*\"\\s*\\}?\\s*$/gm, '');\n // 匹配行内以逗号开头的 JSON 片段\n result = result.replace(/\\s*,\\s*\\{\\\\?\"[^\"]*\\\\?\"\\s*:\\s*\\\\?\"[^\"]*\\\\?\"[^}]*\\}\\s*[\\]\\}]\"\\s*,\\s*\"[^\"]*\"\\s*:\\s*\"[^\"]*\"\\s*\\}?\\s*$/gm, '');\n // 清理转义的 JSON 残留\n result = result.replace(/\\s*,\\s*\\{\\\\[^}]+\\}[\\]\\}]\",\\s*\"[^\"]*\":\\s*\"[^\"]*\"\\}?\\s*$/gm, '');\n // 清理简单的 JSON 闭合残留如 ]}\"} 或 ]}\n result = result.replace(/\\s*\\]\\}[\"']?\\}?\\s*$/gm, '');\n\n // 4. 移除残留的标签片段(如: 1080x1920\" /> 或 />)\n result = result.replace(/^[^<\\n]*\"\\s*\\/>\\s*$/gm, '');\n result = result.replace(/^\\s*\\/>\\s*$/gm, '');\n\n // 5. 移除单独出现的组件名(可能是标签解析残留)\n const standaloneNameRegex = new RegExp('^\\\\s*(' + tagPattern + ')\\\\s*$', 'gim');\n result = result.replace(standaloneNameRegex, '');\n\n // 6. 移除通用的 JSX 组件标签(大写字母开头)\n const genericJsxRegex = /<\\/?[A-Z][A-Za-z0-9_:-]*(?:\\s[^>]*?)?\\s*\\/?>/g;\n result = result.replace(genericJsxRegex, (match, offset) => (isInCodeBlock(offset) ? match : ''));\n\n // 7. 清理多余的空行\n result = result.replace(/\\n{3,}/g, '\\n\\n');\n result = result.replace(/^[ \\t]*\\n/gm, '');\n\n return result.trim();\n};\n\n// 解析并美化思考内容(去除 Thought: Action: 等前缀,提取纯净思考)\nexport function parseThinkingContent(rawContent: string): string {\n if (!rawContent) return '';\n\n let cleaned = rawContent;\n\n // 移除 Thought: 前缀(支持行首和行中)\n cleaned = cleaned\n .replace(/^Thought\\s*:\\s*/gim, '')\n .replace(/\\nThought\\s*:\\s*/gi, '\\n')\n .replace(/(?<![a-zA-Z])Thought\\s*:\\s*/gi, '');\n\n // 移除 Action: xxx 和 Action Input: xxx(这些是工具调用信息,不应该展示)\n cleaned = cleaned\n .replace(/^Action\\s*:\\s*[\\w_-]+\\s*/gim, '')\n .replace(/\\nAction\\s*:\\s*[\\w_-]+\\s*/gi, '\\n')\n .replace(/(?<![a-zA-Z])Action\\s*:\\s*[\\w_-]+\\s*/gi, '');\n\n // 移除 Action Input: 及其后的 JSON 内容\n cleaned = cleaned\n .replace(/^Action\\s+Input\\s*:\\s*\\{[^}]*\\}\\s*/gim, '')\n .replace(/\\nAction\\s+Input\\s*:\\s*\\{[^}]*\\}\\s*/gi, '\\n')\n .replace(/(?<![a-zA-Z])Action\\s+Input\\s*:\\s*\\{[^}]*\\}\\s*/gi, '')\n .replace(/^Action\\s+Input\\s*:\\s*/gim, '')\n .replace(/\\nAction\\s+Input\\s*:\\s*/gi, '\\n');\n\n // 移除 Observation: 前缀\n cleaned = cleaned\n .replace(/^Observation\\s*:\\s*/gim, '')\n .replace(/\\nObservation\\s*:\\s*/gi, '\\n')\n .replace(/(?<![a-zA-Z])Observation\\s*:\\s*/gi, '');\n\n // 移除 Final Answer: 及其后的所有内容\n cleaned = cleaned.replace(/Final\\s+Answer\\s*:\\s*[\\s\\S]*/gi, '');\n\n const lines = cleaned.split(/\\n/);\n const cleanedParts: string[] = [];\n\n for (const line of lines) {\n const lineCleaned = line.trim();\n if (!lineCleaned) continue;\n\n // 跳过 JSON 对象行\n if (lineCleaned.startsWith('{') && (lineCleaned.endsWith('}') || lineCleaned.includes('\"content\":'))) {\n try {\n JSON.parse(lineCleaned);\n continue;\n } catch {\n // Not JSON, continue processing\n }\n }\n\n // 跳过看起来像 JSON 开头的行\n if (lineCleaned.match(/^\\{\"[\\w]+\"\\s*:/)) continue;\n // 跳过工具名行(如 comfy_xxx)\n if (lineCleaned.match(/^comfy_[\\w]+$/i)) continue;\n // 跳过只有标签的行\n if (lineCleaned.match(/^(Action|Thought|Observation|Final Answer)\\s*:?\\s*$/i)) continue;\n // 跳过 \"请确认:\" 相关的内容\n if (lineCleaned.match(/^(请确认|以下是|你好!我是)/)) continue;\n // 跳过 MDX 组件相关内容\n if (lineCleaned.match(/^```mdx/i) || lineCleaned.match(/^<[A-Z]/)) continue;\n\n if (lineCleaned) {\n cleanedParts.push(lineCleaned);\n }\n }\n\n const dedupedParts: string[] = [];\n for (const part of cleanedParts) {\n if (dedupedParts.length === 0 || dedupedParts[dedupedParts.length - 1] !== part) {\n dedupedParts.push(part);\n }\n }\n\n return dedupedParts.join('\\n');\n}\n\nexport function tryParseJson(value: any): any {\n if (typeof value !== 'string') return value;\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\n/**\n * 移除 JSON 格式数据中的图片 URL,但保留正常的 markdown 图片语法\n * 用于 thought 卡片中,避免显示 JSON 数据中的图片\n */\nexport function removeJsonImageUrls(content: string): string {\n if (!content) return '';\n \n let result = content;\n \n // 1. 移除 JSON 对象中的图片 URL 字段(如 \"url\": \"https://xxx.jpg\")\n // 匹配 \"url\": \"xxx\" 或 \"fileUrl\": \"xxx\" 或 \"imageUrl\": \"xxx\" 等\n result = result.replace(/\"(?:url|fileUrl|imageUrl|image|src|hdUrl|thumbUrl)\"\\s*:\\s*\"[^\"]*\\.(jpg|jpeg|png|gif|webp|bmp|svg)[^\"]*\"/gi, '\"$1_url\": \"[图片]\"');\n \n // 2. 移除 JSON 数组中的图片 URL(如 [\"https://xxx.jpg\", \"https://yyy.png\"])\n // 这种情况比较复杂,我们只处理明显是图片 URL 的情况\n result = result.replace(/\"\\s*https?:\\/\\/[^\"]*\\.(jpg|jpeg|png|gif|webp|bmp|svg)[^\"]*\\s*\"/gi, '\"[图片]\"');\n \n // 3. 移除 works 数组中的图片对象(这些通常是工具调用结果)\n // 匹配 {\"fileUrl\": \"xxx\", ...} 这种模式\n result = result.replace(/\\{\\s*\"fileUrl\"\\s*:\\s*\"[^\"]*\"[^}]*\\}/g, '{\"fileUrl\": \"[图片]\"}');\n \n // 4. 移除整行的 JSON 图片数据(如果一行只有图片 URL 相关的 JSON)\n const lines = result.split('\\n');\n const filteredLines = lines.filter(line => {\n const trimmed = line.trim();\n // 如果这一行看起来像是纯 JSON 图片数据,跳过它\n if (trimmed.match(/^\\s*\\[\\s*\\{?\\s*\"(?:url|fileUrl|imageUrl)\"\\s*:/)) {\n return false;\n }\n // 如果这一行只是一个图片 URL(被引号包围)\n if (trimmed.match(/^\"https?:\\/\\/[^\"]*\\.(jpg|jpeg|png|gif|webp|bmp|svg)[^\"]*\"[,\\]]?\\s*$/i)) {\n return false;\n }\n return true;\n });\n \n result = filteredLines.join('\\n');\n \n return result;\n}\n\nexport function getToolCallStatus(tc: ToolCallData): 'pending' | 'waiting_confirmation' | 'success' | 'failed' | 'rejected' | 'confirmed' {\n const statusLower = tc.status?.toLowerCase() || '';\n if (statusLower === 'waiting_confirmation') return 'waiting_confirmation';\n if (statusLower === 'rejected') return 'rejected';\n // CONFIRMED 状态单独返回,不再归类为 pending,这样确认卡片会消失\n if (statusLower === 'confirmed') return 'confirmed';\n if (statusLower === 'pending' || statusLower === 'executing') return 'pending';\n if (statusLower === 'failed') return 'failed';\n if (tc.result) {\n if (tc.result.success === false) return 'failed';\n if (tc.result.success === true) return 'success';\n if (tc.result.error) return 'failed';\n if (tc.result.works?.length || tc.result.outputs) return 'success';\n }\n if (tc.error) return 'failed';\n return 'success';\n}\n","'use client';\n\nimport React, { memo, useState } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport { Check, Copy } from 'lucide-react';\nimport type { AgentConfig } from '../../types/components';\nimport { ResolvedMarkdownMedia } from './MessageMedia';\nimport { isVideoUrl } from './utils';\n\nconst CodeBlock = memo(function CodeBlock({ children, className }: { children: string; className?: string }) {\n const [copied, setCopied] = useState(false);\n const language = className?.replace('language-', '') || 'text';\n\n const handleCopy = async () => {\n await navigator.clipboard.writeText(children);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n return (\n <div className=\"relative group my-3 rounded-lg overflow-hidden bg-zinc-900 border border-zinc-800\">\n <div className=\"flex items-center justify-between px-4 py-2 bg-zinc-800/50 border-b border-zinc-800\">\n <span className=\"text-xs text-zinc-500 font-mono\">{language}</span>\n <button\n onClick={handleCopy}\n className=\"flex items-center gap-1.5 text-xs text-zinc-500 hover:text-zinc-300 transition-colors\"\n >\n {copied ? <Check size={14} className=\"text-green-400\" /> : <Copy size={14} />}\n {copied ? '已复制' : '复制'}\n </button>\n </div>\n <pre className=\"p-4 overflow-x-auto text-sm whitespace-pre-wrap break-all\">\n <code className={`${className} text-zinc-300`}>{children}</code>\n </pre>\n </div>\n );\n});\n\nexport const MarkdownContent = memo(function MarkdownContent({ content, skipImages = false, config, variant = 'default' }: { content: string; skipImages?: boolean; config?: AgentConfig; variant?: 'default' | 'thought' }) {\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={{\n code({ className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || '');\n const codeString = String(children).replace(/\\n$/, '');\n const isBlock = match || codeString.includes('\\n');\n\n if (isBlock) {\n if (variant === 'thought') {\n return (\n <pre className=\"my-2 rounded-lg border border-zinc-700/50 bg-zinc-900/50 p-3 text-xs text-zinc-300 whitespace-pre-wrap break-words\">\n <code className={className}>{codeString}</code>\n </pre>\n );\n }\n return <CodeBlock className={className}>{codeString}</CodeBlock>;\n }\n\n return (\n <code className=\"px-1.5 py-0.5 bg-zinc-800 rounded text-[#d8ff00] text-sm font-mono\" {...props}>\n {children}\n </code>\n );\n },\n img({ src, alt }) {\n return (\n <ResolvedMarkdownMedia\n src={src}\n alt={alt}\n skipImages={skipImages}\n config={config}\n />\n );\n },\n p({ children }) {\n // 普通文字使用细体\n return <p className=\"font-normal leading-[24px]\">{children}</p>;\n },\n h1: ({ children }) => <h1 className=\"text-xl font-bold mb-3 mt-4 first:mt-0\">{children}</h1>,\n h2: ({ children }) => <h2 className=\"text-lg font-bold mb-2 mt-3 first:mt-0\">{children}</h2>,\n h3: ({ children }) => <h3 className=\"text-base font-semibold mb-2 mt-3 first:mt-0\">{children}</h3>,\n ul: ({ children }) => <ul className=\"list-disc list-inside mb-3 space-y-1\">{children}</ul>,\n ol: ({ children }) => <ol className=\"list-decimal list-inside mb-3 space-y-1\">{children}</ol>,\n li: ({ children }) => <li className=\"leading-relaxed\">{children}</li>,\n blockquote: ({ children }) => (\n <blockquote className=\"border-l-4 border-[#d8ff00]/50 pl-4 my-3 text-zinc-400 italic\">\n {children}\n </blockquote>\n ),\n table: ({ children }) => (\n <div className=\"overflow-x-auto my-3\">\n <table className=\"min-w-full border-collapse border border-zinc-700 rounded-lg overflow-hidden\">\n {children}\n </table>\n </div>\n ),\n th: ({ children }) => (\n <th className=\"bg-zinc-800 border border-zinc-700 px-4 py-2 text-left font-medium\">{children}</th>\n ),\n td: ({ children }) => (\n <td className=\"border border-zinc-700 px-4 py-2\">{children}</td>\n ),\n a: ({ href, children }) => {\n const link = href || '';\n const isMediaLink = /\\.(jpg|jpeg|png|gif|webp|bmp|svg)$/i.test(link) || isVideoUrl(link);\n\n if (isMediaLink) {\n return (\n <ResolvedMarkdownMedia\n src={link}\n alt={typeof children === 'string' ? children : undefined}\n skipImages={skipImages}\n config={config}\n />\n );\n }\n\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-[#d8ff00] hover:underline\">\n {children}\n </a>\n );\n },\n hr: () => <hr className=\"my-4 border-zinc-700\" />,\n strong: ({ children }) => <strong className=\"font-semibold text-white\">{children}</strong>,\n em: ({ children }) => <em className=\"italic\">{children}</em>,\n }}\n >\n {content}\n </ReactMarkdown>\n );\n});\n","'use client';\n\nimport React, { useState, useMemo, memo } from 'react';\nimport { ChevronDown, ChevronRight, Copy, Check } from 'lucide-react';\nimport { cn } from '../lib/utils';\n\ninterface ParameterDisplayProps {\n parameters: Record<string, any>;\n className?: string;\n /** 是否显示 JSON 切换按钮 */\n showJsonToggle?: boolean;\n /** 初始是否展开技术参数 */\n defaultExpanded?: boolean;\n /** 紧凑模式 - 只显示关键参数摘要 */\n compact?: boolean;\n /** 紧凑模式下最多显示几个参数 */\n maxCompactItems?: number;\n}\n\n// 常见参数的中文友好名称\nconst PARAM_NAMES: Record<string, string> = {\n prompt: '提示词', query: '搜索内容', content: '内容', text: '文本',\n message: '消息', input: '输入', output: '输出',\n image: '图片', image_url: '图片地址', imageUrl: '图片地址',\n width: '宽度', height: '高度', size: '尺寸',\n model: '模型', style: '风格', seed: '随机种子', steps: '步数',\n cfg_scale: '引导系数', cfgScale: '引导系数',\n name: '名称', title: '标题', description: '描述', type: '类型',\n url: '链接', file: '文件', path: '路径',\n negative_prompt: '反向提示词', negativePrompt: '反向提示词',\n strength: '强度', quality: '质量', count: '数量',\n};\n\n// 技术性参数(默认折叠)\nconst TECHNICAL_PARAMS = new Set([\n 'seed', 'cfg_scale', 'cfgScale', 'steps', 'sampler', 'scheduler',\n 'batch_size', 'batchSize', 'denoising_strength', 'denoisingStrength',\n 'guidance_scale', 'guidanceScale', 'node', 'workflow_id', 'workflowId',\n 'callback_url', 'callbackUrl', 'webhook', 'api_key', 'apiKey',\n]);\n\n// 重要参数(优先显示)\nconst IMPORTANT_PARAMS = new Set([\n 'prompt', 'query', 'content', 'text', 'message', 'input',\n 'image', 'image_url', 'imageUrl', 'file', 'file_url', 'fileUrl',\n 'model', 'style', 'width', 'height', 'size', 'name', 'title',\n]);\n\n// 格式化参数值\nfunction formatValue(key: string, value: any): string {\n if (value === null || value === undefined) return '—';\n if (typeof value === 'boolean') return value ? '是' : '否';\n \n if (typeof value === 'number') {\n if (['width', 'height', 'size'].some(k => key.toLowerCase().includes(k))) {\n return `${value} px`;\n }\n if (['strength', 'opacity'].some(k => key.toLowerCase().includes(k)) && value <= 1) {\n return `${Math.round(value * 100)}%`;\n }\n return String(value);\n }\n \n if (typeof value === 'string') {\n if (value.startsWith('http://') || value.startsWith('https://')) {\n try {\n const url = new URL(value);\n if (/\\.(jpg|jpeg|png|gif|webp|svg)(\\?|$)/i.test(value)) return `[图片] ${url.hostname}`;\n if (/\\.(mp4|mov|webm)(\\?|$)/i.test(value)) return `[视频] ${url.hostname}`;\n return url.hostname + (url.pathname.length > 1 ? '/...' : '');\n } catch { return '[链接]'; }\n }\n return value.length > 80 ? value.slice(0, 80) + '...' : value;\n }\n \n if (Array.isArray(value)) {\n if (value.length === 0) return '[]';\n if (value.length <= 3 && value.every(v => typeof v === 'string' || typeof v === 'number')) {\n return value.join(', ');\n }\n return `[${value.length} 项]`;\n }\n \n if (typeof value === 'object') {\n const keys = Object.keys(value);\n return keys.length === 0 ? '{}' : `{${keys.length} 个字段}`;\n }\n \n return String(value);\n}\n\n// 获取参数显示名\nfunction getDisplayName(key: string): string {\n if (PARAM_NAMES[key]) return PARAM_NAMES[key];\n return key.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/_/g, ' ');\n}\n\n// 单个参数行\nconst ParamRow = memo(function ParamRow({ \n name, \n value, \n isExpanded,\n onToggle \n}: { \n name: string; \n value: string;\n isExpanded?: boolean;\n onToggle?: () => void;\n}) {\n const isLong = value.length > 50;\n \n return (\n <div className=\"flex items-start gap-2 py-0.5 min-w-0\">\n <span className=\"text-[11px] text-zinc-500 flex-shrink-0 w-[60px]\">\n {name}\n </span>\n <span className=\"text-[11px] text-zinc-300 leading-relaxed min-w-0 flex-1 break-words overflow-hidden\">\n {isLong && !isExpanded ? (\n <>\n <span className=\"break-words\">{value.slice(0, 50)}</span>\n <button \n onClick={onToggle}\n className=\"text-[#d8ff00]/70 hover:text-[#d8ff00] ml-1 inline\"\n >\n ...更多\n </button>\n </>\n ) : isLong ? (\n <>\n <span className=\"break-words\">{value}</span>\n <button \n onClick={onToggle}\n className=\"text-[#d8ff00]/70 hover:text-[#d8ff00] ml-1\"\n >\n 收起\n </button>\n </>\n ) : value}\n </span>\n </div>\n );\n});\n\n// JSON 视图\nconst JsonView = memo(function JsonView({ data }: { data: any }) {\n const [copied, setCopied] = useState(false);\n const json = JSON.stringify(data, null, 2);\n \n const handleCopy = async () => {\n await navigator.clipboard.writeText(json);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n \n return (\n <div className=\"relative group\">\n <button\n onClick={handleCopy}\n className=\"absolute top-1.5 right-1.5 p-1 rounded bg-zinc-700/50 hover:bg-zinc-700 transition-colors opacity-0 group-hover:opacity-100\"\n >\n {copied ? (\n <Check className=\"w-3 h-3 text-green-400\" />\n ) : (\n <Copy className=\"w-3 h-3 text-zinc-400\" />\n )}\n </button>\n <pre className=\"text-[11px] font-mono text-zinc-400 leading-relaxed overflow-x-auto max-h-40 overflow-y-auto\">\n {json}\n </pre>\n </div>\n );\n});\n\n/**\n * 参数展示组件 - 精致暗色主题设计\n */\nexport function ParameterDisplay({\n parameters,\n className,\n showJsonToggle = true,\n defaultExpanded = false,\n compact = false,\n maxCompactItems = 3,\n}: ParameterDisplayProps) {\n const [showJson, setShowJson] = useState(false);\n const [expandedTech, setExpandedTech] = useState(defaultExpanded);\n const [expandedValues, setExpandedValues] = useState<Set<string>>(new Set());\n \n // 分类参数\n const { mainParams, techParams } = useMemo(() => {\n if (!parameters || typeof parameters !== 'object') {\n return { mainParams: [], techParams: [] };\n }\n \n const entries = Object.entries(parameters).map(([key, value]) => ({\n key,\n displayName: getDisplayName(key),\n displayValue: formatValue(key, value),\n rawValue: value,\n isImportant: IMPORTANT_PARAMS.has(key),\n isTechnical: TECHNICAL_PARAMS.has(key),\n }));\n \n // 排序:重要的在前\n entries.sort((a, b) => {\n if (a.isImportant && !b.isImportant) return -1;\n if (!a.isImportant && b.isImportant) return 1;\n return 0;\n });\n \n return {\n mainParams: entries.filter(e => !e.isTechnical),\n techParams: entries.filter(e => e.isTechnical),\n };\n }, [parameters]);\n \n const toggleExpand = (key: string) => {\n setExpandedValues(prev => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n \n if (!parameters || Object.keys(parameters).length === 0) {\n return (\n <div className={cn(\"text-[11px] text-zinc-500 italic\", className)}>\n 无参数\n </div>\n );\n }\n \n // 紧凑模式 - 只显示摘要\n if (compact) {\n const visibleParams = mainParams.slice(0, maxCompactItems);\n const hiddenCount = mainParams.length + techParams.length - visibleParams.length;\n \n return (\n <div className={cn(\"space-y-0.5 min-w-0 overflow-hidden\", className)}>\n {visibleParams.map((param) => (\n <div key={param.key} className=\"flex items-center gap-1.5 text-[11px] min-w-0\">\n <span className=\"text-zinc-500 flex-shrink-0\">{param.displayName}:</span>\n <span className=\"text-zinc-400 truncate flex-1 min-w-0\">\n {param.displayValue}\n </span>\n </div>\n ))}\n {hiddenCount > 0 && (\n <div className=\"text-[10px] text-zinc-600\">\n +{hiddenCount} 个参数\n </div>\n )}\n </div>\n );\n }\n \n return (\n <div className={cn(\"space-y-1.5 min-w-0 overflow-hidden\", className)}>\n {/* 视图切换 - 小巧精致 */}\n {showJsonToggle && (\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => setShowJson(false)}\n className={cn(\n \"text-[10px] px-1.5 py-0.5 rounded transition-colors\",\n !showJson \n ? \"bg-zinc-700 text-zinc-200\" \n : \"text-zinc-500 hover:text-zinc-300\"\n )}\n >\n 参数\n </button>\n <button\n onClick={() => setShowJson(true)}\n className={cn(\n \"text-[10px] px-1.5 py-0.5 rounded transition-colors\",\n showJson \n ? \"bg-zinc-700 text-zinc-200\" \n : \"text-zinc-500 hover:text-zinc-300\"\n )}\n >\n JSON\n </button>\n </div>\n )}\n \n {showJson ? (\n <JsonView data={parameters} />\n ) : (\n <div className=\"space-y-0\">\n {/* 主要参数 */}\n {mainParams.map((param) => (\n <ParamRow\n key={param.key}\n name={param.displayName}\n value={param.displayValue}\n isExpanded={expandedValues.has(param.key)}\n onToggle={() => toggleExpand(param.key)}\n />\n ))}\n \n {/* 技术参数折叠 */}\n {techParams.length > 0 && (\n <div className=\"pt-1 mt-1 border-t border-zinc-700/30\">\n <button\n onClick={() => setExpandedTech(!expandedTech)}\n className=\"flex items-center gap-0.5 text-[10px] text-zinc-500 hover:text-zinc-400 transition-colors\"\n >\n {expandedTech ? (\n <ChevronDown className=\"w-3 h-3\" />\n ) : (\n <ChevronRight className=\"w-3 h-3\" />\n )}\n 高级 ({techParams.length})\n </button>\n \n {expandedTech && (\n <div className=\"mt-0.5 pl-2 border-l border-zinc-700/30\">\n {techParams.map((param) => (\n <ParamRow\n key={param.key}\n name={param.displayName}\n value={param.displayValue}\n isExpanded={expandedValues.has(param.key)}\n onToggle={() => toggleExpand(param.key)}\n />\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useMemo } from 'react';\nimport { \n Check, \n X, \n ChevronDown, \n ChevronUp,\n Pencil,\n Loader2, \n AlertCircle,\n Shield,\n Sparkles,\n Eye,\n Code2\n} from 'lucide-react';\nimport { useAgentStore } from '@/stores/agentStore';\nimport { toolCallService } from '@/services/agent';\nimport type { ToolCall } from '@/types/agent';\nimport { ParameterDisplay } from './ParameterDisplay';\nimport { getParamsSummary, generateToolCallDescription } from '../utils/parameterFormatter';\n\ninterface ToolConfirmCardProps {\n toolCall: ToolCall;\n compact?: boolean; // 紧凑模式,用于流式展示\n}\n\n/**\n * 工具调用确认卡片 - 内嵌在消息流中的优雅确认交互\n * \n * 设计理念:\n * 1. 作为消息流的一部分,不打断用户阅读\n * 2. 关键信息一目了然\n * 3. 操作直观,一键确认/拒绝\n * 4. 高级操作(编辑参数)隐藏在展开区域\n */\nexport default function ToolConfirmCard({ toolCall, compact = false }: ToolConfirmCardProps) {\n const { removePendingToolCall, updatePendingToolCall } = useAgentStore();\n \n const [expanded, setExpanded] = useState(false);\n const [isEditing, setIsEditing] = useState(false);\n const [editedArguments, setEditedArguments] = useState('');\n const [loading, setLoading] = useState<'confirm' | 'reject' | null>(null);\n const [error, setError] = useState('');\n\n // 工具显示名称\n const toolDisplayName = useMemo(() => {\n if (toolCall.displayName) return toolCall.displayName;\n // 美化工具名称\n return toolCall.name\n .replace(/^comfy_/, '')\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, l => l.toUpperCase());\n }, [toolCall]);\n\n // 生成工具调用的自然语言描述\n const toolDescription = useMemo(() => {\n return generateToolCallDescription(toolCall.name, toolCall.arguments || {});\n }, [toolCall.name, toolCall.arguments]);\n\n // 获取参数摘要(用于紧凑模式)\n const paramsSummary = useMemo(() => {\n return getParamsSummary(toolCall.arguments || {}, 2);\n }, [toolCall.arguments]);\n\n const hasParams = Object.keys(toolCall.arguments || {}).length > 0;\n\n // 确认工具调用\n const handleConfirm = async () => {\n setLoading('confirm');\n setError('');\n \n try {\n let modifiedArguments: Record<string, any> | undefined;\n \n if (isEditing && editedArguments) {\n try {\n modifiedArguments = JSON.parse(editedArguments);\n } catch {\n setError('JSON 格式错误');\n setLoading(null);\n return;\n }\n }\n\n const response = await toolCallService.confirm({\n toolCallId: toolCall.id,\n approved: true,\n modifiedArguments,\n });\n\n if (response.success) {\n // 更新状态为 confirmed,然后由 SSE 事件流更新后续状态\n updatePendingToolCall(toolCall.id, { status: 'confirmed' });\n } else {\n setError(response.msg || '确认失败');\n }\n } catch {\n setError('网络错误,请重试');\n } finally {\n setLoading(null);\n }\n };\n\n // 拒绝工具调用\n const handleReject = async () => {\n setLoading('reject');\n setError('');\n \n try {\n const response = await toolCallService.confirm({\n toolCallId: toolCall.id,\n approved: false,\n });\n\n if (response.success) {\n updatePendingToolCall(toolCall.id, { status: 'rejected' });\n // 延迟移除,让用户看到状态变化\n setTimeout(() => removePendingToolCall(toolCall.id), 800);\n } else {\n setError(response.msg || '操作失败');\n }\n } catch {\n setError('网络错误,请重试');\n } finally {\n setLoading(null);\n }\n };\n\n // 开始编辑参数\n const startEditing = () => {\n setEditedArguments(JSON.stringify(toolCall.arguments, null, 2));\n setIsEditing(true);\n setExpanded(true);\n };\n\n // 紧凑模式 - 用于流式展示时的简洁卡片\n if (compact) {\n return (\n <div className=\"group relative\">\n {/* 主卡片 */}\n <div className=\"relative overflow-hidden rounded-xl border-2 border-amber-500/40 bg-gradient-to-br from-amber-500/5 via-zinc-900 to-zinc-900\">\n {/* 顶部装饰条 */}\n <div className=\"h-1 bg-gradient-to-r from-amber-500 via-yellow-400 to-amber-500\" />\n \n <div className=\"p-3\">\n {/* 工具信息行 */}\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <div className=\"w-8 h-8 rounded-lg bg-amber-500/20 flex items-center justify-center flex-shrink-0\">\n <Shield size={16} className=\"text-amber-400\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium text-white truncate\">{toolDisplayName}</span>\n <span className=\"flex-shrink-0 text-[10px] font-medium text-amber-400 bg-amber-500/20 px-1.5 py-0.5 rounded\">\n 需要确认\n </span>\n </div>\n {hasParams && (\n <div className=\"text-xs text-zinc-400 truncate mt-0.5\">\n {toolDescription}\n </div>\n )}\n </div>\n </div>\n \n {/* 操作按钮 */}\n <div className=\"flex items-center gap-1.5 flex-shrink-0\">\n <button\n onClick={handleReject}\n disabled={loading !== null}\n className=\"p-2 rounded-lg text-zinc-400 hover:text-red-400 hover:bg-red-500/10 transition-all disabled:opacity-50\"\n title=\"拒绝\"\n >\n {loading === 'reject' ? (\n <Loader2 size={16} className=\"animate-spin\" />\n ) : (\n <X size={16} />\n )}\n </button>\n <button\n onClick={handleConfirm}\n disabled={loading !== null}\n className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-[#d8ff00] hover:bg-[#e5ff4d] text-black text-sm font-medium transition-all disabled:opacity-50 shadow-lg shadow-[#d8ff00]/20\"\n >\n {loading === 'confirm' ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : (\n <Check size={14} />\n )}\n <span>确认</span>\n </button>\n </div>\n </div>\n \n {/* 错误提示 */}\n {error && (\n <div className=\"mt-2 flex items-center gap-1.5 text-xs text-red-400\">\n <AlertCircle size={12} />\n {error}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // 完整模式 - 可展开的详细卡片\n return (\n <div className=\"group relative\">\n {/* 主卡片 */}\n <div className=\"relative overflow-hidden rounded-xl border-2 border-amber-500/40 bg-gradient-to-br from-amber-500/5 via-zinc-900 to-zinc-900 shadow-xl shadow-amber-500/5\">\n {/* 顶部装饰条 */}\n <div className=\"h-1 bg-gradient-to-r from-amber-500 via-yellow-400 to-amber-500\" />\n \n {/* 头部 */}\n <div className=\"px-4 py-3 border-b border-zinc-800/50\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"relative\">\n <div className=\"w-10 h-10 rounded-xl bg-gradient-to-br from-amber-500/30 to-amber-600/20 flex items-center justify-center\">\n <Shield size={20} className=\"text-amber-400\" />\n </div>\n {/* 脉冲动画 */}\n <div className=\"absolute inset-0 rounded-xl bg-amber-500/20 animate-ping opacity-75\" style={{ animationDuration: '2s' }} />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-base font-semibold text-white\">{toolDisplayName}</span>\n </div>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className=\"text-[10px] font-medium text-amber-400 bg-amber-500/20 px-2 py-0.5 rounded-full flex items-center gap-1\">\n <Sparkles size={10} />\n 等待您的确认\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* 参数预览 */}\n <div className=\"px-4 py-3\">\n {hasParams ? (\n <div className=\"space-y-2\">\n {/* 工具意图描述 */}\n <div className=\"text-sm text-zinc-300\">\n {toolDescription}\n </div>\n \n {/* 紧凑参数展示 */}\n {!expanded && (\n <ParameterDisplay\n parameters={toolCall.arguments || {}}\n compact\n maxCompactItems={3}\n />\n )}\n \n {!expanded && (\n <button\n onClick={() => setExpanded(true)}\n className=\"text-xs text-zinc-500 hover:text-zinc-400 flex items-center gap-1 mt-2\"\n >\n <Eye size={12} />\n 查看详细参数\n </button>\n )}\n </div>\n ) : (\n <div className=\"text-sm text-zinc-500 italic\">此操作无需额外参数</div>\n )}\n </div>\n\n {/* 展开的详细内容 */}\n {expanded && (\n <div className=\"px-4 pb-3 space-y-3 border-t border-zinc-800/50 pt-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-zinc-500 uppercase tracking-wider\">\n {isEditing ? '编辑参数 (JSON)' : '详细参数'}\n </span>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => isEditing ? setIsEditing(false) : startEditing()}\n className={`flex items-center gap-1 text-xs px-2 py-1 rounded-md transition-colors ${\n isEditing \n ? 'bg-[#d8ff00]/20 text-[#d8ff00]' \n : 'text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800'\n }`}\n >\n {isEditing ? (\n <>\n <Eye size={10} />\n 预览\n </>\n ) : (\n <>\n <Code2 size={10} />\n 编辑 JSON\n </>\n )}\n </button>\n <button\n onClick={() => setExpanded(false)}\n className=\"text-zinc-500 hover:text-zinc-300\"\n >\n <ChevronUp size={14} />\n </button>\n </div>\n </div>\n \n {isEditing ? (\n <textarea\n value={editedArguments}\n onChange={(e) => setEditedArguments(e.target.value)}\n rows={8}\n className=\"w-full bg-zinc-800/80 border border-zinc-700 rounded-lg p-3 text-xs text-zinc-300 font-mono focus:outline-none focus:border-amber-500/50 focus:ring-1 focus:ring-amber-500/20 resize-none\"\n spellCheck={false}\n />\n ) : (\n <div className=\"bg-zinc-800/50 rounded-lg p-3\">\n <ParameterDisplay\n parameters={toolCall.arguments || {}}\n showJsonToggle={true}\n defaultExpanded={true}\n />\n </div>\n )}\n </div>\n )}\n\n {/* 错误提示 */}\n {error && (\n <div className=\"mx-4 mb-3 flex items-center gap-2 text-sm text-red-400 bg-red-500/10 border border-red-500/20 rounded-lg px-3 py-2\">\n <AlertCircle size={14} />\n {error}\n </div>\n )}\n\n {/* 操作按钮 */}\n <div className=\"flex items-center justify-between gap-3 px-4 py-3 bg-zinc-800/30 border-t border-zinc-800/50\">\n <div className=\"text-xs text-zinc-500\">\n 执行此工具前需要您的确认\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={handleReject}\n disabled={loading !== null}\n className=\"flex items-center gap-1.5 px-4 py-2 rounded-lg border border-zinc-700 text-zinc-400 hover:text-zinc-200 hover:border-zinc-600 hover:bg-zinc-800 text-sm transition-all disabled:opacity-50\"\n >\n {loading === 'reject' ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : (\n <X size={14} />\n )}\n 拒绝\n </button>\n <button\n onClick={handleConfirm}\n disabled={loading !== null}\n className=\"flex items-center gap-1.5 px-5 py-2 rounded-lg bg-[#d8ff00] hover:bg-[#e5ff4d] text-black text-sm font-semibold transition-all disabled:opacity-50 shadow-lg shadow-[#d8ff00]/25 hover:shadow-[#d8ff00]/40\"\n >\n {loading === 'confirm' ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : (\n <Check size={14} />\n )}\n 确认执行\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React, { memo, useState, useMemo, useCallback } from 'react';\nimport { \n FileCode, \n FileJson, \n FileText, \n X, \n Maximize2, \n Copy, \n CheckCheck,\n ExternalLink,\n Code2,\n Eye\n} from 'lucide-react';\nimport { MarkdownContent } from './MessageMarkdown';\nimport type { AgentConfig } from '../../types/components';\n\n// ============================================================================\n// 内容类型检测\n// ============================================================================\n\nexport type ContentType = 'html' | 'markdown' | 'json' | 'code' | 'text';\n\nexport interface ParsedContent {\n type: ContentType;\n content: string;\n language?: string; // 用于代码高亮\n title?: string; // 提取的标题\n}\n\n/**\n * 智能检测内容类型\n */\nexport function detectContentType(value: string): ParsedContent {\n if (!value || typeof value !== 'string') {\n return { type: 'text', content: String(value || '') };\n }\n\n const trimmed = value.trim();\n\n // 检查是否是 markdown 代码块包裹的内容\n const codeBlockMatch = trimmed.match(/^```(\\w+)?\\n([\\s\\S]*?)\\n```$/);\n if (codeBlockMatch) {\n const language = codeBlockMatch[1]?.toLowerCase() || '';\n const innerContent = codeBlockMatch[2];\n\n if (language === 'html' || language === 'htm') {\n return { \n type: 'html', \n content: innerContent,\n title: extractHtmlTitle(innerContent)\n };\n }\n if (language === 'json') {\n return { type: 'json', content: innerContent };\n }\n if (language === 'markdown' || language === 'md') {\n return { type: 'markdown', content: innerContent };\n }\n // 其他代码语言\n if (language) {\n return { type: 'code', content: innerContent, language };\n }\n }\n\n // 检查是否是 HTML(以 <!DOCTYPE 或 <html 开头,或包含常见 HTML 标签)\n if (\n trimmed.startsWith('<!DOCTYPE') ||\n trimmed.startsWith('<html') ||\n /^<(div|section|article|main|header|footer|nav|aside|body|head)\\b/i.test(trimmed)\n ) {\n return { \n type: 'html', \n content: trimmed,\n title: extractHtmlTitle(trimmed)\n };\n }\n\n // 检查是否是 JSON\n if ((trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))) {\n try {\n JSON.parse(trimmed);\n return { type: 'json', content: trimmed };\n } catch {\n // 不是有效 JSON,继续检测\n }\n }\n\n // 检查是否是 Markdown(包含常见 Markdown 语法)\n const markdownPatterns = [\n /^#{1,6}\\s+/m, // 标题\n /^\\*{3,}$/m, // 分隔线\n /^-{3,}$/m, // 分隔线\n /^\\s*[-*+]\\s+/m, // 无序列表\n /^\\s*\\d+\\.\\s+/m, // 有序列表\n /\\[.+?\\]\\(.+?\\)/, // 链接\n /!\\[.*?\\]\\(.+?\\)/, // 图片\n /`{1,3}[^`]+`{1,3}/, // 代码\n /\\*\\*[^*]+\\*\\*/, // 粗体\n /\\*[^*]+\\*/, // 斜体\n /^>\\s+/m, // 引用\n ];\n\n const hasMarkdownSyntax = markdownPatterns.some(pattern => pattern.test(trimmed));\n if (hasMarkdownSyntax) {\n return { type: 'markdown', content: trimmed };\n }\n\n // 默认作为纯文本\n return { type: 'text', content: trimmed };\n}\n\n/**\n * 从 HTML 中提取标题\n */\nfunction extractHtmlTitle(html: string): string | undefined {\n const titleMatch = html.match(/<title[^>]*>([^<]+)<\\/title>/i);\n if (titleMatch) {\n return titleMatch[1].trim();\n }\n // 尝试从 h1 提取\n const h1Match = html.match(/<h1[^>]*>([^<]+)<\\/h1>/i);\n if (h1Match) {\n return h1Match[1].trim();\n }\n return undefined;\n}\n\n/**\n * 从工具调用结果中提取 customResponse 内容\n */\nexport function extractCustomResponses(result: any): ParsedContent[] {\n const responses: ParsedContent[] = [];\n\n if (!result) return responses;\n\n // 检查 works 数组\n if (result.works && Array.isArray(result.works)) {\n for (const work of result.works) {\n if (work.customResponse?.value) {\n const parsed = detectContentType(work.customResponse.value);\n if (parsed.content) {\n responses.push(parsed);\n }\n }\n }\n }\n\n return responses;\n}\n\n// ============================================================================\n// 内容类型图标和描述\n// ============================================================================\n\nconst contentTypeConfig: Record<ContentType, {\n icon: React.ElementType;\n label: string;\n color: string;\n bgColor: string;\n}> = {\n html: {\n icon: FileCode,\n label: 'HTML',\n color: 'text-orange-400',\n bgColor: 'bg-orange-500/10',\n },\n markdown: {\n icon: FileText,\n label: 'Markdown',\n color: 'text-blue-400',\n bgColor: 'bg-blue-500/10',\n },\n json: {\n icon: FileJson,\n label: 'JSON',\n color: 'text-yellow-400',\n bgColor: 'bg-yellow-500/10',\n },\n code: {\n icon: Code2,\n label: 'Code',\n color: 'text-purple-400',\n bgColor: 'bg-purple-500/10',\n },\n text: {\n icon: FileText,\n label: 'Text',\n color: 'text-zinc-400',\n bgColor: 'bg-zinc-500/10',\n },\n};\n\n// ============================================================================\n// 预览卡片组件\n// ============================================================================\n\ninterface ContentPreviewCardProps {\n parsed: ParsedContent;\n index?: number;\n config?: AgentConfig;\n /** 打开 Artifact 预览的回调(用于 SidePanel 模式) */\n onOpenArtifact?: (artifact: { type: string; title: string; content: string; language?: string }) => void;\n}\n\nexport const ContentPreviewCard = memo(function ContentPreviewCard({\n parsed,\n index = 0,\n config,\n onOpenArtifact,\n}: ContentPreviewCardProps) {\n // 仅在没有 onOpenArtifact 回调时使用内部弹窗状态(向后兼容)\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n\n const typeConfig = contentTypeConfig[parsed.type];\n const Icon = typeConfig.icon;\n\n const handleCopy = useCallback(async (e: React.MouseEvent) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(parsed.content);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // ignore\n }\n }, [parsed.content]);\n\n const handleOpenPreview = useCallback(() => {\n console.log('[ContentPreviewCard] Open preview:', onOpenArtifact);\n if (onOpenArtifact) {\n // 使用 SidePanel 模式\n onOpenArtifact({\n type: parsed.type,\n title: parsed.title || `${contentTypeConfig[parsed.type].label} Content`,\n content: parsed.content,\n language: parsed.language,\n });\n } else {\n // 向后兼容:使用内部弹窗\n setIsModalOpen(true);\n }\n }, [onOpenArtifact, parsed]);\n\n const handleCloseModal = useCallback(() => {\n setIsModalOpen(false);\n }, []);\n\n // 生成预览摘要\n const preview = useMemo(() => {\n const content = parsed.content;\n if (parsed.type === 'html') {\n // 提取一些关键信息\n const title = parsed.title || 'HTML Document';\n const hasStyles = /<style/i.test(content);\n const hasScripts = /<script/i.test(content);\n const hasTailwind = /tailwind/i.test(content);\n \n const features: string[] = [];\n if (hasTailwind) features.push('Tailwind CSS');\n if (hasStyles) features.push('Custom Styles');\n if (hasScripts) features.push('JavaScript');\n \n return {\n title,\n subtitle: features.length > 0 ? features.join(' • ') : 'Static HTML',\n lines: content.split('\\n').length,\n };\n }\n if (parsed.type === 'json') {\n try {\n const obj = JSON.parse(content);\n const keys = Object.keys(obj);\n return {\n title: 'JSON Data',\n subtitle: `${keys.length} ${Array.isArray(obj) ? 'items' : 'keys'}`,\n lines: content.split('\\n').length,\n };\n } catch {\n return { title: 'JSON', subtitle: 'Invalid JSON', lines: 0 };\n }\n }\n if (parsed.type === 'markdown') {\n const lines = content.split('\\n');\n const firstHeading = lines.find(l => l.startsWith('#'));\n return {\n title: firstHeading?.replace(/^#+\\s*/, '') || 'Markdown Document',\n subtitle: `${lines.length} lines`,\n lines: lines.length,\n };\n }\n if (parsed.type === 'code') {\n return {\n title: `${parsed.language?.toUpperCase() || 'Code'} File`,\n subtitle: `${content.split('\\n').length} lines`,\n lines: content.split('\\n').length,\n };\n }\n return {\n title: 'Text Content',\n subtitle: `${content.length} characters`,\n lines: content.split('\\n').length,\n };\n }, [parsed]);\n\n return (\n <>\n {/* 预览卡片 */}\n <div\n className=\"group relative flex items-center gap-3 px-3 py-2.5 rounded-lg border border-zinc-700/50 bg-zinc-800/50 hover:bg-zinc-800/80 hover:border-zinc-600/50 cursor-pointer transition-all\"\n onClick={handleOpenPreview}\n >\n {/* 图标 */}\n <div className={`w-10 h-10 rounded-lg ${typeConfig.bgColor} flex items-center justify-center flex-shrink-0`}>\n <Icon size={20} className={typeConfig.color} />\n </div>\n\n {/* 信息 */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-zinc-200 font-medium truncate\">\n {preview.title}\n </span>\n <span className={`text-[10px] px-1.5 py-0.5 rounded ${typeConfig.bgColor} ${typeConfig.color}`}>\n {typeConfig.label}\n </span>\n </div>\n <div className=\"text-xs text-zinc-500 mt-0.5\">\n {preview.subtitle} • {preview.lines} lines\n </div>\n </div>\n\n {/* 操作按钮 */}\n <div className=\"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n onClick={handleCopy}\n className=\"p-1.5 rounded-md hover:bg-zinc-700/50 transition-colors\"\n title=\"复制代码\"\n >\n {copied ? (\n <CheckCheck size={14} className=\"text-green-400\" />\n ) : (\n <Copy size={14} className=\"text-zinc-400\" />\n )}\n </button>\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleOpenPreview();\n }}\n className=\"p-1.5 rounded-md hover:bg-zinc-700/50 transition-colors\"\n title=\"预览\"\n >\n <Eye size={14} className=\"text-zinc-400\" />\n </button>\n </div>\n </div>\n\n {/* 向后兼容:仅在没有 onOpenArtifact 时使用内部弹窗 */}\n {!onOpenArtifact && isModalOpen && (\n <ContentPreviewModal\n parsed={parsed}\n onClose={handleCloseModal}\n config={config}\n />\n )}\n </>\n );\n});\n\n// ============================================================================\n// 预览弹窗组件\n// ============================================================================\n\ninterface ContentPreviewModalProps {\n parsed: ParsedContent;\n onClose: () => void;\n config?: AgentConfig;\n}\n\nconst ContentPreviewModal = memo(function ContentPreviewModal({\n parsed,\n onClose,\n config,\n}: ContentPreviewModalProps) {\n const [viewMode, setViewMode] = useState<'preview' | 'source'>('preview');\n const [copied, setCopied] = useState(false);\n\n const typeConfig = contentTypeConfig[parsed.type];\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(parsed.content);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // ignore\n }\n }, [parsed.content]);\n\n // 阻止背景滚动\n React.useEffect(() => {\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = '';\n };\n }, []);\n\n // ESC 关闭\n React.useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [onClose]);\n\n const canPreview = parsed.type === 'html' || parsed.type === 'markdown';\n\n return (\n <div \n className=\"fixed inset-0 z-[9999] flex items-center justify-center p-4 bg-black/80 backdrop-blur-sm h-[calc(100vh-3.5rem)] overflow-y-auto\"\n onClick={onClose}\n >\n <div \n className=\"relative w-full max-w-5xl h-full bg-zinc-900 rounded-xl border border-zinc-700/50 shadow-2xl flex flex-col overflow-hidden\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* 头部 */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-zinc-700/50 bg-zinc-800/50\">\n <div className=\"flex items-center gap-3\">\n <div className={`w-8 h-8 rounded-lg ${typeConfig.bgColor} flex items-center justify-center`}>\n <typeConfig.icon size={16} className={typeConfig.color} />\n </div>\n <div>\n <div className=\"text-sm font-medium text-zinc-200\">\n {parsed.title || `${typeConfig.label} Content`}\n </div>\n <div className=\"text-xs text-zinc-500\">\n {parsed.content.split('\\n').length} lines • {parsed.content.length} characters\n </div>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* 视图切换 */}\n {canPreview && (\n <div className=\"flex items-center bg-zinc-800 rounded-lg p-0.5 border border-zinc-700/50\">\n <button\n onClick={() => setViewMode('preview')}\n className={`px-3 py-1.5 text-xs rounded-md transition-colors ${\n viewMode === 'preview'\n ? 'bg-zinc-700 text-zinc-200'\n : 'text-zinc-400 hover:text-zinc-300'\n }`}\n >\n <Eye size={12} className=\"inline mr-1\" />\n Preview\n </button>\n <button\n onClick={() => setViewMode('source')}\n className={`px-3 py-1.5 text-xs rounded-md transition-colors ${\n viewMode === 'source'\n ? 'bg-zinc-700 text-zinc-200'\n : 'text-zinc-400 hover:text-zinc-300'\n }`}\n >\n <Code2 size={12} className=\"inline mr-1\" />\n Source\n </button>\n </div>\n )}\n\n {/* 复制按钮 */}\n <button\n onClick={handleCopy}\n className=\"p-2 rounded-lg hover:bg-zinc-700/50 transition-colors\"\n title=\"复制代码\"\n >\n {copied ? (\n <CheckCheck size={16} className=\"text-green-400\" />\n ) : (\n <Copy size={16} className=\"text-zinc-400\" />\n )}\n </button>\n\n {/* 关闭按钮 */}\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-zinc-700/50 transition-colors\"\n title=\"关闭\"\n >\n <X size={16} className=\"text-zinc-400\" />\n </button>\n </div>\n </div>\n\n {/* 内容区域 */}\n <div className=\"flex-1 overflow-hidden\">\n {viewMode === 'preview' && canPreview ? (\n <ContentPreviewRenderer parsed={parsed} config={config} />\n ) : (\n <SourceCodeViewer content={parsed.content} language={parsed.language || parsed.type} />\n )}\n </div>\n </div>\n </div>\n );\n});\n\n// ============================================================================\n// 内容预览渲染器\n// ============================================================================\n\ninterface ContentPreviewRendererProps {\n parsed: ParsedContent;\n config?: AgentConfig;\n}\n\nconst ContentPreviewRenderer = memo(function ContentPreviewRenderer({\n parsed,\n config,\n}: ContentPreviewRendererProps) {\n if (parsed.type === 'html') {\n return <HtmlPreview content={parsed.content} />;\n }\n\n if (parsed.type === 'markdown') {\n return (\n <div className=\"h-full overflow-auto p-6 bg-zinc-900\">\n <div className=\"prose prose-invert prose-sm max-w-none\">\n <MarkdownContent content={parsed.content} config={config} />\n </div>\n </div>\n );\n }\n\n // 其他类型显示源码\n return <SourceCodeViewer content={parsed.content} language={parsed.language || parsed.type} />;\n});\n\n// ============================================================================\n// HTML 预览组件(使用 iframe 沙箱)\n// ============================================================================\n\nconst HtmlPreview = memo(function HtmlPreview({ content }: { content: string }) {\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const [scale, setScale] = useState(0.5);\n\n // 创建 blob URL\n const blobUrl = useMemo(() => {\n const blob = new Blob([content], { type: 'text/html' });\n return URL.createObjectURL(blob);\n }, [content]);\n\n // 清理 blob URL\n React.useEffect(() => {\n return () => {\n URL.revokeObjectURL(blobUrl);\n };\n }, [blobUrl]);\n\n return (\n <div className=\"h-full flex flex-col bg-zinc-950\">\n {/* 工具栏 */}\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-zinc-800 bg-zinc-900/50\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-zinc-500\">Scale:</span>\n <div className=\"flex items-center gap-1\">\n {[0.25, 0.5, 0.75, 1].map((s) => (\n <button\n key={s}\n onClick={() => setScale(s)}\n className={`px-2 py-1 text-xs rounded ${\n scale === s\n ? 'bg-zinc-700 text-zinc-200'\n : 'text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800'\n }`}\n >\n {s * 100}%\n </button>\n ))}\n </div>\n </div>\n <a\n href={blobUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-xs text-zinc-400 hover:text-zinc-200 transition-colors\"\n >\n <ExternalLink size={12} />\n Open in new tab\n </a>\n </div>\n\n {/* iframe 容器 */}\n <div className=\"flex-1 overflow-auto p-4 flex items-start justify-center\">\n <div \n className=\"bg-white rounded-lg shadow-2xl overflow-hidden\"\n style={{\n transform: `scale(${scale})`,\n transformOrigin: 'top center',\n }}\n >\n <iframe\n ref={iframeRef}\n src={blobUrl}\n className=\"border-0\"\n style={{\n width: '1080px',\n height: '1920px',\n }}\n sandbox=\"allow-scripts allow-same-origin\"\n title=\"HTML Preview\"\n />\n </div>\n </div>\n </div>\n );\n});\n\n// ============================================================================\n// 源码查看器\n// ============================================================================\n\nconst SourceCodeViewer = memo(function SourceCodeViewer({\n content,\n language,\n}: {\n content: string;\n language: string;\n}) {\n const lines = content.split('\\n');\n\n return (\n <div className=\"h-full overflow-auto bg-zinc-950\">\n <pre className=\"p-4 text-xs font-mono leading-relaxed\">\n <code>\n {lines.map((line, i) => (\n <div key={i} className=\"flex\">\n <span className=\"w-12 text-right pr-4 text-zinc-600 select-none flex-shrink-0\">\n {i + 1}\n </span>\n <span className=\"text-zinc-300 whitespace-pre-wrap break-all\">\n {line || ' '}\n </span>\n </div>\n ))}\n </code>\n </pre>\n </div>\n );\n});\n\n// ============================================================================\n// 导出:CustomResponse 渲染器\n// ============================================================================\n\ninterface CustomResponseRendererProps {\n result: any;\n config?: AgentConfig;\n /** 打开 Artifact 预览的回调(用于 SidePanel 模式) */\n onOpenArtifact?: (artifact: { type: string; title: string; content: string; language?: string }) => void;\n}\n\nexport const CustomResponseRenderer = memo(function CustomResponseRenderer({\n result,\n config,\n onOpenArtifact,\n}: CustomResponseRendererProps) {\n const parsedContents = useMemo(() => extractCustomResponses(result), [result]);\n\n if (parsedContents.length === 0) {\n return null;\n }\n\n return (\n <div className=\"space-y-2\">\n {parsedContents.map((parsed, index) => (\n <ContentPreviewCard\n key={index}\n parsed={parsed}\n index={index}\n config={config}\n onOpenArtifact={onOpenArtifact}\n />\n ))}\n </div>\n );\n});\n\nexport default CustomResponseRenderer;\n","'use client';\n\nimport React, { memo, useEffect, useMemo, useState } from 'react';\nimport { Check, ChevronDown, ChevronUp, Download, Loader2, Zap, Image, Video, FileJson, Copy, CheckCheck, ChevronRight } from 'lucide-react';\nimport type { ToolCall } from '../../types/agent';\nimport type { AgentConfig, Asset, AssetRenderInfo } from '../../types/components';\nimport { createAssetFromSource, inferAssetTypeFromUrl, resolveAssetForDisplay } from '../../utils/asset';\nimport { useComponent } from '../../context/ComponentContext';\nimport ToolConfirmCard from '../ToolConfirmCard';\nimport { ImagePreviewInternal } from './MessageMedia';\nimport { ToolCallData, getToolCallStatus, isVideoUrl } from './utils';\nimport { ContentPreviewCard, CustomResponseRenderer, extractCustomResponses } from './CustomResponseRenderer';\nimport { useAgentStore } from '@/stores/agentStore';\n\n// ============================================================================\n// JSON 渲染组件\n// ============================================================================\n\ninterface JsonValueProps {\n value: any;\n depth?: number;\n isLast?: boolean;\n}\n\nconst JsonValue = memo(function JsonValue({ value, depth = 0, isLast = true }: JsonValueProps) {\n const [collapsed, setCollapsed] = useState(depth > 1);\n const indent = depth * 16;\n\n if (value === null) {\n return <span className=\"text-zinc-500\">null</span>;\n }\n\n if (value === undefined) {\n return <span className=\"text-zinc-500\">undefined</span>;\n }\n\n if (typeof value === 'boolean') {\n return <span className=\"text-amber-400\">{value ? 'true' : 'false'}</span>;\n }\n\n if (typeof value === 'number') {\n return <span className=\"text-purple-400\">{value}</span>;\n }\n\n if (typeof value === 'string') {\n // 检查是否是 URL\n if (/^https?:\\/\\//.test(value)) {\n // 检查是否是图片\n if (/\\.(jpg|jpeg|png|gif|webp|svg|bmp)(\\?|#|$)/i.test(value)) {\n return (\n <span className=\"text-green-400\">\n \"<a href={value} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">{value.length > 60 ? value.slice(0, 60) + '...' : value}</a>\"\n </span>\n );\n }\n // 检查是否是视频\n if (/\\.(mp4|webm|mov|avi|mkv)(\\?|#|$)/i.test(value)) {\n return (\n <span className=\"text-blue-400\">\n \"<a href={value} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">{value.length > 60 ? value.slice(0, 60) + '...' : value}</a>\"\n </span>\n );\n }\n return (\n <span className=\"text-cyan-400\">\n \"<a href={value} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">{value.length > 80 ? value.slice(0, 80) + '...' : value}</a>\"\n </span>\n );\n }\n // 普通字符串,截断过长的\n const displayValue = value.length > 100 ? value.slice(0, 100) + '...' : value;\n return <span className=\"text-green-400\">\"{displayValue}\"</span>;\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return <span className=\"text-zinc-400\">[]</span>;\n }\n\n if (collapsed) {\n return (\n <span \n className=\"cursor-pointer hover:bg-zinc-700/50 rounded px-1\"\n onClick={() => setCollapsed(false)}\n >\n <span className=\"text-zinc-400\">[</span>\n <span className=\"text-zinc-500 text-xs mx-1\">...{value.length} items</span>\n <span className=\"text-zinc-400\">]</span>\n </span>\n );\n }\n\n return (\n <span>\n <span \n className=\"text-zinc-400 cursor-pointer hover:bg-zinc-700/50 rounded px-0.5\"\n onClick={() => setCollapsed(true)}\n >\n [\n </span>\n <div style={{ marginLeft: indent + 16 }}>\n {value.map((item, i) => (\n <div key={i} className=\"leading-relaxed\">\n <JsonValue value={item} depth={depth + 1} isLast={i === value.length - 1} />\n {i < value.length - 1 && <span className=\"text-zinc-500\">,</span>}\n </div>\n ))}\n </div>\n <span className=\"text-zinc-400\" style={{ marginLeft: indent }}>]</span>\n </span>\n );\n }\n\n if (typeof value === 'object') {\n const keys = Object.keys(value);\n if (keys.length === 0) {\n return <span className=\"text-zinc-400\">{'{}'}</span>;\n }\n\n if (collapsed) {\n return (\n <span \n className=\"cursor-pointer hover:bg-zinc-700/50 rounded px-1\"\n onClick={() => setCollapsed(false)}\n >\n <span className=\"text-zinc-400\">{'{'}</span>\n <span className=\"text-zinc-500 text-xs mx-1\">...{keys.length} keys</span>\n <span className=\"text-zinc-400\">{'}'}</span>\n </span>\n );\n }\n\n return (\n <span>\n <span \n className=\"text-zinc-400 cursor-pointer hover:bg-zinc-700/50 rounded px-0.5\"\n onClick={() => setCollapsed(true)}\n >\n {'{'}\n </span>\n <div style={{ marginLeft: indent + 16 }}>\n {keys.map((key, i) => (\n <div key={key} className=\"leading-relaxed\">\n <span className=\"text-sky-400\">\"{key}\"</span>\n <span className=\"text-zinc-500\">: </span>\n <JsonValue value={value[key]} depth={depth + 1} isLast={i === keys.length - 1} />\n {i < keys.length - 1 && <span className=\"text-zinc-500\">,</span>}\n </div>\n ))}\n </div>\n <span className=\"text-zinc-400\" style={{ marginLeft: indent }}>{'}'}</span>\n </span>\n );\n }\n\n return <span className=\"text-zinc-400\">{String(value)}</span>;\n});\n\n// 优雅的 JSON 渲染器\nconst ElegantJsonRenderer = memo(function ElegantJsonRenderer({ \n data, \n title,\n defaultExpanded = false \n}: { \n data: any; \n title?: string;\n defaultExpanded?: boolean;\n}) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(JSON.stringify(data, null, 2));\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // ignore\n }\n };\n\n if (data === null || data === undefined) {\n return null;\n }\n\n const isSimple = typeof data !== 'object' || (Array.isArray(data) && data.length === 0) || Object.keys(data).length === 0;\n\n if (isSimple) {\n return (\n <div className=\"text-xs font-mono bg-zinc-900/50 rounded-lg p-2 overflow-x-auto\">\n <JsonValue value={data} />\n </div>\n );\n }\n\n return (\n <div className=\"rounded-lg border border-zinc-700/50 overflow-hidden\">\n <div \n className=\"flex items-center justify-between px-3 py-2 bg-zinc-800/50 cursor-pointer hover:bg-zinc-800/80 transition-colors\"\n onClick={() => setExpanded(!expanded)}\n >\n <div className=\"flex items-center gap-2\">\n <FileJson size={14} className=\"text-zinc-500\" />\n <span className=\"text-xs text-zinc-400\">{title || '查看详情'}</span>\n <span className=\"text-[10px] text-zinc-600\">\n {Array.isArray(data) ? `${data.length} items` : `${Object.keys(data).length} keys`}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={handleCopy}\n className=\"p-1 hover:bg-zinc-700/50 rounded transition-colors\"\n title=\"复制 JSON\"\n >\n {copied ? (\n <CheckCheck size={12} className=\"text-green-400\" />\n ) : (\n <Copy size={12} className=\"text-zinc-500\" />\n )}\n </button>\n {expanded ? (\n <ChevronUp size={14} className=\"text-zinc-500\" />\n ) : (\n <ChevronDown size={14} className=\"text-zinc-500\" />\n )}\n </div>\n </div>\n {expanded && (\n <div className=\"p-3 bg-zinc-900/30 text-xs font-mono overflow-x-auto max-h-80 overflow-y-auto\">\n <JsonValue value={data} depth={0} />\n </div>\n )}\n </div>\n );\n});\n\n// ============================================================================\n// 统一的工具结果渲染器\n// ============================================================================\n\ninterface ToolResultRendererProps {\n result: any;\n mediaUrls: AssetRenderInfo[];\n config?: AgentConfig;\n defaultExpanded?: boolean;\n /** 打开 Artifact 预览的回调(用于 SidePanel 模式) */\n onOpenArtifact?: (artifact: { type: string; title: string; content: string; language?: string }) => void;\n}\n\nconst ToolResultRenderer = memo(function ToolResultRenderer({\n result,\n mediaUrls,\n config,\n onOpenArtifact,\n}: ToolResultRendererProps) {\n const [imgLoaded, setImgLoaded] = useState<Record<number, boolean>>({});\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n const extracted = extractCustomResponses(result);\n const customResult = extracted?.map?.((data, index) => {\n return <ContentPreviewCard\n key={`${result.id}-${index}`}\n parsed={data}\n index={index}\n config={config}\n onOpenArtifact={onOpenArtifact}\n />\n });\n\n const ImagePreviewComp = useComponent('ImagePreview') || ImagePreviewInternal;\n\n const imageUrls = mediaUrls.filter(m => !m.isVideo);\n const videoUrls = mediaUrls.filter(m => m.isVideo);\n const hasMedia = imageUrls.length > 0 || videoUrls.length > 0;\n\n // 检查是否有 customResponse 内容\n const customResponses = useMemo(() => extractCustomResponses(result), [result]);\n const hasCustomResponses = customResponses.length > 0;\n\n // 过滤掉已经在媒体中展示的 URL,避免重复\n const filteredResult = useMemo(() => {\n if (!result || typeof result !== 'object') return result;\n \n const mediaUrlSet = new Set(mediaUrls.map(m => m.url));\n mediaUrls.forEach(m => {\n if (m.hdUrl) mediaUrlSet.add(m.hdUrl);\n });\n\n const filterUrls = (obj: any): any => {\n if (Array.isArray(obj)) {\n return obj.map(filterUrls);\n }\n if (obj && typeof obj === 'object') {\n const filtered: any = {};\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'string' && mediaUrlSet.has(value)) {\n continue; // 跳过已展示的媒体 URL\n }\n if (key === 'images' || key === 'videos') {\n continue; // 跳过媒体相关字段(保留 works 字段)\n }\n filtered[key] = filterUrls(value);\n }\n return filtered;\n }\n return obj;\n };\n\n return filterUrls(result);\n }, [result, mediaUrls]);\n\n const hasFilteredResult = filteredResult && typeof filteredResult === 'object' && Object.keys(filteredResult).length > 0;\n\n const handleImgLoad = (index: number) => {\n setImgLoaded(prev => ({ ...prev, [index]: true }));\n };\n\n if (!hasMedia && !hasFilteredResult && !hasCustomResponses) {\n return null;\n }\n\n return (\n <>\n {previewUrl && (\n <ImagePreviewComp\n src={previewUrl}\n onClose={() => setPreviewUrl(null)}\n />\n )}\n\n <div className=\"space-y-2\">\n {/* 媒体预览区域 - 默认收起 */}\n {hasMedia && (\n <div className=\"p-2\">\n {/* 视频 */}\n {videoUrls.length > 0 && (\n <div className=\"space-y-2 mb-2\">\n {videoUrls.map((video, i) => (\n <div key={`video-${i}`} className=\"relative rounded-lg overflow-hidden bg-black\">\n <video\n src={video.url}\n controls\n className=\"w-full max-h-60 object-contain\"\n preload=\"metadata\"\n >\n 您的浏览器不支持视频播放\n </video>\n </div>\n ))}\n </div>\n )}\n\n {/* 图片网格 */}\n {imageUrls.length > 0 && (\n <div>\n {imageUrls.map((img, i) => (\n <div key={`img-${i}`} className={`relative group/img overflow-hidden ${imageUrls.length > 1 ? 'aspect-square bg-black' : ''}`}>\n {!imgLoaded[i] && (\n <div className={`bg-zinc-800 animate-pulse flex items-center justify-center`}>\n <Loader2 className=\"w-5 h-5 text-zinc-600 animate-spin\" />\n </div>\n )}\n <img\n src={img.url}\n alt=\"Generated\"\n onLoad={() => handleImgLoad(i)}\n className={`cursor-zoom-in ${imgLoaded[i] ? '' : 'hidden'}`}\n onClick={() => setPreviewUrl(img.hdUrl)}\n style={{ height: 80 }}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n {hasCustomResponses && customResult}\n </div>\n </>\n );\n});\n\nconst downloadViaFetch = async (url: string, filename: string, config?: AgentConfig, asset?: Asset) => {\n const strategy = config?.asset;\n if (strategy?.download && asset) {\n await strategy.download(asset, url);\n return;\n }\n try {\n const response = await fetch(url);\n const blob = await response.blob();\n const blobUrl = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = blobUrl;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(blobUrl);\n } catch {\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n};\n\nconst collectMediaAssetsFromResult = (result: any): Asset[] => {\n const assets: Asset[] = [];\n if (!result) return assets;\n\n if (result?.works && Array.isArray(result.works) && result.works.length > 0) {\n result.works.forEach((w: any) => {\n const asset = createAssetFromSource({ fileId: w.fileId, fileUrl: w.fileUrl, type: 'image' });\n if (asset) assets.push(asset);\n });\n return assets;\n }\n\n if (result?.outputs?.images) {\n const imgValue = result.outputs.images;\n if (typeof imgValue === 'string') {\n const asset = createAssetFromSource({ fileUrl: imgValue, type: 'image' });\n if (asset) assets.push(asset);\n } else if (Array.isArray(imgValue)) {\n imgValue.forEach((url: string) => {\n const asset = createAssetFromSource({ fileUrl: url, type: 'image' });\n if (asset) assets.push(asset);\n });\n }\n }\n\n if (result?.outputs?.videos || result?.outputs?.video) {\n const vidValue = result.outputs?.videos || result.outputs?.video;\n if (typeof vidValue === 'string') {\n const asset = createAssetFromSource({ fileUrl: vidValue, type: 'video' });\n if (asset) assets.push(asset);\n } else if (Array.isArray(vidValue)) {\n vidValue.forEach((url: string) => {\n const asset = createAssetFromSource({ fileUrl: url, type: 'video' });\n if (asset) assets.push(asset);\n });\n }\n }\n\n if (typeof result === 'string') {\n const asset = createAssetFromSource({ fileUrl: result, type: inferAssetTypeFromUrl(result) });\n if (asset) assets.push(asset);\n }\n\n return assets;\n};\n\n// 内部系统工具列表 - 这些工具使用简洁的展示方式\nconst INTERNAL_SYSTEM_TOOLS = ['load_skill', 'switch_skill', 'unload_skill'];\n\n// 技能加载卡片 - 简洁优雅的展示方式\nconst SkillLoadCard = memo(function SkillLoadCard({ toolCall }: { toolCall: ToolCallData }) {\n const status = getToolCallStatus(toolCall);\n const isPending = status === 'pending' || status === 'confirmed';\n const isSuccess = status === 'success';\n \n const skillName = toolCall.arguments?.skill_name || '技能';\n \n // 根据工具名称确定动作描述\n const actionText = toolCall.name === 'load_skill' ? '启用' :\n toolCall.name === 'unload_skill' ? '停用' :\n toolCall.name === 'switch_skill' ? '切换' : '加载';\n \n return (\n <div className=\"inline-flex items-center gap-2 px-3 py-1.5 bg-gradient-to-r from-violet-500/10 to-purple-500/10 border border-violet-500/20 rounded-full text-sm\">\n {isPending ? (\n <Loader2 size={14} className=\"text-violet-400 animate-spin\" />\n ) : isSuccess ? (\n <Zap size={14} className=\"text-violet-400\" />\n ) : (\n <Zap size={14} className=\"text-red-400\" />\n )}\n <span className=\"text-zinc-300\">\n {isPending ? `正在${actionText}` : isSuccess ? `已${actionText}` : `${actionText}失败`}\n </span>\n <span className=\"font-medium text-violet-300\">{skillName}</span>\n {isSuccess && <span className=\"text-zinc-500\">技能</span>}\n </div>\n );\n});\n\nexport const ToolCallCard = memo(function ToolCallCard({ \n toolCall, \n config,\n onOpenArtifact,\n}: { \n toolCall: ToolCallData; \n config?: AgentConfig;\n onOpenArtifact?: (artifact: { type: string; title: string; content: string; language?: string }) => void;\n}) {\n const [headerExpanded, setHeaderExpanded] = useState(false);\n const [mediaUrls, setMediaUrls] = useState<AssetRenderInfo[]>([]);\n\n const status = getToolCallStatus(toolCall);\n const isPending = status === 'pending' || status === 'confirmed';\n const isSuccess = status === 'success';\n const isFailed = status === 'failed' || status === 'rejected';\n const { tools, showItemTime } = useAgentStore();\n const toolName = tools?.find((t) => t.name === toolCall.name)?.displayName;\n\n // 内部系统工具使用简洁展示\n if (INTERNAL_SYSTEM_TOOLS.includes(toolCall.name)) {\n return <SkillLoadCard toolCall={toolCall} />;\n }\n\n useEffect(() => {\n if (status === 'waiting_confirmation') {\n setMediaUrls([]);\n return;\n }\n let active = true;\n\n const loadMedia = async () => {\n const assets = collectMediaAssetsFromResult(toolCall.result);\n if (assets.length === 0) {\n if (active) setMediaUrls([]);\n return;\n }\n\n const resolved = await Promise.all(\n assets.map(asset => resolveAssetForDisplay(asset, config))\n );\n\n if (!active) return;\n const normalized = resolved\n .filter(Boolean)\n .map((media) => ({\n url: (media as AssetRenderInfo).url,\n hdUrl: (media as AssetRenderInfo).hdUrl || (media as AssetRenderInfo).url,\n isVideo: (media as AssetRenderInfo).isVideo ?? isVideoUrl((media as AssetRenderInfo).url)\n }));\n\n const unique = normalized.filter((item, index, arr) => {\n const key = `${item.url}|${item.hdUrl}|${item.isVideo ? 'v' : 'i'}`;\n return arr.findIndex((other) => `${other.url}|${other.hdUrl}|${other.isVideo ? 'v' : 'i'}` === key) === index;\n });\n\n setMediaUrls(unique);\n };\n\n loadMedia();\n return () => { active = false; };\n }, [toolCall.result, config, status]);\n\n if (status === 'waiting_confirmation') {\n const toolCallForCard: ToolCall = {\n id: toolCall.id,\n name: toolCall.name,\n displayName: toolCall.displayName || toolCall.name,\n arguments: toolCall.arguments,\n status: 'waiting_confirmation',\n };\n return <ToolConfirmCard toolCall={toolCallForCard} />;\n }\n\n const toolDisplayName = toolName || toolCall.name.replace('comfy_', 'Workflow ');\n const errorMessage = toolCall.error;\n return (\n <div className=\"agent-toolcall-card\">\n <ToolResultRenderer\n result={toolCall.result}\n mediaUrls={mediaUrls}\n config={config}\n defaultExpanded={false}\n onOpenArtifact={onOpenArtifact}\n />\n\n {/* 头部信息 */}\n <div className=\"px-3 py-2\">\n <div\n className=\"flex items-center justify-between cursor-pointer\"\n onClick={() => setHeaderExpanded(!headerExpanded)}\n >\n <div className=\"flex items-center gap-2\">\n <div className={`w-5 h-5 rounded flex items-center justify-center ${\n isPending ? 'bg-amber-500/20' : isSuccess ? 'bg-green-500/20' : 'bg-red-500/20'\n }`}>\n {isPending ? (\n <Loader2 size={12} className=\"text-amber-400 animate-spin\" />\n ) : isSuccess ? (\n <Check size={12} className=\"text-green-400\" />\n ) : (\n <Zap size={12} className=\"text-red-400\" />\n )}\n </div>\n <span className=\"agent-toolcall-title text-xs text-zinc-400\">{toolDisplayName}</span>\n <span className={`text-[10px] px-1.5 py-0.5 rounded ${\n isPending ? 'bg-amber-500/10 text-amber-400' :\n isSuccess ? 'bg-green-500/10 text-green-400' :\n 'bg-red-500/10 text-red-400'\n }`}>\n {isPending ? '执行中' : isSuccess ? '已完成' : '失败'}\n </span>\n {headerExpanded ? (\n <ChevronDown size={14} className=\"text-zinc-500\" />\n ) : (\n <ChevronRight size={14} className=\"text-zinc-500\" />\n )}\n </div>\n </div>\n\n {/* 展开后显示参数 */}\n {headerExpanded && (\n <div className=\"mt-3 space-y-3\">\n {/* 错误信息 */}\n {isFailed && errorMessage && (\n <div className=\"mt-2 px-2 py-1.5 bg-red-500/10 border border-red-500/20 rounded text-xs text-red-400\">\n {errorMessage}\n </div>\n )}\n {/* 执行结果 - 统一渲染 */}\n {/* 输入参数 */}\n {toolCall.arguments && Object.keys(toolCall.arguments).length > 0 && (\n <ElegantJsonRenderer data={toolCall.arguments} title=\"输入参数\" defaultExpanded={false} />\n )}\n \n {toolCall.result && (\n <ElegantJsonRenderer data={toolCall.result} title=\"执行结果\" defaultExpanded={false} />\n )}\n\n </div>\n )}\n\n {/* 时间戳 */}\n {(toolCall as any).gmtCreate && showItemTime && (\n <div className=\"text-xs text-zinc-500 mt-2\">\n {new Date((toolCall as any).gmtCreate).toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit', second: '2-digit' })}\n </div>\n )}\n </div>\n </div>\n );\n});\n\n/**\n * 获取工具调用状态的终态优先级\n * 用于去重时选择最终状态,completed/failed/rejected 是终态,优先级最高\n */\nfunction getFinalStatusPriority(status: string | undefined): number {\n const statusLower = (status ?? '').toLowerCase();\n switch (statusLower) {\n case 'completed': return 100; // 已完成,最高优先级\n case 'failed': return 90; // 失败,次高\n case 'rejected': return 80; // 被拒绝\n case 'waiting_confirmation': return 70; // 等待确认\n case 'executing': return 60; // 执行中\n case 'confirmed': return 50; // 已确认\n case 'pending': return 40; // 等待中,最低\n default: return 0;\n }\n}\n\nexport const ToolCallResults = memo(function ToolCallResults({ \n toolCalls, \n config,\n onOpenArtifact,\n}: { \n toolCalls: ToolCallData[]; \n config?: AgentConfig;\n onOpenArtifact?: (artifact: { type: string; title: string; content: string; language?: string }) => void;\n}) {\n const calls = useMemo(() => {\n if (!toolCalls || toolCalls.length === 0) return [];\n const uniqueCalls = toolCalls.reduce((acc, tc) => {\n const existing = acc.get(tc.id);\n if (existing) {\n const existingPriority = getFinalStatusPriority(existing.status);\n const currentPriority = getFinalStatusPriority(tc.status);\n // 只有当新状态优先级更高时才更新(completed > pending)\n acc.set(tc.id, currentPriority > existingPriority ? tc : existing);\n } else {\n acc.set(tc.id, tc);\n }\n return acc;\n }, new Map<string, ToolCallData>());\n return Array.from(uniqueCalls.values());\n }, [toolCalls]);\n\n if (calls.length === 0) return null;\n\n return (\n <div className=\"mt-3 space-y-2 min-w-0 w-full\">\n {calls.map((tc) => (\n <ToolCallCard key={tc.id} toolCall={tc} config={config} onOpenArtifact={onOpenArtifact} />\n ))}\n </div>\n );\n});\n\nexport const StreamingToolCard = memo(function StreamingToolCard({ toolCall }: { toolCall: ToolCallData }) {\n const status = getToolCallStatus(toolCall);\n\n if (status === 'waiting_confirmation') {\n const toolCallForCard: ToolCall = {\n id: toolCall.id,\n name: toolCall.name,\n displayName: toolCall.displayName || toolCall.name,\n arguments: toolCall.arguments,\n status: 'waiting_confirmation',\n };\n return <ToolConfirmCard toolCall={toolCallForCard} compact />;\n }\n\n const isPending = status === 'pending';\n const isSuccess = status === 'success';\n const isFailed = status === 'failed' || status === 'rejected';\n\n const toolName = toolCall.name?.replace('comfy_', '') || 'Tool';\n const errorMessage = toolCall.result?.error || toolCall.error;\n\n return (\n <div className=\"flex flex-col gap-1 px-3 py-2 bg-zinc-900/60 rounded-lg border border-zinc-700/40\">\n <div className=\"flex items-center gap-2\">\n <div className={`w-5 h-5 rounded flex items-center justify-center ${\n isPending ? 'bg-amber-500/20' : isSuccess ? 'bg-green-500/20' : 'bg-red-500/20'\n }`}>\n {isPending ? (\n <Loader2 size={12} className=\"text-amber-400 animate-spin\" />\n ) : isSuccess ? (\n <Check size={12} className=\"text-green-400\" />\n ) : (\n <Zap size={12} className=\"text-red-400\" />\n )}\n </div>\n <span className=\"text-xs text-zinc-300 truncate flex-1\">{toolName}</span>\n <span className={`text-[10px] px-1.5 py-0.5 rounded ${\n isPending ? 'bg-amber-500/10 text-amber-400' :\n isSuccess ? 'bg-green-500/10 text-green-400' :\n 'bg-red-500/10 text-red-400'\n }`}>\n {isPending ? '执行中' : isSuccess ? '完成' : '失败'}\n </span>\n </div>\n {isFailed && errorMessage && (\n <div className=\"text-[11px] text-red-400 pl-7 truncate\" title={errorMessage}>\n {errorMessage}\n </div>\n )}\n {/* 时间戳 */}\n {(toolCall as any).gmtCreate && (\n <div className=\"text-xs text-zinc-500 mt-1\">\n {new Date((toolCall as any).gmtCreate).toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit', second: '2-digit' })}\n </div>\n )}\n </div>\n );\n});\n","'use client';\n\nimport React, { memo, useEffect, useMemo, useState } from 'react';\nimport { ChevronDown } from 'lucide-react';\nimport type { AgentComponentInstance } from '../../types/agent';\nimport { componentService } from '../../services/agent';\nimport { useComponents } from '../../context/ComponentContext';\nimport { useAgentStore } from '@/stores/agentStore';\n\nexport const ComponentPendingCard = memo(function ComponentPendingCard({\n component,\n onResolved,\n}: {\n component: AgentComponentInstance;\n onResolved?: (component: AgentComponentInstance) => void;\n}) {\n const { showItemTime } = useAgentStore();\n const [loading, setLoading] = useState<'confirm' | 'cancel' | null>(null);\n const [error, setError] = useState<string>('');\n const [collapsed, setCollapsed] = useState(false);\n const [jsonValue, setJsonValue] = useState(() => {\n const initialPayload = component.props || component.content || {};\n return typeof initialPayload === 'string'\n ? initialPayload\n : JSON.stringify(initialPayload, null, 2);\n });\n\n const statusUpper = (component.status || '').toUpperCase();\n const isReadonly = ['SUBMITTED', 'CANCELLED', 'CONFIRMED', 'COMPLETED', 'DONE', 'REJECTED'].includes(statusUpper);\n const components = useComponents();\n const registry = components.ComponentRegistry || {};\n const normalizeName = (value?: string) => (value || '').toLowerCase().replace(/[^a-z0-9]/g, '');\n const registryMap = useMemo(() => {\n const map = new Map<string, React.ComponentType<any>>();\n Object.entries(registry).forEach(([key, Comp]) => {\n map.set(key, Comp);\n map.set(normalizeName(key), Comp);\n });\n return map;\n }, [registry]);\n const CustomComponent = (() => {\n const keys = [component.componentName, component.type];\n for (const key of keys) {\n if (!key) continue;\n const direct = registryMap.get(key);\n if (direct) return direct;\n const normalized = registryMap.get(normalizeName(key));\n if (normalized) return normalized;\n }\n return undefined;\n })();\n\n const resolvedProps = useMemo(() => {\n const raw = component.props ?? component.content ?? {};\n if (typeof raw === 'string') {\n try {\n return JSON.parse(raw);\n } catch {\n return { content: raw };\n }\n }\n if (raw && typeof raw === 'object') {\n if ((raw as any).content && typeof (raw as any).content === 'string') {\n return { ...(raw as any), content: (raw as any).content };\n }\n return raw;\n }\n return {};\n }, [component]);\n\n console.log('Resolved Props:', resolvedProps);\n console.log('Component gmtCreate:', component.gmtCreate, typeof component.gmtCreate);\n\n // 本地状态:标记是否已确认/取消,用于禁用按钮但保持卡片显示\n const [localConfirmed, setLocalConfirmed] = useState(false);\n const [localCancelled, setLocalCancelled] = useState(false);\n const isActionDisabled = isReadonly || localConfirmed || localCancelled;\n\n const handleConfirm = async () => {\n if (isActionDisabled) return;\n setLoading('confirm');\n setError('');\n try {\n const parsed = typeof jsonValue === 'string' && jsonValue.trim().startsWith('{')\n ? JSON.parse(jsonValue || '{}')\n : { content: jsonValue };\n const res = await componentService.submit({\n componentId: component.id,\n confirmed: true,\n data: parsed,\n });\n if (!res.success) {\n setError((res as any).errorMessage || (res as any).msg || '提交失败');\n } else {\n // 标记为已确认,禁用按钮但保持卡片显示\n setLocalConfirmed(true);\n setCollapsed(true);\n onResolved?.(component);\n }\n } catch (e: any) {\n setError(e?.message || 'JSON 解析失败');\n } finally {\n setLoading(null);\n }\n };\n\n const handleCancel = async () => {\n if (isActionDisabled) return;\n setLoading('cancel');\n setError('');\n try {\n const res = await componentService.submit({\n componentId: component.id,\n confirmed: false,\n cancelReason: '用户取消',\n });\n if (!res.success) {\n setError((res as any).errorMessage || (res as any).msg || '取消失败');\n } else {\n // 标记为已取消,禁用按钮但保持卡片显示\n setLocalCancelled(true);\n setCollapsed(true);\n onResolved?.(component);\n }\n } finally {\n setLoading(null);\n }\n };\n\n useEffect(() => {\n const initialPayload = component.props || component.content || {};\n setJsonValue(typeof initialPayload === 'string'\n ? initialPayload\n : JSON.stringify(initialPayload, null, 2));\n if (statusUpper === 'SUBMITTED' || statusUpper === 'CONFIRMED' || statusUpper === 'COMPLETED' || statusUpper === 'DONE') {\n setLocalConfirmed(true);\n setCollapsed(true);\n }\n if (statusUpper === 'CANCELLED' || statusUpper === 'REJECTED') {\n setLocalCancelled(true);\n setCollapsed(true);\n }\n }, [component]);\n\n return (\n <div className=\"mt-3 w-full rounded-xl border border-zinc-700/50 bg-zinc-900/60 p-3 space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm text-zinc-200 font-medium\">\n {component.componentName || component.type}\n </div>\n <button\n type=\"button\"\n onClick={() => setCollapsed(!collapsed)}\n className=\"text-zinc-400 hover:text-zinc-200 transition-colors\"\n >\n <ChevronDown size={14} className={collapsed ? '' : 'rotate-180'} />\n </button>\n </div>\n {!collapsed && (\n CustomComponent ? (\n <div className=\"rounded-lg border border-zinc-700/40 bg-zinc-950/40 p-3\">\n <CustomComponent {...resolvedProps} confirmed={isReadonly} />\n </div>\n ) : (\n <textarea\n className=\"w-full min-h-[120px] rounded-lg bg-zinc-950/60 border border-zinc-700/40 text-xs text-zinc-200 p-2 font-mono\"\n value={jsonValue}\n onChange={(e) => setJsonValue(e.target.value)}\n readOnly={isReadonly}\n />\n )\n )}\n {error && <div className=\"text-xs text-red-400\">{error}</div>}\n <div className=\"flex gap-2\">\n <button\n onClick={handleConfirm}\n disabled={loading !== null || isActionDisabled}\n className=\"px-3 py-1.5 text-xs rounded-lg bg-[#d8ff00]/20 text-[#d8ff00] border border-[#d8ff00]/40 hover:bg-[#d8ff00]/30 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {loading === 'confirm' ? '提交中...' : (localConfirmed || isReadonly ? '已确认' : '确认')}\n </button>\n <button\n onClick={handleCancel}\n disabled={loading !== null || isActionDisabled}\n className=\"px-3 py-1.5 text-xs rounded-lg bg-zinc-800/70 text-zinc-300 border border-zinc-700/40 hover:bg-zinc-700/60 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {loading === 'cancel' ? '取消中...' : (localCancelled ? '已取消' : (isReadonly ? '已完成' : '取消'))}\n </button>\n </div>\n {/* 时间戳 */}\n {component.gmtCreate && showItemTime && (\n <div className=\"text-xs text-zinc-500 mt-2\">\n {(() => {\n const ts = component.gmtCreate;\n // 支持数字时间戳和字符串格式\n const date = typeof ts === 'number' ? new Date(ts) : new Date(ts);\n return isNaN(date.getTime()) ? '' : date.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit', second: '2-digit' });\n })()}\n </div>\n )}\n </div>\n );\n});\n","'use client';\n\nimport React, { memo, useState } from 'react';\nimport { Lightbulb, ChevronDown, ChevronUp } from 'lucide-react';\nimport { MarkdownContent } from './MessageMarkdown';\nimport { parseThinkingContent, sanitizeMarkdownContent, stripComponentTags, removeJsonImageUrls } from './utils';\nimport type { AgentConfig } from '../../types/components';\nimport { useAgentStore } from '@/stores/agentStore';\n\ninterface ThoughtTimelineCardProps {\n thought: any;\n config?: AgentConfig;\n /** 是否显示加载中的光标效果 */\n isLoading?: boolean;\n}\n\nexport const ThoughtTimelineCard = memo(function ThoughtTimelineCard({ thought, config, isLoading = false }: ThoughtTimelineCardProps) {\n const [expanded, setExpanded] = useState(true);\n const { showItemTime } = useAgentStore();\n \n // 检查是否是不应该展示的类型\n const thoughtType = thought?.type || '';\n const excludedTypes = [\n 'tool_confirmed',\n 'tool_rejected', \n 'waiting_confirmation',\n 'action',\n 'observation',\n 'final',\n 'component_pending',\n 'component_submitted',\n 'component_cancelled',\n 'component_timeout',\n ];\n \n if (excludedTypes.includes(thoughtType)) {\n return null;\n }\n \n const raw = (thought?.content || '').toString();\n \n // 检查内容是否是工具确认/组件确认相关的内容\n if (raw.includes('\"type\":\"tool_confirmed\"') || \n raw.includes('\"type\":\"tool_rejected\"') ||\n raw.includes('\"type\":\"waiting_confirmation\"') ||\n raw.includes('\"type\":\"component_pending\"') ||\n raw.includes('\"type\":\"component_submitted\"') ||\n raw.includes('\"type\":\"component_cancelled\"') ||\n raw.includes('\"status\":\"CONFIRMED\"') ||\n raw.includes('\"status\":\"REJECTED\"') ||\n raw.includes('\"status\":\"SUBMITTED\"') ||\n raw.includes('\"status\":\"CANCELLED\"') ||\n raw.includes('用户确认执行工具调用') ||\n raw.includes('用户拒绝执行工具调用') ||\n raw.includes('\"toolCalls\":[') ||\n raw.includes('\"components\":[')) {\n return null;\n }\n \n // 检查 thought.raw 中是否包含确认相关的事件\n if (thought?.raw && Array.isArray(thought.raw)) {\n const hasConfirmationEvent = thought.raw.some((r: any) => {\n const type = r?.type || '';\n return excludedTypes.includes(type) ||\n (r?.content && (\n r.content.includes('\"type\":\"tool_confirmed\"') ||\n r.content.includes('\"type\":\"component_submitted\"') ||\n r.content.includes('用户确认执行工具调用')\n ));\n });\n if (hasConfirmationEvent) {\n return null;\n }\n }\n \n // 先过滤掉组件标签,再解析和清理\n const withoutTags = stripComponentTags(raw, ['InformationSupplement', 'BriefReview', 'DesignPreview', 'ImagePreview', 'VideoPreview', 'FilePreview', 'CodePreview', 'ComponentPreview']);\n // 移除 JSON 格式数据中的图片 URL,但保留正常的 markdown 图片\n const withoutJsonImages = removeJsonImageUrls(withoutTags);\n const cleaned = sanitizeMarkdownContent(parseThinkingContent(withoutJsonImages));\n \n if (!cleaned || !cleaned.trim()) return null;\n\n return (\n <div >\n <div className=\"px-3 py-2\">\n <div className=\"\">\n <div className=\"text-sm leading-relaxed prose prose-invert prose-sm max-w-none [&_*]:break-words\">\n <MarkdownContent content={cleaned} skipImages={false} config={config} variant=\"thought\" />\n {/* 加载中的光标效果 */}\n {isLoading && (\n <span className=\"inline-block w-2 h-4 ml-0.5 bg-[#d8ff00] animate-pulse rounded-sm\" />\n )}\n </div>\n </div>\n\n {/* 时间戳 - 使用最后一条 raw 的时间,确保与 timeline 排序一致 */}\n {thought?.raw?.length > 0 && showItemTime && (\n <div className=\"text-xs text-zinc-500 mt-2\">\n {new Date(\n thought.raw[thought.raw.length - 1]?.gmt_create || \n thought.raw[thought.raw.length - 1]?.gmtCreate || \n thought.raw[thought.raw.length - 1]?.timestamp || \n ''\n ).toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit', second: '2-digit' })}\n </div>\n )}\n </div>\n </div>\n );\n});","import { useMemo } from 'react';\nimport type { AgentMessage } from '../../../types/agent';\nimport { parseThinkingContent, sanitizeMarkdownContent, isVideoUrl, stripComponentTags } from '../utils';\n\n// 需要从流式内容中过滤的组件标签\nconst COMPONENT_TAGS_TO_STRIP = [\n 'InformationSupplement',\n 'BriefReview',\n 'DesignPreview',\n 'ImagePreview',\n 'VideoPreview',\n 'FilePreview',\n 'CodePreview',\n 'ComponentPreview',\n];\n\ninterface UseMessageContentParams {\n message: AgentMessage;\n isStreaming: boolean;\n streamingContent?: string;\n isUser: boolean;\n hasToolCallImages: boolean;\n}\n\nexport function useMessageContent({\n message,\n isStreaming,\n streamingContent,\n isUser,\n hasToolCallImages,\n}: UseMessageContentParams) {\n const displayContent = useMemo(() => {\n const isInvalidContent = (content: any): boolean => {\n if (!content) return true;\n if (typeof content !== 'string') return false;\n const trimmed = content.trim().toLowerCase();\n return trimmed === '' || trimmed === 'null' || trimmed === 'undefined';\n };\n\n const hasPlan = (message as any).extraData?.plan;\n if (hasPlan) {\n return '';\n }\n\n if (isStreaming && streamingContent) {\n // 流式内容中过滤掉组件标签,避免显示难看的 tsx 组件代码\n const withoutTags = stripComponentTags(streamingContent, COMPONENT_TAGS_TO_STRIP);\n const parsed = parseThinkingContent(withoutTags);\n return isInvalidContent(parsed) ? '' : parsed;\n }\n\n let content = message.content;\n if (isInvalidContent(content)) {\n return '';\n }\n\n if (content) {\n if (typeof content === 'string') {\n content = stripComponentTags(content, COMPONENT_TAGS_TO_STRIP);\n }\n const trimmed = String(content).trim();\n const jsonBlockMatch = trimmed.match(/^```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```$/m);\n if (jsonBlockMatch) {\n try {\n const parsed = JSON.parse(jsonBlockMatch[1]);\n if (parsed.title && parsed.steps) {\n return `已生成执行计划:${parsed.title}`;\n }\n } catch {\n // ignore\n }\n }\n\n if (trimmed.startsWith('{')) {\n try {\n const parsed = JSON.parse(trimmed);\n if (parsed.plan || parsed.status === 'DRAFT' || parsed.steps) {\n const plan = (message as any).extraData?.plan || parsed.plan || parsed;\n return plan.title\n ? `已生成执行计划:${plan.title}`\n : '已生成执行计划,请查看下方详情';\n }\n if (parsed.content && !isInvalidContent(parsed.content)) return parsed.content;\n if (parsed.message && !isInvalidContent(parsed.message)) return parsed.message;\n if (parsed.text && !isInvalidContent(parsed.text)) return parsed.text;\n return trimmed;\n } catch {\n return trimmed;\n }\n }\n }\n\n return typeof content === 'string' ? content : String(content ?? '');\n }, [isStreaming, streamingContent, message]);\n\n const markdownMedia = useMemo(() => {\n if (!isUser || !displayContent) {\n return { media: [] as Array<{ url: string; type: 'image' | 'video' }>, content: displayContent };\n }\n const media: Array<{ url: string; type: 'image' | 'video' }> = [];\n const mediaRegex = /!\\[[^\\]]*\\]\\(([^)]+)\\)/g;\n let match: RegExpExecArray | null = null;\n while ((match = mediaRegex.exec(displayContent)) !== null) {\n const url = match[1];\n if (!url) continue;\n media.push({ url, type: isVideoUrl(url) ? 'video' : 'image' });\n }\n const cleaned = displayContent\n .replace(mediaRegex, '')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n return { media, content: cleaned };\n }, [displayContent, isUser]);\n\n const effectiveDisplayContent = useMemo(() => {\n const baseContent = isUser ? (markdownMedia.content || '') : (displayContent || '');\n if (!baseContent) return '';\n if (isUser) return baseContent;\n if (!hasToolCallImages) return baseContent;\n\n const content = baseContent.trim();\n const withoutImages = content\n .replace(/!\\[[^\\]]*\\]\\([^)]+\\)/g, '')\n .replace(/<img[^>]+>/gi, '')\n .trim();\n\n if (!withoutImages || withoutImages === '.' || withoutImages === '...' || withoutImages === '。') {\n return '';\n }\n\n return baseContent;\n }, [displayContent, hasToolCallImages, isUser, markdownMedia.content]);\n\n const sanitizedDisplayContent = useMemo(\n () => sanitizeMarkdownContent(effectiveDisplayContent),\n [effectiveDisplayContent]\n );\n\n const hasValidContent = !!effectiveDisplayContent;\n\n return {\n displayContent,\n markdownMedia,\n effectiveDisplayContent,\n sanitizedDisplayContent,\n hasValidContent,\n };\n}\n","import { useMemo } from 'react';\nimport type { AgentMessage, AgentThought, ToolCall } from '../../../types/agent';\nimport type { ToolCallData } from '../utils';\n\n/**\n * 获取工具调用状态的终态优先级\n * 用于去重时选择最终状态,completed/failed/rejected 是终态,优先级最高\n */\nfunction getFinalStatusPriority(status: string | undefined): number {\n const statusLower = (status ?? '').toLowerCase();\n switch (statusLower) {\n case 'completed': return 100; // 已完成,最高优先级\n case 'failed': return 90; // 失败,次高\n case 'rejected': return 80; // 被拒绝\n case 'waiting_confirmation': return 70; // 等待确认\n case 'executing': return 60; // 执行中\n case 'confirmed': return 50; // 已确认\n case 'pending': return 40; // 等待中,最低\n default: return 0;\n }\n}\n\ninterface UseToolCallsParams {\n message: AgentMessage;\n isStreaming: boolean;\n thoughts?: AgentThought[];\n pendingToolCalls?: ToolCall[];\n}\n\nexport function useToolCalls({\n message,\n isStreaming,\n thoughts,\n pendingToolCalls = [],\n}: UseToolCallsParams) {\n const toolCalls = useMemo(() => {\n const toolCallMap = new Map<string, ToolCallData>();\n const normalizeId = (value: any) => {\n if (value === undefined || value === null) return '';\n return String(value);\n };\n\n // 同时处理 tool_calls 和 toolCalls 两种格式,合并并去重\n const extraData = (message as any).extraData || {};\n const toolCallsFromSnakeCase: ToolCallData[] = extraData.tool_calls || [];\n const toolCallsFromCamelCase: ToolCallData[] = extraData.toolCalls || [];\n // 合并两种格式的数据\n const rawToolCalls: ToolCallData[] = [...toolCallsFromSnakeCase, ...toolCallsFromCamelCase];\n rawToolCalls.forEach(tc => {\n const id = normalizeId((tc as any).id || (tc as any).toolCallId);\n if (!id) return;\n const existing = toolCallMap.get(id);\n if (existing) {\n // 如果已存在,根据终态优先级决定是否更新(completed > pending)\n const existingPriority = getFinalStatusPriority(existing.status);\n const currentPriority = getFinalStatusPriority(tc.status);\n if (currentPriority > existingPriority) {\n toolCallMap.set(id, { ...existing, ...tc, id });\n } else if (currentPriority === existingPriority) {\n // 优先级相同时,合并数据但保留已有状态\n toolCallMap.set(id, { ...tc, ...existing, id });\n }\n } else {\n toolCallMap.set(id, { ...tc, id });\n }\n });\n\n // 从 thoughts 中提取 toolCalls(无论是否 streaming)\n // 这样刷新页面后也能正确显示 toolCalls\n // 优先使用传入的 thoughts 参数,如果没有则从 message.extraData.thoughts 中获取\n const effectiveThoughts: AgentThought[] = (thoughts && thoughts.length > 0)\n ? thoughts\n : (extraData.thoughts || []);\n \n if (effectiveThoughts && effectiveThoughts.length > 0) {\n effectiveThoughts.forEach(thought => {\n // 获取 thought 的时间戳,用于 toolCall 的时间排序\n const thoughtTs = (thought as any).gmt_create || (thought as any).gmtCreate ||\n (thought as any).timestamp || (thought as any).createdAt || \n (thought as any).updatedAt || Date.now();\n \n // 处理 thought.toolCalls\n if (thought.toolCalls && Array.isArray(thought.toolCalls)) {\n thought.toolCalls.forEach((tc: any) => {\n const id = normalizeId(tc.id || tc.toolCallId);\n if (id) {\n const existing = toolCallMap.get(id);\n // 保留时间戳信息,用于 timeline 排序\n const tcTs = tc.gmtCreate || tc.timestamp || tc.createdAt || tc.updatedAt || thoughtTs;\n const newData: ToolCallData & { gmtCreate?: number } = {\n id,\n name: tc.name || tc.toolName || existing?.name || 'unknown',\n arguments: tc.arguments || tc.input || existing?.arguments || {},\n status: tc.status || existing?.status || 'PENDING',\n result: tc.result || tc.output || existing?.result,\n gmtCreate: tcTs,\n };\n \n if (existing) {\n // 只有当新状态优先级更高时才更新(completed > pending)\n const existingPriority = getFinalStatusPriority(existing.status);\n const newPriority = getFinalStatusPriority(newData.status);\n if (newPriority > existingPriority) {\n toolCallMap.set(id, { ...existing, ...newData, id });\n }\n // 优先级相同或更低时,不更新\n } else {\n toolCallMap.set(id, newData);\n }\n }\n });\n }\n \n // 处理 waiting_confirmation 类型的 thought\n // 注意:waiting_confirmation 的 thought.id 不是 toolCall id\n // 需要找到同一个 step 中最近的 toolCall 并更新其状态\n if ((thought as any).type === 'waiting_confirmation') {\n const step = (thought as any).step;\n // 找到同一个 step 中状态为 PENDING 的 toolCall,更新为 WAITING_CONFIRMATION\n toolCallMap.forEach((tc, id) => {\n if (tc.status === 'PENDING') {\n toolCallMap.set(id, {\n ...tc,\n status: 'WAITING_CONFIRMATION',\n });\n }\n });\n }\n \n // 处理 observation 类型的 thought(工具执行结果)\n if ((thought as any).type === 'observation') {\n const observation = (thought as any).observation;\n if (observation) {\n // 尝试解析 observation 中的 toolCall 信息\n try {\n const obsData = typeof observation === 'string' ? JSON.parse(observation) : observation;\n const toolName = obsData?.relation?.toolName;\n // 查找对应的 toolCall 并更新状态\n toolCallMap.forEach((tc, id) => {\n if (tc.name === toolName && tc.status !== 'COMPLETED') {\n toolCallMap.set(id, {\n ...tc,\n status: 'COMPLETED',\n result: obsData,\n });\n }\n });\n } catch {\n // 解析失败,忽略\n }\n }\n }\n });\n }\n\n if (pendingToolCalls && pendingToolCalls.length > 0) {\n pendingToolCalls.forEach((ptc: any) => {\n const id = normalizeId(ptc.id || ptc.toolCallId);\n if (id) {\n const existing = toolCallMap.get(id);\n if (existing) {\n const existingPriority = getFinalStatusPriority(existing.status);\n const ptcPriority = getFinalStatusPriority(ptc.status);\n\n // 只有当新状态优先级更高时才更新\n if (ptcPriority > existingPriority) {\n toolCallMap.set(id, {\n ...existing,\n id,\n status: ptc.status || existing.status,\n displayName: ptc.displayName || existing.displayName,\n });\n }\n } else {\n toolCallMap.set(id, {\n id,\n name: ptc.name || 'unknown',\n displayName: ptc.displayName,\n arguments: ptc.arguments || {},\n status: ptc.status || 'PENDING',\n gmtCreate: ptc.gmtCreate || Date.now(),\n });\n }\n }\n });\n }\n\n return Array.from(toolCallMap.values());\n }, [message, isStreaming, thoughts, pendingToolCalls]);\n\n const dedupedToolCalls = useMemo(() => {\n if (!toolCalls || toolCalls.length === 0) return [] as ToolCallData[];\n const uniqueCalls = toolCalls.reduce((acc, tc) => {\n const id = String(tc.id);\n const existing = acc.get(id);\n if (existing) {\n const existingPriority = getFinalStatusPriority(existing.status);\n const currentPriority = getFinalStatusPriority(tc.status);\n // 只有当新状态优先级更高时才更新\n acc.set(id, currentPriority > existingPriority ? tc : existing);\n } else {\n acc.set(id, tc);\n }\n return acc;\n }, new Map<string, ToolCallData>());\n return Array.from(uniqueCalls.values());\n }, [toolCalls]);\n\n return { toolCalls, dedupedToolCalls };\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport type { AgentComponentInstance, AgentMessage, AgentThought } from '../../../types/agent';\nimport { componentService } from '../../../services/agent';\n\ninterface UseComponentsParams {\n message: AgentMessage;\n pendingComponents: AgentComponentInstance[];\n pendingComponentsSessionId?: string | null;\n thoughts?: AgentThought[];\n isStreaming?: boolean;\n}\n\nexport function useComponents({\n message,\n pendingComponents,\n pendingComponentsSessionId,\n thoughts,\n isStreaming,\n}: UseComponentsParams) {\n const [componentDetailMap, setComponentDetailMap] = useState<Record<string, AgentComponentInstance>>({});\n const componentDetailRequestedRef = useRef<Set<string>>(new Set());\n\n const componentsToRender = useMemo(() => {\n const extraComponents: AgentComponentInstance[] = (message as any).extraData?.components || [];\n \n const backendId = (message as any).metadata?.backendId;\n const messageStatus = (message.status || '').toUpperCase();\n \n // 需要显示组件的状态:streaming、WAITING_COMPONENT、WAITING_TOOL_CONFIRMATION 等\n const shouldShowComponents = isStreaming || \n messageStatus === 'STREAMING' || \n messageStatus === 'WAITING_COMPONENT' || \n messageStatus === 'WAITING_TOOL_CONFIRMATION';\n \n // 从 thoughts 中构建 component id 到时间戳的映射,并提取 components\n const componentTsMap = new Map<string, number>();\n const thoughtComponents: AgentComponentInstance[] = [];\n \n // 优先使用传入的 thoughts 参数,如果没有则从 message.extraData.thoughts 中获取\n const effectiveThoughts: AgentThought[] = (thoughts && thoughts.length > 0) \n ? thoughts \n : ((message as any).extraData?.thoughts || []);\n \n if (effectiveThoughts && effectiveThoughts.length > 0) {\n effectiveThoughts.forEach(thought => {\n const thoughtTs = (thought as any).gmt_create || (thought as any).gmtCreate || \n (thought as any).timestamp || (thought as any).createdAt || \n (thought as any).updatedAt || Date.now();\n \n // 检查 thought 中是否有 components 数据(来自 component_pending 事件)\n const components = (thought as any).components || \n (thought as any).extraData?.components || [];\n \n if (Array.isArray(components) && components.length > 0) {\n components.forEach((c: any) => {\n if (c?.id) {\n componentTsMap.set(c.id, Number(thoughtTs));\n thoughtComponents.push({\n ...c,\n componentName: c.componentName || c.type || 'UnknownComponent',\n props: c.props || c.content || {},\n status: c.status || 'PENDING',\n gmtCreate: c.gmtCreate || c.timestamp || c.createdAt || c.updatedAt || thoughtTs,\n });\n }\n });\n }\n \n // 如果 thought 本身就是 component_pending 类型\n // 注意:component_pending 事件可能有 components 数据,也可能只有 id\n if ((thought as any).type === 'component_pending') {\n const thoughtId = (thought as any).id;\n const pendingComps = (thought as any).extraData?.components || \n (thought as any).components || [];\n \n if (Array.isArray(pendingComps) && pendingComps.length > 0) {\n pendingComps.forEach((c: any) => {\n if (c?.id) {\n componentTsMap.set(c.id, Number(thoughtTs));\n // 避免重复添加\n if (!thoughtComponents.some(tc => tc.id === c.id)) {\n thoughtComponents.push({\n ...c,\n componentName: c.componentName || c.type || 'UnknownComponent',\n props: c.props || c.content || {},\n status: c.status || 'PENDING',\n gmtCreate: c.gmtCreate || c.timestamp || c.createdAt || c.updatedAt || thoughtTs,\n });\n }\n }\n });\n } else if (thoughtId && !thoughtComponents.some(tc => tc.id === thoughtId)) {\n // component_pending 事件只有 thought.id 没有 components 数据\n // 这种情况下,thought.id 就是 component id,需要通过 API 获取详情\n // 先创建一个占位组件,后续通过 useEffect 获取详情\n componentTsMap.set(thoughtId, Number(thoughtTs));\n thoughtComponents.push({\n id: thoughtId,\n componentName: 'UnknownComponent',\n props: {},\n status: 'PENDING',\n gmtCreate: thoughtTs,\n } as AgentComponentInstance);\n }\n }\n \n // 处理 component_submitted 类型,更新组件状态\n // 注意:component_submitted 事件的 id 是 thought id,不是 component id\n // 需要找到之前最近的 component_pending 事件中的组件,并更新其状态\n if ((thought as any).type === 'component_submitted') {\n // 尝试从 extraData.components 中获取组件 ID\n const submittedComps = (thought as any).extraData?.components || \n (thought as any).components || [];\n \n if (Array.isArray(submittedComps) && submittedComps.length > 0) {\n // 如果 component_submitted 事件包含组件数据,直接使用\n submittedComps.forEach((c: any) => {\n if (c?.id) {\n const existingIndex = thoughtComponents.findIndex(tc => tc.id === c.id);\n if (existingIndex >= 0) {\n thoughtComponents[existingIndex] = {\n ...thoughtComponents[existingIndex],\n status: 'SUBMITTED',\n };\n }\n }\n });\n } else {\n // 如果没有组件数据,将所有 PENDING 状态的组件更新为 SUBMITTED\n // 因为 component_submitted 表示用户已确认组件\n thoughtComponents.forEach((tc, index) => {\n if (tc.status === 'PENDING') {\n thoughtComponents[index] = {\n ...tc,\n status: 'SUBMITTED',\n };\n }\n });\n }\n }\n });\n }\n \n // 如果 extraData 中有 components,优先使用,但补充时间戳\n if (extraComponents.length > 0) {\n return extraComponents.map(c => ({\n ...c,\n gmtCreate: c.gmtCreate || componentTsMap.get(c.id) || Date.now(),\n }));\n }\n \n // 如果 thoughts 中有 components,使用 thoughts 中的数据\n if (thoughtComponents.length > 0) {\n // 合并 pendingComponents 和 thoughtComponents,按 id 去重\n const componentMap = new Map<string, AgentComponentInstance>();\n thoughtComponents.forEach(c => componentMap.set(c.id, c));\n pendingComponents.forEach(c => {\n if (!componentMap.has(c.id)) {\n const ts = componentTsMap.get(c.id);\n componentMap.set(c.id, {\n ...c,\n gmtCreate: c.gmtCreate || ts || Date.now(),\n });\n }\n });\n return Array.from(componentMap.values());\n }\n \n // 检查 sessionId 是否匹配\n if (pendingComponentsSessionId !== message.sessionId) return [];\n \n // 使用 pendingComponents,补充时间戳\n const enrichedPendingComponents = pendingComponents.map(c => {\n if (c.gmtCreate) return c;\n const ts = componentTsMap.get(c.id);\n return ts ? { ...c, gmtCreate: ts } : { ...c, gmtCreate: Date.now() };\n });\n \n // 根据消息状态决定是否显示\n if (!backendId) {\n return shouldShowComponents ? enrichedPendingComponents : [];\n }\n return enrichedPendingComponents.filter(c => c.messageId === backendId);\n }, [message, pendingComponents, pendingComponentsSessionId, thoughts, isStreaming]);\n\n useEffect(() => {\n if (!componentsToRender || componentsToRender.length === 0) return;\n\n componentsToRender.forEach((component) => {\n if (!component?.id) return;\n if (componentDetailRequestedRef.current.has(component.id)) return;\n\n const hasProps = component.props && Object.keys(component.props).length > 0;\n const hasContent = component.content && Object.keys(component.content).length > 0;\n if (hasProps || hasContent) return;\n\n componentDetailRequestedRef.current.add(component.id);\n componentService.getDetail(component.id)\n .then((res) => {\n if (res.success && res.data) {\n const data = res.data as AgentComponentInstance;\n const resolvedProps = data.props || {};\n setComponentDetailMap((prev) => ({\n ...prev,\n [component.id]: {\n ...data,\n componentName: data.componentName || data.type || component.componentName,\n props: resolvedProps,\n },\n }));\n }\n })\n .catch(() => {\n componentDetailRequestedRef.current.delete(component.id);\n });\n });\n }, [componentsToRender]);\n\n const effectiveComponents = useMemo(() => {\n if (!componentsToRender || componentsToRender.length === 0) return [] as AgentComponentInstance[];\n return componentsToRender.map((component) => {\n const detail = componentDetailMap[component.id];\n if (detail) {\n // 合并详情数据,但保留原有的 gmtCreate(如果详情中没有)\n return {\n ...component,\n ...detail,\n gmtCreate: detail.gmtCreate || component.gmtCreate,\n };\n }\n return component;\n });\n }, [componentsToRender, componentDetailMap]);\n\n return { effectiveComponents };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport type { AgentMessage, AgentThought, ExecutionPlan } from '../../../types/agent';\nimport { planService } from '../../../services/agent';\nimport { tryParseJson } from '../utils';\n\ninterface UsePlanStateParams {\n message: AgentMessage;\n thoughts?: AgentThought[];\n}\n\nexport function usePlanState({ message, thoughts }: UsePlanStateParams) {\n const planFromThoughts = useMemo(() => {\n const extraPlan = (message as any).extraData?.plan;\n if (extraPlan && extraPlan.steps && Array.isArray(extraPlan.steps) && extraPlan.steps.length > 0) {\n return null;\n }\n\n const historyThoughts: any[] = (message as any).extraData?.thoughts || [];\n const allThoughts = thoughts && thoughts.length > 0 ? thoughts : historyThoughts;\n\n if (allThoughts.length === 0) return null;\n\n const hasPlanEvents = allThoughts.some((t: any) =>\n t.type === 'plan_generating' ||\n t.type === 'plan_generating_delta' ||\n t.type === 'plan_ready' ||\n t.type === 'plan_confirmed' ||\n t.type?.startsWith('step_')\n );\n\n if (!hasPlanEvents) return null;\n\n const deltaEvents = allThoughts\n .filter((t: any) => t.type === 'plan_generating_delta')\n .sort((a: any, b: any) => (a.gmt_create || 0) - (b.gmt_create || 0));\n\n let planJson = '';\n deltaEvents.forEach((e: any) => {\n if (e.content) planJson += e.content;\n });\n\n let plan: any = null;\n if (planJson) {\n const jsonMatch = planJson.match(/```json\\s*([\\s\\S]*?)\\s*```/) ||\n planJson.match(/```\\s*([\\s\\S]*?)\\s*```/);\n const cleanJson = jsonMatch ? jsonMatch[1] : planJson;\n\n try {\n plan = JSON.parse(cleanJson.trim());\n } catch {\n // ignore\n }\n }\n\n if (!plan) return null;\n\n const stepEvents = allThoughts.filter((t: any) =>\n t.type === 'step_start' || t.type === 'step_progress' || t.type === 'step_complete'\n );\n\n const stepStatusMap = new Map<number, { status: string; result?: any; observation?: any }>();\n\n stepEvents.forEach((e: any) => {\n const match = e.content?.match(/步骤\\s*(\\d+)/i);\n if (match) {\n const stepIndex = parseInt(match[1], 10) - 1;\n\n if (e.type === 'step_start') {\n stepStatusMap.set(stepIndex, { status: 'RUNNING' });\n } else if (e.type === 'step_complete') {\n const prev = stepStatusMap.get(stepIndex) || {};\n stepStatusMap.set(stepIndex, {\n ...prev,\n status: 'COMPLETED',\n observation: e.observation,\n });\n }\n }\n });\n\n if (plan?.steps && Array.isArray(plan?.steps)) {\n plan.steps = plan.steps.map((step: any, idx: number) => {\n const statusInfo = stepStatusMap.get(idx);\n if (statusInfo) {\n return {\n ...step,\n status: statusInfo.status,\n result: statusInfo.observation ? tryParseJson(statusInfo.observation) : step.result,\n };\n }\n return { ...step, status: 'PENDING' };\n });\n }\n\n const hasCompleted = allThoughts.some((t: any) => t.type === 'plan_completed');\n const hasConfirmed = allThoughts.some((t: any) => t.type === 'plan_confirmed');\n const hasReady = allThoughts.some((t: any) => t.type === 'plan_ready');\n\n if (hasCompleted) {\n plan.status = 'COMPLETED';\n } else if (hasConfirmed) {\n plan.status = 'EXECUTING';\n } else if (hasReady) {\n plan.status = 'DRAFT';\n }\n\n const summaryEvent = allThoughts.find((t: any) => t.type === 'plan_summary');\n if (summaryEvent?.content) {\n plan.summary = summaryEvent.content;\n }\n\n return plan;\n }, [message, thoughts]);\n\n const effectivePlan = (message as any).extraData?.plan || planFromThoughts;\n\n const [fullPlan, setFullPlan] = useState<ExecutionPlan | null>(null);\n const [planLoading, setPlanLoading] = useState(false);\n const [loadedPlanId, setLoadedPlanId] = useState<string | null>(null);\n\n useEffect(() => {\n if (!effectivePlan) {\n setFullPlan(null);\n setLoadedPlanId(null);\n return;\n }\n\n const planId = effectivePlan.publicId || (effectivePlan as any).planId;\n\n if (effectivePlan.steps && Array.isArray(effectivePlan.steps) && effectivePlan.steps.length > 0) {\n setFullPlan(effectivePlan);\n setLoadedPlanId(planId);\n return;\n }\n\n if (!planId) {\n setFullPlan(planFromThoughts);\n return;\n }\n\n if (loadedPlanId === planId) {\n return;\n }\n\n setPlanLoading(true);\n setLoadedPlanId(planId);\n\n planService.getDetail(planId)\n .then(res => {\n if (res.success && res.data) {\n const apiPlan = res.data;\n if (apiPlan.steps && Array.isArray(apiPlan.steps) && apiPlan.steps.length > 0) {\n setFullPlan({\n ...effectivePlan,\n ...apiPlan,\n });\n } else {\n setFullPlan(planFromThoughts || effectivePlan);\n }\n } else {\n setFullPlan(planFromThoughts || effectivePlan);\n }\n })\n .catch(() => {\n setFullPlan(planFromThoughts || effectivePlan);\n })\n .finally(() => {\n setPlanLoading(false);\n });\n }, [effectivePlan, loadedPlanId, planFromThoughts]);\n\n return { effectivePlan, fullPlan, planLoading };\n}\n","import { useMemo } from 'react';\nimport type { AgentMessage, AgentThought } from '../../../types/agent';\nimport { parseThinkingContent, sanitizeMarkdownContent, stripComponentTags } from '../utils';\n\n// 需要过滤的组件标签列表\nconst COMPONENT_TAGS_TO_STRIP = [\n 'InformationSupplement',\n 'BriefReview',\n 'DesignPreview',\n 'ImagePreview',\n 'VideoPreview',\n 'FilePreview',\n 'CodePreview',\n 'ComponentPreview',\n];\n\ninterface UseThinkingContentParams {\n message: AgentMessage;\n thoughts?: AgentThought[];\n isStreaming: boolean;\n messageContent?: string; // 用于去重:如果 thought 与消息内容相同则隐藏\n}\n\nexport function useThinkingContent({ message, thoughts, isStreaming, messageContent }: UseThinkingContentParams) {\n return useMemo(() => {\n const historyThoughts: any[] = (message as any).extraData?.thoughts || [];\n const allThoughts = thoughts && thoughts.length > 0 ? thoughts : historyThoughts;\n\n const hasSubAgents = allThoughts.some((t: any) => t.agent_id || t.agentId || t.agent_name || t.agentName);\n\n const groups: Array<{\n agentId: string | null;\n agentName: string | null;\n thoughts: any[];\n thinkingContent: string;\n toolCalls: any[];\n }> = [];\n\n if (hasSubAgents) {\n const agentMap = new Map<string, { agentName: string | null; thoughts: any[] }>();\n const mainAgentKey = '__main__';\n\n allThoughts.forEach((t: any) => {\n const agentId = t.agent_id || t.agentId || null;\n const agentName = t.agent_name || t.agentName || null;\n const key = agentId || mainAgentKey;\n\n if (!agentMap.has(key)) {\n agentMap.set(key, { agentName, thoughts: [] });\n }\n agentMap.get(key)!.thoughts.push(t);\n });\n\n const mainAgent = agentMap.get(mainAgentKey);\n if (mainAgent) {\n const thinkingParts: string[] = [];\n const seenContent = new Set<string>();\n mainAgent.thoughts\n .filter((t: any) => t.type === 'reasoning_start' || t.type === 'reasoning_delta' || t.type === 'reasoning_end' || t.type === 'thinking')\n .forEach((t: any) => {\n const content = (t.content || '').trim();\n if (content && !seenContent.has(content)) {\n seenContent.add(content);\n thinkingParts.push(content);\n }\n });\n\n groups.push({\n agentId: null,\n agentName: null,\n thoughts: mainAgent.thoughts,\n thinkingContent: parseThinkingContent(thinkingParts.join('\\n')),\n toolCalls: mainAgent.thoughts.filter((t: any) => t.type === 'action' && t.tool_calls).flatMap((t: any) => t.tool_calls || []),\n });\n agentMap.delete(mainAgentKey);\n }\n\n agentMap.forEach((value, key) => {\n const thinkingParts: string[] = [];\n const seenContent = new Set<string>();\n value.thoughts\n .filter((t: any) => t.type === 'reasoning_start' || t.type === 'reasoning_delta' || t.type === 'reasoning_end' || t.type === 'thinking')\n .forEach((t: any) => {\n const content = (t.content || '').trim();\n if (content && !seenContent.has(content)) {\n seenContent.add(content);\n thinkingParts.push(content);\n }\n });\n\n groups.push({\n agentId: key,\n agentName: value.agentName,\n thoughts: value.thoughts,\n thinkingContent: parseThinkingContent(thinkingParts.join('\\n')),\n toolCalls: value.thoughts.filter((t: any) => t.type === 'action' && t.tool_calls).flatMap((t: any) => t.tool_calls || []),\n });\n });\n }\n\n let rawThinkingContent = '';\n const thoughtBlocks: Array<{ content: string; ts: number }> = [];\n\n const sortedThoughts = [...allThoughts].sort((a: any, b: any) => {\n return (a.gmt_create || a.timestamp || 0) - (b.gmt_create || b.timestamp || 0);\n });\n\n let deltaBuffer = '';\n let deltaTs: number | null = null;\n\n const flushDelta = () => {\n if (!deltaBuffer) return;\n const withoutTags = stripComponentTags(deltaBuffer, COMPONENT_TAGS_TO_STRIP);\n const cleaned = sanitizeMarkdownContent(parseThinkingContent(withoutTags));\n if (cleaned) {\n const last = thoughtBlocks[thoughtBlocks.length - 1];\n if (!last || last.content !== cleaned) {\n thoughtBlocks.push({ content: cleaned, ts: deltaTs || Date.now() });\n }\n }\n deltaBuffer = '';\n deltaTs = null;\n };\n\n sortedThoughts.forEach((t: any) => {\n const type = t.type;\n const content = t.content || '';\n\n if (type === 'reasoning_delta') {\n if (!deltaTs) {\n deltaTs = t.gmt_create || t.timestamp || Date.now();\n }\n deltaBuffer += content;\n } else if (type === 'thinking' || type === 'reasoning_start') {\n flushDelta();\n const trimmed = content.trim();\n if (trimmed) {\n if (rawThinkingContent && !rawThinkingContent.endsWith('\\n')) {\n rawThinkingContent += '\\n';\n }\n rawThinkingContent += trimmed + '\\n';\n const withoutTags = stripComponentTags(trimmed, COMPONENT_TAGS_TO_STRIP);\n const cleaned = sanitizeMarkdownContent(parseThinkingContent(withoutTags));\n const ts = t.gmt_create || t.timestamp || Date.now();\n if (cleaned) {\n const last = thoughtBlocks[thoughtBlocks.length - 1];\n if (!last || last.content !== cleaned) {\n thoughtBlocks.push({ content: cleaned, ts });\n }\n }\n }\n }\n });\n\n flushDelta();\n\n const parsedContent = sanitizeMarkdownContent(parseThinkingContent(stripComponentTags(rawThinkingContent, COMPONENT_TAGS_TO_STRIP)));\n\n if (thoughtBlocks.length > 1) {\n const combinedRaw = thoughtBlocks.map((b) => b.content).join('\\n');\n // 检查是否包含任何需要过滤的组件标签\n const tagPattern = COMPONENT_TAGS_TO_STRIP.join('|');\n if (new RegExp(`<\\\\s*(${tagPattern})\\\\b`, 'i').test(combinedRaw)) {\n const combinedCleaned = sanitizeMarkdownContent(\n parseThinkingContent(stripComponentTags(combinedRaw, COMPONENT_TAGS_TO_STRIP))\n );\n if (combinedCleaned) {\n const firstTs = thoughtBlocks[0].ts;\n thoughtBlocks.length = 0;\n thoughtBlocks.push({ content: combinedCleaned, ts: firstTs });\n }\n }\n }\n\n // 去重:如果最后一个 thoughtBlock 与消息内容相同,则移除\n const finalContent = messageContent || (message as any).content || '';\n if (finalContent && thoughtBlocks.length > 0) {\n const finalCleaned = sanitizeMarkdownContent(\n parseThinkingContent(stripComponentTags(String(finalContent), COMPONENT_TAGS_TO_STRIP))\n ).trim();\n \n // 标准化函数:去除多余空白、换行,转小写\n const normalize = (value: string) => value.replace(/\\s+/g, ' ').trim().toLowerCase();\n const normalizedFinal = normalize(finalCleaned);\n \n if (normalizedFinal) {\n // 从后往前检查,移除所有与 finalContent 相同或相似的 thoughtBlocks\n while (thoughtBlocks.length > 0) {\n const last = thoughtBlocks[thoughtBlocks.length - 1];\n const normalizedLast = normalize(last.content);\n \n // 检查是否完全相同,或者互相包含(考虑流式时内容可能不完整)\n const isSame = normalizedLast === normalizedFinal;\n const lastIncludesFinal = normalizedLast.includes(normalizedFinal) && normalizedFinal.length > 20;\n const finalIncludesLast = normalizedFinal.includes(normalizedLast) && normalizedLast.length > 20;\n \n if (isSame || lastIncludesFinal || finalIncludesLast) {\n thoughtBlocks.pop();\n } else {\n break;\n }\n }\n }\n }\n\n return {\n thinkingContent: parsedContent,\n thoughtBlocks,\n hasStreamingThoughts: isStreaming && thoughts && thoughts.length > 0,\n hasHistoryThoughts: !isStreaming && historyThoughts.length > 0 && !!parsedContent,\n agentGroups: groups,\n isMultiAgent: hasSubAgents && groups.length > 0,\n };\n }, [message, thoughts, isStreaming, messageContent]);\n}\n","import { useMemo } from 'react';\nimport type { AgentComponentInstance, AgentMessage, AgentThought, ExecutionPlan } from '../../../types/agent';\nimport { parseThinkingContent, sanitizeMarkdownContent, stripComponentTags } from '../utils';\nimport type { ToolCallData } from '../utils';\nimport type { TimelineItem } from '../../MessageTimeline';\n\ninterface UseTimelineItemsParams {\n message: AgentMessage;\n isUser: boolean;\n toolCalls: ToolCallData[];\n components: AgentComponentInstance[];\n plan: ExecutionPlan | null;\n thoughts?: AgentThought[];\n includeThoughts?: boolean;\n includeMessage?: boolean;\n messageContent?: string;\n messageTs?: number;\n /** 思考内容聚合的时间窗口(毫秒),默认 0 表示只聚合连续的 reasoning_delta */\n thoughtMergeWindowMs?: number;\n}\n\nexport function useTimelineItems({\n message,\n isUser,\n toolCalls,\n components,\n plan,\n thoughts,\n includeThoughts = false,\n includeMessage = false,\n messageContent,\n messageTs,\n thoughtMergeWindowMs = 0,\n}: UseTimelineItemsParams) {\n return useMemo(() => {\n if (isUser) return [] as TimelineItem[];\n\n const extra = (message as any).extraData || {};\n const extraToolCalls: any[] = extra.tool_calls || [];\n const extraComponents: any[] = extra.components || [];\n const extraPlan = extra.plan;\n\n const toolCallTsMap = new Map<string, number>();\n extraToolCalls.forEach((tc: any) => {\n const ts = tc?.gmtCreate || tc?.timestamp || tc?.createdAt || tc?.updatedAt;\n if (tc?.id && ts) toolCallTsMap.set(tc.id, Number(ts));\n });\n\n const componentTsMap = new Map<string, number>();\n extraComponents.forEach((c: any) => {\n const ts = c?.gmtCreate || c?.timestamp || c?.createdAt || c?.updatedAt;\n if (c?.id && ts) componentTsMap.set(c.id, Number(ts));\n });\n\n const planTs = extraPlan?.gmtCreate || extraPlan?.timestamp || extraPlan?.createdAt || extraPlan?.updatedAt;\n\n const getFallbackTs = (value: any) => {\n const ts = value?.gmtCreate || value?.timestamp || value?.createdAt || value?.updatedAt || message.gmtCreate || 0;\n return typeof ts === 'number' ? ts : Number(ts) || 0;\n };\n\n // 获取 thoughts 中最大的时间戳,用于没有时间戳的 toolCalls/components\n let maxThoughtTs = 0;\n if (thoughts && thoughts.length > 0) {\n thoughts.forEach((t: any) => {\n const ts = Number(t.gmt_create || t.timestamp || t.createdAt || t.updatedAt || 0);\n if (ts > maxThoughtTs) maxThoughtTs = ts;\n });\n }\n const streamingFallbackTs = maxThoughtTs || Date.now();\n\n // 先收集所有非 thought 事件的时间戳,用于判断 thoughts 之间是否有其他事件穿插\n const otherEventTimestamps: number[] = [];\n\n toolCalls.forEach((tc, index) => {\n let ts = (tc as any)?.gmtCreate || (tc as any)?.timestamp || (tc as any)?.createdAt || (tc as any)?.updatedAt;\n if (!ts) ts = toolCallTsMap.get(tc.id);\n if (!ts) ts = streamingFallbackTs + index + 1;\n otherEventTimestamps.push(ts);\n });\n\n components.forEach((component, index) => {\n let ts = (component as any)?.gmtCreate || (component as any)?.timestamp || (component as any)?.createdAt || (component as any)?.updatedAt;\n if (ts && typeof ts !== 'number') {\n const parsed = new Date(ts).getTime();\n ts = isNaN(parsed) ? 0 : parsed;\n }\n if (!ts) ts = componentTsMap.get(component.id);\n if (!ts) ts = streamingFallbackTs + toolCalls.length + index + 1;\n otherEventTimestamps.push(ts);\n });\n\n if (plan && planTs) {\n otherEventTimestamps.push(Number(planTs));\n }\n\n // 排序其他事件的时间戳\n otherEventTimestamps.sort((a, b) => a - b);\n\n // 检查两个时间戳之间是否有其他事件\n const hasEventBetween = (startTs: number, endTs: number): boolean => {\n return otherEventTimestamps.some(ts => ts > startTs && ts < endTs);\n };\n\n const items: Array<TimelineItem & { ts: number }> = [];\n\n if (includeThoughts) {\n const sourceThoughts: any[] = (thoughts && thoughts.length > 0)\n ? thoughts\n : (extra.thoughts || []);\n\n // 按时间排序\n const sortedThoughts = [...sourceThoughts]\n .filter((t) => t && t.content)\n .sort((a: any, b: any) => {\n const tsA = Number(a.gmt_create || a.timestamp || a.createdAt || a.updatedAt || 0);\n const tsB = Number(b.gmt_create || b.timestamp || b.createdAt || b.updatedAt || 0);\n return tsA - tsB;\n });\n\n const merged: Array<{ id: string; ts: number; content: string; raw: any[] }> = [];\n const mergeAllThoughts = !!plan;\n\n // 用于聚合 reasoning_delta 的 buffer\n let deltaBuffer = '';\n let deltaStartTs: number | null = null; // 第一条 delta 的时间(用于 id 和判断是否有事件穿插)\n let deltaEndTs: number | null = null; // 最后一条 delta 的时间(用于排序)\n let deltaId: string | null = null;\n let deltaRaw: any[] = [];\n\n const flushDelta = () => {\n if (!deltaBuffer) return;\n const withoutTags = stripComponentTags(deltaBuffer, ['InformationSupplement', 'BriefReview']);\n const cleaned = sanitizeMarkdownContent(parseThinkingContent(withoutTags)).trim();\n if (cleaned) {\n merged.push({\n id: deltaId || `delta-${deltaStartTs}`,\n ts: deltaEndTs || deltaStartTs || Date.now(),\n content: cleaned,\n raw: [...deltaRaw],\n });\n }\n deltaBuffer = '';\n deltaStartTs = null;\n deltaEndTs = null;\n deltaId = null;\n deltaRaw = [];\n };\n\n // 不应该作为思考内容展示的类型(这些类型的数据会通过其他 timeline item 展示)\n const excludedTypes = new Set([\n 'final', // 最终答案,会单独展示\n 'action', // 工具调用事件,toolCalls 已单独处理\n 'observation', // 工具执行结果,toolCalls 已单独处理\n 'waiting_confirmation', // 工具确认相关\n 'tool_confirmed',\n 'tool_rejected',\n // Component 相关事件,components 已单独处理\n 'component_pending',\n 'component_submitted',\n 'component_cancelled',\n 'component_timeout',\n // Plan 相关事件,plan 已单独处理\n 'PLAN_GENERATING',\n 'PLAN_GENERATING_DELTA',\n 'PLAN_READY',\n 'PLAN_CONFIRMED',\n 'PLAN_REJECTED',\n 'STEP_START',\n 'STEP_PROGRESS',\n 'STEP_COMPLETE',\n 'STEP_FAILED',\n 'WAITING_HUMAN_INPUT',\n 'HUMAN_INPUT_RECEIVED',\n 'PLAN_SUMMARY',\n 'PLAN_COMPLETED',\n 'cancelled',\n 'error',\n 'timeout',\n ]);\n\n sortedThoughts.forEach((t, index) => {\n const type = t.type || '';\n const content = t.content || '';\n const ts = Number(t.gmt_create || t.timestamp || t.createdAt || t.updatedAt || getFallbackTs(t));\n\n // 过滤不应该作为思考内容展示的类型\n if (excludedTypes.has(type)) return;\n\n if (type === 'reasoning_delta') {\n // 检查是否需要先 flush(如果当前 delta 和之前的 delta 之间有其他事件)\n if (deltaEndTs && hasEventBetween(deltaEndTs, ts)) {\n flushDelta();\n }\n \n // 检查内容中是否包含 \"Final Answer:\" 分隔标记\n // 如果包含,需要在此处分割,Final Answer 之后的内容不应该作为思考内容展示\n const finalAnswerPattern = /Final Answer:\\s*/i;\n const finalAnswerMatch = content.match(finalAnswerPattern);\n \n if (finalAnswerMatch) {\n // 找到 Final Answer 标记,分割内容\n const splitIndex = content.indexOf(finalAnswerMatch[0]);\n const beforeFinalAnswer = content.substring(0, splitIndex);\n \n // 将 Final Answer 之前的内容加入 buffer\n if (beforeFinalAnswer) {\n if (!deltaStartTs) {\n deltaStartTs = ts;\n deltaId = t.id || t.thoughtId || `delta-${ts}-${index}`;\n }\n deltaEndTs = ts;\n deltaBuffer += beforeFinalAnswer;\n deltaRaw.push({ ...t, content: beforeFinalAnswer });\n }\n \n // Flush 当前 buffer,Final Answer 之后的内容不再累积\n flushDelta();\n // 跳过后续处理,Final Answer 之后的内容会作为消息内容展示\n } else {\n // 正常累积 delta 内容\n if (!deltaStartTs) {\n deltaStartTs = ts;\n deltaId = t.id || t.thoughtId || `delta-${ts}-${index}`;\n }\n deltaEndTs = ts;\n deltaBuffer += content;\n deltaRaw.push(t);\n }\n } else if (type === 'reasoning_end') {\n // reasoning_end 触发 flush,但不单独添加(内容已在 delta 中)\n flushDelta();\n } else if (type === 'reasoning_start' || type === 'thinking') {\n // 新的思考块开始,先 flush 之前的 delta\n flushDelta();\n\n const withoutTags = stripComponentTags(String(content), ['InformationSupplement', 'BriefReview']);\n const cleaned = sanitizeMarkdownContent(parseThinkingContent(withoutTags)).trim();\n if (!cleaned) return;\n\n const id = t.id || t.thoughtId || `${ts}-${index}`;\n merged.push({ id: String(id), ts, content: cleaned, raw: [t] });\n } else {\n // 其他类型的 thought,先 flush delta\n flushDelta();\n\n const withoutTags = stripComponentTags(String(content), ['InformationSupplement', 'BriefReview']);\n const cleaned = sanitizeMarkdownContent(parseThinkingContent(withoutTags)).trim();\n if (!cleaned) return;\n\n const id = t.id || t.thoughtId || `${ts}-${index}`;\n merged.push({ id: String(id), ts, content: cleaned, raw: [t] });\n }\n });\n\n // 处理最后可能残留的 delta buffer\n flushDelta();\n\n // 无论是否有 plan,都尝试合并相邻的 thoughts\n // Plan 模式和非 Plan 模式使用相同的聚合逻辑,保持一致的展示\n if (merged.length > 1) {\n // 合并相邻的 thoughts(不跨越其他事件)\n const windowMerged: Array<{ id: string; ts: number; content: string; raw: any[] }> = [];\n \n for (const m of merged) {\n const last = windowMerged[windowMerged.length - 1];\n if (last) {\n // 检查两个 thought 之间是否有其他事件穿插\n if (!hasEventBetween(last.ts, m.ts)) {\n // 没有其他事件穿插,合并内容\n if (!last.content.includes(m.content)) {\n last.content = `${last.content}\\n${m.content}`;\n }\n last.raw.push(...m.raw);\n last.ts = m.ts; // 更新为最后一条的时间\n continue;\n }\n }\n windowMerged.push({ ...m });\n }\n \n merged.length = 0;\n merged.push(...windowMerged);\n }\n \n // 额外的时间窗口合并(如果配置了)\n if (thoughtMergeWindowMs > 0 && merged.length > 1) {\n // 根据时间窗口合并相邻的 thoughts(但不跨越其他事件)\n const windowMerged: Array<{ id: string; ts: number; content: string; raw: any[] }> = [];\n \n for (const m of merged) {\n const last = windowMerged[windowMerged.length - 1];\n if (last) {\n const timeDiff = m.ts - last.ts;\n // 只有在时间窗口内且没有其他事件穿插时才合并\n if (timeDiff <= thoughtMergeWindowMs && !hasEventBetween(last.ts, m.ts)) {\n if (!last.content.includes(m.content)) {\n last.content = `${last.content}\\n${m.content}`;\n }\n last.raw.push(...m.raw);\n last.ts = m.ts; // 更新为最后一条的时间\n continue;\n }\n }\n windowMerged.push({ ...m });\n }\n \n merged.length = 0;\n merged.push(...windowMerged);\n }\n\n merged.forEach((m) => {\n items.push({ kind: 'thought', id: m.id, ts: m.ts, data: { content: m.content, raw: m.raw } });\n });\n }\n\n toolCalls.forEach((tc, index) => {\n // 优先使用 toolCall 自身的时间戳\n let ts = (tc as any)?.gmtCreate || (tc as any)?.timestamp || (tc as any)?.createdAt || (tc as any)?.updatedAt;\n // 其次使用 extraData 中的时间戳\n if (!ts) ts = toolCallTsMap.get(tc.id);\n // 最后使用 thoughts 的最大时间戳 + 偏移量(确保在 thoughts 之后)\n if (!ts) ts = streamingFallbackTs + index + 1;\n items.push({ kind: 'toolcall', id: tc.id, ts, data: tc });\n });\n\n components.forEach((component, index) => {\n // 优先使用 component 自身的时间戳,支持多种格式\n let ts = (component as any)?.gmtCreate || (component as any)?.timestamp || (component as any)?.createdAt || (component as any)?.updatedAt;\n if (ts && typeof ts !== 'number') {\n const parsed = new Date(ts).getTime();\n ts = isNaN(parsed) ? 0 : parsed;\n }\n // 其次使用 extraData 中的时间戳\n if (!ts) ts = componentTsMap.get(component.id);\n // 最后使用 thoughts 的最大时间戳 + 偏移量(确保在 thoughts 之后)\n if (!ts) ts = streamingFallbackTs + toolCalls.length + index + 1;\n items.push({ kind: 'component', id: component.id, ts, data: component });\n });\n\n if (plan) {\n const planId = (plan as any).publicId || (plan as any).planId || 'plan';\n const ts = planTs ? Number(planTs) : getFallbackTs(plan);\n items.push({ kind: 'plan', id: String(planId), ts, data: plan });\n }\n\n if (includeMessage && messageContent?.trim()) {\n const ts = typeof messageTs === 'number' ? messageTs : getFallbackTs(message);\n items.push({ kind: 'message', id: String(message.messageId || message.gmtCreate || 'message'), ts, data: messageContent });\n }\n\n return items\n .sort((a, b) => {\n // 如果时间戳相同,或者相差小于1秒,则thought 在前\n if (Math.abs(a.ts - b.ts) < 500) {\n return a.kind === 'thought' ? -1 : 1;\n }\n\n return a.ts - b.ts;\n })\n .map((item, index) => ({ ...item, id: `${item.kind}-${item.id}-${index}` }));\n }, [message, isUser, toolCalls, components, plan, thoughts, includeThoughts, includeMessage, messageContent, messageTs, thoughtMergeWindowMs]);\n}\n","'use client';\n\nimport React, { useState, useCallback, useMemo, memo } from 'react';\nimport { Copy, Check, RefreshCw, Loader2, ChevronDown, ChevronUp, Lightbulb, Square, Trash2, AlertTriangle } from 'lucide-react';\nimport type { AgentComponentInstance, AgentMessage, AgentThought, ToolCall } from '../types/agent';\nimport MultiAgentThoughts from './MultiAgentThoughts';\nimport PlanCard from './PlanCard';\nimport { StreamingJsonDisplay, looksLikeJson } from './StreamingJsonDisplay';\nimport { cn } from '../lib/utils';\nimport { useComponent } from '../context/ComponentContext';\nimport { useAgentStore } from '../stores/agentStore';\nimport { MessageAvatar, MessageIdentityMeta } from './MessageIdentity';\nimport { MessageTimeline } from './MessageTimeline';\nimport { MessageImageInternal, MessageVideoInternal, ImagePreviewInternal, VideoPreviewInternal } from './message/MessageMedia';\nimport { MarkdownContent } from './message/MessageMarkdown';\nimport { ToolCallCard, StreamingToolCard } from './message/ToolCallCards';\nimport { ComponentPendingCard } from './message/ComponentPendingCard';\nimport { ThoughtTimelineCard } from './message/ThoughtTimelineCard';\nimport { isVideoUrl } from './message/utils';\nimport { useMessageContent } from './message/hooks/useMessageContent';\nimport { useToolCalls } from './message/hooks/useToolCalls';\nimport { useComponents } from './message/hooks/useComponents';\nimport { usePlanState } from './message/hooks/usePlanState';\nimport { useThinkingContent } from './message/hooks/useThinkingContent';\nimport { useTimelineItems } from './message/hooks/useTimelineItems';\nimport { ContentPreviewCard, extractCustomResponses, type ParsedContent } from './message/CustomResponseRenderer';\n\nimport type { AgentConfig, Asset } from '../types/components';\n\ninterface MessageBubbleProps {\n message: AgentMessage;\n isStreaming?: boolean;\n streamingContent?: string;\n onRegenerate?: () => void;\n onDelete?: (messageId: string) => Promise<boolean>; // 删除消息回调\n thoughts?: AgentThought[];\n pendingToolCalls?: ToolCall[]; // 实时工具调用状态\n onAbort?: () => void;\n config?: AgentConfig; // 新增配置参数\n // Plan Mode 回调\n onPlanConfirm?: () => void;\n onPlanReject?: () => void;\n onHumanInput?: (stepId: string, input: string) => void;\n isPlanProcessing?: boolean;\n waitingStepId?: string | null; // 当前等待输入的步骤 ID\n // Plan 执行控制回调\n onPlanPause?: () => void; // 暂停执行\n onPlanResume?: () => void; // 恢复执行\n // Plan 失败处理回调\n onPlanRetry?: () => void; // 重试失败步骤\n onPlanSkip?: () => void; // 跳过失败步骤\n onPlanCancel?: () => void; // 终止计划\n onOpenArtifact?: (artifact: { type: string; title: string; content: string; language?: string }) => void;\n}\n\nconst ThoughtBlockItem = memo(function ThoughtBlockItem({\n content,\n config,\n}: {\n content: string;\n config?: AgentConfig;\n}) {\n const [expanded, setExpanded] = useState(false);\n const lineCount = useMemo(() => content.split('\\n').length, [content]);\n const shouldToggle = lineCount > 2 || content.length > 120;\n\n return (\n <div className=\"space-y-2\">\n <div\n className={cn(\n 'text-sm text-zinc-400 leading-relaxed prose prose-invert prose-sm max-w-none [&_*]:break-words',\n shouldToggle && !expanded ? 'max-h-[3.5em] overflow-hidden' : ''\n )}\n >\n <MarkdownContent content={content} skipImages={false} config={config} variant=\"thought\" />\n </div>\n {shouldToggle && (\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"text-xs text-[#d8ff00]/80 hover:text-[#d8ff00]\"\n >\n {expanded ? '收起' : '展开'}\n </button>\n )}\n </div>\n );\n});\n\n/**\n * 消息气泡组件 - 使用 memo 避免不必要的重新渲染\n */\nconst MessageBubble = memo(function MessageBubble({ \n message, \n isStreaming = false,\n streamingContent,\n onRegenerate,\n onDelete,\n thoughts,\n pendingToolCalls = [], // 实时工具调用状态\n onAbort,\n onPlanConfirm,\n onPlanReject,\n onHumanInput,\n isPlanProcessing,\n waitingStepId,\n onPlanPause,\n onPlanResume,\n onPlanRetry,\n onPlanSkip,\n onPlanCancel,\n config,\n onOpenArtifact\n}: MessageBubbleProps) {\n const MessageImageComp = useComponent('MessageImage') || MessageImageInternal;\n const MessageVideoComp = useComponent('MessageVideo') || MessageVideoInternal;\n const ImagePreviewComp = useComponent('ImagePreview') || ImagePreviewInternal;\n const [copied, setCopied] = useState(false);\n const [showThoughts, setShowThoughts] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n const [previewMedia, setPreviewMedia] = useState<{ url: string; isVideo: boolean } | null>(null);\n const pendingComponents = useAgentStore((state) => state.chatUI.pendingComponents);\n const pendingComponentsSessionId = useAgentStore((state) => state.chatUI.pendingComponentsSessionId);\n const isUser = message.role === 'user';\n const isSystem = message.role === 'system';\n const isTool = message.role === 'tool';\n\n const { toolCalls, dedupedToolCalls } = useToolCalls({\n message,\n isStreaming,\n thoughts,\n pendingToolCalls,\n });\n\n const hasToolCallImages = useMemo(() => {\n return toolCalls.some(tc => {\n if (tc.result?.works?.some(w => w.fileUrl || w.fileId)) return true;\n if (tc.result?.outputs?.images) return true;\n return false;\n });\n }, [toolCalls]);\n\n const { displayContent, markdownMedia, effectiveDisplayContent, sanitizedDisplayContent, hasValidContent } = useMessageContent({\n message,\n isStreaming,\n streamingContent,\n isUser,\n hasToolCallImages,\n });\n\n // 复制消息(使用完整内容,不做去重)\n const handleCopy = useCallback(async () => {\n if (!displayContent) return;\n await navigator.clipboard.writeText(displayContent);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [displayContent]);\n\n // 删除消息\n const handleDelete = useCallback(async () => {\n if (!onDelete || !message.messageId) return;\n setIsDeleting(true);\n try {\n const success = await onDelete(message.messageId);\n if (success) {\n setShowDeleteConfirm(false);\n }\n } finally {\n setIsDeleting(false);\n }\n }, [onDelete, message.messageId]);\n\n // 检查是否有媒体附件 (图片/视频) - 使用 useMemo 缓存\n const attachments = useMemo(() => {\n const rawAttachments: Array<{ type?: string; url: string; name?: string }> = (message as any).attachments || [];\n const assetStrategy = config?.asset;\n\n const processedAttachments = rawAttachments.map(att => {\n const isVideo = att.type?.startsWith('video/') || isVideoUrl(att.url);\n const isImage = att.type?.startsWith('image/') || (!isVideo && /\\.(jpg|jpeg|png|gif|webp|bmp|svg)(\\?|#|$)/i.test(att.url));\n const inferredType: Asset['type'] = isVideo ? 'video' : isImage ? 'image' : 'file';\n let asset: Asset = { type: inferredType, url: att.url, name: att.name };\n if (assetStrategy?.transform) {\n asset = assetStrategy.transform(asset);\n }\n return { ...att, url: asset.url || att.url, type: inferredType };\n });\n\n const markdownAttachments = markdownMedia.media.map(item => ({\n type: item.type,\n url: item.url\n }));\n\n return [...processedAttachments, ...markdownAttachments];\n }, [message, config, markdownMedia]);\n\n const { effectiveComponents } = useComponents({\n message,\n pendingComponents,\n pendingComponentsSessionId,\n thoughts,\n isStreaming,\n });\n\n const [stickyComponents, setStickyComponents] = useState<AgentComponentInstance[]>([]);\n const mergedComponents = useMemo(() => {\n const map = new Map<string, AgentComponentInstance>();\n effectiveComponents.forEach((c) => {\n if (c?.id) map.set(String(c.id), c);\n });\n stickyComponents.forEach((c) => {\n if (c?.id) map.set(String(c.id), c);\n });\n return Array.from(map.values());\n }, [effectiveComponents, stickyComponents]);\n\n const { effectivePlan, fullPlan, planLoading } = usePlanState({ message, thoughts });\n\n const { thinkingContent, thoughtBlocks, hasStreamingThoughts, hasHistoryThoughts, agentGroups, isMultiAgent } = useThinkingContent({\n message,\n thoughts,\n isStreaming,\n messageContent: sanitizedDisplayContent,\n });\n\n const hasPlan = !!effectivePlan;\n const hasToolCalls = dedupedToolCalls.length > 0;\n const hasComponents = mergedComponents.length > 0;\n const hasOtherContent = hasPlan || hasToolCalls || hasComponents;\n const hasAttachmentOnly = isUser && attachments.length > 0 && !hasValidContent;\n const showThoughtsInTimeline = (config?.chatLayout?.showThoughtsInTimeline ?? true) && !hasPlan;\n\n // 提取所有工具调用的 customResponse,用于外置展示\n const allCustomResponses = useMemo(() => {\n const responses: Array<{ toolCallId: string; toolName: string; parsed: ParsedContent }> = [];\n dedupedToolCalls.forEach((tc) => {\n if (tc.result) {\n const extracted = extractCustomResponses(tc.result);\n extracted.forEach((parsed) => {\n responses.push({\n toolCallId: tc.id,\n toolName: tc.displayName || tc.name || 'Tool',\n parsed,\n });\n });\n }\n });\n return responses;\n }, [dedupedToolCalls]);\n const hasCustomResponses = allCustomResponses.length > 0;\n\n const includeMessageInTimeline = !isUser && showThoughtsInTimeline && isStreaming && !!sanitizedDisplayContent;\n\n const timelineItems = useTimelineItems({\n message,\n isUser,\n toolCalls: dedupedToolCalls,\n components: mergedComponents,\n plan: fullPlan,\n thoughts,\n includeThoughts: showThoughtsInTimeline,\n includeMessage: includeMessageInTimeline,\n messageContent: sanitizedDisplayContent,\n messageTs: isStreaming ? Date.now() : undefined,\n });\n const shouldRenderBubble = isUser\n ? (hasValidContent || isStreaming)\n : (includeMessageInTimeline ? false : (hasValidContent || isStreaming || hasOtherContent || (showThoughtsInTimeline ? false : (hasStreamingThoughts || hasHistoryThoughts))));\n\n const userIdentity = config?.identity?.user;\n const assistantIdentity = config?.identity?.assistant;\n const displayName = isUser ? userIdentity?.name : assistantIdentity?.name;\n const avatarUrl = isUser ? userIdentity?.avatarUrl : assistantIdentity?.avatarUrl;\n const avatarText = isUser ? userIdentity?.avatarText : assistantIdentity?.avatarText;\n const description = isUser ? userIdentity?.description : assistantIdentity?.description;\n const layout = config?.chatLayout?.layout ?? 'horizontal';\n const isVertical = layout === 'vertical';\n const showUserAvatar = config?.chatLayout?.showUserAvatar ?? true;\n const showAssistantAvatar = config?.chatLayout?.showAssistantAvatar ?? true;\n const showUserName = config?.chatLayout?.showUserName ?? true;\n const showAssistantName = config?.chatLayout?.showAssistantName ?? true;\n const showUserDescription = config?.chatLayout?.showUserDescription ?? false;\n const showAssistantDescription = config?.chatLayout?.showAssistantDescription ?? false;\n const shouldShowAvatar = isUser ? showUserAvatar : showAssistantAvatar;\n const shouldShowName = isUser ? showUserName : showAssistantName;\n const shouldShowDescription = isUser ? showUserDescription : showAssistantDescription;\n\n console.log('[MessageBubble] 渲染消息气泡, config?.identity:', config?.identity)\n\n const resolveFileName = (url: string) => {\n try {\n const pathname = new URL(url, 'http://dummy').pathname;\n const name = pathname.split('/').pop() || url;\n return decodeURIComponent(name);\n } catch {\n const parts = url.split('/');\n return parts[parts.length - 1] || url;\n }\n };\n\n return (\n <div className={`group flex ${isVertical ? 'flex-col gap-2' : `gap-3 ${isUser ? 'flex-row-reverse' : 'flex-row'}`} ${isUser ? isVertical ? 'items-end' : 'items-start' : 'items-start'}`}>\n {/* 头像与名称(上下结构) */}\n {isVertical && (shouldShowAvatar || shouldShowName || shouldShowDescription) && (\n <div className={`flex items-center gap-2 ${isUser ? 'flex-row-reverse' : 'flex-row'}`}>\n {shouldShowAvatar && (\n <MessageAvatar\n isUser={isUser}\n avatarUrl={avatarUrl}\n avatarText={avatarText}\n displayName={displayName}\n />\n )}\n <MessageIdentityMeta\n isUser={isUser}\n displayName={displayName}\n description={description}\n showName={shouldShowName}\n showDescription={shouldShowDescription}\n />\n </div>\n )}\n\n {/* 头像(左右结构) */}\n {!isVertical && shouldShowAvatar && (\n <MessageAvatar\n isUser={isUser}\n avatarUrl={avatarUrl}\n avatarText={avatarText}\n displayName={displayName}\n />\n )}\n\n {/* 内容 */}\n <div className={`flex flex-col ${isUser ? 'items-end' : 'items-start'} w-full max-w-[100%] min-w-0`}>\n {!isVertical && shouldShowName && displayName && (\n <div className={`text-xs text-zinc-500 mb-1 ${isUser ? 'text-right' : 'text-left'}`}>\n {displayName}\n </div>\n )}\n\n {/* 流式传输初始加载状态 - 当还没有任何内容时显示 */}\n {!isUser && isStreaming && timelineItems.length === 0 && !hasValidContent && (\n <div className=\"mb-3 px-3 py-2\">\n <div className=\"flex items-center gap-2 text-sm text-zinc-400\">\n <span>正在思考</span>\n <span className=\"inline-block w-2 h-4 bg-[#d8ff00] animate-pulse rounded-sm\" />\n </div>\n </div>\n )}\n\n {/* 时间线渲染:按时间合并 ToolCall / Component / Plan / Thought */}\n {!isUser && timelineItems.length > 0 && (\n <MessageTimeline\n items={timelineItems}\n className=\"mb-3 space-y-3 w-full\"\n renderThought={(item, index, allThoughtItems) => {\n // 判断是否是最后一个 thought 且正在流式传输\n const isLastThought = index === allThoughtItems.length - 1;\n const showLoadingCursor = isStreaming && isLastThought;\n return (\n <ThoughtTimelineCard \n key={item.id} \n thought={item.data} \n config={config} \n isLoading={showLoadingCursor}\n />\n );\n }}\n renderToolCall={(item) => {\n return <ToolCallCard key={item.id} toolCall={item.data} config={config} onOpenArtifact={onOpenArtifact} />\n }}\n renderComponent={(item) => (\n <ComponentPendingCard\n key={item.id}\n component={item.data}\n onResolved={(component) => {\n setStickyComponents((prev) => {\n const id = component?.id ? String(component.id) : '';\n if (!id || prev.some((c) => String(c.id) === id)) return prev;\n return [...prev, component];\n });\n }}\n />\n )}\n renderMessage={(item) => (\n <div key={item.id} className=\"rounded-2xl bg-zinc-800/80 text-zinc-100 px-4 py-3 overflow-hidden\">\n <div className=\"prose prose-invert prose-sm max-w-none prose-pre:whitespace-pre-wrap prose-pre:break-all [&_*]:break-words\">\n <MarkdownContent content={item.data} skipImages={hasToolCallImages} config={config} />\n </div>\n </div>\n )}\n renderPlan={(item) => (\n <div key={item.id} className=\"w-full\">\n {planLoading ? (\n <div className=\"rounded-xl border border-zinc-700/50 bg-zinc-900/50 overflow-hidden\">\n <div className=\"px-4 py-3 flex items-center gap-3\">\n <div className=\"w-8 h-8 rounded-lg bg-zinc-800 animate-pulse\" />\n <div className=\"flex-1\">\n <div className=\"h-4 w-32 bg-zinc-800 rounded animate-pulse mb-2\" />\n <div className=\"h-3 w-24 bg-zinc-800 rounded animate-pulse\" />\n </div>\n </div>\n </div>\n ) : fullPlan ? (\n <PlanCard\n plan={fullPlan}\n isProcessing={isPlanProcessing}\n waitingStepId={waitingStepId}\n streamingContent={isStreaming ? streamingContent : undefined}\n onConfirm={onPlanConfirm}\n onReject={onPlanReject}\n onHumanInput={onHumanInput}\n onPause={onPlanPause}\n onResume={onPlanResume}\n onRetry={onPlanRetry}\n onSkip={onPlanSkip}\n onCancel={onPlanCancel}\n config={config}\n />\n ) : null}\n </div>\n )}\n />\n )}\n\n {/* 外置的 CustomResponse 展示 - 核心产出物(如 HTML 预览卡片)直接展示在最外层 */}\n {/* {!isUser && hasCustomResponses && (\n <div className=\"mb-3 space-y-2 w-full\">\n {allCustomResponses.map((item, index) => (\n <ContentPreviewCard\n key={`${item.toolCallId}-${index}`}\n parsed={item.parsed}\n index={index}\n config={config}\n onOpenArtifact={onOpenArtifact}\n />\n ))}\n </div>\n )} */}\n\n {/* 消息内容 */}\n {shouldRenderBubble && (\n <div\n className={\n cn(\n 'relative rounded-2xl',\n isUser\n ? 'bg-blue-600 px-4 py-2.5 rounded-tr-sm'\n : `bg-zinc-800/80 text-zinc-100 rounded-tl-sm overflow-hidden ${isStreaming ? 'min-w-[200px]' : ''}`\n )\n }\n >\n {/* 单条消息的停止按钮 */}\n {!isUser && isStreaming && onAbort && (\n <button\n onClick={onAbort}\n className=\"absolute top-2 right-2 inline-flex items-center gap-1 px-2.5 py-1 bg-red-500/15 hover:bg-red-500/25 text-red-100 text-xs font-medium border border-red-500/30 rounded-lg shadow-sm transition-colors\"\n >\n <Square size={12} className=\"text-red-300\" />\n 终止生成\n </button>\n )}\n {/* 思考过程(内嵌在 AI 消息头部) */}\n {!isUser && !showThoughtsInTimeline && (hasStreamingThoughts || hasHistoryThoughts) && (\n <div className=\"border-b border-zinc-700/50\">\n <button\n onClick={() => setShowThoughts(!showThoughts)}\n className={`w-full flex items-center justify-between px-4 py-2.5 hover:bg-zinc-700/30 transition-colors ${isStreaming && onAbort ? 'pr-24' : ''}`}\n >\n <div className=\"flex items-center gap-2\">\n {hasStreamingThoughts ? (\n <Loader2 size={14} className=\"text-[#d8ff00] animate-spin\" />\n ) : (\n <Lightbulb size={14} className=\"text-zinc-500\" />\n )}\n <span className=\"text-sm text-zinc-300\">\n {hasStreamingThoughts ? '正在思考...' : '查看思考过程'}\n </span>\n {isMultiAgent && (\n <span className=\"text-xs text-zinc-500 bg-zinc-700/50 px-1.5 py-0.5 rounded\">\n Multi-Agent\n </span>\n )}\n {dedupedToolCalls.length > 0 && (\n <span className=\"text-xs text-zinc-500\">\n {dedupedToolCalls.length} 次工具调用\n </span>\n )}\n </div>\n {showThoughts ? (\n <ChevronUp size={14} className=\"text-zinc-500\" />\n ) : (\n <ChevronDown size={14} className=\"text-zinc-500\" />\n )}\n </button>\n {showThoughts && (\n <div className=\"px-4 pb-3 space-y-3\">\n {/* Multi-Agent 模式:使用时间线组件 */}\n {isMultiAgent ? (\n <MultiAgentThoughts \n thoughts={thoughts && thoughts.length > 0 ? thoughts : ((message as any).extraData?.thoughts || [])}\n isStreaming={hasStreamingThoughts}\n />\n ) : (\n <>\n {/* 非 Multi-Agent 模式:按块展示 */}\n {thoughtBlocks.length > 0 && (\n <div className=\"space-y-3\">\n {thoughtBlocks.map((block, index) => (\n <ThoughtBlockItem\n key={`${block.ts}-${index}`}\n content={block.content}\n config={config}\n />\n ))}\n {hasStreamingThoughts && (\n <span className=\"inline-block w-0.5 h-4 bg-[#d8ff00] animate-pulse ml-1 align-middle\" />\n )}\n </div>\n )}\n {/* 工具调用卡片 */}\n {dedupedToolCalls.length > 0 && (\n <div className=\"space-y-2\">\n {dedupedToolCalls.map((tc, i) => (\n <StreamingToolCard key={tc.id || i} toolCall={tc} />\n ))}\n </div>\n )}\n </>\n )}\n </div>\n )}\n </div>\n )}\n \n {/* 主内容 - 如果没有内容但有 toolCalls 或 plan,则不显示空气泡 */}\n {(() => {\n // 检测流式内容是否是 JSON(Plan 生成过程中的 JSON)\n const isStreamingJson = isStreaming && hasValidContent && looksLikeJson(sanitizedDisplayContent);\n \n // 没有有效内容且有其他内容时,不显示空气泡\n if (!hasValidContent && !isStreaming && (hasOtherContent || hasAttachmentOnly)) {\n return null;\n }\n\n if (!isUser) {\n return null;\n }\n \n return (\n <div className={!isUser ? `px-4 py-3 ${isStreaming && onAbort ? 'pr-24' : ''}` : ''}>\n {hasValidContent ? (\n // 流式 JSON 使用科技感展示组件\n isStreamingJson ? (\n <StreamingJsonDisplay content={sanitizedDisplayContent} />\n ) : isUser ? (\n // 用户消息:Markdown 渲染(支持图片、代码等)\n <div className=\"agent-user-markdown prose prose-invert prose-sm max-w-none prose-pre:whitespace-pre-wrap prose-pre:break-all [&_*]:break-words\">\n <MarkdownContent content={sanitizedDisplayContent} skipImages={false} config={config} />\n </div>\n ) : (\n // AI 消息:Markdown 渲染\n <div className=\"prose prose-invert prose-sm max-w-none prose-pre:whitespace-pre-wrap prose-pre:break-all [&_*]:break-words\">\n <MarkdownContent content={sanitizedDisplayContent} skipImages={hasToolCallImages} config={config} />\n </div>\n )\n ) : (\n <span className=\"text-zinc-500 italic text-sm\">\n {isStreaming ? (\n <span className=\"flex items-center gap-2\">\n <span className=\"flex gap-1\">\n <span className=\"w-1.5 h-1.5 bg-[#d8ff00] rounded-full animate-bounce\" style={{ animationDelay: '0ms' }} />\n <span className=\"w-1.5 h-1.5 bg-[#d8ff00] rounded-full animate-bounce\" style={{ animationDelay: '150ms' }} />\n <span className=\"w-1.5 h-1.5 bg-[#d8ff00] rounded-full animate-bounce\" style={{ animationDelay: '300ms' }} />\n </span>\n 思考中...\n </span>\n ) : '无内容'}\n </span>\n )}\n \n {/* 流式光标 */}\n {isStreaming && hasValidContent && (\n <span className=\"inline-block w-0.5 h-4 bg-[#d8ff00] animate-pulse ml-0.5 align-middle\" />\n )}\n </div>\n );\n })()}\n </div>\n )}\n \n {/* 用户附件卡片 */}\n {isUser && attachments.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {attachments.map((att: { type?: string; url: string; name?: string }, i: number) => {\n const isVideo = att.type === 'video' || att.type?.startsWith('video/') || isVideoUrl(att.url);\n const isImage = att.type === 'image' || att.type?.startsWith('image/') || (!isVideo && /\\.(jpg|jpeg|png|gif|webp|bmp|svg)(\\?|#|$)/i.test(att.url));\n const fileName = att.name || resolveFileName(att.url);\n\n if (isImage || isVideo) {\n return (\n <button\n key={i}\n type=\"button\"\n onClick={() => setPreviewMedia({ url: att.url, isVideo })}\n className=\"group/att relative w-[88px] h-[88px] rounded-lg overflow-hidden border border-zinc-700/40 bg-zinc-900/60 hover:border-zinc-500/60 transition-colors\"\n >\n {isVideo ? (\n <MessageVideoComp src={att.url} className=\"w-full h-full object-cover\" />\n ) : (\n <MessageImageComp src={att.url} alt={fileName} className=\"w-full h-full object-cover\" />\n )}\n <div className=\"absolute inset-0 bg-black/20 opacity-0 group-hover/att:opacity-100 transition-opacity\" />\n </button>\n );\n }\n\n return (\n <a\n key={i}\n href={att.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"flex items-center gap-2 px-3 py-2 rounded-lg border border-zinc-700/40 bg-zinc-900/60 hover:border-zinc-500/60 transition-colors max-w-[260px]\"\n >\n <span className=\"w-8 h-8 rounded-md bg-zinc-800 flex items-center justify-center text-zinc-400\">📎</span>\n <span className=\"text-xs text-zinc-300 truncate\">{fileName}</span>\n </a>\n );\n })}\n </div>\n )}\n\n {/* 操作按钮 - AI 消息(删除按钮始终可用,复制按钮需要有效内容) */}\n {!isUser && !isStreaming && (effectiveDisplayContent || onDelete) && (\n <div className=\"flex items-center gap-1 mt-1.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n {effectiveDisplayContent && (\n <button\n onClick={handleCopy}\n className=\"p-1.5 text-zinc-600 hover:text-zinc-400 hover:bg-zinc-800 rounded-lg transition-colors\"\n title=\"复制\"\n >\n {copied ? <Check size={14} className=\"text-green-400\" /> : <Copy size={14} />}\n </button>\n )}\n {onRegenerate && effectiveDisplayContent && (\n <button\n onClick={onRegenerate}\n className=\"p-1.5 text-zinc-600 hover:text-zinc-400 hover:bg-zinc-800 rounded-lg transition-colors\"\n title=\"重新生成\"\n >\n <RefreshCw size={14} />\n </button>\n )}\n {onDelete && (\n <button\n onClick={() => setShowDeleteConfirm(true)}\n className=\"p-1.5 text-zinc-600 hover:text-red-400 hover:bg-red-500/10 rounded-lg transition-colors\"\n title=\"删除\"\n >\n <Trash2 size={14} />\n </button>\n )}\n </div>\n )}\n\n {/* 操作按钮 - 用户消息 */}\n {isUser && !isStreaming && onDelete && (\n <div className=\"flex items-center gap-1 mt-1.5 opacity-0 group-hover:opacity-100 transition-opacity justify-end\">\n <button\n onClick={() => setShowDeleteConfirm(true)}\n className=\"p-1.5 text-zinc-600 hover:text-red-400 hover:bg-red-500/10 rounded-lg transition-colors\"\n title=\"删除\"\n >\n <Trash2 size={14} />\n </button>\n </div>\n )}\n\n {/* 附件预览 */}\n {previewMedia && (\n previewMedia.isVideo ? (\n <VideoPreviewInternal src={previewMedia.url} onClose={() => setPreviewMedia(null)} />\n ) : (\n <ImagePreviewComp src={previewMedia.url} onClose={() => setPreviewMedia(null)} />\n )\n )}\n\n {/* 删除确认对话框 */}\n {showDeleteConfirm && (\n <div className=\"fixed inset-0 z-[100] flex items-center justify-center bg-black/60 backdrop-blur-sm animate-in fade-in duration-150\">\n <div \n className=\"bg-zinc-900 border border-zinc-800 rounded-2xl shadow-2xl w-full max-w-sm mx-4 overflow-hidden animate-in zoom-in-95 duration-200\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* 头部 */}\n <div className=\"p-5 pb-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-full bg-red-500/10 flex items-center justify-center flex-shrink-0\">\n <AlertTriangle className=\"w-5 h-5 text-red-400\" />\n </div>\n <div>\n <h3 className=\"text-base font-medium text-white\">删除消息</h3>\n <p className=\"text-sm text-zinc-400 mt-0.5\">确定要删除这条消息吗?</p>\n </div>\n </div>\n </div>\n \n {/* 消息预览 */}\n <div className=\"px-5 pb-4\">\n <div className=\"bg-zinc-800/50 rounded-lg p-3 border border-zinc-700/50\">\n <p className=\"text-xs text-zinc-400 line-clamp-2\">\n {effectiveDisplayContent || message.content || '无内容'}\n </p>\n </div>\n </div>\n \n {/* 按钮 */}\n <div className=\"flex border-t border-zinc-800\">\n <button\n onClick={() => setShowDeleteConfirm(false)}\n disabled={isDeleting}\n className=\"flex-1 py-3 text-sm font-medium text-zinc-400 hover:text-white hover:bg-zinc-800/50 transition-colors disabled:opacity-50\"\n >\n 取消\n </button>\n <div className=\"w-px bg-zinc-800\" />\n <button\n onClick={handleDelete}\n disabled={isDeleting}\n className=\"flex-1 py-3 text-sm font-medium text-red-400 hover:text-red-300 hover:bg-red-500/10 transition-colors disabled:opacity-50 flex items-center justify-center gap-2\"\n >\n {isDeleting ? (\n <>\n <Loader2 size={14} className=\"animate-spin\" />\n 删除中...\n </>\n ) : (\n <>\n <Trash2 size={14} />\n 删除\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* 时间戳 */}\n {message.gmtCreate && !isStreaming && (\n <div className=\"text-zinc-600 text-[10px] mt-1\">\n {new Date(message.gmtCreate).toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit', second: '2-digit' })}\n </div>\n )}\n </div>\n </div>\n );\n});\n\nexport default MessageBubble;\n","'use client';\n\nimport React, { useRef, useEffect, useState, useCallback, useMemo, memo } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport { useAgentStore } from '../stores/agentStore';\nimport type { AgentConfig, AssetRenderInfo } from '../types/components';\nimport { createAssetFromSource, inferAssetTypeFromUrl, isHttpUrl, resolveAssetForDisplay, isVideoUrl } from '../utils/asset';\nimport MessageBubble from './MessageBubble';\nimport ToolConfirmCard from './ToolConfirmCard';\nimport { Bot, Sparkles, Loader2, ChevronDown, ChevronUp, Lightbulb, Copy, Check, X } from 'lucide-react';\nimport type { AgentThought, AgentMessage, ToolCall } from '../types/agent';\nimport { useShallow } from 'zustand/react/shallow';\nimport { parseThoughts } from '../utils/thoughtParser';\nimport { getToolCallStatusPriority } from '../utils/toolCallUtils';\ninterface ChatWindowProps {\n sessionId: string;\n loading?: boolean;\n config?: AgentConfig;\n onAbortMessage?: (messageId: string) => void;\n onDeleteMessage?: (messageId: string) => Promise<boolean>; // 删除消息回调\n // Plan Mode 回调\n onPlanConfirm?: () => void;\n onPlanReject?: () => void;\n onHumanInput?: (stepId: string, input: string) => void;\n isPlanProcessing?: boolean;\n waitingStepId?: string | null;\n // Plan 执行控制回调\n onPlanPause?: () => void;\n onPlanResume?: () => void;\n // Plan 失败处理回调\n onPlanRetry?: () => void;\n onPlanSkip?: () => void;\n onPlanCancel?: () => void;\n onOpenArtifact?: (artifact: { type: string; title: string; content: string; language?: string }) => void;\n}\n\n// 空状态\nconst EmptyState = memo(function EmptyState() {\n return (\n <div className=\"flex-1 flex items-center justify-center h-full\">\n <div className=\"text-center\">\n <div className=\"w-12 h-12 rounded-xl bg-zinc-800/50 flex items-center justify-center mx-auto mb-3\">\n <Sparkles size={24} className=\"text-zinc-600\" />\n </div>\n <p className=\"text-zinc-600 text-sm\">开始对话吧</p>\n </div>\n </div>\n );\n});\n\n// 加载状态\nconst LoadingState = memo(function LoadingState() {\n return (\n <div className=\"flex-1 flex items-center justify-center h-full\">\n <div className=\"text-center\">\n <Loader2 className=\"w-8 h-8 text-[#d8ff00] animate-spin mx-auto mb-3\" />\n <p className=\"text-zinc-500 text-sm\">加载消息中...</p>\n </div>\n </div>\n );\n});\n\n// 代码块组件\nconst CodeBlock = memo(function CodeBlock({ children, className }: { children: string; className?: string }) {\n const [copied, setCopied] = useState(false);\n const language = className?.replace('language-', '') || 'text';\n\n const handleCopy = async () => {\n await navigator.clipboard.writeText(children);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n return (\n <div className=\"relative group my-2 rounded-lg overflow-hidden bg-zinc-900 border border-zinc-800\">\n <div className=\"flex items-center justify-between px-3 py-1.5 bg-zinc-800/50 border-b border-zinc-800\">\n <span className=\"text-xs text-zinc-500 font-mono\">{language}</span>\n <button onClick={handleCopy} className=\"flex items-center gap-1 text-xs text-zinc-500 hover:text-zinc-300 transition-colors\">\n {copied ? <Check size={12} className=\"text-green-400\" /> : <Copy size={12} />}\n {copied ? '已复制' : '复制'}\n </button>\n </div>\n <pre className=\"p-3 overflow-x-auto text-xs\">\n <code className={`${className} text-zinc-300`}>{children}</code>\n </pre>\n </div>\n );\n});\n\n// Markdown 渲染组件\nconst ResolvedMarkdownMedia = memo(function ResolvedMarkdownMedia({\n src,\n alt,\n config\n}: {\n src?: string;\n alt?: string;\n config?: AgentConfig;\n}) {\n const [media, setMedia] = useState<AssetRenderInfo | null>(null);\n\n useEffect(() => {\n let active = true;\n const load = async () => {\n if (!src) {\n if (active) setMedia(null);\n return;\n }\n\n const asset = createAssetFromSource({\n fileUrl: src,\n fileId: isHttpUrl(src) ? undefined : src,\n type: inferAssetTypeFromUrl(src)\n });\n\n if (!asset) {\n if (active) setMedia(null);\n return;\n }\n\n const resolved = await resolveAssetForDisplay(asset, config);\n if (active) setMedia(resolved);\n };\n\n load();\n return () => { active = false; };\n }, [src, config]);\n\n if (!media) return null;\n\n if (media.isVideo) {\n return (\n <video\n src={media.url}\n controls\n className=\"max-w-full rounded-lg max-h-[320px] w-full my-2\"\n preload=\"metadata\"\n />\n );\n }\n\n return (\n <img\n src={media.url}\n alt={alt || 'image'}\n className=\"max-w-full rounded-lg max-h-[320px] w-full my-2 object-contain\"\n />\n );\n});\n\nconst MarkdownContent = memo(function MarkdownContent({ content, config }: { content: string; config?: AgentConfig }) {\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={{\n code({ className, children, ...props }) {\n const codeString = String(children).replace(/\\n$/, '');\n const isBlock = className || codeString.includes('\\n');\n if (isBlock) return <CodeBlock className={className}>{codeString}</CodeBlock>;\n return <code className=\"px-1 py-0.5 bg-zinc-800 rounded text-[#d8ff00] text-xs font-mono\" {...props}>{children}</code>;\n },\n p: ({ children }) => <p className=\"mb-2 last:mb-0 leading-relaxed\">{children}</p>,\n h1: ({ children }) => <h1 className=\"text-base font-bold mb-2 mt-3 first:mt-0\">{children}</h1>,\n h2: ({ children }) => <h2 className=\"text-sm font-bold mb-2 mt-3 first:mt-0\">{children}</h2>,\n h3: ({ children }) => <h3 className=\"text-sm font-semibold mb-1 mt-2 first:mt-0\">{children}</h3>,\n ul: ({ children }) => <ul className=\"list-disc list-inside mb-2 space-y-0.5\">{children}</ul>,\n ol: ({ children }) => <ol className=\"list-decimal list-inside mb-2 space-y-0.5\">{children}</ol>,\n li: ({ children }) => <li className=\"leading-relaxed\">{children}</li>,\n blockquote: ({ children }) => <blockquote className=\"border-l-2 border-[#d8ff00]/50 pl-2 my-2 text-zinc-400 italic\">{children}</blockquote>,\n img: ({ src, alt }) => (\n <ResolvedMarkdownMedia src={src} alt={alt} config={config} />\n ),\n a: ({ href, children }) => {\n const link = href || '';\n const isMediaLink = /\\.(jpg|jpeg|png|gif|webp|bmp|svg)$/i.test(link) || isVideoUrl(link);\n\n if (isMediaLink) {\n return <ResolvedMarkdownMedia src={link} alt={typeof children === 'string' ? children : undefined} config={config} />;\n }\n\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-[#d8ff00] hover:underline\">\n {children}\n </a>\n );\n },\n strong: ({ children }) => <strong className=\"font-semibold text-white\">{children}</strong>,\n em: ({ children }) => <em className=\"italic\">{children}</em>,\n }}\n >\n {content}\n </ReactMarkdown>\n );\n});\n\n// 工具调用卡片组件 - 可展开查看参数和结果\nconst ToolCallCard = memo(function ToolCallCard({ toolCall }: { toolCall: ToolCall }) {\n const [expanded, setExpanded] = useState(false);\n \n console.log('[UI] 🔧 ToolCallCard 收到 toolCall:', { id: toolCall.id, status: toolCall.status });\n \n // 如果是等待确认状态,渲染确认卡片(内嵌在消息流中)\n if (toolCall.status === 'waiting_confirmation') {\n console.log('[UI] ✅ 渲染 ToolConfirmCard (waiting_confirmation)');\n return <ToolConfirmCard toolCall={toolCall} compact />;\n }\n \n console.log('[UI] ⚠️ 渲染普通卡片,status =', toolCall.status);\n \n // 根据状态确定样式\n const getStatusConfig = () => {\n switch (toolCall.status) {\n case 'completed':\n return {\n bgColor: 'bg-green-500/20',\n textColor: 'text-green-400',\n borderColor: 'border-green-500/30',\n icon: <Check size={12} className=\"text-green-400\" />,\n label: '完成',\n };\n case 'failed':\n return {\n bgColor: 'bg-red-500/20',\n textColor: 'text-red-400',\n borderColor: 'border-red-500/30',\n icon: <Lightbulb size={12} className=\"text-red-400\" />,\n label: '失败',\n };\n case 'rejected':\n return {\n bgColor: 'bg-zinc-500/20',\n textColor: 'text-zinc-400',\n borderColor: 'border-zinc-500/30',\n icon: <Lightbulb size={12} className=\"text-zinc-400\" />,\n label: '已拒绝',\n };\n case 'confirmed':\n case 'executing':\n return {\n bgColor: 'bg-blue-500/20',\n textColor: 'text-blue-400',\n borderColor: 'border-blue-500/30',\n icon: <Loader2 size={12} className=\"text-blue-400 animate-spin\" />,\n label: '执行中',\n };\n default:\n return {\n bgColor: 'bg-amber-500/20',\n textColor: 'text-amber-400',\n borderColor: 'border-amber-500/30',\n icon: <Loader2 size={12} className=\"text-amber-400 animate-spin\" />,\n label: '执行中',\n };\n }\n };\n \n const statusConfig = getStatusConfig();\n const hasArguments = toolCall.arguments && Object.keys(toolCall.arguments).length > 0;\n const hasResult = toolCall.result || toolCall.error;\n const canExpand = hasArguments || hasResult;\n\n return (\n <div className={`rounded-lg border ${statusConfig.borderColor} overflow-hidden bg-zinc-900/60`}>\n {/* 卡片头部 - 可点击展开 */}\n <button\n onClick={() => canExpand && setExpanded(!expanded)}\n disabled={!canExpand}\n className={`w-full flex items-center gap-2 px-3 py-2 ${canExpand ? 'hover:bg-zinc-800/50 cursor-pointer' : 'cursor-default'} transition-colors`}\n >\n <div className={`w-5 h-5 rounded flex items-center justify-center ${statusConfig.bgColor}`}>\n {statusConfig.icon}\n </div>\n <span className=\"text-xs text-zinc-300 truncate flex-1 text-left\">\n {toolCall.displayName || toolCall.name?.replace('comfy_', '') || 'Tool'}\n </span>\n <span className={`text-[10px] px-1.5 py-0.5 rounded ${statusConfig.bgColor} ${statusConfig.textColor}`}>\n {statusConfig.label}\n </span>\n {canExpand && (\n expanded ? <ChevronUp size={12} className=\"text-zinc-500\" /> : <ChevronDown size={12} className=\"text-zinc-500\" />\n )}\n </button>\n \n {/* 展开内容 */}\n {expanded && (\n <div className=\"border-t border-zinc-700/50 px-3 py-2 space-y-2\">\n {/* 参数 */}\n {hasArguments && (\n <div>\n <div className=\"text-[10px] text-zinc-500 uppercase tracking-wide mb-1\">参数</div>\n <pre className=\"text-[11px] text-zinc-400 bg-zinc-800/50 rounded p-2 overflow-x-auto font-mono\">\n {JSON.stringify(toolCall.arguments, null, 2)}\n </pre>\n </div>\n )}\n \n {/* 结果 */}\n {toolCall.result && (\n <div>\n <div className=\"text-[10px] text-zinc-500 uppercase tracking-wide mb-1\">结果</div>\n <div className=\"text-[11px] text-zinc-300 bg-zinc-800/50 rounded p-2 overflow-x-auto max-h-40 overflow-y-auto\">\n {typeof toolCall.result === 'string' ? (\n toolCall.result.length > 500 ? (\n <pre className=\"font-mono whitespace-pre-wrap break-words\">{toolCall.result.slice(0, 500)}...</pre>\n ) : (\n <pre className=\"font-mono whitespace-pre-wrap break-words\">{toolCall.result}</pre>\n )\n ) : (\n <pre className=\"font-mono\">{JSON.stringify(toolCall.result, null, 2)}</pre>\n )}\n </div>\n </div>\n )}\n \n {/* 错误 */}\n {toolCall.error && (\n <div>\n <div className=\"text-[10px] text-red-400 uppercase tracking-wide mb-1\">错误</div>\n <div className=\"text-[11px] text-red-300 bg-red-500/10 rounded p-2 overflow-x-auto\">\n {toolCall.error}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n});\n\n// AI 思考中消息气泡\nconst ThinkingBubble = memo(function ThinkingBubble({ \n thoughts, \n pendingToolCalls = [],\n config\n}: { \n thoughts: AgentThought[];\n pendingToolCalls?: ToolCall[];\n config?: AgentConfig;\n}) {\n const [expanded, setExpanded] = useState(true);\n \n // 使用抽取的工具函数解析思考内容\n const { content: thinkingContent, toolCalls: thoughtToolCalls, isThinking } = useMemo(\n () => parseThoughts(thoughts),\n [thoughts]\n );\n \n // 合并 thoughts 中的 toolCalls 和 pendingToolCalls,按 id 去重,保留优先级更高的状态\n const toolCalls = useMemo(() => {\n const toolCallMap = new Map<string, ToolCall>();\n \n // 先添加 thoughts 中的 toolCalls\n thoughtToolCalls.forEach(tc => {\n toolCallMap.set(tc.id, tc);\n });\n \n console.log('[UI] 🎨 thoughtToolCalls:', thoughtToolCalls.map(tc => ({ id: tc.id, status: tc.status })));\n console.log('[UI] 🎨 pendingToolCalls:', pendingToolCalls.map(tc => ({ id: tc.id, status: tc.status })));\n \n // 再添加 pendingToolCalls,但要比较状态优先级\n pendingToolCalls.forEach(tc => {\n const existing = toolCallMap.get(tc.id);\n if (existing) {\n // 选择优先级更高的状态\n const existingPriority = getToolCallStatusPriority(existing.status);\n const tcPriority = getToolCallStatusPriority(tc.status);\n \n console.log(`[UI] 🎨 合并 id=${tc.id}: existing.status=${existing.status}(${existingPriority}), pending.status=${tc.status}(${tcPriority})`);\n \n if (tcPriority >= existingPriority) {\n // pendingToolCalls 的状态优先级更高或相等,使用它\n toolCallMap.set(tc.id, { ...existing, ...tc });\n } else {\n // thoughtToolCalls 的状态优先级更高,保留它但合并其他属性\n toolCallMap.set(tc.id, { ...tc, ...existing });\n }\n } else {\n toolCallMap.set(tc.id, tc);\n }\n });\n \n const result = Array.from(toolCallMap.values());\n console.log('[UI] 🎨 最终 toolCalls:', result.map(tc => ({ id: tc.id, status: tc.status })));\n return result;\n }, [thoughtToolCalls, pendingToolCalls]);\n\n return (\n <div className=\"flex gap-3\">\n <div className=\"w-8 h-8 rounded-lg bg-[#d8ff00] flex items-center justify-center flex-shrink-0\">\n <Bot size={16} className=\"text-black\" />\n </div>\n <div className=\"flex flex-col items-start max-w-[75%] min-w-0\">\n <div className=\"bg-zinc-800/80 text-zinc-100 rounded-2xl rounded-tl-sm overflow-hidden w-full\">\n <button onClick={() => setExpanded(!expanded)} className=\"w-full flex items-center justify-between px-4 py-3 hover:bg-zinc-700/30 transition-colors\">\n <div className=\"flex items-center gap-2\">\n <Loader2 size={16} className=\"text-[#d8ff00] animate-spin\" />\n <span className=\"text-sm text-zinc-200\">正在思考...</span>\n {toolCalls.length > 0 && <span className=\"text-xs text-zinc-500\">{toolCalls.length} 次工具调用</span>}\n </div>\n {expanded ? <ChevronUp size={14} className=\"text-zinc-500\" /> : <ChevronDown size={14} className=\"text-zinc-500\" />}\n </button>\n {expanded && (\n <div className=\"px-4 pb-4 space-y-3 border-t border-zinc-700/50 overflow-hidden\">\n {thinkingContent ? (\n <div className=\"text-sm text-zinc-400 leading-relaxed pt-3 prose prose-invert prose-sm max-w-none [&_*]:break-words\">\n <MarkdownContent content={thinkingContent} config={config} />\n {isThinking && <span className=\"inline-block w-0.5 h-4 bg-[#d8ff00] animate-pulse ml-1 align-middle\" />}\n </div>\n ) : isThinking && (\n <div className=\"flex items-center gap-2 text-sm text-zinc-500 pt-3\">\n <span className=\"flex gap-1\">\n <span className=\"w-1.5 h-1.5 bg-[#d8ff00] rounded-full animate-bounce\" style={{ animationDelay: '0ms' }} />\n <span className=\"w-1.5 h-1.5 bg-[#d8ff00] rounded-full animate-bounce\" style={{ animationDelay: '150ms' }} />\n <span className=\"w-1.5 h-1.5 bg-[#d8ff00] rounded-full animate-bounce\" style={{ animationDelay: '300ms' }} />\n </span>\n <span>正在分析...</span>\n </div>\n )}\n {toolCalls.length > 0 && (\n <div className=\"space-y-2 pt-2\">\n {toolCalls.map((tc: ToolCall) => (\n <ToolCallCard key={tc.id} toolCall={tc} />\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n});\n\n/**\n * 对话窗口组件 - 简化版,避免闪动\n */\nfunction ChatWindow({ \n sessionId, \n loading = false, \n config,\n onAbortMessage,\n onDeleteMessage,\n onPlanConfirm,\n onPlanReject,\n onHumanInput,\n isPlanProcessing,\n waitingStepId,\n onPlanPause,\n onPlanResume,\n onPlanRetry,\n onPlanSkip,\n onPlanCancel,\n onOpenArtifact,\n}: ChatWindowProps) {\n // 使用 useShallow 比较,只有真正变化时才触发渲染\n const { messages, pendingToolCalls, chatError, currentThoughts, isThinking, streamingContent, streamingSessionId, pendingToolCallsSessionId, currentThoughtsSessionId } = useAgentStore(\n useShallow((state) => ({\n messages: state.messages,\n pendingToolCalls: state.chatUI.pendingToolCalls,\n chatError: state.chatUI.error,\n currentThoughts: state.chatUI.currentThoughts,\n isThinking: state.chatUI.isThinking,\n streamingContent: state.chatUI.streamingContent,\n streamingSessionId: state.chatUI.streamingSessionId,\n pendingToolCallsSessionId: state.chatUI.pendingToolCallsSessionId,\n currentThoughtsSessionId: state.chatUI.currentThoughtsSessionId,\n }))\n );\n \n // session 级别隔离:只显示当前 session 的 pendingToolCalls 和 currentThoughts\n const sessionPendingToolCalls = useMemo(\n () => pendingToolCallsSessionId === sessionId ? pendingToolCalls : [],\n [pendingToolCalls, pendingToolCallsSessionId, sessionId]\n );\n \n const sessionCurrentThoughts = useMemo(\n () => currentThoughtsSessionId === sessionId ? currentThoughts : [],\n [currentThoughts, currentThoughtsSessionId, sessionId]\n );\n \n // 判断当前 session 是否正在流式输出\n const isCurrentSessionStreaming = streamingSessionId === sessionId;\n \n const containerRef = useRef<HTMLDivElement>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const [showScrollButton, setShowScrollButton] = useState(false);\n\n // 缓存当前会话消息\n const sessionMessages = useMemo(\n () => messages.filter((m: AgentMessage) => m.sessionId === sessionId),\n [messages, sessionId]\n );\n \n const streamingMessage = useMemo(\n () => sessionMessages.find((m: AgentMessage) => m.status === 'streaming'),\n [sessionMessages]\n );\n \n // ==================== 智能滚动系统 ====================\n // 核心原则:用户向上滚动时暂停自动滚动,滚回底部时恢复\n \n // 是否应该自动滚动(用户在底部附近时为 true)\n // 是否应该自动滚动(用户在底部附近时为 true)\n const shouldAutoScrollRef = useRef(true);\n \n // 检查是否在底部附近\n const isNearBottom = useCallback((threshold = 150) => {\n const container = containerRef.current;\n if (!container) return true;\n const { scrollTop, scrollHeight, clientHeight } = container;\n return scrollHeight - scrollTop - clientHeight < threshold;\n }, []);\n \n // 滚动到底部\n const scrollToBottom = useCallback((behavior: 'smooth' | 'instant' = 'smooth') => {\n messagesEndRef.current?.scrollIntoView({ behavior, block: 'end' });\n }, []);\n \n // 条件滚动:只有在应该自动滚动时才滚动\n const autoScrollIfNeeded = useCallback(() => {\n if (shouldAutoScrollRef.current) {\n scrollToBottom('smooth');\n }\n }, [scrollToBottom]);\n \n const getScrollMetrics = useCallback(() => {\n const container = containerRef.current;\n if (container && container.scrollHeight - container.clientHeight > 1) {\n return {\n scrollTop: container.scrollTop,\n scrollHeight: container.scrollHeight,\n clientHeight: container.clientHeight,\n };\n }\n\n const doc = document.scrollingElement || document.documentElement;\n return {\n scrollTop: doc.scrollTop,\n scrollHeight: doc.scrollHeight,\n clientHeight: doc.clientHeight,\n };\n }, []);\n\n const updateScrollState = useCallback(() => {\n const { scrollTop, scrollHeight, clientHeight } = getScrollMetrics();\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n\n // 更新\"回到底部\"按钮显示\n setShowScrollButton(distanceFromBottom > 200);\n\n // 如果用户滚动到底部附近,恢复自动滚动\n if (distanceFromBottom < 100) {\n shouldAutoScrollRef.current = true;\n }\n }, [getScrollMetrics]);\n\n // 记录上次滚动位置,用于检测滚动方向\n const lastScrollTopRef = useRef(0);\n \n // 监听滚动事件\n useEffect(() => {\n const handleScroll = () => {\n const container = containerRef.current;\n if (!container) return;\n \n const currentScrollTop = container.scrollTop;\n const lastScrollTop = lastScrollTopRef.current;\n \n // 检测滚动方向\n if (currentScrollTop < lastScrollTop - 5) {\n // 用户向上滚动(有 5px 的容差避免抖动)\n shouldAutoScrollRef.current = false;\n } else if (isNearBottom(100)) {\n // 滚动到底部附近,恢复自动滚动\n shouldAutoScrollRef.current = true;\n }\n \n lastScrollTopRef.current = currentScrollTop;\n updateScrollState();\n };\n\n // 检测用户主动向上滚动(wheel 事件更准确,用于桌面端)\n const handleWheel = (e: WheelEvent) => {\n if (e.deltaY < 0) {\n // 用户向上滚动,暂停自动滚动\n shouldAutoScrollRef.current = false;\n setShowScrollButton(true);\n } else if (e.deltaY > 0 && isNearBottom(100)) {\n // 用户向下滚动且在底部附近,恢复自动滚动\n shouldAutoScrollRef.current = true;\n setShowScrollButton(false);\n }\n };\n \n // 触摸开始时记录位置(用于移动端)\n let touchStartY = 0;\n const handleTouchStart = (e: TouchEvent) => {\n touchStartY = e.touches[0].clientY;\n };\n \n // 触摸移动时检测方向(用于移动端)\n const handleTouchMove = (e: TouchEvent) => {\n const touchCurrentY = e.touches[0].clientY;\n const deltaY = touchStartY - touchCurrentY;\n \n if (deltaY < -10) {\n // 用户向上滑动(手指向下),暂停自动滚动\n shouldAutoScrollRef.current = false;\n setShowScrollButton(true);\n } else if (deltaY > 10 && isNearBottom(100)) {\n // 用户向下滑动且在底部附近,恢复自动滚动\n shouldAutoScrollRef.current = true;\n setShowScrollButton(false);\n }\n };\n\n const container = containerRef.current;\n\n container?.addEventListener('scroll', handleScroll, { passive: true });\n container?.addEventListener('wheel', handleWheel, { passive: true });\n container?.addEventListener('touchstart', handleTouchStart, { passive: true });\n container?.addEventListener('touchmove', handleTouchMove, { passive: true });\n window.addEventListener('scroll', handleScroll, { passive: true });\n window.addEventListener('wheel', handleWheel, { passive: true });\n\n // 初始化状态\n updateScrollState();\n\n return () => {\n container?.removeEventListener('scroll', handleScroll);\n container?.removeEventListener('wheel', handleWheel);\n container?.removeEventListener('touchstart', handleTouchStart);\n container?.removeEventListener('touchmove', handleTouchMove);\n window.removeEventListener('scroll', handleScroll);\n window.removeEventListener('wheel', handleWheel);\n };\n }, [isNearBottom, updateScrollState]);\n \n // 初始加载 / 切换会话时滚动到底部\n useEffect(() => {\n if (!loading && sessionMessages.length > 0) {\n shouldAutoScrollRef.current = true;\n scrollToBottom('instant');\n }\n }, [loading, sessionId, scrollToBottom]);\n \n // 新消息时滚动到底部\n // 注意:只有当用户发送新消息时才强制滚动,AI 回复时使用 autoScrollIfNeeded\n const prevMessageCountRef = useRef(sessionMessages.length);\n useEffect(() => {\n const prevCount = prevMessageCountRef.current;\n const currentCount = sessionMessages.length;\n prevMessageCountRef.current = currentCount;\n \n if (currentCount > prevCount) {\n // 有新消息\n const lastMessage = sessionMessages[currentCount - 1];\n if (lastMessage?.role === 'user') {\n // 用户发送的新消息,强制滚动到底部\n shouldAutoScrollRef.current = true;\n scrollToBottom('smooth');\n } else {\n // AI 回复的新消息,使用条件滚动\n autoScrollIfNeeded();\n }\n }\n updateScrollState();\n }, [sessionMessages.length, sessionMessages, scrollToBottom, autoScrollIfNeeded, updateScrollState]);\n \n // 流式内容更新时自动滚动\n useEffect(() => {\n if (streamingContent) {\n autoScrollIfNeeded();\n }\n }, [streamingContent, autoScrollIfNeeded]);\n \n // Thought 更新时自动滚动\n useEffect(() => {\n if (isThinking && isCurrentSessionStreaming && sessionCurrentThoughts.length > 0) {\n autoScrollIfNeeded();\n }\n }, [isThinking, isCurrentSessionStreaming, sessionCurrentThoughts.length, autoScrollIfNeeded]);\n \n // pendingToolCalls 变化时滚动\n useEffect(() => {\n if (!isCurrentSessionStreaming) return;\n if (sessionPendingToolCalls.length > 0) {\n setTimeout(() => autoScrollIfNeeded(), 50);\n }\n }, [sessionPendingToolCalls, isCurrentSessionStreaming, autoScrollIfNeeded]);\n \n // ==================== 滚动系统结束 ====================\n\n if (loading) {\n return (\n <div className=\"flex-1 flex flex-col min-h-0\">\n <LoadingState />\n </div>\n );\n }\n\n return (\n <div className=\"flex-1 flex flex-col min-h-0 relative\">\n <div ref={containerRef} className=\"flex-1 overflow-y-auto\">\n <div className=\"max-w-7xl mx-auto px-4 py-8 space-y-8\">\n {sessionMessages.length === 0 && !isThinking ? (\n <EmptyState />\n ) : (\n <>\n {sessionMessages.map((message: AgentMessage) => {\n const statusLower = (message.status || '').toLowerCase();\n const isWaitingComponent = statusLower === 'waiting_component' || statusLower === 'waitingcomponent';\n const isWaitingToolConfirmation = statusLower === 'waiting_tool_confirmation' || statusLower === 'waitingtoolconfirmation';\n // 未完成的消息状态:streaming、waiting_component、waiting_tool_confirmation\n const isIncompleteMessage = statusLower === 'streaming' || isWaitingComponent || isWaitingToolConfirmation;\n // 如果当前 session 正在流式输出,使用实时的 thoughts 和 pendingToolCalls\n const isStreamingMessage = isIncompleteMessage && isCurrentSessionStreaming;\n // 对于未完成但不在流式输出的消息(如页面刷新后),从 message.extraData.thoughts 中获取\n const messageThoughts = isStreamingMessage \n ? sessionCurrentThoughts \n : (isIncompleteMessage ? (message as any).extraData?.thoughts : undefined);\n const messageToolCalls = isStreamingMessage \n ? sessionPendingToolCalls \n : undefined;\n return (\n <MessageBubble \n key={message.messageId} \n message={message}\n isStreaming={isStreamingMessage}\n streamingContent={isStreamingMessage ? streamingContent : undefined}\n thoughts={messageThoughts}\n pendingToolCalls={messageToolCalls}\n onAbort={isStreamingMessage ? () => onAbortMessage?.(message.messageId) : undefined}\n onDelete={onDeleteMessage}\n onPlanConfirm={onPlanConfirm}\n onPlanReject={onPlanReject}\n onHumanInput={onHumanInput}\n isPlanProcessing={isPlanProcessing}\n waitingStepId={waitingStepId}\n onPlanPause={onPlanPause}\n onPlanResume={onPlanResume}\n onPlanRetry={onPlanRetry}\n onPlanSkip={onPlanSkip}\n onPlanCancel={onPlanCancel}\n config={config}\n onOpenArtifact={onOpenArtifact}\n />\n );\n })}\n \n {isThinking && isCurrentSessionStreaming && !streamingMessage && (sessionCurrentThoughts.length > 0 || sessionPendingToolCalls.length > 0) && (\n <ThinkingBubble thoughts={sessionCurrentThoughts} pendingToolCalls={sessionPendingToolCalls} config={config} />\n )}\n \n {isThinking && isCurrentSessionStreaming && !streamingMessage && sessionCurrentThoughts.length === 0 && sessionPendingToolCalls.length === 0 && (\n <div className=\"flex gap-3\">\n <div className=\"w-8 h-8 rounded-lg bg-[#d8ff00] flex items-center justify-center flex-shrink-0\">\n <Bot size={16} className=\"text-black\" />\n </div>\n <div className=\"bg-zinc-800/80 rounded-2xl rounded-tl-sm px-4 py-3\">\n <div className=\"flex items-center gap-2 text-zinc-400 text-sm\">\n <div className=\"flex gap-1\">\n <span className=\"w-1.5 h-1.5 bg-[#d8ff00] rounded-full animate-bounce\" style={{ animationDelay: '0ms' }} />\n <span className=\"w-1.5 h-1.5 bg-[#d8ff00] rounded-full animate-bounce\" style={{ animationDelay: '150ms' }} />\n <span className=\"w-1.5 h-1.5 bg-[#d8ff00] rounded-full animate-bounce\" style={{ animationDelay: '300ms' }} />\n </div>\n <span>思考中...</span>\n </div>\n </div>\n </div>\n )}\n </>\n )}\n \n <div ref={messagesEndRef} />\n </div>\n </div>\n\n {showScrollButton && (\n <button\n onClick={() => {\n // 恢复自动滚动并滚动到底部\n shouldAutoScrollRef.current = true;\n scrollToBottom('smooth');\n setShowScrollButton(false);\n }}\n className=\"absolute bottom-4 left-1/2 -translate-x-1/2 flex items-center gap-1.5 px-3 py-1.5 bg-zinc-800 hover:bg-zinc-700 border border-zinc-700 rounded-full text-xs text-zinc-300 shadow-lg transition-all hover:scale-105\"\n >\n <ChevronDown size={14} />\n {isCurrentSessionStreaming ? (\n <>\n <span className=\"w-1.5 h-1.5 rounded-full bg-[#d8ff00] animate-pulse\" />\n 回到底部\n </>\n ) : (\n '回到底部'\n )}\n </button>\n )}\n\n {/* 错误提示 - 可关闭,5秒后自动消失 */}\n {chatError && (\n <ChatErrorBanner error={chatError} />\n )}\n </div>\n );\n}\n\n// 错误提示组件 - 可关闭,5秒后自动消失\nconst ChatErrorBanner = memo(function ChatErrorBanner({ error }: { error: string }) {\n const [visible, setVisible] = useState(true);\n const { setChatError } = useAgentStore();\n \n // 5秒后自动消失\n useEffect(() => {\n const timer = setTimeout(() => {\n setVisible(false);\n setChatError(undefined);\n }, 5000);\n return () => clearTimeout(timer);\n }, [error, setChatError]);\n \n if (!visible) return null;\n \n return (\n <div className=\"absolute bottom-4 left-1/2 -translate-x-1/2 max-w-md animate-in fade-in slide-in-from-bottom-2 duration-200\">\n <div className=\"flex items-center gap-2 px-4 py-2.5 bg-red-500/15 border border-red-500/30 rounded-lg shadow-lg backdrop-blur-sm\">\n <span className=\"text-red-400 text-sm flex-1\">{error}</span>\n <button\n onClick={() => {\n setVisible(false);\n setChatError(undefined);\n }}\n className=\"p-1 text-red-400/60 hover:text-red-400 hover:bg-red-500/20 rounded transition-colors\"\n >\n <X size={14} />\n </button>\n </div>\n </div>\n );\n});\n\nexport default memo(ChatWindow);\n","/**\n * 消息媒体渲染组件\n * 抽取自 MessageBubble.tsx,用于渲染图片、视频等媒体内容\n */\n\n'use client';\n\nimport React, { useState, memo, useEffect, useCallback } from 'react';\nimport { ImageIcon, X, Download } from 'lucide-react';\n\n// ============ 图片组件 ============\n\ninterface MessageImageProps {\n src: string;\n alt?: string;\n}\n\n/**\n * 图片组件 - 使用 memo 避免重复渲染导致闪烁\n */\nexport const MessageImage = memo(function MessageImage({ src, alt }: MessageImageProps) {\n const [loaded, setLoaded] = useState(false);\n const [error, setError] = useState(false);\n\n if (error) {\n return (\n <div className=\"flex items-center gap-2 p-3 bg-zinc-800/50 rounded-lg text-zinc-500 text-sm\">\n <ImageIcon size={16} />\n <span>图片加载失败</span>\n </div>\n );\n }\n\n return (\n <div className=\"my-2 relative\">\n {!loaded && (\n <div className=\"absolute inset-0 bg-zinc-800 animate-pulse rounded-lg\" />\n )}\n <img\n src={src}\n alt={alt || 'image'}\n onLoad={() => setLoaded(true)}\n onError={() => setError(true)}\n className={`max-w-full rounded-lg ${loaded ? 'opacity-100' : 'opacity-0'} transition-opacity`}\n style={{ maxHeight: '400px' }}\n />\n </div>\n );\n});\n\n// ============ 视频组件 ============\n\ninterface MessageVideoProps {\n src: string;\n}\n\n/**\n * 视频组件\n */\nexport const MessageVideo = memo(function MessageVideo({ src }: MessageVideoProps) {\n return (\n <div className=\"my-2 relative rounded-lg overflow-hidden bg-zinc-900 border border-zinc-800\">\n <video \n src={src} \n controls \n className=\"max-w-full rounded-lg max-h-[400px] w-full\"\n preload=\"metadata\"\n >\n 您的浏览器不支持视频播放\n </video>\n </div>\n );\n});\n\n// ============ 图片预览弹窗 ============\n\ninterface ImagePreviewProps {\n src: string;\n alt?: string;\n onClose: () => void;\n}\n\n/**\n * 图片预览弹窗组件\n */\nexport const ImagePreview = memo(function ImagePreview({ \n src, \n alt, \n onClose \n}: ImagePreviewProps) {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [onClose]);\n\n const handleDownload = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n const link = document.createElement('a');\n link.href = src;\n link.download = `image-${Date.now()}.png`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }, [src]);\n\n return (\n <div \n className=\"fixed inset-0 z-[100] flex items-center justify-center bg-black/90 backdrop-blur-sm p-4 animate-in fade-in duration-200\"\n onClick={onClose}\n >\n <button\n onClick={onClose}\n className=\"absolute top-4 right-4 p-2 text-white/50 hover:text-white bg-white/10 hover:bg-white/20 rounded-full transition-colors\"\n >\n <X size={24} />\n </button>\n \n <img\n src={src}\n alt={alt}\n className=\"max-w-full max-h-[90vh] object-contain shadow-2xl rounded-lg\"\n onClick={(e) => e.stopPropagation()}\n />\n \n <div className=\"absolute bottom-6 left-1/2 -translate-x-1/2 flex gap-4\">\n <button\n onClick={handleDownload}\n className=\"flex items-center gap-2 px-4 py-2 bg-[#d8ff00] hover:bg-[#c2e600] text-black rounded-full shadow-lg transition-colors text-sm font-medium\"\n >\n <Download size={16} />\n 下载\n </button>\n </div>\n </div>\n );\n});\n\n// ============ 工具函数 ============\n\n/**\n * 检查是否为视频 URL\n */\nexport function isVideoUrl(url?: string): boolean {\n if (!url) return false;\n try {\n // 移除 query 和 hash,只检查路径部分\n const urlObj = new URL(url, 'http://dummy');\n const pathname = urlObj.pathname.toLowerCase();\n return /\\.(mp4|mov|webm|avi|mkv|m4v)$/i.test(pathname);\n } catch {\n // URL 解析失败,回退到简单匹配\n const lower = url.toLowerCase();\n return /\\.(mp4|mov|webm|avi|mkv|m4v)(\\?|#|$)/i.test(lower);\n }\n}\n\n/**\n * 检查是否为图片 URL\n */\nexport function isImageUrl(url?: string): boolean {\n if (!url) return false;\n try {\n const urlObj = new URL(url, 'http://dummy');\n const pathname = urlObj.pathname.toLowerCase();\n return /\\.(jpg|jpeg|png|gif|webp|svg|bmp)$/i.test(pathname);\n } catch {\n const lower = url.toLowerCase();\n return /\\.(jpg|jpeg|png|gif|webp|svg|bmp)(\\?|#|$)/i.test(lower);\n }\n}\n\n// ============ 附件过滤 ============\n\ninterface Attachment {\n type?: string;\n url: string;\n}\n\n/**\n * 过滤媒体附件(图片/视频)\n */\nexport function filterMediaAttachments(attachments: Attachment[]): Attachment[] {\n return attachments.filter((a) => \n a.type?.startsWith('image/') || a.type?.startsWith('video/')\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport { \n Lightbulb, \n Zap, \n Check, \n X, \n Clock, \n Bot, \n ChevronDown, \n ChevronUp,\n Loader2,\n AlertCircle,\n Pause,\n Play\n} from 'lucide-react';\nimport type { AgentThought } from '@/types/agent';\n\ninterface ThinkingProcessProps {\n thoughts: AgentThought[];\n collapsed?: boolean;\n compact?: boolean; // 紧凑模式,用于流式展示\n}\n\n// 从 thoughts 中提取工具调用(按 id 去重,保留最新状态)\nexport function extractToolCallsFromThoughts(thoughts: AgentThought[]): any[] {\n const toolCallMap = new Map<string, any>();\n \n for (const t of thoughts) {\n if (t.type === 'action' && t.toolCalls) {\n t.toolCalls.forEach(tc => {\n // 同一 id 的工具调用,后面的覆盖前面的(状态更新)\n toolCallMap.set(tc.id, { ...toolCallMap.get(tc.id), ...tc });\n });\n }\n if (t.type === 'observation' && t.toolCalls) {\n t.toolCalls.forEach(tc => {\n const existing = toolCallMap.get(tc.id);\n if (existing) {\n existing.status = 'completed';\n existing.result = tc.result || t.observation;\n }\n });\n }\n }\n \n return Array.from(toolCallMap.values());\n}\n\n// 工具调用卡片(简洁版)\nfunction ToolCallCardCompact({ toolCall, isStreaming }: { toolCall: any; isStreaming?: boolean }) {\n const isPending = !toolCall.result && toolCall.status !== 'completed';\n const isCompleted = toolCall.status === 'completed' || toolCall.result;\n \n const toolName = toolCall.displayName || toolCall.name?.replace('comfy_', '') || 'Tool';\n \n return (\n <div className=\"flex items-center gap-2 px-3 py-2 bg-zinc-800/60 rounded-lg border border-zinc-700/40\">\n <div className={`w-5 h-5 rounded flex items-center justify-center ${\n isPending ? 'bg-amber-500/20' : 'bg-green-500/20'\n }`}>\n {isPending ? (\n <Loader2 size={12} className=\"text-amber-400 animate-spin\" />\n ) : (\n <Check size={12} className=\"text-green-400\" />\n )}\n </div>\n <span className=\"text-xs text-zinc-300 truncate flex-1\">{toolName}</span>\n <span className={`text-[10px] px-1.5 py-0.5 rounded ${\n isPending ? 'bg-amber-500/10 text-amber-400' : 'bg-green-500/10 text-green-400'\n }`}>\n {isPending ? '执行中' : '完成'}\n </span>\n </div>\n );\n}\n\n// 解析并美化思考内容\nfunction parseThinkingContent(rawContent: string): string {\n if (!rawContent) return '';\n \n let cleaned = rawContent;\n \n // 全局清理前缀(可能跨多行)\n cleaned = cleaned\n .replace(/Thought\\s*:\\s*/gi, '')\n .replace(/Action\\s*:\\s*\\w+\\s*/gi, '')\n .replace(/Action\\s+Input\\s*:\\s*/gi, '')\n .replace(/Observation\\s*:\\s*/gi, '')\n .replace(/Final\\s+Answer\\s*:\\s*/gi, '')\n .trim();\n \n // 按行处理\n const lines = cleaned.split(/\\n/);\n const cleanedParts: string[] = [];\n \n for (const line of lines) {\n let lineCleaned = line.trim();\n if (!lineCleaned) continue;\n \n if (lineCleaned.startsWith('{') && lineCleaned.endsWith('}')) {\n try {\n JSON.parse(lineCleaned);\n continue;\n } catch { /* not JSON */ }\n }\n \n if (lineCleaned.match(/^comfy_[\\w]+$/i)) continue;\n if (lineCleaned.match(/^\\{\".*\":\\s*[\"\\{\\d]/)) continue;\n \n if (lineCleaned) cleanedParts.push(lineCleaned);\n }\n \n const dedupedParts: string[] = [];\n for (const part of cleanedParts) {\n if (dedupedParts.length === 0 || dedupedParts[dedupedParts.length - 1] !== part) {\n dedupedParts.push(part);\n }\n }\n \n return dedupedParts.join(' ');\n}\n\n// 紧凑模式 - 用于流式消息内嵌\nfunction CompactThinking({ thoughts }: { thoughts: AgentThought[] }) {\n // 合并并去重思考内容\n const thinkingParts: string[] = [];\n const seenContent = new Set<string>();\n thoughts\n .filter(t => t.type === 'reasoning_start' || t.type === 'reasoning_delta')\n .forEach(t => {\n const content = (t.content || '').trim();\n if (content && !seenContent.has(content)) {\n seenContent.add(content);\n thinkingParts.push(content);\n }\n });\n // 解析并美化\n const rawThinkingContent = thinkingParts.join('\\n');\n const thinkingContent = parseThinkingContent(rawThinkingContent);\n \n // 提取工具调用\n const toolCalls = extractToolCallsFromThoughts(thoughts);\n \n const isThinking = thoughts.some(t => \n t.type === 'reasoning_start' || t.type === 'reasoning_delta'\n ) && !thoughts.some(t => t.type === 'final' || t.type === 'error');\n\n return (\n <div className=\"space-y-2\">\n {/* 思考内容 */}\n {thinkingContent && (\n <div className=\"text-sm text-zinc-400 leading-relaxed\">\n {thinkingContent}\n {isThinking && (\n <span className=\"inline-block w-0.5 h-3 bg-blue-400 animate-pulse ml-1 align-middle\" />\n )}\n </div>\n )}\n \n {/* 无内容时的加载动画 */}\n {!thinkingContent && isThinking && (\n <div className=\"flex items-center gap-2 text-sm text-zinc-500\">\n <span className=\"flex gap-1\">\n <span className=\"w-1.5 h-1.5 bg-blue-400 rounded-full animate-bounce\" style={{ animationDelay: '0ms' }} />\n <span className=\"w-1.5 h-1.5 bg-blue-400 rounded-full animate-bounce\" style={{ animationDelay: '150ms' }} />\n <span className=\"w-1.5 h-1.5 bg-blue-400 rounded-full animate-bounce\" style={{ animationDelay: '300ms' }} />\n </span>\n <span>正在分析...</span>\n </div>\n )}\n \n {/* 工具调用 */}\n {toolCalls.length > 0 && (\n <div className=\"space-y-1.5 pt-1\">\n {toolCalls.map((tc, i) => (\n <ToolCallCardCompact key={tc.id || i} toolCall={tc} isStreaming={isThinking} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// 工具调用卡片(完整版)\nfunction ToolCallCard({ toolCall }: { toolCall: any }) {\n const [showDetails, setShowDetails] = useState(false);\n \n const isPending = !toolCall.result && toolCall.status !== 'completed';\n const isCompleted = toolCall.status === 'completed' || toolCall.result;\n \n const toolName = toolCall.displayName || toolCall.name?.replace('comfy_', 'Workflow ') || 'Tool';\n\n return (\n <div className=\"bg-zinc-800/60 rounded-lg border border-zinc-700/50 overflow-hidden\">\n <div \n className=\"flex items-center justify-between px-3 py-2 cursor-pointer hover:bg-zinc-700/30 transition-colors\"\n onClick={() => setShowDetails(!showDetails)}\n >\n <div className=\"flex items-center gap-2\">\n <div className={`w-5 h-5 rounded flex items-center justify-center ${\n isPending ? 'bg-amber-500/20' : 'bg-green-500/20'\n }`}>\n {isPending ? (\n <Loader2 size={12} className=\"text-amber-400 animate-spin\" />\n ) : (\n <Check size={12} className=\"text-green-400\" />\n )}\n </div>\n <span className=\"text-sm text-white\">{toolName}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className={`text-[10px] px-1.5 py-0.5 rounded ${\n isPending ? 'bg-amber-500/10 text-amber-400' : 'bg-green-500/10 text-green-400'\n }`}>\n {isPending ? '执行中' : '完成'}\n </span>\n {showDetails ? <ChevronUp size={14} className=\"text-zinc-500\" /> : <ChevronDown size={14} className=\"text-zinc-500\" />}\n </div>\n </div>\n \n {showDetails && (\n <div className=\"px-3 pb-3 pt-1 border-t border-zinc-700/50 space-y-2\">\n {toolCall.arguments && (\n <div>\n <div className=\"text-[10px] text-zinc-500 uppercase tracking-wide mb-1\">参数</div>\n <pre className=\"text-xs text-zinc-400 bg-zinc-900 rounded p-2 overflow-x-auto font-mono\">\n {JSON.stringify(toolCall.arguments, null, 2)}\n </pre>\n </div>\n )}\n {toolCall.result && (\n <div>\n <div className=\"text-[10px] text-zinc-500 uppercase tracking-wide mb-1\">结果</div>\n <pre className=\"text-xs text-green-400 bg-zinc-900 rounded p-2 overflow-x-auto font-mono max-h-40 overflow-y-auto\">\n {typeof toolCall.result === 'string' ? toolCall.result : JSON.stringify(toolCall.result, null, 2)}\n </pre>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// 完整思考过程(时间线)\nfunction FullThinking({ thoughts }: { thoughts: AgentThought[] }) {\n // 合并并去重思考内容\n const thinkingParts: string[] = [];\n const seenContent = new Set<string>();\n thoughts\n .filter(t => t.type === 'reasoning_start' || t.type === 'reasoning_delta' || t.type === 'reasoning_end')\n .forEach(t => {\n const content = (t.content || '').trim();\n if (content && !seenContent.has(content)) {\n seenContent.add(content);\n thinkingParts.push(content);\n }\n });\n // 解析并美化\n const rawThinkingContent = thinkingParts.join('\\n');\n const thinkingContent = parseThinkingContent(rawThinkingContent);\n \n // 提取工具调用\n const toolCalls = extractToolCallsFromThoughts(thoughts);\n \n // 最终结果\n const finalThought = thoughts.find(t => t.type === 'final');\n const errorThought = thoughts.find(t => t.type === 'error');\n\n return (\n <div className=\"space-y-4\">\n {/* 思考内容 */}\n {thinkingContent && (\n <div>\n <div className=\"flex items-center gap-2 mb-2\">\n <Lightbulb size={14} className=\"text-blue-400\" />\n <span className=\"text-xs font-medium text-blue-400\">思考过程</span>\n </div>\n <div className=\"text-sm text-zinc-400 leading-relaxed pl-5 border-l-2 border-zinc-700\">\n {thinkingContent}\n </div>\n </div>\n )}\n \n {/* 工具调用 */}\n {toolCalls.length > 0 && (\n <div>\n <div className=\"flex items-center gap-2 mb-2\">\n <Zap size={14} className=\"text-amber-400\" />\n <span className=\"text-xs font-medium text-amber-400\">工具调用</span>\n <span className=\"text-[10px] text-zinc-500\">{toolCalls.length} 次</span>\n </div>\n <div className=\"space-y-2\">\n {toolCalls.map((tc, i) => (\n <ToolCallCard key={tc.id || i} toolCall={tc} />\n ))}\n </div>\n </div>\n )}\n \n {/* 错误 */}\n {errorThought && (\n <div className=\"flex items-start gap-2 p-3 bg-red-500/10 border border-red-500/20 rounded-lg\">\n <AlertCircle size={16} className=\"text-red-400 mt-0.5 flex-shrink-0\" />\n <div className=\"text-sm text-red-400\">{errorThought.error || errorThought.content}</div>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * 思考过程组件\n */\nexport default function ThinkingProcess({ thoughts, collapsed = false, compact = false }: ThinkingProcessProps) {\n const [expanded, setExpanded] = useState(!collapsed);\n\n if (thoughts.length === 0) return null;\n\n // 紧凑模式\n if (compact) {\n return <CompactThinking thoughts={thoughts} />;\n }\n\n const isThinking = thoughts.some(t => \n t.type === 'reasoning_start' || t.type === 'reasoning_delta'\n ) && !thoughts.some(t => t.type === 'final' || t.type === 'error');\n\n const toolCallCount = extractToolCallsFromThoughts(thoughts).length;\n\n return (\n <div className=\"bg-zinc-900/50 rounded-xl border border-zinc-800 overflow-hidden\">\n {/* 头部 */}\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"w-full flex items-center justify-between px-4 py-3 hover:bg-zinc-800/30 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n {isThinking ? (\n <Loader2 size={16} className=\"text-[#d8ff00] animate-spin\" />\n ) : (\n <Lightbulb size={16} className=\"text-[#d8ff00]\" />\n )}\n <span className=\"text-sm font-medium text-white\">\n {isThinking ? '正在思考...' : '思考过程'}\n </span>\n {toolCallCount > 0 && (\n <span className=\"text-xs text-zinc-500\">\n {toolCallCount} 次工具调用\n </span>\n )}\n </div>\n {expanded ? (\n <ChevronUp size={16} className=\"text-zinc-500\" />\n ) : (\n <ChevronDown size={16} className=\"text-zinc-500\" />\n )}\n </button>\n\n {/* 内容 */}\n {expanded && (\n <div className=\"px-4 pb-4 max-h-80 overflow-y-auto\">\n <FullThinking thoughts={thoughts} />\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport { Zap, Check, X, Pencil, Loader2, AlertTriangle } from 'lucide-react';\nimport { useAgentStore } from '@/stores/agentStore';\nimport { toolCallService } from '@/services/agent';\nimport type { ToolCall } from '@/types/agent';\n\ninterface ToolConfirmDialogProps {\n toolCall: ToolCall;\n}\n\n/**\n * 工具调用确认卡片\n */\nexport default function ToolConfirmDialog({ toolCall }: ToolConfirmDialogProps) {\n const { removePendingToolCall } = useAgentStore();\n const [isEditing, setIsEditing] = useState(false);\n const [editedArguments, setEditedArguments] = useState(\n JSON.stringify(toolCall.arguments, null, 2)\n );\n const [rejectReason, setRejectReason] = useState('');\n const [loading, setLoading] = useState(false);\n const [showRejectInput, setShowRejectInput] = useState(false);\n const [error, setError] = useState('');\n\n // 确认工具调用\n const handleConfirm = async () => {\n setLoading(true);\n setError('');\n try {\n let modifiedArguments: Record<string, any> | undefined;\n \n if (isEditing) {\n try {\n modifiedArguments = JSON.parse(editedArguments);\n } catch (e) {\n setError('参数格式错误,请检查 JSON 格式');\n setLoading(false);\n return;\n }\n }\n\n const response = await toolCallService.confirm({\n toolCallId: toolCall.id,\n approved: true,\n modifiedArguments,\n });\n\n if (response.success) {\n removePendingToolCall(toolCall.id);\n } else {\n setError(response.msg || '确认失败');\n }\n } catch (err) {\n setError('确认工具调用失败');\n } finally {\n setLoading(false);\n }\n };\n\n // 拒绝工具调用\n const handleReject = async () => {\n setLoading(true);\n setError('');\n try {\n const response = await toolCallService.confirm({\n toolCallId: toolCall.id,\n approved: false,\n rejectReason: rejectReason.trim() || undefined,\n });\n\n if (response.success) {\n removePendingToolCall(toolCall.id);\n } else {\n setError(response.msg || '操作失败');\n }\n } catch (err) {\n setError('拒绝工具调用失败');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"bg-zinc-900 border border-amber-500/30 rounded-xl overflow-hidden shadow-lg shadow-amber-500/5\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between px-4 py-3 bg-amber-500/10 border-b border-amber-500/20\">\n <div className=\"flex items-center gap-2\">\n <div className=\"w-7 h-7 rounded-lg bg-amber-500/20 flex items-center justify-center\">\n <Zap size={14} className=\"text-amber-400\" />\n </div>\n <span className=\"text-white font-medium\">工具调用确认</span>\n <span className=\"text-[10px] text-amber-400 bg-amber-500/20 px-2 py-0.5 rounded-full\">\n 需要确认\n </span>\n </div>\n </div>\n\n {/* 内容 */}\n <div className=\"p-4 space-y-4\">\n {/* 工具信息 */}\n <div>\n <div className=\"text-[10px] text-zinc-500 uppercase tracking-wide mb-1\">工具名称</div>\n <div className=\"text-white font-medium\">{toolCall.displayName || toolCall.name}</div>\n </div>\n\n {/* 参数 */}\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-[10px] text-zinc-500 uppercase tracking-wide\">调用参数</span>\n <button\n onClick={() => setIsEditing(!isEditing)}\n className={`flex items-center gap-1 text-xs px-2 py-1 rounded transition-colors ${\n isEditing \n ? 'bg-[#d8ff00]/20 text-[#d8ff00]' \n : 'text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800'\n }`}\n >\n <Pencil size={12} />\n {isEditing ? '取消编辑' : '编辑'}\n </button>\n </div>\n \n {isEditing ? (\n <textarea\n value={editedArguments}\n onChange={(e) => setEditedArguments(e.target.value)}\n rows={6}\n className=\"w-full bg-zinc-800 border border-zinc-700 rounded-lg p-3 text-sm text-zinc-300 font-mono focus:outline-none focus:border-zinc-600 resize-none\"\n placeholder=\"编辑 JSON 参数...\"\n />\n ) : (\n <pre className=\"bg-zinc-800 rounded-lg p-3 text-sm text-zinc-400 font-mono overflow-x-auto\">\n {JSON.stringify(toolCall.arguments, null, 2)}\n </pre>\n )}\n </div>\n\n {/* 拒绝原因输入 */}\n {showRejectInput && (\n <div>\n <div className=\"text-[10px] text-zinc-500 uppercase tracking-wide mb-2\">拒绝原因(可选)</div>\n <input\n type=\"text\"\n value={rejectReason}\n onChange={(e) => setRejectReason(e.target.value)}\n placeholder=\"请输入拒绝原因...\"\n className=\"w-full bg-zinc-800 border border-zinc-700 rounded-lg px-3 py-2 text-sm text-white placeholder-zinc-600 focus:outline-none focus:border-zinc-600\"\n />\n </div>\n )}\n\n {/* 错误提示 */}\n {error && (\n <div className=\"flex items-center gap-2 text-sm text-red-400 bg-red-500/10 border border-red-500/20 rounded-lg px-3 py-2\">\n <AlertTriangle size={14} />\n {error}\n </div>\n )}\n </div>\n\n {/* 操作按钮 */}\n <div className=\"flex items-center justify-end gap-2 px-4 py-3 bg-zinc-800/50 border-t border-zinc-800\">\n {!showRejectInput ? (\n <>\n <button\n onClick={() => setShowRejectInput(true)}\n disabled={loading}\n className=\"flex items-center gap-1.5 px-4 py-2 bg-zinc-700 hover:bg-zinc-600 text-zinc-300 text-sm rounded-lg transition-colors disabled:opacity-50\"\n >\n <X size={14} />\n 拒绝\n </button>\n <button\n onClick={handleConfirm}\n disabled={loading}\n className=\"flex items-center gap-1.5 px-4 py-2 bg-[#d8ff00] hover:bg-[#c2e600] text-black text-sm font-medium rounded-lg transition-colors disabled:opacity-50\"\n >\n {loading ? <Loader2 size={14} className=\"animate-spin\" /> : <Check size={14} />}\n 确认执行\n </button>\n </>\n ) : (\n <>\n <button\n onClick={() => {\n setShowRejectInput(false);\n setRejectReason('');\n }}\n disabled={loading}\n className=\"px-4 py-2 text-zinc-400 hover:text-zinc-300 text-sm transition-colors\"\n >\n 取消\n </button>\n <button\n onClick={handleReject}\n disabled={loading}\n className=\"flex items-center gap-1.5 px-4 py-2 bg-red-500/20 hover:bg-red-500/30 text-red-400 text-sm rounded-lg transition-colors disabled:opacity-50\"\n >\n {loading ? <Loader2 size={14} className=\"animate-spin\" /> : <X size={14} />}\n 确认拒绝\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n","import * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n} ","/**\n * Copyright 2022 Joe Bell. All rights reserved.\n *\n * This file is licensed to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */ import { clsx } from \"clsx\";\nconst falsyToString = (value)=>typeof value === \"boolean\" ? `${value}` : value === 0 ? \"0\" : value;\nexport const cx = clsx;\nexport const cva = (base, config)=>(props)=>{\n var _config_compoundVariants;\n if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n const { variants, defaultVariants } = config;\n const getVariantClassNames = Object.keys(variants).map((variant)=>{\n const variantProp = props === null || props === void 0 ? void 0 : props[variant];\n const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];\n if (variantProp === null) return null;\n const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);\n return variants[variant][variantKey];\n });\n const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{\n let [key, value] = param;\n if (value === undefined) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{\n let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;\n return Object.entries(compoundVariantOptions).every((param)=>{\n let [key, value] = param;\n return Array.isArray(value) ? value.includes({\n ...defaultVariants,\n ...propsWithoutUndefined\n }[key]) : ({\n ...defaultVariants,\n ...propsWithoutUndefined\n })[key] === value;\n }) ? [\n ...acc,\n cvClass,\n cvClassName\n ] : acc;\n }, []);\n return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n };\n\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants } ","import { cn } from \"@/lib/utils\";\n\nconst Badge = ({ children, className }: { children: React.ReactNode, className?: string }) => {\n return <div className={cn(\"inline-flex items-center rounded-md bg-muted px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\", className)}>\n {children}\n </div>;\n};\n\nexport { Badge };","import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n className\n )}\n {...props}\n />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","'use client';\n\nimport { cn } from \"@/lib/utils\";\nimport React from 'react';\n\nconst Separator = ({ className, orientation = \"horizontal\", decorative = true }: { \n className?: string; \n orientation?: \"horizontal\" | \"vertical\";\n decorative?: boolean;\n}) => {\n return (\n <div\n role={decorative ? \"none\" : \"separator\"}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n />\n );\n};\n\nexport { Separator };\n","'use client';\n\nimport * as React from 'react';\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';\nimport { cn } from '@/lib/utils';\n\nconst ScrollArea = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn('relative overflow-hidden', className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n));\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;\n\nconst ScrollBar = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = 'vertical', ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n 'flex touch-none select-none transition-colors',\n orientation === 'vertical' &&\n 'h-full w-2.5 border-l border-l-transparent p-[1px]',\n orientation === 'horizontal' &&\n 'h-2.5 flex-col border-t border-t-transparent p-[1px]',\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n));\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;\n\nexport { ScrollArea, ScrollBar };\n","'use client';\n\nimport React from 'react';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from './ui/dialog';\nimport { Button } from './ui/button';\nimport { Badge } from './ui/badge';\nimport { Card, CardContent, CardHeader, CardTitle } from './ui/card';\nimport { Separator } from './ui/separator';\nimport { ScrollArea } from './ui/scroll-area';\nimport { \n Bot, \n Zap, \n UserCheck, \n Clock, \n CheckCircle, \n XCircle, \n AlertTriangle,\n Play,\n Ban,\n RotateCcw,\n ListOrdered,\n Loader2\n} from 'lucide-react';\nimport type { ExecutionPlan, PlanStep } from '@/types/agent';\n\ninterface PlanConfirmDialogProps {\n plan: ExecutionPlan | null;\n isOpen: boolean;\n isProcessing?: boolean;\n onConfirm: (modifiedSteps?: PlanStep[]) => void;\n onReject: () => void;\n onCancel: () => void;\n}\n\nconst PlanConfirmDialog: React.FC<PlanConfirmDialogProps> = ({\n plan,\n isOpen,\n isProcessing = false,\n onConfirm,\n onReject,\n onCancel,\n}) => {\n if (!plan) return null;\n\n const getStepIcon = (type: string) => {\n switch (type) {\n case 'TOOL_CALL':\n return <Zap className=\"w-4 h-4 text-yellow-500\" />;\n case 'LLM_REASONING':\n return <Bot className=\"w-4 h-4 text-blue-500\" />;\n case 'HUMAN_INPUT':\n return <UserCheck className=\"w-4 h-4 text-green-500\" />;\n default:\n return <AlertTriangle className=\"w-4 h-4 text-gray-500\" />;\n }\n };\n\n const getStepBadgeVariant = (type: string) => {\n switch (type) {\n case 'TOOL_CALL':\n return 'bg-orange-500/20 text-orange-400 border-orange-500/30';\n case 'LLM_REASONING':\n return 'bg-blue-500/20 text-blue-400 border-blue-500/30';\n case 'HUMAN_INPUT':\n return 'bg-green-500/20 text-green-400 border-green-500/30';\n default:\n return 'bg-gray-500/20 text-gray-400 border-gray-500/30';\n }\n };\n\n const renderStepDetails = (step: PlanStep) => {\n if (step.type === 'TOOL_CALL' && step.toolName) {\n return (\n <div className=\"space-y-2\">\n <div className=\"text-sm\">\n <span className=\"font-medium text-zinc-300\">工具:</span>{' '}\n <span className=\"text-zinc-400\">{step.toolName}</span>\n </div>\n {step.toolArguments && Object.keys(step.toolArguments).length > 0 && (\n <div className=\"space-y-1.5\">\n {/* 预估参数标识 */}\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[10px] px-1.5 py-0.5 rounded bg-amber-500/10 text-amber-400 border border-amber-500/20\">\n 预估参数\n </span>\n <span className=\"text-[10px] text-zinc-500\">\n 实际参数将在执行时由 AI 根据上下文动态确定\n </span>\n </div>\n <div className=\"text-xs bg-zinc-900/50 rounded p-2 font-mono overflow-x-auto border border-zinc-800\">\n <pre className=\"whitespace-pre-wrap break-all text-zinc-500\">\n {JSON.stringify(step.toolArguments, null, 2)}\n </pre>\n </div>\n </div>\n )}\n </div>\n );\n }\n\n if (step.type === 'LLM_REASONING') {\n return (\n <div className=\"text-sm text-zinc-400\">\n {step.description || 'AI 将进行推理分析'}\n </div>\n );\n }\n\n if (step.type === 'HUMAN_INPUT') {\n return (\n <div className=\"text-sm text-zinc-400\">\n {step.description || '需要您提供输入'}\n </div>\n );\n }\n\n return (\n <div className=\"text-sm text-zinc-400\">\n {step.description}\n </div>\n );\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onCancel()}>\n <DialogContent className=\"max-w-3xl max-h-[80vh] overflow-hidden flex flex-col sm:max-w-4xl\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <Play className=\"w-5 h-5 text-blue-400\" />\n 执行计划确认\n </DialogTitle>\n <DialogDescription>\n 检查并确认以下执行计划,然后决定是否继续执行\n </DialogDescription>\n </DialogHeader>\n\n <ScrollArea className=\"flex-grow pr-4\">\n <div className=\"space-y-4 pb-4\">\n {/* 计划概览 */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span>{plan.title || '未命名计划'}</span>\n <Badge className=\"ml-2 capitalize\">\n {plan.status.toLowerCase()}\n </Badge>\n </div>\n <div className=\"flex items-center gap-4 text-sm text-zinc-400\">\n <div className=\"flex items-center gap-1\">\n <Clock className=\"w-4 h-4\" />\n <span>{plan.totalSteps} 步骤</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <CheckCircle className=\"w-4 h-4 text-green-500\" />\n <span>{plan.completedSteps}/{plan.totalSteps} 已完成</span>\n </div>\n </div>\n </CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-zinc-400\">{plan.description}</p>\n </CardContent>\n </Card>\n\n {/* 步骤列表 */}\n <div className=\"space-y-3\">\n <h3 className=\"font-semibold text-lg flex items-center gap-2\">\n <ListOrdered className=\"w-5 h-5\" />\n 执行步骤 ({plan.steps.length})\n </h3>\n \n {plan.steps\n .filter(step => step && step.type && !('$ref' in step)) // 过滤无效 step\n .map((step, index) => (\n <Card key={step.id || index} className=\"border-l-4 border-l-blue-500/50 hover:bg-zinc-800/30 transition-colors\">\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3 flex-grow\">\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-zinc-700 flex items-center justify-center text-sm font-bold\">\n {index + 1}\n </div>\n <div className=\"flex-grow\">\n <div className=\"flex items-center gap-2\">\n {getStepIcon(step.type)}\n <span className=\"font-medium\">{step.title || `步骤 ${index + 1}`}</span>\n <Badge className={`${getStepBadgeVariant(step.type)} text-xs`}>\n {step.type?.replace('_', ' ') || 'UNKNOWN'}\n </Badge>\n </div>\n </div>\n </div>\n \n <div className={`flex-shrink-0 px-2 py-1 rounded-full text-xs ${\n step.status === 'COMPLETED' ? 'bg-green-500/20 text-green-400' :\n step.status === 'FAILED' ? 'bg-red-500/20 text-red-400' :\n step.status === 'RUNNING' ? 'bg-blue-500/20 text-blue-400' :\n 'bg-zinc-500/20 text-zinc-400'\n }`}>\n {step.status?.toLowerCase() || 'pending'}\n </div>\n </CardTitle>\n </CardHeader>\n \n <CardContent className=\"pt-0\">\n {renderStepDetails(step)}\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n </ScrollArea>\n\n <Separator />\n\n {/* 操作按钮 */}\n <div className=\"flex justify-end gap-3 pt-4\">\n <Button \n variant=\"outline\" \n onClick={onReject}\n disabled={isProcessing}\n className=\"gap-2\"\n >\n <Ban className=\"w-4 h-4\" />\n 拒绝\n </Button>\n \n <Button \n variant=\"secondary\" \n onClick={onCancel}\n disabled={isProcessing}\n className=\"gap-2\"\n >\n <RotateCcw className=\"w-4 h-4\" />\n 取消\n </Button>\n \n <Button \n onClick={() => onConfirm()}\n disabled={isProcessing}\n className=\"gap-2 bg-green-600 hover:bg-green-700\"\n >\n {isProcessing ? (\n <>\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n 处理中...\n </>\n ) : (\n <>\n <Play className=\"w-4 h-4\" />\n 确认执行\n </>\n )}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default PlanConfirmDialog;","'use client';\n\nimport React from 'react';\nimport { Card, CardContent, CardHeader, CardTitle } from './ui/card';\nimport { Badge } from './ui/badge';\nimport { Separator } from './ui/separator';\nimport { \n Bot, \n Zap, \n UserCheck, \n Clock, \n CheckCircle, \n XCircle, \n AlertTriangle,\n Play,\n Pause,\n Ban,\n RotateCcw\n} from 'lucide-react';\nimport type { ExecutionPlan, PlanStep } from '../types/agent';\n\ninterface PlanProgressPanelProps {\n plan: ExecutionPlan | null;\n isProcessing?: boolean;\n onPause?: () => void;\n onResume?: () => void;\n onCancel?: () => void;\n}\n\nconst PlanProgressPanel: React.FC<PlanProgressPanelProps> = ({\n plan,\n isProcessing = false,\n onPause,\n onResume,\n onCancel,\n}) => {\n if (!plan || !['EXECUTING', 'PAUSED'].includes(plan.status)) return null;\n\n const getStepIcon = (type: string) => {\n switch (type) {\n case 'TOOL_CALL':\n return <Zap className=\"w-4 h-4 text-yellow-500\" />;\n case 'LLM_REASONING':\n return <Bot className=\"w-4 h-4 text-blue-500\" />;\n case 'HUMAN_INPUT':\n return <UserCheck className=\"w-4 h-4 text-green-500\" />;\n default:\n return <AlertTriangle className=\"w-4 h-4 text-gray-500\" />;\n }\n };\n\n const getStepBadgeVariant = (type: string) => {\n switch (type) {\n case 'TOOL_CALL':\n return 'bg-orange-500/20 text-orange-400 border-orange-500/30';\n case 'LLM_REASONING':\n return 'bg-blue-500/20 text-blue-400 border-blue-500/30';\n case 'HUMAN_INPUT':\n return 'bg-green-500/20 text-green-400 border-green-500/30';\n default:\n return 'bg-gray-500/20 text-gray-400 border-gray-500/30';\n }\n };\n\n const renderStepResult = (step: PlanStep) => {\n if (!step.result && !step.error) return null;\n\n return (\n <div className=\"mt-2 space-y-1\">\n {step.error ? (\n <div className=\"text-sm text-red-400 flex items-center gap-1\">\n <XCircle className=\"w-4 h-4\" />\n <span>{step.error}</span>\n </div>\n ) : step.result ? (\n <div className=\"text-xs bg-zinc-800/50 rounded p-2 font-mono overflow-x-auto max-h-20 overflow-y-auto\">\n <pre className=\"whitespace-pre-wrap break-all text-zinc-300\">\n {typeof step.result === 'string' ? step.result : JSON.stringify(step.result, null, 2)}\n </pre>\n </div>\n ) : null}\n </div>\n );\n };\n\n return (\n <Card className=\"border-l-4 border-l-blue-500/50 mt-4\">\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Play className=\"w-5 h-5 text-blue-400\" />\n <span>执行进度 ({plan.completedSteps}/{plan.totalSteps})</span>\n <Badge className=\"capitalize ml-2\">\n {plan.status.toLowerCase()}\n </Badge>\n </div>\n <div className=\"flex items-center gap-2\">\n {plan.status === 'EXECUTING' && onPause && (\n <button \n onClick={onPause}\n disabled={isProcessing}\n className=\"p-2 rounded-full hover:bg-zinc-700 disabled:opacity-50\"\n title=\"暂停\"\n >\n <Pause className=\"w-4 h-4\" />\n </button>\n )}\n {plan.status === 'PAUSED' && onResume && (\n <button \n onClick={onResume}\n disabled={isProcessing}\n className=\"p-2 rounded-full hover:bg-zinc-700 disabled:opacity-50\"\n title=\"恢复\"\n >\n <Play className=\"w-4 h-4\" />\n </button>\n )}\n {onCancel && (\n <button \n onClick={onCancel}\n disabled={isProcessing}\n className=\"p-2 rounded-full hover:bg-red-500/20 text-red-400 disabled:opacity-50\"\n title=\"取消\"\n >\n <Ban className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {plan.steps\n .filter(step => step && step.type && !('$ref' in step)) // 过滤无效 step\n .map((step, index) => (\n <div \n key={step.id || index} \n className={`p-3 rounded-lg border ${\n step.status === 'COMPLETED' ? 'bg-green-500/10 border-green-500/30' :\n step.status === 'FAILED' ? 'bg-red-500/10 border-red-500/30' :\n step.status === 'RUNNING' ? 'bg-blue-500/10 border-blue-500/30' :\n 'bg-zinc-800/30 border-zinc-700'\n }`}\n >\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-start gap-3 flex-grow\">\n <div className=\"flex-shrink-0 w-6 h-6 rounded-full bg-zinc-700 flex items-center justify-center text-xs font-bold mt-0.5\">\n {index + 1}\n </div>\n <div className=\"flex-grow\">\n <div className=\"flex items-center gap-2\">\n {getStepIcon(step.type)}\n <span className=\"font-medium\">{step.title || `步骤 ${index + 1}`}</span>\n <Badge className={`${getStepBadgeVariant(step.type)} text-xs`}>\n {step.type?.replace('_', ' ') || 'UNKNOWN'}\n </Badge>\n <Badge className={`${\n step.status === 'COMPLETED' ? 'bg-green-500/20 text-green-400' :\n step.status === 'FAILED' ? 'bg-red-500/20 text-red-400' :\n step.status === 'RUNNING' ? 'bg-blue-500/20 text-blue-400' :\n 'bg-zinc-500/20 text-zinc-400'\n } text-xs`}>\n {step.status?.toLowerCase() || 'pending'}\n </Badge>\n </div>\n {step.description && (\n <div className=\"text-sm text-zinc-400 mt-1\">{step.description}</div>\n )}\n {renderStepResult(step)}\n </div>\n </div>\n \n {step.startTime && (\n <div className=\"flex-shrink-0 text-xs text-zinc-500 flex items-center gap-1\">\n <Clock className=\"w-3 h-3\" />\n {new Date(step.startTime).toLocaleTimeString('zh-CN')}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n );\n};\n\nexport default PlanProgressPanel;","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface TextareaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n theme?: 'dark' | 'light';\n}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, theme, ...props }, ref) => {\n const themeClass = theme === 'dark' ? 'bg-gray-800 text-white' : 'bg-white text-black';\n return (\n <textarea\n className={cn(\n `flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${themeClass}`,\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea } ","'use client';\n\nimport React, { useState } from 'react';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from './ui/dialog';\nimport { Button } from './ui/button';\nimport { Textarea } from './ui/textarea';\nimport { Badge } from './ui/badge';\nimport { \n UserCheck, \n Send, \n X,\n Loader2,\n AlertCircle\n} from 'lucide-react';\nimport type { PlanStep } from '@/types/agent';\n\ninterface HumanInputDialogProps {\n step: PlanStep | null;\n isOpen: boolean;\n isProcessing?: boolean;\n onSubmit: (input: string) => void;\n onCancel: () => void;\n}\n\nconst HumanInputDialog: React.FC<HumanInputDialogProps> = ({\n step,\n isOpen,\n isProcessing = false,\n onSubmit,\n onCancel,\n}) => {\n const [input, setInput] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = () => {\n if (!input.trim()) {\n setError('请输入内容');\n return;\n }\n setError(null);\n onSubmit(input.trim());\n setInput('');\n };\n\n const handleCancel = () => {\n setInput('');\n setError(null);\n onCancel();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n // Cmd+Enter 或 Ctrl+Enter 提交\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n if (!step) return null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleCancel()}>\n <DialogContent className=\"max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <UserCheck className=\"w-5 h-5 text-green-500\" />\n 需要您的输入\n </DialogTitle>\n <DialogDescription>\n 当前步骤需要您提供信息以继续执行\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 py-4\">\n {/* 步骤信息 */}\n <div className=\"p-3 rounded-lg bg-zinc-800/50 border border-zinc-700\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Badge className=\"bg-green-500/20 text-green-400 border-green-500/30\">\n 步骤 {(step.index || 0) + 1}\n </Badge>\n <span className=\"text-sm font-medium text-white\">{step.title}</span>\n </div>\n {step.description && (\n <p className=\"text-sm text-zinc-400\">{step.description}</p>\n )}\n </div>\n\n {/* 输入框 */}\n <div>\n <label className=\"block text-sm font-medium text-zinc-300 mb-2\">\n 您的输入\n </label>\n <Textarea\n value={input}\n onChange={(e) => {\n setInput(e.target.value);\n if (error) setError(null);\n }}\n onKeyDown={handleKeyDown}\n placeholder=\"请输入您的回复...\"\n rows={4}\n disabled={isProcessing}\n className={`w-full resize-none ${error ? 'border-red-500 focus:border-red-500' : ''}`}\n />\n {error && (\n <p className=\"mt-1.5 text-sm text-red-400 flex items-center gap-1\">\n <AlertCircle size={14} />\n {error}\n </p>\n )}\n <p className=\"mt-1.5 text-xs text-zinc-500\">\n {typeof navigator !== 'undefined' && /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? '⌘' : 'Ctrl'}+Enter 提交\n </p>\n </div>\n </div>\n\n <DialogFooter>\n <Button \n variant=\"outline\" \n onClick={handleCancel}\n disabled={isProcessing}\n >\n <X className=\"w-4 h-4 mr-2\" />\n 取消\n </Button>\n \n <Button \n onClick={handleSubmit}\n disabled={isProcessing || !input.trim()}\n className=\"bg-green-600 hover:bg-green-700\"\n >\n {isProcessing ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n 提交中...\n </>\n ) : (\n <>\n <Send className=\"w-4 h-4 mr-2\" />\n 提交\n </>\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default HumanInputDialog;\n","'use client';\nfunction __insertCSS(code) {\n if (!code || typeof document == 'undefined') return\n let head = document.head || document.getElementsByTagName('head')[0]\n let style = document.createElement('style')\n style.type = 'text/css'\n head.appendChild(style)\n ;style.styleSheet ? (style.styleSheet.cssText = code) : style.appendChild(document.createTextNode(code))\n}\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nconst getAsset = (type)=>{\n switch(type){\n case 'success':\n return SuccessIcon;\n case 'info':\n return InfoIcon;\n case 'warning':\n return WarningIcon;\n case 'error':\n return ErrorIcon;\n default:\n return null;\n }\n};\nconst bars = Array(12).fill(0);\nconst Loader = ({ visible, className })=>{\n return /*#__PURE__*/ React.createElement(\"div\", {\n className: [\n 'sonner-loading-wrapper',\n className\n ].filter(Boolean).join(' '),\n \"data-visible\": visible\n }, /*#__PURE__*/ React.createElement(\"div\", {\n className: \"sonner-spinner\"\n }, bars.map((_, i)=>/*#__PURE__*/ React.createElement(\"div\", {\n className: \"sonner-loading-bar\",\n key: `spinner-bar-${i}`\n }))));\n};\nconst SuccessIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\",\n clipRule: \"evenodd\"\n}));\nconst WarningIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z\",\n clipRule: \"evenodd\"\n}));\nconst InfoIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\",\n clipRule: \"evenodd\"\n}));\nconst ErrorIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z\",\n clipRule: \"evenodd\"\n}));\nconst CloseIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"12\",\n height: \"12\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: \"1.5\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n}, /*#__PURE__*/ React.createElement(\"line\", {\n x1: \"18\",\n y1: \"6\",\n x2: \"6\",\n y2: \"18\"\n}), /*#__PURE__*/ React.createElement(\"line\", {\n x1: \"6\",\n y1: \"6\",\n x2: \"18\",\n y2: \"18\"\n}));\n\nconst useIsDocumentHidden = ()=>{\n const [isDocumentHidden, setIsDocumentHidden] = React.useState(document.hidden);\n React.useEffect(()=>{\n const callback = ()=>{\n setIsDocumentHidden(document.hidden);\n };\n document.addEventListener('visibilitychange', callback);\n return ()=>window.removeEventListener('visibilitychange', callback);\n }, []);\n return isDocumentHidden;\n};\n\nlet toastsCounter = 1;\nclass Observer {\n constructor(){\n // We use arrow functions to maintain the correct `this` reference\n this.subscribe = (subscriber)=>{\n this.subscribers.push(subscriber);\n return ()=>{\n const index = this.subscribers.indexOf(subscriber);\n this.subscribers.splice(index, 1);\n };\n };\n this.publish = (data)=>{\n this.subscribers.forEach((subscriber)=>subscriber(data));\n };\n this.addToast = (data)=>{\n this.publish(data);\n this.toasts = [\n ...this.toasts,\n data\n ];\n };\n this.create = (data)=>{\n var _data_id;\n const { message, ...rest } = data;\n const id = typeof (data == null ? void 0 : data.id) === 'number' || ((_data_id = data.id) == null ? void 0 : _data_id.length) > 0 ? data.id : toastsCounter++;\n const alreadyExists = this.toasts.find((toast)=>{\n return toast.id === id;\n });\n const dismissible = data.dismissible === undefined ? true : data.dismissible;\n if (this.dismissedToasts.has(id)) {\n this.dismissedToasts.delete(id);\n }\n if (alreadyExists) {\n this.toasts = this.toasts.map((toast)=>{\n if (toast.id === id) {\n this.publish({\n ...toast,\n ...data,\n id,\n title: message\n });\n return {\n ...toast,\n ...data,\n id,\n dismissible,\n title: message\n };\n }\n return toast;\n });\n } else {\n this.addToast({\n title: message,\n ...rest,\n dismissible,\n id\n });\n }\n return id;\n };\n this.dismiss = (id)=>{\n if (id) {\n this.dismissedToasts.add(id);\n requestAnimationFrame(()=>this.subscribers.forEach((subscriber)=>subscriber({\n id,\n dismiss: true\n })));\n } else {\n this.toasts.forEach((toast)=>{\n this.subscribers.forEach((subscriber)=>subscriber({\n id: toast.id,\n dismiss: true\n }));\n });\n }\n return id;\n };\n this.message = (message, data)=>{\n return this.create({\n ...data,\n message\n });\n };\n this.error = (message, data)=>{\n return this.create({\n ...data,\n message,\n type: 'error'\n });\n };\n this.success = (message, data)=>{\n return this.create({\n ...data,\n type: 'success',\n message\n });\n };\n this.info = (message, data)=>{\n return this.create({\n ...data,\n type: 'info',\n message\n });\n };\n this.warning = (message, data)=>{\n return this.create({\n ...data,\n type: 'warning',\n message\n });\n };\n this.loading = (message, data)=>{\n return this.create({\n ...data,\n type: 'loading',\n message\n });\n };\n this.promise = (promise, data)=>{\n if (!data) {\n // Nothing to show\n return;\n }\n let id = undefined;\n if (data.loading !== undefined) {\n id = this.create({\n ...data,\n promise,\n type: 'loading',\n message: data.loading,\n description: typeof data.description !== 'function' ? data.description : undefined\n });\n }\n const p = Promise.resolve(promise instanceof Function ? promise() : promise);\n let shouldDismiss = id !== undefined;\n let result;\n const originalPromise = p.then(async (response)=>{\n result = [\n 'resolve',\n response\n ];\n const isReactElementResponse = React.isValidElement(response);\n if (isReactElementResponse) {\n shouldDismiss = false;\n this.create({\n id,\n type: 'default',\n message: response\n });\n } else if (isHttpResponse(response) && !response.ok) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(`HTTP error! status: ${response.status}`) : data.error;\n const description = typeof data.description === 'function' ? await data.description(`HTTP error! status: ${response.status}`) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n } else if (response instanceof Error) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(response) : data.error;\n const description = typeof data.description === 'function' ? await data.description(response) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n } else if (data.success !== undefined) {\n shouldDismiss = false;\n const promiseData = typeof data.success === 'function' ? await data.success(response) : data.success;\n const description = typeof data.description === 'function' ? await data.description(response) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'success',\n description,\n ...toastSettings\n });\n }\n }).catch(async (error)=>{\n result = [\n 'reject',\n error\n ];\n if (data.error !== undefined) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(error) : data.error;\n const description = typeof data.description === 'function' ? await data.description(error) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n }\n }).finally(()=>{\n if (shouldDismiss) {\n // Toast is still in load state (and will be indefinitely — dismiss it)\n this.dismiss(id);\n id = undefined;\n }\n data.finally == null ? void 0 : data.finally.call(data);\n });\n const unwrap = ()=>new Promise((resolve, reject)=>originalPromise.then(()=>result[0] === 'reject' ? reject(result[1]) : resolve(result[1])).catch(reject));\n if (typeof id !== 'string' && typeof id !== 'number') {\n // cannot Object.assign on undefined\n return {\n unwrap\n };\n } else {\n return Object.assign(id, {\n unwrap\n });\n }\n };\n this.custom = (jsx, data)=>{\n const id = (data == null ? void 0 : data.id) || toastsCounter++;\n this.create({\n jsx: jsx(id),\n id,\n ...data\n });\n return id;\n };\n this.getActiveToasts = ()=>{\n return this.toasts.filter((toast)=>!this.dismissedToasts.has(toast.id));\n };\n this.subscribers = [];\n this.toasts = [];\n this.dismissedToasts = new Set();\n }\n}\nconst ToastState = new Observer();\n// bind this to the toast function\nconst toastFunction = (message, data)=>{\n const id = (data == null ? void 0 : data.id) || toastsCounter++;\n ToastState.addToast({\n title: message,\n ...data,\n id\n });\n return id;\n};\nconst isHttpResponse = (data)=>{\n return data && typeof data === 'object' && 'ok' in data && typeof data.ok === 'boolean' && 'status' in data && typeof data.status === 'number';\n};\nconst basicToast = toastFunction;\nconst getHistory = ()=>ToastState.toasts;\nconst getToasts = ()=>ToastState.getActiveToasts();\n// We use `Object.assign` to maintain the correct types as we would lose them otherwise\nconst toast = Object.assign(basicToast, {\n success: ToastState.success,\n info: ToastState.info,\n warning: ToastState.warning,\n error: ToastState.error,\n custom: ToastState.custom,\n message: ToastState.message,\n promise: ToastState.promise,\n dismiss: ToastState.dismiss,\n loading: ToastState.loading\n}, {\n getHistory,\n getToasts\n});\n\n__insertCSS(\"[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}\");\n\nfunction isAction(action) {\n return action.label !== undefined;\n}\n\n// Visible toasts amount\nconst VISIBLE_TOASTS_AMOUNT = 3;\n// Viewport padding\nconst VIEWPORT_OFFSET = '24px';\n// Mobile viewport padding\nconst MOBILE_VIEWPORT_OFFSET = '16px';\n// Default lifetime of a toasts (in ms)\nconst TOAST_LIFETIME = 4000;\n// Default toast width\nconst TOAST_WIDTH = 356;\n// Default gap between toasts\nconst GAP = 14;\n// Threshold to dismiss a toast\nconst SWIPE_THRESHOLD = 45;\n// Equal to exit animation duration\nconst TIME_BEFORE_UNMOUNT = 200;\nfunction cn(...classes) {\n return classes.filter(Boolean).join(' ');\n}\nfunction getDefaultSwipeDirections(position) {\n const [y, x] = position.split('-');\n const directions = [];\n if (y) {\n directions.push(y);\n }\n if (x) {\n directions.push(x);\n }\n return directions;\n}\nconst Toast = (props)=>{\n var _toast_classNames, _toast_classNames1, _toast_classNames2, _toast_classNames3, _toast_classNames4, _toast_classNames5, _toast_classNames6, _toast_classNames7, _toast_classNames8;\n const { invert: ToasterInvert, toast, unstyled, interacting, setHeights, visibleToasts, heights, index, toasts, expanded, removeToast, defaultRichColors, closeButton: closeButtonFromToaster, style, cancelButtonStyle, actionButtonStyle, className = '', descriptionClassName = '', duration: durationFromToaster, position, gap, expandByDefault, classNames, icons, closeButtonAriaLabel = 'Close toast' } = props;\n const [swipeDirection, setSwipeDirection] = React.useState(null);\n const [swipeOutDirection, setSwipeOutDirection] = React.useState(null);\n const [mounted, setMounted] = React.useState(false);\n const [removed, setRemoved] = React.useState(false);\n const [swiping, setSwiping] = React.useState(false);\n const [swipeOut, setSwipeOut] = React.useState(false);\n const [isSwiped, setIsSwiped] = React.useState(false);\n const [offsetBeforeRemove, setOffsetBeforeRemove] = React.useState(0);\n const [initialHeight, setInitialHeight] = React.useState(0);\n const remainingTime = React.useRef(toast.duration || durationFromToaster || TOAST_LIFETIME);\n const dragStartTime = React.useRef(null);\n const toastRef = React.useRef(null);\n const isFront = index === 0;\n const isVisible = index + 1 <= visibleToasts;\n const toastType = toast.type;\n const dismissible = toast.dismissible !== false;\n const toastClassname = toast.className || '';\n const toastDescriptionClassname = toast.descriptionClassName || '';\n // Height index is used to calculate the offset as it gets updated before the toast array, which means we can calculate the new layout faster.\n const heightIndex = React.useMemo(()=>heights.findIndex((height)=>height.toastId === toast.id) || 0, [\n heights,\n toast.id\n ]);\n const closeButton = React.useMemo(()=>{\n var _toast_closeButton;\n return (_toast_closeButton = toast.closeButton) != null ? _toast_closeButton : closeButtonFromToaster;\n }, [\n toast.closeButton,\n closeButtonFromToaster\n ]);\n const duration = React.useMemo(()=>toast.duration || durationFromToaster || TOAST_LIFETIME, [\n toast.duration,\n durationFromToaster\n ]);\n const closeTimerStartTimeRef = React.useRef(0);\n const offset = React.useRef(0);\n const lastCloseTimerStartTimeRef = React.useRef(0);\n const pointerStartRef = React.useRef(null);\n const [y, x] = position.split('-');\n const toastsHeightBefore = React.useMemo(()=>{\n return heights.reduce((prev, curr, reducerIndex)=>{\n // Calculate offset up until current toast\n if (reducerIndex >= heightIndex) {\n return prev;\n }\n return prev + curr.height;\n }, 0);\n }, [\n heights,\n heightIndex\n ]);\n const isDocumentHidden = useIsDocumentHidden();\n const invert = toast.invert || ToasterInvert;\n const disabled = toastType === 'loading';\n offset.current = React.useMemo(()=>heightIndex * gap + toastsHeightBefore, [\n heightIndex,\n toastsHeightBefore\n ]);\n React.useEffect(()=>{\n remainingTime.current = duration;\n }, [\n duration\n ]);\n React.useEffect(()=>{\n // Trigger enter animation without using CSS animation\n setMounted(true);\n }, []);\n React.useEffect(()=>{\n const toastNode = toastRef.current;\n if (toastNode) {\n const height = toastNode.getBoundingClientRect().height;\n // Add toast height to heights array after the toast is mounted\n setInitialHeight(height);\n setHeights((h)=>[\n {\n toastId: toast.id,\n height,\n position: toast.position\n },\n ...h\n ]);\n return ()=>setHeights((h)=>h.filter((height)=>height.toastId !== toast.id));\n }\n }, [\n setHeights,\n toast.id\n ]);\n React.useLayoutEffect(()=>{\n // Keep height up to date with the content in case it updates\n if (!mounted) return;\n const toastNode = toastRef.current;\n const originalHeight = toastNode.style.height;\n toastNode.style.height = 'auto';\n const newHeight = toastNode.getBoundingClientRect().height;\n toastNode.style.height = originalHeight;\n setInitialHeight(newHeight);\n setHeights((heights)=>{\n const alreadyExists = heights.find((height)=>height.toastId === toast.id);\n if (!alreadyExists) {\n return [\n {\n toastId: toast.id,\n height: newHeight,\n position: toast.position\n },\n ...heights\n ];\n } else {\n return heights.map((height)=>height.toastId === toast.id ? {\n ...height,\n height: newHeight\n } : height);\n }\n });\n }, [\n mounted,\n toast.title,\n toast.description,\n setHeights,\n toast.id,\n toast.jsx,\n toast.action,\n toast.cancel\n ]);\n const deleteToast = React.useCallback(()=>{\n // Save the offset for the exit swipe animation\n setRemoved(true);\n setOffsetBeforeRemove(offset.current);\n setHeights((h)=>h.filter((height)=>height.toastId !== toast.id));\n setTimeout(()=>{\n removeToast(toast);\n }, TIME_BEFORE_UNMOUNT);\n }, [\n toast,\n removeToast,\n setHeights,\n offset\n ]);\n React.useEffect(()=>{\n if (toast.promise && toastType === 'loading' || toast.duration === Infinity || toast.type === 'loading') return;\n let timeoutId;\n // Pause the timer on each hover\n const pauseTimer = ()=>{\n if (lastCloseTimerStartTimeRef.current < closeTimerStartTimeRef.current) {\n // Get the elapsed time since the timer started\n const elapsedTime = new Date().getTime() - closeTimerStartTimeRef.current;\n remainingTime.current = remainingTime.current - elapsedTime;\n }\n lastCloseTimerStartTimeRef.current = new Date().getTime();\n };\n const startTimer = ()=>{\n // setTimeout(, Infinity) behaves as if the delay is 0.\n // As a result, the toast would be closed immediately, giving the appearance that it was never rendered.\n // See: https://github.com/denysdovhan/wtfjs?tab=readme-ov-file#an-infinite-timeout\n if (remainingTime.current === Infinity) return;\n closeTimerStartTimeRef.current = new Date().getTime();\n // Let the toast know it has started\n timeoutId = setTimeout(()=>{\n toast.onAutoClose == null ? void 0 : toast.onAutoClose.call(toast, toast);\n deleteToast();\n }, remainingTime.current);\n };\n if (expanded || interacting || isDocumentHidden) {\n pauseTimer();\n } else {\n startTimer();\n }\n return ()=>clearTimeout(timeoutId);\n }, [\n expanded,\n interacting,\n toast,\n toastType,\n isDocumentHidden,\n deleteToast\n ]);\n React.useEffect(()=>{\n if (toast.delete) {\n deleteToast();\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n }\n }, [\n deleteToast,\n toast.delete\n ]);\n function getLoadingIcon() {\n var _toast_classNames;\n if (icons == null ? void 0 : icons.loading) {\n var _toast_classNames1;\n return /*#__PURE__*/ React.createElement(\"div\", {\n className: cn(classNames == null ? void 0 : classNames.loader, toast == null ? void 0 : (_toast_classNames1 = toast.classNames) == null ? void 0 : _toast_classNames1.loader, 'sonner-loader'),\n \"data-visible\": toastType === 'loading'\n }, icons.loading);\n }\n return /*#__PURE__*/ React.createElement(Loader, {\n className: cn(classNames == null ? void 0 : classNames.loader, toast == null ? void 0 : (_toast_classNames = toast.classNames) == null ? void 0 : _toast_classNames.loader),\n visible: toastType === 'loading'\n });\n }\n const icon = toast.icon || (icons == null ? void 0 : icons[toastType]) || getAsset(toastType);\n var _toast_richColors, _icons_close;\n return /*#__PURE__*/ React.createElement(\"li\", {\n tabIndex: 0,\n ref: toastRef,\n className: cn(className, toastClassname, classNames == null ? void 0 : classNames.toast, toast == null ? void 0 : (_toast_classNames = toast.classNames) == null ? void 0 : _toast_classNames.toast, classNames == null ? void 0 : classNames.default, classNames == null ? void 0 : classNames[toastType], toast == null ? void 0 : (_toast_classNames1 = toast.classNames) == null ? void 0 : _toast_classNames1[toastType]),\n \"data-sonner-toast\": \"\",\n \"data-rich-colors\": (_toast_richColors = toast.richColors) != null ? _toast_richColors : defaultRichColors,\n \"data-styled\": !Boolean(toast.jsx || toast.unstyled || unstyled),\n \"data-mounted\": mounted,\n \"data-promise\": Boolean(toast.promise),\n \"data-swiped\": isSwiped,\n \"data-removed\": removed,\n \"data-visible\": isVisible,\n \"data-y-position\": y,\n \"data-x-position\": x,\n \"data-index\": index,\n \"data-front\": isFront,\n \"data-swiping\": swiping,\n \"data-dismissible\": dismissible,\n \"data-type\": toastType,\n \"data-invert\": invert,\n \"data-swipe-out\": swipeOut,\n \"data-swipe-direction\": swipeOutDirection,\n \"data-expanded\": Boolean(expanded || expandByDefault && mounted),\n \"data-testid\": toast.testId,\n style: {\n '--index': index,\n '--toasts-before': index,\n '--z-index': toasts.length - index,\n '--offset': `${removed ? offsetBeforeRemove : offset.current}px`,\n '--initial-height': expandByDefault ? 'auto' : `${initialHeight}px`,\n ...style,\n ...toast.style\n },\n onDragEnd: ()=>{\n setSwiping(false);\n setSwipeDirection(null);\n pointerStartRef.current = null;\n },\n onPointerDown: (event)=>{\n if (event.button === 2) return; // Return early on right click\n if (disabled || !dismissible) return;\n dragStartTime.current = new Date();\n setOffsetBeforeRemove(offset.current);\n // Ensure we maintain correct pointer capture even when going outside of the toast (e.g. when swiping)\n event.target.setPointerCapture(event.pointerId);\n if (event.target.tagName === 'BUTTON') return;\n setSwiping(true);\n pointerStartRef.current = {\n x: event.clientX,\n y: event.clientY\n };\n },\n onPointerUp: ()=>{\n var _toastRef_current, _toastRef_current1, _dragStartTime_current;\n if (swipeOut || !dismissible) return;\n pointerStartRef.current = null;\n const swipeAmountX = Number(((_toastRef_current = toastRef.current) == null ? void 0 : _toastRef_current.style.getPropertyValue('--swipe-amount-x').replace('px', '')) || 0);\n const swipeAmountY = Number(((_toastRef_current1 = toastRef.current) == null ? void 0 : _toastRef_current1.style.getPropertyValue('--swipe-amount-y').replace('px', '')) || 0);\n const timeTaken = new Date().getTime() - ((_dragStartTime_current = dragStartTime.current) == null ? void 0 : _dragStartTime_current.getTime());\n const swipeAmount = swipeDirection === 'x' ? swipeAmountX : swipeAmountY;\n const velocity = Math.abs(swipeAmount) / timeTaken;\n if (Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11) {\n setOffsetBeforeRemove(offset.current);\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n if (swipeDirection === 'x') {\n setSwipeOutDirection(swipeAmountX > 0 ? 'right' : 'left');\n } else {\n setSwipeOutDirection(swipeAmountY > 0 ? 'down' : 'up');\n }\n deleteToast();\n setSwipeOut(true);\n return;\n } else {\n var _toastRef_current2, _toastRef_current3;\n (_toastRef_current2 = toastRef.current) == null ? void 0 : _toastRef_current2.style.setProperty('--swipe-amount-x', `0px`);\n (_toastRef_current3 = toastRef.current) == null ? void 0 : _toastRef_current3.style.setProperty('--swipe-amount-y', `0px`);\n }\n setIsSwiped(false);\n setSwiping(false);\n setSwipeDirection(null);\n },\n onPointerMove: (event)=>{\n var _window_getSelection, // Apply transform using both x and y values\n _toastRef_current, _toastRef_current1;\n if (!pointerStartRef.current || !dismissible) return;\n const isHighlighted = ((_window_getSelection = window.getSelection()) == null ? void 0 : _window_getSelection.toString().length) > 0;\n if (isHighlighted) return;\n const yDelta = event.clientY - pointerStartRef.current.y;\n const xDelta = event.clientX - pointerStartRef.current.x;\n var _props_swipeDirections;\n const swipeDirections = (_props_swipeDirections = props.swipeDirections) != null ? _props_swipeDirections : getDefaultSwipeDirections(position);\n // Determine swipe direction if not already locked\n if (!swipeDirection && (Math.abs(xDelta) > 1 || Math.abs(yDelta) > 1)) {\n setSwipeDirection(Math.abs(xDelta) > Math.abs(yDelta) ? 'x' : 'y');\n }\n let swipeAmount = {\n x: 0,\n y: 0\n };\n const getDampening = (delta)=>{\n const factor = Math.abs(delta) / 20;\n return 1 / (1.5 + factor);\n };\n // Only apply swipe in the locked direction\n if (swipeDirection === 'y') {\n // Handle vertical swipes\n if (swipeDirections.includes('top') || swipeDirections.includes('bottom')) {\n if (swipeDirections.includes('top') && yDelta < 0 || swipeDirections.includes('bottom') && yDelta > 0) {\n swipeAmount.y = yDelta;\n } else {\n // Smoothly transition to dampened movement\n const dampenedDelta = yDelta * getDampening(yDelta);\n // Ensure we don't jump when transitioning to dampened movement\n swipeAmount.y = Math.abs(dampenedDelta) < Math.abs(yDelta) ? dampenedDelta : yDelta;\n }\n }\n } else if (swipeDirection === 'x') {\n // Handle horizontal swipes\n if (swipeDirections.includes('left') || swipeDirections.includes('right')) {\n if (swipeDirections.includes('left') && xDelta < 0 || swipeDirections.includes('right') && xDelta > 0) {\n swipeAmount.x = xDelta;\n } else {\n // Smoothly transition to dampened movement\n const dampenedDelta = xDelta * getDampening(xDelta);\n // Ensure we don't jump when transitioning to dampened movement\n swipeAmount.x = Math.abs(dampenedDelta) < Math.abs(xDelta) ? dampenedDelta : xDelta;\n }\n }\n }\n if (Math.abs(swipeAmount.x) > 0 || Math.abs(swipeAmount.y) > 0) {\n setIsSwiped(true);\n }\n (_toastRef_current = toastRef.current) == null ? void 0 : _toastRef_current.style.setProperty('--swipe-amount-x', `${swipeAmount.x}px`);\n (_toastRef_current1 = toastRef.current) == null ? void 0 : _toastRef_current1.style.setProperty('--swipe-amount-y', `${swipeAmount.y}px`);\n }\n }, closeButton && !toast.jsx && toastType !== 'loading' ? /*#__PURE__*/ React.createElement(\"button\", {\n \"aria-label\": closeButtonAriaLabel,\n \"data-disabled\": disabled,\n \"data-close-button\": true,\n onClick: disabled || !dismissible ? ()=>{} : ()=>{\n deleteToast();\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n },\n className: cn(classNames == null ? void 0 : classNames.closeButton, toast == null ? void 0 : (_toast_classNames2 = toast.classNames) == null ? void 0 : _toast_classNames2.closeButton)\n }, (_icons_close = icons == null ? void 0 : icons.close) != null ? _icons_close : CloseIcon) : null, (toastType || toast.icon || toast.promise) && toast.icon !== null && ((icons == null ? void 0 : icons[toastType]) !== null || toast.icon) ? /*#__PURE__*/ React.createElement(\"div\", {\n \"data-icon\": \"\",\n className: cn(classNames == null ? void 0 : classNames.icon, toast == null ? void 0 : (_toast_classNames3 = toast.classNames) == null ? void 0 : _toast_classNames3.icon)\n }, toast.promise || toast.type === 'loading' && !toast.icon ? toast.icon || getLoadingIcon() : null, toast.type !== 'loading' ? icon : null) : null, /*#__PURE__*/ React.createElement(\"div\", {\n \"data-content\": \"\",\n className: cn(classNames == null ? void 0 : classNames.content, toast == null ? void 0 : (_toast_classNames4 = toast.classNames) == null ? void 0 : _toast_classNames4.content)\n }, /*#__PURE__*/ React.createElement(\"div\", {\n \"data-title\": \"\",\n className: cn(classNames == null ? void 0 : classNames.title, toast == null ? void 0 : (_toast_classNames5 = toast.classNames) == null ? void 0 : _toast_classNames5.title)\n }, toast.jsx ? toast.jsx : typeof toast.title === 'function' ? toast.title() : toast.title), toast.description ? /*#__PURE__*/ React.createElement(\"div\", {\n \"data-description\": \"\",\n className: cn(descriptionClassName, toastDescriptionClassname, classNames == null ? void 0 : classNames.description, toast == null ? void 0 : (_toast_classNames6 = toast.classNames) == null ? void 0 : _toast_classNames6.description)\n }, typeof toast.description === 'function' ? toast.description() : toast.description) : null), /*#__PURE__*/ React.isValidElement(toast.cancel) ? toast.cancel : toast.cancel && isAction(toast.cancel) ? /*#__PURE__*/ React.createElement(\"button\", {\n \"data-button\": true,\n \"data-cancel\": true,\n style: toast.cancelButtonStyle || cancelButtonStyle,\n onClick: (event)=>{\n // We need to check twice because typescript\n if (!isAction(toast.cancel)) return;\n if (!dismissible) return;\n toast.cancel.onClick == null ? void 0 : toast.cancel.onClick.call(toast.cancel, event);\n deleteToast();\n },\n className: cn(classNames == null ? void 0 : classNames.cancelButton, toast == null ? void 0 : (_toast_classNames7 = toast.classNames) == null ? void 0 : _toast_classNames7.cancelButton)\n }, toast.cancel.label) : null, /*#__PURE__*/ React.isValidElement(toast.action) ? toast.action : toast.action && isAction(toast.action) ? /*#__PURE__*/ React.createElement(\"button\", {\n \"data-button\": true,\n \"data-action\": true,\n style: toast.actionButtonStyle || actionButtonStyle,\n onClick: (event)=>{\n // We need to check twice because typescript\n if (!isAction(toast.action)) return;\n toast.action.onClick == null ? void 0 : toast.action.onClick.call(toast.action, event);\n if (event.defaultPrevented) return;\n deleteToast();\n },\n className: cn(classNames == null ? void 0 : classNames.actionButton, toast == null ? void 0 : (_toast_classNames8 = toast.classNames) == null ? void 0 : _toast_classNames8.actionButton)\n }, toast.action.label) : null);\n};\nfunction getDocumentDirection() {\n if (typeof window === 'undefined') return 'ltr';\n if (typeof document === 'undefined') return 'ltr'; // For Fresh purpose\n const dirAttribute = document.documentElement.getAttribute('dir');\n if (dirAttribute === 'auto' || !dirAttribute) {\n return window.getComputedStyle(document.documentElement).direction;\n }\n return dirAttribute;\n}\nfunction assignOffset(defaultOffset, mobileOffset) {\n const styles = {};\n [\n defaultOffset,\n mobileOffset\n ].forEach((offset, index)=>{\n const isMobile = index === 1;\n const prefix = isMobile ? '--mobile-offset' : '--offset';\n const defaultValue = isMobile ? MOBILE_VIEWPORT_OFFSET : VIEWPORT_OFFSET;\n function assignAll(offset) {\n [\n 'top',\n 'right',\n 'bottom',\n 'left'\n ].forEach((key)=>{\n styles[`${prefix}-${key}`] = typeof offset === 'number' ? `${offset}px` : offset;\n });\n }\n if (typeof offset === 'number' || typeof offset === 'string') {\n assignAll(offset);\n } else if (typeof offset === 'object') {\n [\n 'top',\n 'right',\n 'bottom',\n 'left'\n ].forEach((key)=>{\n if (offset[key] === undefined) {\n styles[`${prefix}-${key}`] = defaultValue;\n } else {\n styles[`${prefix}-${key}`] = typeof offset[key] === 'number' ? `${offset[key]}px` : offset[key];\n }\n });\n } else {\n assignAll(defaultValue);\n }\n });\n return styles;\n}\nfunction useSonner() {\n const [activeToasts, setActiveToasts] = React.useState([]);\n React.useEffect(()=>{\n return ToastState.subscribe((toast)=>{\n if (toast.dismiss) {\n setTimeout(()=>{\n ReactDOM.flushSync(()=>{\n setActiveToasts((toasts)=>toasts.filter((t)=>t.id !== toast.id));\n });\n });\n return;\n }\n // Prevent batching, temp solution.\n setTimeout(()=>{\n ReactDOM.flushSync(()=>{\n setActiveToasts((toasts)=>{\n const indexOfExistingToast = toasts.findIndex((t)=>t.id === toast.id);\n // Update the toast if it already exists\n if (indexOfExistingToast !== -1) {\n return [\n ...toasts.slice(0, indexOfExistingToast),\n {\n ...toasts[indexOfExistingToast],\n ...toast\n },\n ...toasts.slice(indexOfExistingToast + 1)\n ];\n }\n return [\n toast,\n ...toasts\n ];\n });\n });\n });\n });\n }, []);\n return {\n toasts: activeToasts\n };\n}\nconst Toaster = /*#__PURE__*/ React.forwardRef(function Toaster(props, ref) {\n const { id, invert, position = 'bottom-right', hotkey = [\n 'altKey',\n 'KeyT'\n ], expand, closeButton, className, offset, mobileOffset, theme = 'light', richColors, duration, style, visibleToasts = VISIBLE_TOASTS_AMOUNT, toastOptions, dir = getDocumentDirection(), gap = GAP, icons, containerAriaLabel = 'Notifications' } = props;\n const [toasts, setToasts] = React.useState([]);\n const filteredToasts = React.useMemo(()=>{\n if (id) {\n return toasts.filter((toast)=>toast.toasterId === id);\n }\n return toasts.filter((toast)=>!toast.toasterId);\n }, [\n toasts,\n id\n ]);\n const possiblePositions = React.useMemo(()=>{\n return Array.from(new Set([\n position\n ].concat(filteredToasts.filter((toast)=>toast.position).map((toast)=>toast.position))));\n }, [\n filteredToasts,\n position\n ]);\n const [heights, setHeights] = React.useState([]);\n const [expanded, setExpanded] = React.useState(false);\n const [interacting, setInteracting] = React.useState(false);\n const [actualTheme, setActualTheme] = React.useState(theme !== 'system' ? theme : typeof window !== 'undefined' ? window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' : 'light');\n const listRef = React.useRef(null);\n const hotkeyLabel = hotkey.join('+').replace(/Key/g, '').replace(/Digit/g, '');\n const lastFocusedElementRef = React.useRef(null);\n const isFocusWithinRef = React.useRef(false);\n const removeToast = React.useCallback((toastToRemove)=>{\n setToasts((toasts)=>{\n var _toasts_find;\n if (!((_toasts_find = toasts.find((toast)=>toast.id === toastToRemove.id)) == null ? void 0 : _toasts_find.delete)) {\n ToastState.dismiss(toastToRemove.id);\n }\n return toasts.filter(({ id })=>id !== toastToRemove.id);\n });\n }, []);\n React.useEffect(()=>{\n return ToastState.subscribe((toast)=>{\n if (toast.dismiss) {\n // Prevent batching of other state updates\n requestAnimationFrame(()=>{\n setToasts((toasts)=>toasts.map((t)=>t.id === toast.id ? {\n ...t,\n delete: true\n } : t));\n });\n return;\n }\n // Prevent batching, temp solution.\n setTimeout(()=>{\n ReactDOM.flushSync(()=>{\n setToasts((toasts)=>{\n const indexOfExistingToast = toasts.findIndex((t)=>t.id === toast.id);\n // Update the toast if it already exists\n if (indexOfExistingToast !== -1) {\n return [\n ...toasts.slice(0, indexOfExistingToast),\n {\n ...toasts[indexOfExistingToast],\n ...toast\n },\n ...toasts.slice(indexOfExistingToast + 1)\n ];\n }\n return [\n toast,\n ...toasts\n ];\n });\n });\n });\n });\n }, [\n toasts\n ]);\n React.useEffect(()=>{\n if (theme !== 'system') {\n setActualTheme(theme);\n return;\n }\n if (theme === 'system') {\n // check if current preference is dark\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n // it's currently dark\n setActualTheme('dark');\n } else {\n // it's not dark\n setActualTheme('light');\n }\n }\n if (typeof window === 'undefined') return;\n const darkMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n try {\n // Chrome & Firefox\n darkMediaQuery.addEventListener('change', ({ matches })=>{\n if (matches) {\n setActualTheme('dark');\n } else {\n setActualTheme('light');\n }\n });\n } catch (error) {\n // Safari < 14\n darkMediaQuery.addListener(({ matches })=>{\n try {\n if (matches) {\n setActualTheme('dark');\n } else {\n setActualTheme('light');\n }\n } catch (e) {\n console.error(e);\n }\n });\n }\n }, [\n theme\n ]);\n React.useEffect(()=>{\n // Ensure expanded is always false when no toasts are present / only one left\n if (toasts.length <= 1) {\n setExpanded(false);\n }\n }, [\n toasts\n ]);\n React.useEffect(()=>{\n const handleKeyDown = (event)=>{\n var _listRef_current;\n const isHotkeyPressed = hotkey.every((key)=>event[key] || event.code === key);\n if (isHotkeyPressed) {\n var _listRef_current1;\n setExpanded(true);\n (_listRef_current1 = listRef.current) == null ? void 0 : _listRef_current1.focus();\n }\n if (event.code === 'Escape' && (document.activeElement === listRef.current || ((_listRef_current = listRef.current) == null ? void 0 : _listRef_current.contains(document.activeElement)))) {\n setExpanded(false);\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return ()=>document.removeEventListener('keydown', handleKeyDown);\n }, [\n hotkey\n ]);\n React.useEffect(()=>{\n if (listRef.current) {\n return ()=>{\n if (lastFocusedElementRef.current) {\n lastFocusedElementRef.current.focus({\n preventScroll: true\n });\n lastFocusedElementRef.current = null;\n isFocusWithinRef.current = false;\n }\n };\n }\n }, [\n listRef.current\n ]);\n return(// Remove item from normal navigation flow, only available via hotkey\n /*#__PURE__*/ React.createElement(\"section\", {\n ref: ref,\n \"aria-label\": `${containerAriaLabel} ${hotkeyLabel}`,\n tabIndex: -1,\n \"aria-live\": \"polite\",\n \"aria-relevant\": \"additions text\",\n \"aria-atomic\": \"false\",\n suppressHydrationWarning: true\n }, possiblePositions.map((position, index)=>{\n var _heights_;\n const [y, x] = position.split('-');\n if (!filteredToasts.length) return null;\n return /*#__PURE__*/ React.createElement(\"ol\", {\n key: position,\n dir: dir === 'auto' ? getDocumentDirection() : dir,\n tabIndex: -1,\n ref: listRef,\n className: className,\n \"data-sonner-toaster\": true,\n \"data-sonner-theme\": actualTheme,\n \"data-y-position\": y,\n \"data-x-position\": x,\n style: {\n '--front-toast-height': `${((_heights_ = heights[0]) == null ? void 0 : _heights_.height) || 0}px`,\n '--width': `${TOAST_WIDTH}px`,\n '--gap': `${gap}px`,\n ...style,\n ...assignOffset(offset, mobileOffset)\n },\n onBlur: (event)=>{\n if (isFocusWithinRef.current && !event.currentTarget.contains(event.relatedTarget)) {\n isFocusWithinRef.current = false;\n if (lastFocusedElementRef.current) {\n lastFocusedElementRef.current.focus({\n preventScroll: true\n });\n lastFocusedElementRef.current = null;\n }\n }\n },\n onFocus: (event)=>{\n const isNotDismissible = event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';\n if (isNotDismissible) return;\n if (!isFocusWithinRef.current) {\n isFocusWithinRef.current = true;\n lastFocusedElementRef.current = event.relatedTarget;\n }\n },\n onMouseEnter: ()=>setExpanded(true),\n onMouseMove: ()=>setExpanded(true),\n onMouseLeave: ()=>{\n // Avoid setting expanded to false when interacting with a toast, e.g. swiping\n if (!interacting) {\n setExpanded(false);\n }\n },\n onDragEnd: ()=>setExpanded(false),\n onPointerDown: (event)=>{\n const isNotDismissible = event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';\n if (isNotDismissible) return;\n setInteracting(true);\n },\n onPointerUp: ()=>setInteracting(false)\n }, filteredToasts.filter((toast)=>!toast.position && index === 0 || toast.position === position).map((toast, index)=>{\n var _toastOptions_duration, _toastOptions_closeButton;\n return /*#__PURE__*/ React.createElement(Toast, {\n key: toast.id,\n icons: icons,\n index: index,\n toast: toast,\n defaultRichColors: richColors,\n duration: (_toastOptions_duration = toastOptions == null ? void 0 : toastOptions.duration) != null ? _toastOptions_duration : duration,\n className: toastOptions == null ? void 0 : toastOptions.className,\n descriptionClassName: toastOptions == null ? void 0 : toastOptions.descriptionClassName,\n invert: invert,\n visibleToasts: visibleToasts,\n closeButton: (_toastOptions_closeButton = toastOptions == null ? void 0 : toastOptions.closeButton) != null ? _toastOptions_closeButton : closeButton,\n interacting: interacting,\n position: position,\n style: toastOptions == null ? void 0 : toastOptions.style,\n unstyled: toastOptions == null ? void 0 : toastOptions.unstyled,\n classNames: toastOptions == null ? void 0 : toastOptions.classNames,\n cancelButtonStyle: toastOptions == null ? void 0 : toastOptions.cancelButtonStyle,\n actionButtonStyle: toastOptions == null ? void 0 : toastOptions.actionButtonStyle,\n closeButtonAriaLabel: toastOptions == null ? void 0 : toastOptions.closeButtonAriaLabel,\n removeToast: removeToast,\n toasts: filteredToasts.filter((t)=>t.position == toast.position),\n heights: heights.filter((h)=>h.position == toast.position),\n setHeights: setHeights,\n expandByDefault: expand,\n gap: gap,\n expanded: expanded,\n swipeDirections: props.swipeDirections\n });\n }));\n })));\n});\n\nexport { Toaster, toast, useSonner };\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { \n X, \n Link, \n Lock, \n Globe, \n Copy, \n Check, \n Loader2,\n Calendar,\n Eye,\n Trash2,\n ExternalLink,\n Pencil,\n} from 'lucide-react';\nimport { shareService } from '@/services/agent';\nimport type { SessionShareDTO, CreateShareRequest, UpdateShareRequest } from '@/types/agent';\nimport { toast } from 'sonner';\n\ninterface ShareModalProps {\n sessionId: string;\n sessionTitle?: string;\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport default function ShareModal({ sessionId, sessionTitle, isOpen, onClose }: ShareModalProps) {\n const [loading, setLoading] = useState(true);\n const [creating, setCreating] = useState(false);\n const [shares, setShares] = useState<SessionShareDTO[]>([]);\n const [copied, setCopied] = useState<string | null>(null);\n\n // 新建分享表单\n const [showCreateForm, setShowCreateForm] = useState(false);\n const [title, setTitle] = useState('');\n const [hasPassword, setHasPassword] = useState(false);\n const [password, setPassword] = useState('');\n const [expireDays, setExpireDays] = useState<number | null>(30);\n\n // 编辑状态\n const [editingShare, setEditingShare] = useState<SessionShareDTO | null>(null);\n const [editTitle, setEditTitle] = useState('');\n const [editHasPassword, setEditHasPassword] = useState(false);\n const [editPassword, setEditPassword] = useState('');\n const [editEnabled, setEditEnabled] = useState(true);\n const [updating, setUpdating] = useState(false);\n\n // 加载已有分享\n useEffect(() => {\n if (!isOpen || !sessionId) return;\n \n async function loadShares() {\n try {\n setLoading(true);\n console.log('[ShareModal] Loading shares for session:', sessionId);\n const res = await shareService.listBySession(sessionId);\n console.log('[ShareModal] API response:', res);\n if (res.success && res.data) {\n setShares(res.data);\n } else if (res.data) {\n // 兼容没有 success 字段的情况\n setShares(Array.isArray(res.data) ? res.data : []);\n } else {\n toast.error(res.msg || '加载分享失败');\n }\n } catch (err) {\n console.error('[ShareModal] Failed to load shares:', err);\n toast.error('加载分享失败');\n } finally {\n setLoading(false);\n }\n }\n\n loadShares();\n }, [isOpen, sessionId]);\n\n // 创建分享\n const handleCreate = async () => {\n if (hasPassword && !password.trim()) {\n toast.error('请输入密码');\n return;\n }\n\n try {\n setCreating(true);\n const req: CreateShareRequest = {\n sessionId,\n title: title.trim() || sessionTitle || '对话分享',\n accessType: hasPassword ? 'PASSWORD' : 'PUBLIC',\n password: hasPassword ? password : undefined,\n expireDays: expireDays || undefined,\n };\n\n const res = await shareService.create(req);\n if (res.success && res.data) {\n setShares(prev => [res.data!, ...prev]);\n setShowCreateForm(false);\n setTitle('');\n setPassword('');\n setHasPassword(false);\n toast.success('分享链接已创建');\n } else {\n toast.error(res.msg || '创建失败');\n }\n } catch (err: any) {\n toast.error(err.message || '创建失败');\n } finally {\n setCreating(false);\n }\n };\n\n // 删除分享\n const handleDelete = async (shareId: string) => {\n if (!confirm('确定要删除此分享链接吗?')) return;\n\n try {\n const res = await shareService.delete(shareId);\n if (res.success) {\n setShares(prev => prev.filter(s => s.shareId !== shareId));\n toast.success('已删除');\n } else {\n toast.error(res.msg || '删除失败');\n }\n } catch (err: any) {\n toast.error(err.message || '删除失败');\n }\n };\n\n // 开始编辑\n const handleStartEdit = (share: SessionShareDTO) => {\n setEditingShare(share);\n setEditTitle(share.title || '');\n setEditHasPassword(share.hasPassword || false);\n setEditPassword('');\n setEditEnabled(share.enabled !== 'N');\n };\n\n // 取消编辑\n const handleCancelEdit = () => {\n setEditingShare(null);\n setEditTitle('');\n setEditPassword('');\n setEditHasPassword(false);\n };\n\n // 保存编辑\n const handleSaveEdit = async () => {\n if (!editingShare) return;\n\n try {\n setUpdating(true);\n const req: UpdateShareRequest = {\n shareId: editingShare.shareId,\n title: editTitle.trim() || undefined,\n enabled: editEnabled ? 'Y' : 'N',\n };\n\n // 如果要设置新密码\n if (editHasPassword && editPassword.trim()) {\n req.password = editPassword;\n req.accessType = 'PASSWORD';\n } else if (!editHasPassword && editingShare.hasPassword) {\n // 取消密码保护\n req.accessType = 'PUBLIC';\n req.password = '';\n }\n\n const res = await shareService.update(req);\n if (res.success && res.data) {\n setShares(prev => prev.map(s => s.shareId === editingShare.shareId ? res.data! : s));\n setEditingShare(null);\n toast.success('已更新');\n } else {\n toast.error(res.msg || '更新失败');\n }\n } catch (err: any) {\n toast.error(err.message || '更新失败');\n } finally {\n setUpdating(false);\n }\n };\n\n // 复制链接\n const handleCopy = (shareId: string, url?: string) => {\n const link = `${window.location.origin}/comfy/share/${shareId}`;\n navigator.clipboard.writeText(link);\n setCopied(shareId);\n setTimeout(() => setCopied(null), 2000);\n toast.success('链接已复制');\n };\n\n // 打开分享页\n const handleOpen = (shareId: string) => {\n window.open(`/comfy/share/${shareId}`, '_blank');\n };\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* 遮罩 */}\n <div className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\" onClick={onClose} />\n \n {/* 弹窗 */}\n <div className=\"relative w-full max-w-lg bg-zinc-900 border border-zinc-800 rounded-xl shadow-2xl mx-4\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-zinc-800\">\n <h2 className=\"text-base font-medium text-white\">分享对话</h2>\n <button\n onClick={onClose}\n className=\"p-1 text-zinc-500 hover:text-white hover:bg-zinc-800 rounded-lg transition-colors\"\n >\n <X size={18} />\n </button>\n </div>\n\n {/* 内容 */}\n <div className=\"p-5 max-h-[60vh] overflow-y-auto\">\n {loading ? (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 className=\"w-6 h-6 animate-spin text-[#d8ff00]\" />\n </div>\n ) : (\n <>\n {/* 已有分享列表 */}\n {shares.length > 0 && (\n <div className=\"space-y-3 mb-5\">\n <div className=\"text-xs text-zinc-500 uppercase tracking-wide\">已创建的分享</div>\n {shares.map(share => (\n <div\n key={share.shareId}\n className=\"p-3 bg-zinc-800/50 border border-zinc-700/50 rounded-lg\"\n >\n {/* 编辑模式 */}\n {editingShare?.shareId === share.shareId ? (\n <div className=\"space-y-3\">\n <input\n type=\"text\"\n value={editTitle}\n onChange={(e) => setEditTitle(e.target.value)}\n placeholder=\"分享标题\"\n className=\"w-full px-3 py-2 bg-zinc-900 border border-zinc-700 rounded-lg text-sm text-white placeholder:text-zinc-600 focus:outline-none focus:border-zinc-600\"\n />\n <div className=\"flex items-center gap-4\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={editEnabled}\n onChange={(e) => setEditEnabled(e.target.checked)}\n className=\"w-4 h-4 rounded border-zinc-600 bg-zinc-800 text-[#d8ff00] focus:ring-0\"\n />\n <span className=\"text-sm text-zinc-300\">启用</span>\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={editHasPassword}\n onChange={(e) => setEditHasPassword(e.target.checked)}\n className=\"w-4 h-4 rounded border-zinc-600 bg-zinc-800 text-[#d8ff00] focus:ring-0\"\n />\n <span className=\"text-sm text-zinc-300\">\n {share.hasPassword ? '修改密码' : '添加密码'}\n </span>\n </label>\n </div>\n {editHasPassword && (\n <input\n type=\"text\"\n value={editPassword}\n onChange={(e) => setEditPassword(e.target.value)}\n placeholder={share.hasPassword ? '输入新密码(留空保持不变)' : '设置密码'}\n className=\"w-full px-3 py-2 bg-zinc-900 border border-zinc-700 rounded-lg text-sm text-white placeholder:text-zinc-600 focus:outline-none focus:border-zinc-600\"\n />\n )}\n <div className=\"flex gap-2\">\n <button\n onClick={handleCancelEdit}\n className=\"flex-1 py-1.5 text-xs text-zinc-400 hover:text-white bg-zinc-800 hover:bg-zinc-700 rounded-lg transition-colors\"\n >\n 取消\n </button>\n <button\n onClick={handleSaveEdit}\n disabled={updating}\n className=\"flex-1 py-1.5 text-xs text-black bg-[#d8ff00] hover:bg-[#c2e600] rounded-lg transition-colors disabled:opacity-50\"\n >\n {updating ? '保存中...' : '保存'}\n </button>\n </div>\n </div>\n ) : (\n /* 显示模式 */\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n {share.hasPassword ? (\n <Lock size={12} className=\"text-amber-400\" />\n ) : (\n <Globe size={12} className=\"text-green-400\" />\n )}\n <span className=\"text-sm text-white truncate\">\n {share.title || '对话分享'}\n </span>\n {share.enabled === 'N' && (\n <span className=\"text-[10px] text-red-400 bg-red-400/10 px-1.5 py-0.5 rounded\">\n 已禁用\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-3 text-[11px] text-zinc-500\">\n <span className=\"flex items-center gap-1\">\n <Calendar size={10} />\n {share.gmtCreate ? new Date(share.gmtCreate).toLocaleDateString() : '-'}\n </span>\n {share.expireTime && (\n <span>\n 过期: {new Date(share.expireTime).toLocaleDateString()}\n </span>\n )}\n {share.viewCount !== undefined && (\n <span className=\"flex items-center gap-1\">\n <Eye size={10} />\n {share.viewCount}\n </span>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => handleCopy(share.shareId, share.shareUrl)}\n className=\"p-1.5 text-zinc-400 hover:text-[#d8ff00] hover:bg-zinc-700 rounded transition-colors\"\n title=\"复制链接\"\n >\n {copied === share.shareId ? <Check size={14} /> : <Copy size={14} />}\n </button>\n <button\n onClick={() => handleOpen(share.shareId)}\n className=\"p-1.5 text-zinc-400 hover:text-white hover:bg-zinc-700 rounded transition-colors\"\n title=\"打开\"\n >\n <ExternalLink size={14} />\n </button>\n <button\n onClick={() => handleStartEdit(share)}\n className=\"p-1.5 text-zinc-400 hover:text-white hover:bg-zinc-700 rounded transition-colors\"\n title=\"编辑\"\n >\n <Pencil size={14} />\n </button>\n <button\n onClick={() => handleDelete(share.shareId)}\n className=\"p-1.5 text-zinc-400 hover:text-red-400 hover:bg-zinc-700 rounded transition-colors\"\n title=\"删除\"\n >\n <Trash2 size={14} />\n </button>\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* 创建新分享 */}\n {showCreateForm ? (\n <div className=\"space-y-4 p-4 bg-zinc-800/30 border border-zinc-700/50 rounded-lg\">\n <div className=\"text-xs text-zinc-500 uppercase tracking-wide\">创建新分享</div>\n \n {/* 标题 */}\n <div>\n <label className=\"block text-xs text-zinc-400 mb-1.5\">分享标题</label>\n <input\n type=\"text\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={sessionTitle || '对话分享'}\n className=\"w-full px-3 py-2 bg-zinc-900 border border-zinc-700 rounded-lg text-sm text-white placeholder:text-zinc-600 focus:outline-none focus:border-zinc-600\"\n />\n </div>\n\n {/* 密码保护 */}\n <div>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={hasPassword}\n onChange={(e) => setHasPassword(e.target.checked)}\n className=\"w-4 h-4 rounded border-zinc-600 bg-zinc-800 text-[#d8ff00] focus:ring-0 focus:ring-offset-0\"\n />\n <span className=\"text-sm text-zinc-300\">密码保护</span>\n </label>\n {hasPassword && (\n <input\n type=\"text\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"设置访问密码\"\n className=\"w-full mt-2 px-3 py-2 bg-zinc-900 border border-zinc-700 rounded-lg text-sm text-white placeholder:text-zinc-600 focus:outline-none focus:border-zinc-600\"\n />\n )}\n </div>\n\n {/* 过期时间 */}\n <div>\n <label className=\"block text-xs text-zinc-400 mb-1.5\">有效期</label>\n <select\n value={expireDays ?? ''}\n onChange={(e) => setExpireDays(e.target.value ? Number(e.target.value) : null)}\n className=\"w-full px-3 py-2 bg-zinc-900 border border-zinc-700 rounded-lg text-sm text-white focus:outline-none focus:border-zinc-600\"\n >\n <option value=\"7\">7 天</option>\n <option value=\"30\">30 天</option>\n <option value=\"90\">90 天</option>\n <option value=\"\">永久有效</option>\n </select>\n </div>\n\n {/* 按钮 */}\n <div className=\"flex gap-2\">\n <button\n onClick={() => setShowCreateForm(false)}\n className=\"flex-1 py-2 text-sm text-zinc-400 hover:text-white bg-zinc-800 hover:bg-zinc-700 rounded-lg transition-colors\"\n >\n 取消\n </button>\n <button\n onClick={handleCreate}\n disabled={creating}\n className=\"flex-1 py-2 text-sm text-black bg-[#d8ff00] hover:bg-[#c2e600] rounded-lg transition-colors disabled:opacity-50\"\n >\n {creating ? '创建中...' : '创建链接'}\n </button>\n </div>\n </div>\n ) : (\n <button\n onClick={() => setShowCreateForm(true)}\n className=\"w-full flex items-center justify-center gap-2 py-3 text-sm text-zinc-300 bg-zinc-800/50 hover:bg-zinc-800 border border-zinc-700/50 hover:border-zinc-700 rounded-lg transition-colors\"\n >\n <Link size={16} />\n 创建新的分享链接\n </button>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { \n Dialog, \n DialogContent, \n DialogHeader, \n DialogTitle, \n DialogDescription, \n DialogFooter \n} from './ui/dialog';\nimport { Button } from './ui/button';\nimport { Textarea } from './ui/textarea';\nimport { Badge } from './ui/badge';\nimport { \n Save, \n X, \n Loader2, \n AlertCircle,\n Eye,\n EyeOff,\n Tag,\n Folder\n} from 'lucide-react';\nimport type { PromptTemplate, KnowledgeVisibility } from '@/types/agent';\n\ninterface SaveTemplateDialogProps {\n isOpen: boolean;\n originalContent: string;\n onSave: (template: Omit<PromptTemplate, 'publicId' | 'gmtCreate' | 'gmtModified'>) => void;\n onCancel: () => void;\n isSaving?: boolean;\n}\n\nconst CATEGORIES = [\n '写作',\n '翻译',\n '代码',\n '分析',\n '总结',\n '邮件',\n '商务',\n '学习',\n '创意',\n '其他'\n];\n\nconst VISIBILITY_OPTIONS = [\n { value: 'PRIVATE' as KnowledgeVisibility, label: '私有', icon: EyeOff, description: '仅自己可见' },\n { value: 'TEAM' as KnowledgeVisibility, label: '团队', icon: Folder, description: '团队成员可见' },\n { value: 'PUBLIC' as KnowledgeVisibility, label: '公开', icon: Eye, description: '所有人可见' }\n];\n\n// 提取模板中的变量 {{variable}}\nconst extractVariables = (content: string): string[] => {\n const regex = /\\{\\{([^}]+)\\}\\}/g;\n const variables: string[] = [];\n let match;\n while ((match = regex.exec(content)) !== null) {\n const varName = match[1].trim();\n if (!variables.includes(varName)) {\n variables.push(varName);\n }\n }\n return variables;\n};\n\nconst SaveTemplateDialog: React.FC<SaveTemplateDialogProps> = ({\n isOpen,\n originalContent,\n onSave,\n onCancel,\n isSaving = false\n}) => {\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [content, setContent] = useState(originalContent);\n const [category, setCategory] = useState<string>('其他');\n const [visibility, setVisibility] = useState<KnowledgeVisibility>('PRIVATE');\n const [variables, setVariables] = useState<string[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n // 当原始内容变化时,更新内容和重新检测变量\n useEffect(() => {\n setContent(originalContent);\n }, [originalContent]);\n\n useEffect(() => {\n const detectedVars = extractVariables(content);\n setVariables(detectedVars);\n }, [content]);\n\n const handleSave = () => {\n if (!name.trim()) {\n setError('请输入模板名称');\n return;\n }\n if (!content.trim()) {\n setError('请输入模板内容');\n return;\n }\n setError(null);\n\n const template: Omit<PromptTemplate, 'publicId' | 'gmtCreate' | 'gmtModified'> = {\n name: name.trim(),\n description: description.trim() || undefined,\n content: content.trim(),\n category: category === '其他' ? undefined : category,\n visibility,\n variables: variables.length > 0 ? variables.reduce((acc, varName) => {\n acc[varName] = {\n type: 'string',\n description: `${varName} 变量`,\n required: true\n };\n return acc;\n }, {} as Record<string, any>) : undefined\n };\n\n onSave(template);\n };\n\n const handleCancel = () => {\n setName('');\n setDescription('');\n setContent(originalContent);\n setCategory('其他');\n setVisibility('PRIVATE');\n setError(null);\n onCancel();\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleCancel()}>\n <DialogContent className=\"max-w-2xl bg-zinc-900 border-zinc-800 text-white\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2 text-lg\">\n <Save className=\"w-5 h-5 text-[#d8ff00]\" />\n 保存为提示词模板\n </DialogTitle>\n <DialogDescription className=\"text-zinc-400\">\n 将当前消息内容保存为可复用的提示词模板,支持变量替换\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 py-4\">\n {/* 原始内容预览 */}\n <div className=\"p-3 rounded-lg bg-zinc-800/50 border border-zinc-700\">\n <div className=\"text-xs text-zinc-500 mb-2\">原始内容</div>\n <p className=\"text-sm text-zinc-300 whitespace-pre-wrap break-words\">\n {originalContent}\n </p>\n </div>\n\n {/* 模板名称 */}\n <div>\n <label className=\"block text-sm font-medium text-zinc-300 mb-2\">\n 模板名称 <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n if (error) setError(null);\n }}\n placeholder=\"例如:写一封商务邮件\"\n className=\"w-full px-3 py-2 bg-zinc-800 border border-zinc-700 rounded-lg text-sm text-white placeholder:text-zinc-600 focus:outline-none focus:border-[#d8ff00] focus:ring-1 focus:ring-[#d8ff00]\"\n />\n </div>\n\n {/* 模板描述 */}\n <div>\n <label className=\"block text-sm font-medium text-zinc-300 mb-2\">\n 模板描述\n </label>\n <Textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"简要描述模板的用途...\"\n rows={2}\n theme=\"dark\"\n className=\"w-full resize-none bg-zinc-800 border-zinc-700 text-white placeholder:text-zinc-600 focus:border-[#d8ff00] focus:ring-1 focus:ring-[#d8ff00]\"\n />\n </div>\n\n {/* 模板内容 */}\n <div>\n <label className=\"block text-sm font-medium text-zinc-300 mb-2\">\n 模板内容 <span className=\"text-red-500\">*</span>\n </label>\n <Textarea\n value={content}\n onChange={(e) => {\n setContent(e.target.value);\n if (error) setError(null);\n }}\n placeholder=\"使用 {{变量名}} 来标记可替换的变量...\"\n rows={6}\n theme=\"dark\"\n className=\"w-full resize-none bg-zinc-800 border-zinc-700 text-white placeholder:text-zinc-600 focus:border-[#d8ff00] focus:ring-1 focus:ring-[#d8ff00]\"\n />\n {variables.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-2\">\n <span className=\"text-xs text-zinc-500\">检测到的变量:</span>\n {variables.map((variable) => (\n <Badge key={variable} className=\"bg-[#d8ff00]/10 text-[#d8ff00] border-[#d8ff00]/30\">\n <Tag className=\"w-3 h-3 mr-1\" />\n {variable}\n </Badge>\n ))}\n </div>\n )}\n </div>\n\n {/* 分类和可见性 */}\n <div className=\"grid grid-cols-2 gap-4\">\n {/* 分类 */}\n <div>\n <label className=\"block text-sm font-medium text-zinc-300 mb-2\">\n <Folder className=\"w-4 h-4 inline mr-1\" />\n 分类\n </label>\n <select\n value={category}\n onChange={(e) => setCategory(e.target.value)}\n className=\"w-full px-3 py-2 bg-zinc-800 border border-zinc-700 rounded-lg text-sm text-white focus:outline-none focus:border-[#d8ff00] focus:ring-1 focus:ring-[#d8ff00]\"\n >\n {CATEGORIES.map((cat) => (\n <option key={cat} value={cat}>\n {cat}\n </option>\n ))}\n </select>\n </div>\n\n {/* 可见性 */}\n <div>\n <label className=\"block text-sm font-medium text-zinc-300 mb-2\">\n 可见性\n </label>\n <select\n value={visibility}\n onChange={(e) => setVisibility(e.target.value as KnowledgeVisibility)}\n className=\"w-full px-3 py-2 bg-zinc-800 border border-zinc-700 rounded-lg text-sm text-white focus:outline-none focus:border-[#d8ff00] focus:ring-1 focus:ring-[#d8ff00]\"\n >\n {VISIBILITY_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label} - {option.description}\n </option>\n ))}\n </select>\n </div>\n </div>\n\n {/* 错误提示 */}\n {error && (\n <div className=\"flex items-center gap-2 text-sm text-red-400 bg-red-500/10 border border-red-500/30 rounded-lg p-3\">\n <AlertCircle size={16} />\n {error}\n </div>\n )}\n </div>\n\n <DialogFooter>\n <Button \n variant=\"outline\" \n onClick={handleCancel}\n disabled={isSaving}\n className=\"border-zinc-700 text-zinc-300 hover:bg-zinc-800 hover:text-white\"\n >\n <X className=\"w-4 h-4 mr-2\" />\n 取消\n </Button>\n \n <Button \n onClick={handleSave}\n disabled={isSaving || !name.trim() || !content.trim()}\n className=\"bg-[#d8ff00] text-black hover:bg-[#d8ff00]/90\"\n >\n {isSaving ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n 保存中...\n </>\n ) : (\n <>\n <Save className=\"w-4 h-4 mr-2\" />\n 保存模板\n </>\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default SaveTemplateDialog;\n","'use client';\n\nimport React, { useState } from 'react';\nimport { \n Dialog, \n DialogContent, \n DialogHeader, \n DialogTitle, \n DialogDescription, \n DialogFooter \n} from './ui/dialog';\nimport { Button } from './ui/button';\nimport { Textarea } from './ui/textarea';\nimport { Badge } from './ui/badge';\nimport { \n Save, \n X, \n Loader2, \n AlertCircle,\n FileText,\n ArrowRight,\n FileEdit\n} from 'lucide-react';\nimport type { PromptTemplate } from '@/types/agent';\n\ninterface UpdateTemplateDialogProps {\n isOpen: boolean;\n originalTemplate: PromptTemplate;\n newContent: string;\n onUpdate: (changeDescription: string) => void;\n onSaveAsNew: () => void;\n onCancel: () => void;\n isUpdating?: boolean;\n}\n\nconst UpdateTemplateDialog: React.FC<UpdateTemplateDialogProps> = ({\n isOpen,\n originalTemplate,\n newContent,\n onUpdate,\n onSaveAsNew,\n onCancel,\n isUpdating = false\n}) => {\n const [changeDescription, setChangeDescription] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const handleUpdate = () => {\n if (!changeDescription.trim()) {\n setError('请输入变更说明');\n return;\n }\n setError(null);\n onUpdate(changeDescription.trim());\n };\n\n const handleCancel = () => {\n setChangeDescription('');\n setError(null);\n onCancel();\n };\n\n const handleSaveAsNew = () => {\n setChangeDescription('');\n setError(null);\n onSaveAsNew();\n };\n\n // 高亮差异的简单实现\n const highlightChanges = (original: string, updated: string) => {\n return (\n <div className=\"space-y-3\">\n {/* 原内容 */}\n <div className=\"p-3 rounded-lg bg-zinc-800/50 border border-zinc-700\">\n <div className=\"flex items-center gap-2 mb-2\">\n <FileText className=\"w-4 h-4 text-zinc-500\" />\n <span className=\"text-xs text-zinc-500\">原模板内容</span>\n </div>\n <p className=\"text-sm text-zinc-300 whitespace-pre-wrap break-words\">\n {original}\n </p>\n </div>\n\n {/* 箭头 */}\n <div className=\"flex justify-center\">\n <ArrowRight className=\"w-5 h-5 text-[#d8ff00]\" />\n </div>\n\n {/* 新内容 */}\n <div className=\"p-3 rounded-lg bg-zinc-800/50 border border-[#d8ff00]/30\">\n <div className=\"flex items-center gap-2 mb-2\">\n <FileEdit className=\"w-4 h-4 text-[#d8ff00]\" />\n <span className=\"text-xs text-[#d8ff00]\">新模板内容</span>\n </div>\n <p className=\"text-sm text-zinc-300 whitespace-pre-wrap break-words\">\n {updated}\n </p>\n </div>\n </div>\n );\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleCancel()}>\n <DialogContent className=\"max-w-2xl bg-zinc-900 border-zinc-800 text-white\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2 text-lg\">\n <FileEdit className=\"w-5 h-5 text-[#d8ff00]\" />\n 更新提示词模板\n </DialogTitle>\n <DialogDescription className=\"text-zinc-400\">\n 模板:{originalTemplate.name}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 py-4\">\n {/* 内容对比 */}\n <div className=\"p-4 rounded-lg bg-zinc-800/30 border border-zinc-700/50\">\n <div className=\"text-xs text-zinc-500 mb-3 uppercase tracking-wide\">内容对比</div>\n {highlightChanges(originalTemplate.content, newContent)}\n </div>\n\n {/* 变更说明 */}\n <div>\n <label className=\"block text-sm font-medium text-zinc-300 mb-2\">\n 变更说明 <span className=\"text-red-500\">*</span>\n </label>\n <Textarea\n value={changeDescription}\n onChange={(e) => {\n setChangeDescription(e.target.value);\n if (error) setError(null);\n }}\n placeholder=\"请说明本次更新的原因和内容...\"\n rows={3}\n theme=\"dark\"\n className=\"w-full resize-none bg-zinc-800 border-zinc-700 text-white placeholder:text-zinc-600 focus:border-[#d8ff00] focus:ring-1 focus:ring-[#d8ff00]\"\n />\n </div>\n\n {/* 错误提示 */}\n {error && (\n <div className=\"flex items-center gap-2 text-sm text-red-400 bg-red-500/10 border border-red-500/30 rounded-lg p-3\">\n <AlertCircle size={16} />\n {error}\n </div>\n )}\n\n {/* 提示信息 */}\n <div className=\"flex items-start gap-2 text-xs text-zinc-500 bg-zinc-800/30 border border-zinc-700/50 rounded-lg p-3\">\n <AlertCircle size={14} className=\"mt-0.5 flex-shrink-0\" />\n <div className=\"space-y-1\">\n <p>• 更新模板将直接修改原模板内容,所有引用该模板的消息都会受到影响</p>\n <p>• 如需保留原模板,请使用\"另存为新模板\"</p>\n </div>\n </div>\n </div>\n\n <DialogFooter className=\"flex-col sm:flex-row gap-2\">\n <div className=\"flex flex-col-reverse sm:flex-row gap-2 w-full sm:w-auto\">\n <Button \n variant=\"outline\" \n onClick={handleCancel}\n disabled={isUpdating}\n className=\"flex-1 sm:flex-none border-zinc-700 text-zinc-300 hover:bg-zinc-800 hover:text-white\"\n >\n <X className=\"w-4 h-4 mr-2\" />\n 取消\n </Button>\n \n <Button \n variant=\"outline\"\n onClick={handleSaveAsNew}\n disabled={isUpdating}\n className=\"flex-1 sm:flex-none border-[#d8ff00]/50 text-[#d8ff00] hover:bg-[#d8ff00]/10\"\n >\n <Save className=\"w-4 h-4 mr-2\" />\n 另存为新模板\n </Button>\n </div>\n \n <Button \n onClick={handleUpdate}\n disabled={isUpdating || !changeDescription.trim()}\n className=\"w-full sm:w-auto bg-[#d8ff00] text-black hover:bg-[#d8ff00]/90\"\n >\n {isUpdating ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n 更新中...\n </>\n ) : (\n <>\n <FileEdit className=\"w-4 h-4 mr-2\" />\n 更新模板\n </>\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default UpdateTemplateDialog;\n","'use client';\n\nimport React, { useState } from 'react';\nimport { Badge } from './ui/badge';\nimport { \n BookOpen, \n Edit, \n Save,\n ChevronDown,\n ChevronUp\n} from 'lucide-react';\nimport type { PromptTemplate } from '@/types/agent';\n\ninterface TemplateSourceBadgeProps {\n template: PromptTemplate;\n onUpdateTemplate?: () => void;\n onSaveAsNewTemplate?: () => void;\n}\n\nconst TemplateSourceBadge: React.FC<TemplateSourceBadgeProps> = ({\n template,\n onUpdateTemplate,\n onSaveAsNewTemplate\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n\n if (!template) return null;\n\n return (\n <div className=\"mt-2\">\n {/* 模板来源标识 */}\n <div \n className=\"inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-zinc-800/50 border border-zinc-700/50 hover:border-[#d8ff00]/50 transition-colors cursor-pointer group\"\n onClick={() => setIsExpanded(!isExpanded)}\n >\n <BookOpen className=\"w-3.5 h-3.5 text-[#d8ff00]\" />\n <span className=\"text-xs text-zinc-300\">\n 来自模板:<span className=\"text-[#d8ff00] font-medium\">{template.name}</span>\n </span>\n {isExpanded ? (\n <ChevronUp className=\"w-3.5 h-3.5 text-zinc-500\" />\n ) : (\n <ChevronDown className=\"w-3.5 h-3.5 text-zinc-500\" />\n )}\n </div>\n\n {/* 展开操作按钮 */}\n {isExpanded && (\n <div className=\"mt-2 flex items-center gap-2 pl-1\">\n {/* 更新模板按钮 */}\n {onUpdateTemplate && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onUpdateTemplate();\n }}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md bg-zinc-800/50 border border-zinc-700/50 hover:border-[#d8ff00]/50 hover:bg-zinc-800 transition-all text-xs text-zinc-300 hover:text-[#d8ff00]\"\n >\n <Edit className=\"w-3 h-3\" />\n 更新模板\n </button>\n )}\n\n {/* 另存为新模板按钮 */}\n {onSaveAsNewTemplate && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onSaveAsNewTemplate();\n }}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md bg-zinc-800/50 border border-zinc-700/50 hover:border-[#d8ff00]/50 hover:bg-zinc-800 transition-all text-xs text-zinc-300 hover:text-[#d8ff00]\"\n >\n <Save className=\"w-3 h-3\" />\n 另存为新模板\n </button>\n )}\n </div>\n )}\n\n {/* 模板描述(可选显示) */}\n {isExpanded && template.description && (\n <div className=\"mt-2 pl-1\">\n <p className=\"text-xs text-zinc-500 italic\">\n {template.description}\n </p>\n </div>\n )}\n\n {/* 分类和标签(可选显示) */}\n {isExpanded && (template.category || (template.tags && template.tags.length > 0)) && (\n <div className=\"mt-2 pl-1 flex items-center gap-2 flex-wrap\">\n {template.category && (\n <Badge className=\"bg-zinc-800 text-zinc-400 border-zinc-700 text-xs\">\n {template.category}\n </Badge>\n )}\n {template.tags && template.tags.map((tag) => (\n <Badge key={tag} className=\"bg-zinc-800 text-zinc-400 border-zinc-700 text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default TemplateSourceBadge;\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { \n X, \n Search, \n BookOpen, \n Clock, \n User, \n Globe,\n Tag,\n Loader2,\n Sparkles,\n} from 'lucide-react';\nimport { templateService } from '@/services/template';\nimport type { PromptTemplateWithArrayVars } from '@/types/template';\nimport { toast } from 'sonner';\n\ninterface TemplateSelectorProps {\n isOpen: boolean;\n onClose: () => void;\n onSelectTemplate: (template: PromptTemplateWithArrayVars) => void;\n}\n\ntype TabType = 'recent' | 'mine' | 'public';\n\nconst TemplateSelector: React.FC<TemplateSelectorProps> = ({ isOpen, onClose, onSelectTemplate }) => {\n const [activeTab, setActiveTab] = useState<TabType>('recent');\n const [searchKeyword, setSearchKeyword] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<string>('');\n const [loading, setLoading] = useState(false);\n const [templates, setTemplates] = useState<PromptTemplateWithArrayVars[]>([]);\n const [categories, setCategories] = useState<string[]>([]);\n\n // 加载模板列表\n const loadTemplates = async () => {\n try {\n setLoading(true);\n let res;\n \n if (activeTab === 'recent') {\n res = await templateService.getRecent(10);\n } else if (activeTab === 'mine') {\n res = await templateService.getMine({ pageNo: 1, pageSize: 20 });\n } else {\n res = await templateService.getPublic({ pageNo: 1, pageSize: 20 });\n }\n\n if (res.success && res.data) {\n const list = Array.isArray(res.data) ? res.data : res.data.list || [];\n setTemplates(list);\n \n // 提取分类\n const uniqueCategories = Array.from(\n new Set(list.map(t => t.category).filter(Boolean))\n ) as string[];\n setCategories(uniqueCategories);\n } else {\n toast.error(res.msg || '加载模板失败');\n }\n } catch (err) {\n console.error('[TemplateSelector] Failed to load templates:', err);\n toast.error('加载模板失败');\n } finally {\n setLoading(false);\n }\n };\n\n // 搜索模板\n const searchTemplates = async () => {\n if (!searchKeyword.trim()) {\n loadTemplates();\n return;\n }\n\n try {\n setLoading(true);\n const res = await templateService.list({\n scope: activeTab === 'mine' ? 'MINE' : 'PUBLIC',\n keyword: searchKeyword,\n category: selectedCategory || undefined,\n pageNo: 1,\n pageSize: 20,\n });\n\n if (res.success && res.data) {\n setTemplates(res.data.list || []);\n } else {\n toast.error(res.msg || '搜索失败');\n }\n } catch (err) {\n console.error('[TemplateSelector] Failed to search templates:', err);\n toast.error('搜索失败');\n } finally {\n setLoading(false);\n }\n };\n\n // 切换 Tab 时重新加载\n useEffect(() => {\n if (isOpen) {\n setSearchKeyword('');\n setSelectedCategory('');\n loadTemplates();\n }\n }, [isOpen, activeTab]);\n\n // 搜索防抖\n useEffect(() => {\n const timer = setTimeout(() => {\n if (searchKeyword.trim()) {\n searchTemplates();\n }\n }, 500);\n return () => clearTimeout(timer);\n }, [searchKeyword, selectedCategory]);\n\n const handleSelectTemplate = (template: PromptTemplateWithArrayVars) => {\n onSelectTemplate(template);\n onClose();\n };\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* 遮罩 */}\n <div className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\" onClick={onClose} />\n \n {/* 弹窗 */}\n <div className=\"relative w-full max-w-3xl bg-zinc-900 border border-zinc-800 rounded-xl shadow-2xl mx-4 flex flex-col max-h-[80vh]\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-zinc-800\">\n <h2 className=\"text-base font-medium text-white flex items-center gap-2\">\n <BookOpen className=\"w-5 h-5 text-[#d8ff00]\" />\n 提示词模板\n </h2>\n <button\n onClick={onClose}\n className=\"p-1 text-zinc-500 hover:text-white hover:bg-zinc-800 rounded-lg transition-colors\"\n >\n <X size={18} />\n </button>\n </div>\n\n {/* 搜索和筛选 */}\n <div className=\"px-5 py-4 border-b border-zinc-800 space-y-3\">\n {/* 搜索框 */}\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-zinc-500\" />\n <input\n type=\"text\"\n value={searchKeyword}\n onChange={(e) => setSearchKeyword(e.target.value)}\n placeholder=\"搜索模板名称或描述...\"\n className=\"w-full pl-10 pr-4 py-2 bg-zinc-800 border border-zinc-700 rounded-lg text-sm text-white placeholder:text-zinc-500 focus:outline-none focus:border-[#d8ff00]\"\n />\n </div>\n\n {/* 分类筛选 */}\n {categories.length > 0 && (\n <div className=\"flex items-center gap-2 flex-wrap\">\n <Tag className=\"w-4 h-4 text-zinc-500\" />\n <button\n onClick={() => setSelectedCategory('')}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n !selectedCategory\n ? 'bg-[#d8ff00] text-black font-medium'\n : 'bg-zinc-800 text-zinc-400 hover:bg-zinc-700'\n }`}\n >\n 全部\n </button>\n {categories.map((cat) => (\n <button\n key={cat}\n onClick={() => setSelectedCategory(cat)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n selectedCategory === cat\n ? 'bg-[#d8ff00] text-black font-medium'\n : 'bg-zinc-800 text-zinc-400 hover:bg-zinc-700'\n }`}\n >\n {cat}\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Tab 切换 */}\n <div className=\"flex items-center px-5 py-3 border-b border-zinc-800 gap-1\">\n <button\n onClick={() => setActiveTab('recent')}\n className={`flex items-center gap-2 px-4 py-2 text-sm rounded-lg transition-colors ${\n activeTab === 'recent'\n ? 'bg-zinc-800 text-white'\n : 'text-zinc-400 hover:text-white hover:bg-zinc-800/50'\n }`}\n >\n <Clock className=\"w-4 h-4\" />\n 最近使用\n </button>\n <button\n onClick={() => setActiveTab('mine')}\n className={`flex items-center gap-2 px-4 py-2 text-sm rounded-lg transition-colors ${\n activeTab === 'mine'\n ? 'bg-zinc-800 text-white'\n : 'text-zinc-400 hover:text-white hover:bg-zinc-800/50'\n }`}\n >\n <User className=\"w-4 h-4\" />\n 我的模板\n </button>\n <button\n onClick={() => setActiveTab('public')}\n className={`flex items-center gap-2 px-4 py-2 text-sm rounded-lg transition-colors ${\n activeTab === 'public'\n ? 'bg-zinc-800 text-white'\n : 'text-zinc-400 hover:text-white hover:bg-zinc-800/50'\n }`}\n >\n <Globe className=\"w-4 h-4\" />\n 公开模板\n </button>\n </div>\n\n {/* 模板列表 */}\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">\n {loading ? (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"w-6 h-6 animate-spin text-[#d8ff00]\" />\n </div>\n ) : templates.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-zinc-500\">\n <BookOpen className=\"w-12 h-12 mb-3 opacity-50\" />\n <p className=\"text-sm\">暂无模板</p>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n {templates.map((template) => (\n <button\n key={template.publicId}\n onClick={() => handleSelectTemplate(template)}\n className=\"text-left p-4 bg-zinc-800/50 border border-zinc-700/50 rounded-lg hover:border-[#d8ff00] hover:bg-zinc-800 transition-all group\"\n >\n <div className=\"flex items-start justify-between gap-3 mb-2\">\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-sm font-medium text-white truncate group-hover:text-[#d8ff00] transition-colors\">\n {template.name}\n </h3>\n {template.category && (\n <span className=\"inline-block mt-1 px-2 py-0.5 text-xs bg-zinc-700 text-zinc-400 rounded\">\n {template.category}\n </span>\n )}\n </div>\n {template.icon && (\n <img src={template.icon} alt=\"\" className=\"w-8 h-8 rounded-lg flex-shrink-0\" />\n )}\n </div>\n {template.description && (\n <p className=\"text-xs text-zinc-400 line-clamp-2 mb-2\">\n {template.description}\n </p>\n )}\n <div className=\"flex items-center gap-3 text-xs text-zinc-500\">\n <span className=\"flex items-center gap-1\">\n <Sparkles className=\"w-3 h-3\" />\n {template.usageCount || 0} 次使用\n </span>\n {template.tags && template.tags.length > 0 && (\n <div className=\"flex items-center gap-1\">\n {template.tags.slice(0, 2).map((tag) => (\n <span key={tag} className=\"text-zinc-600\">\n #{tag}\n </span>\n ))}\n {template.tags.length > 2 && <span>+{template.tags.length - 2}</span>}\n </div>\n )}\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* 底部 */}\n <div className=\"px-5 py-4 border-t border-zinc-800\">\n <p className=\"text-xs text-zinc-500 text-center\">\n 选择模板后,填写变量即可快速生成提示词\n </p>\n </div>\n </div>\n </div>\n );\n};\n\nexport default TemplateSelector;\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { \n X, \n Send, \n Eye, \n EyeOff,\n Loader2,\n AlertCircle,\n CheckCircle2,\n} from 'lucide-react';\nimport { templateService } from '@/services/template';\nimport type { PromptTemplateWithArrayVars, VariableDefinitionArray } from '@/types/template';\nimport type { IncrementUsageRequest } from '@/types/template';\nimport { toast } from 'sonner';\n\ninterface TemplateVariableDialogProps {\n template: PromptTemplateWithArrayVars | null;\n isOpen: boolean;\n onSend: (content: string) => void;\n onClose: () => void;\n}\n\nconst TemplateVariableDialog: React.FC<TemplateVariableDialogProps> = ({ \n template, \n isOpen, \n onSend, \n onClose \n}) => {\n const [formValues, setFormValues] = useState<Record<string, any>>({});\n const [formErrors, setFormErrors] = useState<Record<string, string>>({});\n const [isSending, setIsSending] = useState(false);\n const [showPreview, setShowPreview] = useState(true);\n\n // 初始化表单值\n useEffect(() => {\n if (template && template.variables) {\n const initialValues: Record<string, any> = {};\n template.variables.forEach((variable) => {\n if (variable.defaultValue !== undefined) {\n initialValues[variable.name] = variable.defaultValue;\n } else {\n // 根据类型设置默认值\n switch (variable.type) {\n case 'boolean':\n initialValues[variable.name] = false;\n break;\n case 'number':\n initialValues[variable.name] = 0;\n break;\n default:\n initialValues[variable.name] = '';\n }\n }\n });\n setFormValues(initialValues);\n setFormErrors({});\n }\n }, [template]);\n\n if (!template || !isOpen) return null;\n\n // 生成预览内容\n const generatePreview = (): string => {\n let content = template.content;\n \n if (template.variables) {\n template.variables.forEach((variable) => {\n const value = formValues[variable.name];\n const placeholder = `{{${variable.name}}}`;\n \n if (value !== undefined && value !== null && value !== '') {\n content = content.replace(new RegExp(placeholder, 'g'), String(value));\n } else {\n // 如果值为空,保留占位符\n content = content.replace(new RegExp(placeholder, 'g'), `[${variable.label}]`);\n }\n });\n }\n \n return content;\n };\n\n // 验证表单\n const validateForm = (): boolean => {\n const errors: Record<string, string> = {};\n \n if (template.variables) {\n template.variables.forEach((variable) => {\n const value = formValues[variable.name];\n \n // 必填验证\n if (variable.required && (value === undefined || value === null || value === '')) {\n errors[variable.name] = `${variable.label}不能为空`;\n }\n \n // 类型验证\n if (value !== undefined && value !== null && value !== '') {\n switch (variable.type) {\n case 'number':\n if (isNaN(Number(value))) {\n errors[variable.name] = `${variable.label}必须是数字`;\n } else {\n const numValue = Number(value);\n if (variable.min !== undefined && numValue < variable.min) {\n errors[variable.name] = `${variable.label}不能小于 ${variable.min}`;\n }\n if (variable.max !== undefined && numValue > variable.max) {\n errors[variable.name] = `${variable.label}不能大于 ${variable.max}`;\n }\n }\n break;\n case 'string':\n case 'textarea':\n if (variable.maxLength && String(value).length > variable.maxLength) {\n errors[variable.name] = `${variable.label}不能超过 ${variable.maxLength} 个字符`;\n }\n break;\n }\n }\n });\n }\n \n setFormErrors(errors);\n return Object.keys(errors).length === 0;\n };\n\n // 处理提交\n const handleSubmit = async () => {\n if (!validateForm()) {\n toast.error('请检查表单填写是否正确');\n return;\n }\n\n const content = generatePreview();\n \n try {\n setIsSending(true);\n \n // 增加使用次数\n if (template.publicId) {\n await templateService.incrementUsage({ publicId: template.publicId });\n }\n \n onSend(content);\n onClose();\n \n // 重置表单\n setFormValues({});\n setFormErrors({});\n } catch (err) {\n console.error('[TemplateVariableDialog] Failed to send:', err);\n toast.error('发送失败');\n } finally {\n setIsSending(false);\n }\n };\n\n // 渲染表单字段\n const renderFormField = (variable: VariableDefinitionArray) => {\n const error = formErrors[variable.name];\n const value = formValues[variable.name];\n\n switch (variable.type) {\n case 'string':\n return (\n <div key={variable.name} className=\"space-y-2\">\n <label className=\"block text-sm font-medium text-zinc-300\">\n {variable.label}\n {variable.required && <span className=\"text-red-400 ml-1\">*</span>}\n </label>\n <input\n type=\"text\"\n value={value || ''}\n onChange={(e) => {\n setFormValues(prev => ({ ...prev, [variable.name]: e.target.value }));\n if (error) setFormErrors(prev => ({ ...prev, [variable.name]: '' }));\n }}\n placeholder={variable.placeholder || `请输入${variable.label}`}\n maxLength={variable.maxLength}\n className={`w-full px-3 py-2 bg-zinc-800 border rounded-lg text-sm text-white placeholder:text-zinc-600 focus:outline-none focus:border-[#d8ff00] transition-colors ${\n error ? 'border-red-500 focus:border-red-500' : 'border-zinc-700'\n }`}\n />\n {variable.description && (\n <p className=\"text-xs text-zinc-500\">{variable.description}</p>\n )}\n {error && (\n <p className=\"text-xs text-red-400 flex items-center gap-1\">\n <AlertCircle size={12} />\n {error}\n </p>\n )}\n {variable.maxLength && (\n <p className=\"text-xs text-zinc-600 text-right\">\n {String(value || '').length} / {variable.maxLength}\n </p>\n )}\n </div>\n );\n\n case 'textarea':\n return (\n <div key={variable.name} className=\"space-y-2\">\n <label className=\"block text-sm font-medium text-zinc-300\">\n {variable.label}\n {variable.required && <span className=\"text-red-400 ml-1\">*</span>}\n </label>\n <textarea\n value={value || ''}\n onChange={(e) => {\n setFormValues(prev => ({ ...prev, [variable.name]: e.target.value }));\n if (error) setFormErrors(prev => ({ ...prev, [variable.name]: '' }));\n }}\n placeholder={variable.placeholder || `请输入${variable.label}`}\n maxLength={variable.maxLength}\n rows={4}\n className={`w-full px-3 py-2 bg-zinc-800 border rounded-lg text-sm text-white placeholder:text-zinc-600 focus:outline-none focus:border-[#d8ff00] resize-none transition-colors ${\n error ? 'border-red-500 focus:border-red-500' : 'border-zinc-700'\n }`}\n />\n {variable.description && (\n <p className=\"text-xs text-zinc-500\">{variable.description}</p>\n )}\n {error && (\n <p className=\"text-xs text-red-400 flex items-center gap-1\">\n <AlertCircle size={12} />\n {error}\n </p>\n )}\n {variable.maxLength && (\n <p className=\"text-xs text-zinc-600 text-right\">\n {String(value || '').length} / {variable.maxLength}\n </p>\n )}\n </div>\n );\n\n case 'number':\n return (\n <div key={variable.name} className=\"space-y-2\">\n <label className=\"block text-sm font-medium text-zinc-300\">\n {variable.label}\n {variable.required && <span className=\"text-red-400 ml-1\">*</span>}\n </label>\n <input\n type=\"number\"\n value={value || ''}\n onChange={(e) => {\n setFormValues(prev => ({ ...prev, [variable.name]: e.target.value }));\n if (error) setFormErrors(prev => ({ ...prev, [variable.name]: '' }));\n }}\n placeholder={variable.placeholder || `请输入${variable.label}`}\n min={variable.min}\n max={variable.max}\n className={`w-full px-3 py-2 bg-zinc-800 border rounded-lg text-sm text-white placeholder:text-zinc-600 focus:outline-none focus:border-[#d8ff00] transition-colors ${\n error ? 'border-red-500 focus:border-red-500' : 'border-zinc-700'\n }`}\n />\n {variable.description && (\n <p className=\"text-xs text-zinc-500\">{variable.description}</p>\n )}\n {error && (\n <p className=\"text-xs text-red-400 flex items-center gap-1\">\n <AlertCircle size={12} />\n {error}\n </p>\n )}\n </div>\n );\n\n case 'boolean':\n return (\n <div key={variable.name} className=\"space-y-2\">\n <label className=\"flex items-center gap-3 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={value || false}\n onChange={(e) => {\n setFormValues(prev => ({ ...prev, [variable.name]: e.target.checked }));\n }}\n className=\"w-4 h-4 rounded border-zinc-600 bg-zinc-800 text-[#d8ff00] focus:ring-[#d8ff00] focus:ring-offset-zinc-900\"\n />\n <span className=\"text-sm font-medium text-zinc-300\">\n {variable.label}\n {variable.required && <span className=\"text-red-400 ml-1\">*</span>}\n </span>\n </label>\n {variable.description && (\n <p className=\"text-xs text-zinc-500 ml-7\">{variable.description}</p>\n )}\n </div>\n );\n\n case 'select':\n return (\n <div key={variable.name} className=\"space-y-2\">\n <label className=\"block text-sm font-medium text-zinc-300\">\n {variable.label}\n {variable.required && <span className=\"text-red-400 ml-1\">*</span>}\n </label>\n <select\n value={value || ''}\n onChange={(e) => {\n setFormValues(prev => ({ ...prev, [variable.name]: e.target.value }));\n if (error) setFormErrors(prev => ({ ...prev, [variable.name]: '' }));\n }}\n className={`w-full px-3 py-2 bg-zinc-800 border rounded-lg text-sm text-white focus:outline-none focus:border-[#d8ff00] transition-colors ${\n error ? 'border-red-500 focus:border-red-500' : 'border-zinc-700'\n }`}\n >\n <option value=\"\">请选择{variable.label}</option>\n {variable.options?.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n {variable.description && (\n <p className=\"text-xs text-zinc-500\">{variable.description}</p>\n )}\n {error && (\n <p className=\"text-xs text-red-400 flex items-center gap-1\">\n <AlertCircle size={12} />\n {error}\n </p>\n )}\n </div>\n );\n\n default:\n return null;\n }\n };\n\n const previewContent = generatePreview();\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* 遮罩 */}\n <div className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\" onClick={onClose} />\n \n {/* 弹窗 */}\n <div className=\"relative w-full max-w-2xl bg-zinc-900 border border-zinc-800 rounded-xl shadow-2xl mx-4 flex flex-col max-h-[85vh]\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-zinc-800\">\n <div>\n <h2 className=\"text-base font-medium text-white\">{template.name}</h2>\n {template.description && (\n <p className=\"text-xs text-zinc-500 mt-1\">{template.description}</p>\n )}\n </div>\n <button\n onClick={onClose}\n className=\"p-1 text-zinc-500 hover:text-white hover:bg-zinc-800 rounded-lg transition-colors\"\n >\n <X size={18} />\n </button>\n </div>\n\n {/* 内容 */}\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">\n <div className=\"flex gap-4\">\n {/* 左侧:表单 */}\n <div className=\"flex-1 space-y-4\">\n <h3 className=\"text-sm font-medium text-zinc-300 flex items-center gap-2\">\n <CheckCircle2 className=\"w-4 h-4 text-[#d8ff00]\" />\n 填写变量\n </h3>\n \n {template.variables && template.variables.length > 0 ? (\n <div className=\"space-y-4\">\n {template.variables.map(renderFormField)}\n </div>\n ) : (\n <div className=\"text-center py-8 text-zinc-500 text-sm\">\n 此模板无需填写变量\n </div>\n )}\n </div>\n\n {/* 右侧:预览 */}\n <div className=\"w-80 border-l border-zinc-800 pl-4 space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-zinc-300 flex items-center gap-2\">\n <Eye className=\"w-4 h-4\" />\n 预览\n </h3>\n <button\n onClick={() => setShowPreview(!showPreview)}\n className=\"p-1 text-zinc-500 hover:text-white hover:bg-zinc-800 rounded transition-colors\"\n title={showPreview ? '隐藏预览' : '显示预览'}\n >\n {showPreview ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n </div>\n \n {showPreview && (\n <div className=\"p-3 bg-zinc-800/50 border border-zinc-700 rounded-lg\">\n <pre className=\"text-xs text-zinc-300 whitespace-pre-wrap break-words font-mono\">\n {previewContent}\n </pre>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* 底部按钮 */}\n <div className=\"px-5 py-4 border-t border-zinc-800 flex justify-end gap-3\">\n <button\n onClick={onClose}\n disabled={isSending}\n className=\"px-4 py-2 text-sm text-zinc-400 hover:text-white hover:bg-zinc-800 rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n 取消\n </button>\n <button\n onClick={handleSubmit}\n disabled={isSending}\n className=\"px-4 py-2 text-sm text-black bg-[#d8ff00] hover:bg-[#c4e600] rounded-lg font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2\"\n >\n {isSending ? (\n <>\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n 发送中...\n </>\n ) : (\n <>\n <Send className=\"w-4 h-4\" />\n 发送\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default TemplateVariableDialog;\n","/**\n * 语音识别 Hook\n * 支持 Web Speech API 和自定义 Provider\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport type {\n VoiceEngine,\n RecordingStatus,\n RecognitionResult,\n VoiceInputConfig,\n VoiceError,\n VoiceProvider,\n UseVoiceRecognitionReturn,\n} from './types';\n\n// 检查浏览器是否支持 Web Speech API\nconst checkBrowserSupport = (): boolean => {\n return typeof window !== 'undefined' && (\n 'webkitSpeechRecognition' in window ||\n 'SpeechRecognition' in window\n );\n};\n\n// 获取 SpeechRecognition 构造函数\nconst getSpeechRecognition = (): any => {\n if (typeof window === 'undefined') return null;\n return (window as any).SpeechRecognition ||\n (window as any).webkitSpeechRecognition;\n};\n\n// 创建默认的 Web Speech Provider\nconst createWebSpeechProvider = (\n config: VoiceInputConfig\n): VoiceProvider => {\n const {\n language = 'zh-CN',\n continuous = true,\n interimResults = true,\n maxDuration = 60000,\n autoStopSilence = 3000,\n } = config;\n\n let recognition: any = null;\n let maxDurationTimer: ReturnType<typeof setTimeout> | null = null;\n let silenceTimer: ReturnType<typeof setTimeout> | null = null;\n let resultCallback: ((result: RecognitionResult) => void) | null = null;\n let errorCallback: ((error: VoiceError) => void) | null = null;\n let statusCallback: ((status: RecordingStatus) => void) | null = null;\n \n // 累积所有已确认的文本(关键修复:防止停顿时丢失内容)\n let accumulatedFinalText = '';\n\n const clearTimers = () => {\n if (maxDurationTimer) {\n clearTimeout(maxDurationTimer);\n maxDurationTimer = null;\n }\n if (silenceTimer) {\n clearTimeout(silenceTimer);\n silenceTimer = null;\n }\n };\n \n const resetState = () => {\n accumulatedFinalText = '';\n };\n\n const setStatus = (status: RecordingStatus) => {\n statusCallback?.(status);\n };\n\n const handleError = (error: VoiceError) => {\n clearTimers();\n errorCallback?.(error);\n setStatus('error');\n if (recognition) {\n try {\n recognition.stop();\n } catch (e) {\n // ignore\n }\n recognition = null;\n }\n };\n\n return {\n id: 'webspeech',\n name: 'Web Speech API',\n\n isSupported: checkBrowserSupport,\n\n start: async () => {\n if (!checkBrowserSupport()) {\n throw new Error('Browser does not support speech recognition');\n }\n\n // 先请求麦克风权限,确保设备就绪后再启动识别\n setStatus('requesting');\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n // 保持流活跃一小段时间,确保麦克风完全初始化\n await new Promise(resolve => setTimeout(resolve, 200));\n stream.getTracks().forEach(track => track.stop());\n } catch (err) {\n handleError({\n code: 'PERMISSION_DENIED',\n message: '无法访问麦克风,请检查权限设置',\n type: 'permission',\n });\n return;\n }\n\n const SpeechRecognition = getSpeechRecognition();\n recognition = new SpeechRecognition();\n\n recognition.lang = language;\n recognition.continuous = continuous;\n recognition.interimResults = interimResults;\n\n recognition.onstart = () => {\n // 重置累积文本\n resetState();\n setStatus('recording');\n // 设置最大录音时长\n if (maxDuration > 0) {\n maxDurationTimer = setTimeout(() => {\n recognition?.stop();\n }, maxDuration);\n }\n };\n\n recognition.onresult = (event: any) => {\n let newFinalTranscript = '';\n let interimTranscript = '';\n\n // 遍历本次事件中的所有结果\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const transcript = event.results[i][0].transcript;\n if (event.results[i].isFinal) {\n newFinalTranscript += transcript;\n } else {\n interimTranscript += transcript;\n }\n }\n\n // 如果有新的已确认文本,累积到总文本中\n if (newFinalTranscript) {\n accumulatedFinalText += newFinalTranscript;\n }\n\n // 完整文本 = 累积的已确认文本 + 当前临时文本\n const fullText = accumulatedFinalText + interimTranscript;\n const hasNewFinal = !!newFinalTranscript;\n const confidence = event.results[event.results.length - 1]?.[0]?.confidence || 0;\n\n // 返回完整的累积文本\n resultCallback?.({ \n text: fullText, \n isFinal: hasNewFinal && !interimTranscript, // 只有当没有临时文本时才算最终\n confidence \n });\n\n // 重置静音检测定时器\n if (silenceTimer) {\n clearTimeout(silenceTimer);\n }\n if (autoStopSilence > 0 && hasNewFinal) {\n silenceTimer = setTimeout(() => {\n recognition?.stop();\n }, autoStopSilence);\n }\n };\n\n recognition.onerror = (event: any) => {\n let errorInfo: VoiceError;\n\n switch (event.error) {\n case 'no-speech':\n errorInfo = {\n code: 'NO_SPEECH',\n message: '未检测到语音,请重试',\n type: 'unknown',\n };\n break;\n case 'audio-capture':\n errorInfo = {\n code: 'AUDIO_CAPTURE',\n message: '无法访问麦克风',\n type: 'permission',\n };\n break;\n case 'not-allowed':\n errorInfo = {\n code: 'PERMISSION_DENIED',\n message: '麦克风权限被拒绝,请在浏览器设置中允许访问',\n type: 'permission',\n };\n break;\n case 'network':\n errorInfo = {\n code: 'NETWORK_ERROR',\n message: '网络错误,请检查网络连接',\n type: 'network',\n };\n break;\n case 'aborted':\n // 用户主动停止,不算错误\n return;\n default:\n errorInfo = {\n code: 'UNKNOWN_ERROR',\n message: '语音识别出错,请重试',\n type: 'unknown',\n };\n }\n\n handleError(errorInfo);\n };\n\n recognition.onend = () => {\n clearTimers();\n setStatus('completed');\n };\n\n // 麦克风权限已在前面获取,直接启动识别\n recognition.start();\n },\n\n stop: () => {\n clearTimers();\n if (recognition) {\n try {\n recognition.stop();\n } catch (e) {\n // ignore\n }\n }\n },\n\n onResult: (callback) => {\n resultCallback = callback;\n },\n\n onError: (callback) => {\n errorCallback = callback;\n },\n\n onStatusChange: (callback) => {\n statusCallback = callback;\n },\n\n destroy: () => {\n clearTimers();\n if (recognition) {\n try {\n recognition.stop();\n } catch (e) {\n // ignore\n }\n recognition = null;\n }\n resultCallback = null;\n errorCallback = null;\n statusCallback = null;\n },\n };\n};\n\nexport const useVoiceRecognition = (\n config: VoiceInputConfig = {}\n): UseVoiceRecognitionReturn => {\n const {\n engine = 'webspeech',\n customProvider,\n } = config;\n\n const [status, setStatus] = useState<RecordingStatus>('idle');\n const [result, setResult] = useState<RecognitionResult | null>(null);\n const [error, setError] = useState<VoiceError | null>(null);\n const [isSupported, setIsSupported] = useState(true);\n\n const providerRef = useRef<VoiceProvider | null>(null);\n\n // 初始化 provider\n useEffect(() => {\n if (engine === 'webspeech') {\n providerRef.current = createWebSpeechProvider(config);\n } else if (engine === 'custom' && customProvider) {\n providerRef.current = customProvider;\n } else {\n // 如果配置了 custom 但没有 provider,使用 webspeech 作为 fallback\n providerRef.current = createWebSpeechProvider(config);\n }\n\n const provider = providerRef.current;\n setIsSupported(provider.isSupported());\n\n // 设置回调\n provider.onResult?.((newResult) => {\n setResult(newResult);\n });\n\n provider.onError?.((newError) => {\n setError(newError);\n });\n\n provider.onStatusChange?.((newStatus) => {\n setStatus(newStatus);\n });\n\n return () => {\n provider.destroy?.();\n providerRef.current = null;\n };\n }, [engine, customProvider, config.language, config.maxDuration, config.autoStopSilence]);\n\n const startRecording = useCallback(async () => {\n setError(null);\n setResult(null);\n setStatus('requesting');\n\n try {\n await providerRef.current?.start();\n } catch (err) {\n setError({\n code: 'START_FAILED',\n message: err instanceof Error ? err.message : '启动录音失败',\n type: 'unknown',\n });\n setStatus('error');\n }\n }, []);\n\n const stopRecording = useCallback(() => {\n providerRef.current?.stop();\n }, []);\n\n return {\n status,\n result,\n error,\n isSupported,\n startRecording,\n stopRecording,\n isRecording: status === 'recording',\n };\n};\n","/**\n * 语音波形动画组件\n * 实时显示音频波形,参考 ChatGPT/Claude 的设计\n */\n\nimport React, { useEffect, useRef, useCallback } from 'react';\nimport { Mic } from 'lucide-react';\n\ninterface VoiceWaveformProps {\n /** 是否正在录音 */\n isRecording: boolean;\n /** 自定义类名 */\n className?: string;\n /** 波形颜色 */\n color?: string;\n}\n\nexport const VoiceWaveform: React.FC<VoiceWaveformProps> = ({\n isRecording,\n className = '',\n color = '#d8ff00',\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const animationRef = useRef<number>();\n const audioContextRef = useRef<AudioContext | null>(null);\n const analyserRef = useRef<AnalyserNode | null>(null);\n const dataArrayRef = useRef<Uint8Array | null>(null);\n const sourceRef = useRef<MediaStreamAudioSourceNode | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n\n // 绘制波形\n const draw = useCallback(() => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext('2d');\n const analyser = analyserRef.current;\n const dataArray = dataArrayRef.current;\n\n if (!canvas || !ctx || !analyser || !dataArray) return;\n\n const WIDTH = canvas.width;\n const HEIGHT = canvas.height;\n\n analyser.getByteFrequencyData(dataArray);\n\n // 清空画布\n ctx.clearRect(0, 0, WIDTH, HEIGHT);\n\n // 计算平均音量\n const average = dataArray.reduce((a, b) => a + b, 0) / dataArray.length;\n const normalizedVolume = Math.min(average / 128, 1);\n\n // 绘制中心圆点(呼吸效果)\n const centerX = WIDTH / 2;\n const centerY = HEIGHT / 2;\n const baseRadius = 30;\n const pulseRadius = baseRadius + normalizedVolume * 20;\n\n // 外圈脉冲\n ctx.beginPath();\n ctx.arc(centerX, centerY, pulseRadius, 0, 2 * Math.PI);\n ctx.fillStyle = `${color}20`;\n ctx.fill();\n\n // 中圈\n ctx.beginPath();\n ctx.arc(centerX, centerY, baseRadius + normalizedVolume * 10, 0, 2 * Math.PI);\n ctx.fillStyle = `${color}40`;\n ctx.fill();\n\n // 内圈\n ctx.beginPath();\n ctx.arc(centerX, centerY, baseRadius, 0, 2 * Math.PI);\n ctx.fillStyle = color;\n ctx.fill();\n\n // 绘制频谱条\n const barCount = 32;\n const barWidth = 3;\n const maxBarHeight = 40;\n const gap = 4;\n const totalWidth = barCount * (barWidth + gap) - gap;\n const startX = (WIDTH - totalWidth) / 2;\n\n for (let i = 0; i < barCount; i++) {\n // 从中心向两侧映射频率数据\n const dataIndex = Math.floor((i / barCount) * (dataArray.length / 2));\n const value = dataArray[dataIndex] || 0;\n const normalizedValue = value / 255;\n\n const barHeight = normalizedValue * maxBarHeight;\n const x = startX + i * (barWidth + gap);\n const y = centerY - barHeight / 2;\n\n // 绘制圆角矩形\n ctx.beginPath();\n ctx.roundRect(x, y, barWidth, barHeight, 1.5);\n ctx.fillStyle = `${color}${Math.floor(normalizedValue * 80 + 20).toString(16).padStart(2, '0')}`;\n ctx.fill();\n }\n\n animationRef.current = requestAnimationFrame(draw);\n }, [color]);\n\n // 初始化音频\n useEffect(() => {\n if (!isRecording) {\n // 清理资源\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n }\n if (sourceRef.current) {\n sourceRef.current.disconnect();\n sourceRef.current = null;\n }\n if (audioContextRef.current) {\n audioContextRef.current.close();\n audioContextRef.current = null;\n }\n if (streamRef.current) {\n streamRef.current.getTracks().forEach(track => track.stop());\n streamRef.current = null;\n }\n return;\n }\n\n const initAudio = async () => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n sampleRate: 44100,\n }\n });\n streamRef.current = stream;\n\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n audioContextRef.current = audioContext;\n\n const analyser = audioContext.createAnalyser();\n analyser.fftSize = 128;\n analyserRef.current = analyser;\n\n const source = audioContext.createMediaStreamSource(stream);\n source.connect(analyser);\n sourceRef.current = source;\n\n const bufferLength = analyser.frequencyBinCount;\n dataArrayRef.current = new Uint8Array(bufferLength);\n\n draw();\n } catch (err) {\n console.error('Failed to initialize audio:', err);\n }\n };\n\n initAudio();\n\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n }\n };\n }, [isRecording, draw]);\n\n if (!isRecording) {\n return (\n <div className={`flex items-center justify-center ${className}`}>\n <div className=\"w-20 h-20 rounded-full bg-zinc-800 flex items-center justify-center\">\n <Mic size={32} className=\"text-zinc-500\" />\n </div>\n </div>\n );\n }\n\n return (\n <div className={`flex items-center justify-center ${className}`}>\n <canvas\n ref={canvasRef}\n width={280}\n height={120}\n className=\"rounded-lg\"\n />\n </div>\n );\n};\n\nexport default VoiceWaveform;\n","/**\n * 语音输入组件 - ChatGPT 风格\n * 长按录音,松手停止,实时显示识别结果\n */\n\nimport React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { Mic, X, Check, Loader2 } from 'lucide-react';\nimport { VoiceWaveform } from './VoiceWaveform';\nimport { useVoiceRecognition } from './useVoiceRecognition';\nimport type { VoiceInputProps, VoiceError, RecognitionResult } from './types';\n\nexport const VoiceInput: React.FC<VoiceInputProps> = ({\n onResult,\n onError,\n config = {},\n disabled = false,\n className = '',\n}) => {\n const { enabled = true } = config;\n\n // 使用 ref 避免循环依赖问题\n const resultHandledRef = useRef(false);\n const lastResultRef = useRef<RecognitionResult | null>(null);\n\n const [isExpanded, setIsExpanded] = useState(false);\n const [showResult, setShowResult] = useState(false);\n\n const {\n status,\n result,\n error,\n isSupported,\n startRecording,\n stopRecording,\n isRecording,\n } = useVoiceRecognition(config);\n\n const isRequesting = status === 'requesting';\n const isRecognizing = status === 'recognizing';\n const isCompleted = status === 'completed';\n const hasError = status === 'error';\n\n // 定义回调函数(在 useEffect 之前)\n const handleStart = useCallback(async () => {\n if (!isSupported || disabled) return;\n resultHandledRef.current = false;\n setIsExpanded(true);\n await startRecording();\n }, [isSupported, disabled, startRecording]);\n\n const handleStop = useCallback(() => {\n stopRecording();\n }, [stopRecording]);\n\n const handleConfirm = useCallback((text: string) => {\n onResult(text);\n setIsExpanded(false);\n setShowResult(false);\n // 注意:不要重置 resultHandledRef,保持为 true 防止重复触发\n lastResultRef.current = null;\n }, [onResult]);\n\n const handleCancel = useCallback(() => {\n stopRecording();\n setIsExpanded(false);\n setShowResult(false);\n resultHandledRef.current = false;\n lastResultRef.current = null;\n }, [stopRecording]);\n\n // 实时更新累积的识别结果(确保停顿后不丢失)\n useEffect(() => {\n if (result?.text) {\n lastResultRef.current = result;\n }\n }, [result]);\n\n // 处理结果 - 只在完成时触发一次\n useEffect(() => {\n if (isCompleted && !resultHandledRef.current) {\n resultHandledRef.current = true;\n\n // 获取最终文本(优先使用累积的文本)\n const finalText = lastResultRef.current?.text || result?.text;\n\n // 如果没有识别到文字,直接关闭\n if (!finalText) {\n setIsExpanded(false);\n setShowResult(false);\n return;\n }\n\n // 自动确认模式(默认)- 直接发送,不显示预览,不延迟\n const autoConfirm = config.autoConfirm ?? true;\n if (autoConfirm) {\n // 立即发送,不延迟,避免闪现确认弹窗\n handleConfirm(finalText);\n } else {\n // 手动确认模式才显示预览\n setShowResult(true);\n }\n }\n }, [isCompleted, result, config.autoConfirm, handleConfirm]);\n\n // 重置状态当开始新的录音\n useEffect(() => {\n if (isRecording) {\n resultHandledRef.current = false;\n lastResultRef.current = null;\n setShowResult(false);\n }\n }, [isRecording]);\n\n // 错误处理\n useEffect(() => {\n if (error && onError) {\n onError(error);\n // 错误后重置\n setTimeout(() => {\n setIsExpanded(false);\n setShowResult(false);\n resultHandledRef.current = false;\n }, 2000);\n }\n }, [error, onError]);\n\n // 检测是否为触摸设备\n const isTouchDevice = typeof window !== 'undefined' && (\n 'ontouchstart' in window || navigator.maxTouchPoints > 0\n );\n\n // 如果未启用或不支持,不渲染\n if (!enabled || !isSupported) {\n return null;\n }\n\n return (\n <div className={`relative ${className}`}>\n {/* 展开状态的浮动面板 */}\n {isExpanded && (\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-3 z-50\">\n <div className=\"bg-zinc-900 border border-zinc-700 rounded-2xl shadow-2xl overflow-hidden min-w-[320px] max-w-[400px]\">\n {/* 波形动画区域 */}\n <div className=\"p-6 pb-4\">\n <VoiceWaveform isRecording={isRecording} color=\"#d8ff00\" />\n\n {/* 实时识别文本 */}\n <div className=\"mt-4 text-center min-h-[24px]\">\n {isRecording && !result?.text && (\n <p className=\"text-sm text-zinc-400 animate-pulse\">聆听中...</p>\n )}\n {result?.text && (\n <p className=\"text-base text-white leading-relaxed\">\n {result.text}\n {!result.isFinal && (\n <span className=\"inline-block w-0.5 h-5 bg-[#d8ff00] ml-1 animate-pulse align-middle\" />\n )}\n </p>\n )}\n </div>\n </div>\n\n {/* 底部操作栏 */}\n <div className=\"flex items-center justify-between px-4 py-3 bg-zinc-800/50 border-t border-zinc-800\">\n {isRecording ? (\n <>\n <span className=\"text-xs text-zinc-400\">\n {isTouchDevice ? '松开停止' : ''}\n </span>\n <button\n onClick={handleCancel}\n className=\"p-2 text-zinc-400 hover:text-red-400 hover:bg-red-500/10 rounded-lg transition-colors\"\n >\n <X size={18} />\n </button>\n </>\n ) : showResult ? (\n <>\n <button\n onClick={() => lastResultRef.current && handleConfirm(lastResultRef.current.text)}\n className=\"flex items-center gap-1.5 px-4 py-2 bg-[#d8ff00] hover:bg-[#c2e600] text-black text-sm font-medium rounded-lg transition-colors\"\n >\n <Check size={16} />\n 发送\n </button>\n <button\n onClick={handleCancel}\n className=\"p-2 text-zinc-400 hover:text-white hover:bg-zinc-700 rounded-lg transition-colors\"\n >\n <X size={18} />\n </button>\n </>\n ) : isRequesting || isRecognizing ? (\n <>\n <span className=\"text-xs text-zinc-400 flex items-center gap-2 whitespace-nowrap\">\n <Loader2 size={14} className=\"animate-spin flex-shrink-0\" />\n 准备中...\n </span>\n <button\n onClick={handleCancel}\n className=\"p-2 text-zinc-400 hover:text-white hover:bg-zinc-700 rounded-lg transition-colors\"\n >\n <X size={18} />\n </button>\n </>\n ) : hasError ? (\n <>\n <span className=\"text-xs text-red-400\">识别失败</span>\n <button\n onClick={handleCancel}\n className=\"p-2 text-zinc-400 hover:text-white hover:bg-zinc-700 rounded-lg transition-colors\"\n >\n <X size={18} />\n </button>\n </>\n ) : null}\n </div>\n </div>\n\n {/* 箭头 */}\n <div className=\"absolute top-full left-1/2 -translate-x-1/2 -mt-1\">\n <div className=\"w-3 h-3 bg-zinc-900 border-r border-b border-zinc-700 rotate-45\" />\n </div>\n </div>\n )}\n\n {/* 录音按钮 - 支持长按和点击两种模式 */}\n <VoiceButton\n isRecording={isRecording}\n isExpanded={isExpanded}\n disabled={disabled}\n onStart={handleStart}\n onStop={handleStop}\n />\n </div>\n );\n};\n\n// 语音按钮组件 - Web 端使用点击模式,移动端支持长按\ninterface VoiceButtonProps {\n isRecording: boolean;\n isExpanded: boolean;\n disabled?: boolean;\n onStart: () => void;\n onStop: () => void;\n}\n\nconst VoiceButton: React.FC<VoiceButtonProps> = ({\n isRecording,\n isExpanded,\n disabled,\n onStart,\n onStop,\n}) => {\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n // 检测是否为触摸设备\n const isTouchDevice = typeof window !== 'undefined' && (\n 'ontouchstart' in window || navigator.maxTouchPoints > 0\n );\n\n // Web 端:点击切换录音状态\n const handleClick = useCallback(() => {\n if (disabled) return;\n if (isRecording) {\n onStop();\n } else {\n onStart();\n }\n }, [disabled, isRecording, onStart, onStop]);\n\n // 移动端:长按模式\n const pressTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const longPressRef = useRef(false);\n const LONG_PRESS_DURATION = 300;\n\n const handleTouchStart = useCallback((e: React.TouchEvent) => {\n e.preventDefault();\n if (disabled) return;\n longPressRef.current = false;\n\n pressTimerRef.current = setTimeout(() => {\n longPressRef.current = true;\n onStart();\n }, LONG_PRESS_DURATION);\n }, [disabled, onStart]);\n\n const handleTouchEnd = useCallback((e: React.TouchEvent) => {\n e.preventDefault();\n if (pressTimerRef.current) {\n clearTimeout(pressTimerRef.current);\n pressTimerRef.current = null;\n }\n\n if (longPressRef.current && isRecording) {\n onStop();\n } else if (!longPressRef.current && !isRecording && !isExpanded) {\n onStart();\n }\n }, [isRecording, isExpanded, onStart, onStop]);\n\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n disabled={disabled}\n onClick={!isTouchDevice ? handleClick : undefined}\n onTouchStart={isTouchDevice ? handleTouchStart : undefined}\n onTouchEnd={isTouchDevice ? handleTouchEnd : undefined}\n className={`\n relative w-10 h-10 flex items-center justify-center rounded-xl transition-all duration-150 select-none\n ${isRecording\n ? 'bg-red-500/20 text-red-400 scale-105 ring-2 ring-red-400/30'\n : isExpanded\n ? 'bg-[#d8ff00] text-black'\n : 'text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800/80'\n }\n disabled:opacity-50 disabled:cursor-not-allowed\n active:scale-95\n `}\n title={isRecording ? '点击停止' : '点击说话'}\n >\n <Mic size={20} className={isRecording ? 'animate-pulse' : ''} />\n\n {/* 录音时的脉冲光环 */}\n {isRecording && (\n <>\n <span className=\"absolute inset-0 rounded-xl bg-red-400/20 animate-ping\" />\n <span className=\"absolute -inset-1 rounded-xl bg-red-400/10 animate-pulse\" />\n </>\n )}\n </button>\n );\n};\n\nexport default VoiceInput;\n","/**\n * 录音弹窗组件\n * 参考 ChatGPT/Claude 的语音交互设计\n */\n\nimport React, { useEffect, useRef, useCallback } from 'react';\nimport { Mic, Square, Check, X, AlertCircle } from 'lucide-react';\nimport { VoiceWaveform } from './VoiceWaveform';\nimport type { RecordingStatus, RecognitionResult, VoiceError } from './types';\n\ninterface VoiceRecordingModalProps {\n /** 是否显示 */\n visible: boolean;\n /** 当前状态 */\n status: RecordingStatus;\n /** 识别结果 */\n result: RecognitionResult | null;\n /** 错误信息 */\n error: VoiceError | null;\n /** 开始录音 */\n onStart: () => void;\n /** 停止录音 */\n onStop: () => void;\n /** 关闭弹窗 */\n onClose: () => void;\n /** 确认使用识别结果 */\n onConfirm: (text: string) => void;\n /** 自定义类名 */\n className?: string;\n}\n\nexport const VoiceRecordingModal: React.FC<VoiceRecordingModalProps> = ({\n visible,\n status,\n result,\n error,\n onStart,\n onStop,\n onClose,\n onConfirm,\n className = '',\n}) => {\n const isRecording = status === 'recording';\n const isRequesting = status === 'requesting';\n const isRecognizing = status === 'recognizing';\n const isCompleted = status === 'completed';\n const hasError = status === 'error';\n\n // 使用 ref 避免循环依赖\n const hasConfirmedRef = useRef(false);\n const onConfirmRef = useRef(onConfirm);\n\n // 更新 ref\n useEffect(() => {\n onConfirmRef.current = onConfirm;\n }, [onConfirm]);\n\n // 自动确认(当识别完成且是最终结果时)- 只执行一次\n useEffect(() => {\n if (isCompleted && result?.isFinal && result.text && !hasConfirmedRef.current) {\n hasConfirmedRef.current = true;\n const timer = setTimeout(() => {\n onConfirmRef.current(result.text);\n }, 800);\n return () => clearTimeout(timer);\n }\n }, [isCompleted, result]);\n\n // 重置确认状态当弹窗关闭\n useEffect(() => {\n if (!visible) {\n hasConfirmedRef.current = false;\n }\n }, [visible]);\n\n // 处理关闭\n const handleClose = () => {\n if (isRecording) {\n onStop();\n }\n onClose();\n };\n\n if (!visible) return null;\n\n return (\n <div className={`fixed inset-0 z-50 flex items-center justify-center ${className}`}>\n {/* 背景遮罩 */}\n <div\n className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\"\n onClick={handleClose}\n />\n\n {/* 弹窗内容 */}\n <div className=\"relative w-full max-w-md mx-4 bg-zinc-900 border border-zinc-800 rounded-2xl shadow-2xl overflow-hidden\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-zinc-800\">\n <h3 className=\"text-base font-medium text-white\">语音输入</h3>\n <button\n onClick={handleClose}\n className=\"p-1.5 text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800 rounded-lg transition-colors\"\n >\n <X size={18} />\n </button>\n </div>\n\n {/* 内容区 */}\n <div className=\"p-6 min-h-[280px] flex flex-col items-center justify-center\">\n {/* 错误状态 */}\n {hasError && error && (\n <div className=\"w-full\">\n <div className=\"flex items-start gap-3 p-4 bg-red-500/10 border border-red-500/20 rounded-xl\">\n <AlertCircle size={20} className=\"text-red-400 flex-shrink-0 mt-0.5\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-red-400 font-medium mb-1\">识别失败</p>\n <p className=\"text-sm text-red-300/80\">{error.message}</p>\n </div>\n </div>\n <button\n onClick={onStart}\n className=\"w-full mt-4 py-2.5 bg-zinc-800 hover:bg-zinc-700 text-white text-sm font-medium rounded-xl transition-colors\"\n >\n 重试\n </button>\n </div>\n )}\n\n {/* 请求权限中 */}\n {isRequesting && (\n <div className=\"flex flex-col items-center\">\n <div className=\"w-16 h-16 rounded-full bg-zinc-800 flex items-center justify-center mb-4\">\n <div className=\"w-6 h-6 border-2 border-zinc-600 border-t-[#d8ff00] rounded-full animate-spin\" />\n </div>\n <p className=\"text-sm text-zinc-400\">正在请求麦克风权限...</p>\n </div>\n )}\n\n {/* 识别中 */}\n {isRecognizing && (\n <div className=\"flex flex-col items-center\">\n <div className=\"w-16 h-16 rounded-full bg-zinc-800 flex items-center justify-center mb-4\">\n <div className=\"w-6 h-6 border-2 border-zinc-600 border-t-[#d8ff00] rounded-full animate-spin\" />\n </div>\n <p className=\"text-sm text-zinc-400\">正在识别...</p>\n {result?.text && (\n <p className=\"mt-3 text-base text-zinc-300 text-center px-4 line-clamp-3\">\n {result.text}\n </p>\n )}\n </div>\n )}\n\n {/* 完成状态 */}\n {isCompleted && result && (\n <div className=\"flex flex-col items-center w-full\">\n <div className=\"w-16 h-16 rounded-full bg-green-500/20 flex items-center justify-center mb-4\">\n <Check size={32} className=\"text-green-400\" />\n </div>\n <p className=\"text-sm text-green-400 font-medium mb-3\">识别完成</p>\n <div className=\"w-full p-4 bg-zinc-800/50 rounded-xl mb-4\">\n <p className=\"text-base text-white text-center leading-relaxed\">\n {result.text}\n </p>\n </div>\n {result.confidence > 0 && (\n <p className=\"text-xs text-zinc-500 mb-4\">\n 置信度: {(result.confidence * 100).toFixed(1)}%\n </p>\n )}\n <div className=\"flex gap-3 w-full\">\n <button\n onClick={handleClose}\n className=\"flex-1 py-2.5 bg-zinc-800 hover:bg-zinc-700 text-zinc-300 text-sm font-medium rounded-xl transition-colors\"\n >\n 取消\n </button>\n <button\n onClick={() => onConfirm(result.text)}\n className=\"flex-1 py-2.5 bg-[#d8ff00] hover:bg-[#c2e600] text-black text-sm font-medium rounded-xl transition-colors\"\n >\n 使用\n </button>\n </div>\n </div>\n )}\n\n {/* 录音中/空闲状态 */}\n {!hasError && !isRequesting && !isRecognizing && !isCompleted && (\n <div className=\"flex flex-col items-center w-full\">\n <VoiceWaveform isRecording={isRecording} color=\"#d8ff00\" />\n\n <div className=\"mt-6 text-center\">\n {isRecording ? (\n <>\n <p className=\"text-sm text-zinc-300 mb-1\">正在聆听,请说话...</p>\n <p className=\"text-xs text-zinc-500\">检测到静音 3 秒后自动停止</p>\n </>\n ) : (\n <>\n <p className=\"text-sm text-zinc-300 mb-1\">点击开始录音</p>\n <p className=\"text-xs text-zinc-500\">支持中文语音识别</p>\n </>\n )}\n </div>\n\n {/* 操作按钮 */}\n <div className=\"mt-6\">\n {isRecording ? (\n <button\n onClick={onStop}\n className=\"flex items-center gap-2 px-6 py-3 bg-red-500/20 hover:bg-red-500/30 text-red-400 rounded-xl transition-colors\"\n >\n <Square size={18} fill=\"currentColor\" />\n <span className=\"text-sm font-medium\">停止录音</span>\n </button>\n ) : (\n <button\n onClick={onStart}\n className=\"flex items-center gap-2 px-6 py-3 bg-[#d8ff00] hover:bg-[#c2e600] text-black rounded-xl transition-colors\"\n >\n <Mic size={18} />\n <span className=\"text-sm font-medium\">开始录音</span>\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default VoiceRecordingModal;\n","/**\n * 语音输入按钮组件\n * 集成到 Chat 输入框中使用\n */\n\nimport React, { useState, useCallback, useEffect } from 'react';\nimport { Mic } from 'lucide-react';\nimport { useVoiceRecognition } from './useVoiceRecognition';\nimport { VoiceRecordingModal } from './VoiceRecordingModal';\nimport type { VoiceInputProps, VoiceError } from './types';\n\nexport const VoiceInputButton: React.FC<VoiceInputProps> = ({\n onResult,\n onError,\n config = {},\n disabled = false,\n className = '',\n style,\n}) => {\n const { enabled = true } = config;\n\n const [modalVisible, setModalVisible] = useState(false);\n const [hasPermission, setHasPermission] = useState<boolean | null>(null);\n\n const {\n status,\n result,\n error,\n isSupported,\n startRecording,\n stopRecording,\n } = useVoiceRecognition(config);\n\n // 检查麦克风权限\n useEffect(() => {\n if (typeof navigator === 'undefined') return;\n\n navigator.permissions?.query({ name: 'microphone' as PermissionName })\n .then((permissionStatus) => {\n setHasPermission(permissionStatus.state === 'granted');\n permissionStatus.addEventListener('change', () => {\n setHasPermission(permissionStatus.state === 'granted');\n });\n })\n .catch(() => {\n // 浏览器不支持权限查询,默认为 null\n });\n }, []);\n\n // 处理打开弹窗\n const handleOpenModal = useCallback(() => {\n if (!isSupported) {\n onError?.({\n code: 'NOT_SUPPORTED',\n message: '您的浏览器不支持语音识别功能,请使用 Chrome、Edge 或 Safari',\n type: 'not-supported',\n });\n return;\n }\n setModalVisible(true);\n }, [isSupported, onError]);\n\n // 处理关闭弹窗\n const handleCloseModal = useCallback(() => {\n if (status === 'recording') {\n stopRecording();\n }\n setModalVisible(false);\n }, [status, stopRecording]);\n\n // 处理确认使用识别结果\n const handleConfirm = useCallback((text: string) => {\n onResult(text);\n setModalVisible(false);\n }, [onResult]);\n\n // 处理错误\n useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n // 如果未启用或不支持,不渲染按钮\n if (!enabled || !isSupported) {\n return null;\n }\n\n return (\n <>\n <button\n type=\"button\"\n onClick={handleOpenModal}\n disabled={disabled}\n className={`\n p-2 rounded-lg transition-all duration-200\n text-zinc-500 hover:text-[#d8ff00] hover:bg-zinc-800\n disabled:opacity-50 disabled:cursor-not-allowed\n ${status === 'recording' ? 'text-red-400 animate-pulse' : ''}\n ${className}\n `}\n style={style}\n title=\"语音输入\"\n >\n <Mic size={18} />\n </button>\n\n <VoiceRecordingModal\n visible={modalVisible}\n status={status}\n result={result}\n error={error}\n onStart={startRecording}\n onStop={stopRecording}\n onClose={handleCloseModal}\n onConfirm={handleConfirm}\n />\n </>\n );\n};\n\nexport default VoiceInputButton;\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n/**\n * 合并 Tailwind CSS 类名\n * 使用 clsx 进行条件类名合并,使用 tailwind-merge 解决类名冲突\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n \n}\n","'use client';\n\nimport React, { useState, useCallback, useEffect, useRef, memo } from 'react';\nimport { X, GripVertical, Maximize2, Minimize2 } from 'lucide-react';\nimport { cn } from '../utils/cn';\n\n// ============================================================================\n// 类型定义\n// ============================================================================\n\nexport interface SidePanelProps {\n /** 是否打开 */\n isOpen: boolean;\n /** 关闭回调 */\n onClose: () => void;\n /** 面板标题 */\n title?: React.ReactNode;\n /** 面板副标题 */\n subtitle?: React.ReactNode;\n /** 面板内容 */\n children: React.ReactNode;\n /** 额外头部操作 */\n headerActions?: React.ReactNode;\n /** 底部操作栏 */\n footer?: React.ReactNode;\n /** 自定义宽度(默认 50%) */\n defaultWidth?: number;\n /** 最小宽度 */\n minWidth?: number;\n /** 最大宽度 */\n maxWidth?: number;\n /** 是否可调整宽度 */\n resizable?: boolean;\n /** 自定义类名 */\n className?: string;\n /** 内容区域类名 */\n contentClassName?: string;\n /** 是否显示遮罩(移动端) */\n showOverlay?: boolean;\n /** 是否全屏模式 */\n isFullscreen?: boolean;\n /** 全屏切换回调 */\n onFullscreenToggle?: () => void;\n}\n\n// ============================================================================\n// 尺寸调整 Hook\n// ============================================================================\n\nfunction useResizablePanel(\n defaultWidth: number,\n minWidth: number,\n maxWidth: number,\n onWidthChange?: (width: number) => void\n) {\n const [width, setWidth] = useState(defaultWidth);\n const [isResizing, setIsResizing] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const startResize = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setIsResizing(true);\n \n const startX = e.clientX;\n const startWidth = width;\n const containerWidth = containerRef.current?.parentElement?.clientWidth || window.innerWidth;\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const deltaX = startX - moveEvent.clientX;\n const newWidthPercent = ((startWidth * containerWidth / 100 - deltaX) / containerWidth) * 100;\n const clampedWidth = Math.max(minWidth, Math.min(maxWidth, newWidthPercent));\n setWidth(clampedWidth);\n onWidthChange?.(clampedWidth);\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }, [width, minWidth, maxWidth, onWidthChange]);\n\n return { width, isResizing, startResize, containerRef };\n}\n\n// ============================================================================\n// 主组件\n// ============================================================================\n\nexport const SidePanel = memo(function SidePanel({\n isOpen,\n onClose,\n title,\n subtitle,\n children,\n headerActions,\n footer,\n defaultWidth = 50,\n minWidth = 30,\n maxWidth = 80,\n resizable = true,\n className,\n contentClassName,\n showOverlay = true,\n isFullscreen,\n onFullscreenToggle,\n}: SidePanelProps) {\n const { width, isResizing, startResize, containerRef } = useResizablePanel(\n defaultWidth,\n minWidth,\n maxWidth\n );\n\n // ESC 关闭\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, onClose]);\n\n // 阻止背景滚动\n useEffect(() => {\n if (isOpen) {\n const originalOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = originalOverflow;\n };\n }\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n return (\n <>\n {/* 遮罩层(移动端) */}\n {showOverlay && (\n <div \n className=\"fixed inset-0 bg-black/40 backdrop-blur-sm z-40 md:hidden animate-in fade-in duration-200\"\n onClick={onClose}\n />\n )}\n\n {/* 主面板 */}\n <div\n ref={containerRef}\n className={cn(\n 'fixed right-0 top-0 h-full z-50 flex flex-col',\n 'bg-zinc-950 border-l border-zinc-800/50',\n 'shadow-2xl shadow-black/50',\n 'animate-in slide-in-from-right duration-300 ease-out',\n isResizing && 'transition-none',\n className\n )}\n style={{ \n width: isFullscreen ? '100%' : `${width}%`,\n }}\n >\n {/* 调整宽度的拖拽条 */}\n {resizable && !isFullscreen && (\n <div\n className={cn(\n 'absolute left-0 top-0 bottom-0 w-4 -translate-x-1/2',\n 'cursor-col-resize z-10 flex items-center justify-center',\n 'group hover:bg-zinc-800/50 transition-colors',\n isResizing && 'bg-zinc-800/50'\n )}\n onMouseDown={startResize}\n >\n <div className={cn(\n 'w-1 h-12 rounded-full bg-zinc-700',\n 'group-hover:bg-zinc-500 transition-colors',\n isResizing && 'bg-zinc-400'\n )} />\n <GripVertical \n size={14} \n className={cn(\n 'absolute text-zinc-600 opacity-0',\n 'group-hover:opacity-100 transition-opacity',\n isResizing && 'opacity-100 text-zinc-400'\n )} \n />\n </div>\n )}\n\n {/* 头部 */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-zinc-800/50 bg-zinc-900/30 flex-shrink-0\">\n <div className=\"flex-1 min-w-0 mr-4\">\n {title && (\n <h3 className=\"text-sm font-medium text-zinc-200 truncate\">\n {title}\n </h3>\n )}\n {subtitle && (\n <p className=\"text-xs text-zinc-500 truncate mt-0.5\">\n {subtitle}\n </p>\n )}\n </div>\n\n <div className=\"flex items-center gap-1\">\n {headerActions}\n \n {onFullscreenToggle && (\n <button\n onClick={onFullscreenToggle}\n className=\"p-2 rounded-lg hover:bg-zinc-800/50 text-zinc-400 hover:text-zinc-200 transition-colors\"\n title={isFullscreen ? '退出全屏' : '全屏'}\n >\n {isFullscreen ? <Minimize2 size={16} /> : <Maximize2 size={16} />}\n </button>\n )}\n\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-zinc-800/50 text-zinc-400 hover:text-zinc-200 transition-colors\"\n title=\"关闭 (ESC)\"\n >\n <X size={18} />\n </button>\n </div>\n </div>\n\n {/* 内容区域 */}\n <div className={cn(\n 'flex-1 overflow-hidden flex flex-col',\n contentClassName\n )}>\n {children}\n </div>\n\n {/* 底部操作栏 */}\n {footer && (\n <div className=\"flex-shrink-0 border-t border-zinc-800/50 px-4 py-3 bg-zinc-900/30\">\n {footer}\n </div>\n )}\n </div>\n\n {/* 调整时的遮罩(防止 iframe 捕获鼠标事件) */}\n {isResizing && (\n <div className=\"fixed inset-0 z-[60]\" />\n )}\n </>\n );\n});\n\n// ============================================================================\n// 辅助组件:视图切换标签\n// ============================================================================\n\ninterface ViewTabsProps {\n activeView: string;\n onViewChange: (view: string) => void;\n views: Array<{\n id: string;\n label: string;\n icon?: React.ReactNode;\n }>;\n}\n\nexport const ViewTabs = memo(function ViewTabs({\n activeView,\n onViewChange,\n views,\n}: ViewTabsProps) {\n return (\n <div className=\"flex items-center bg-zinc-900 rounded-lg p-0.5 border border-zinc-800/50\">\n {views.map((view) => (\n <button\n key={view.id}\n onClick={() => onViewChange(view.id)}\n className={cn(\n 'flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors',\n activeView === view.id\n ? 'bg-zinc-700 text-zinc-200'\n : 'text-zinc-400 hover:text-zinc-300'\n )}\n >\n {view.icon}\n {view.label}\n </button>\n ))}\n </div>\n );\n});\n\n// ============================================================================\n// 辅助组件:工具栏按钮\n// ============================================================================\n\ninterface ToolbarButtonProps {\n onClick: () => void;\n title?: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const ToolbarButton = memo(function ToolbarButton({\n onClick,\n title,\n children,\n className,\n}: ToolbarButtonProps) {\n return (\n <button\n onClick={onClick}\n title={title}\n className={cn(\n 'p-2 rounded-lg hover:bg-zinc-800/50 text-zinc-400 hover:text-zinc-200 transition-colors',\n className\n )}\n >\n {children}\n </button>\n );\n});\n\nexport default SidePanel;\n","'use client';\n\nimport React, { useState, useMemo, useCallback, memo, useEffect, useRef } from 'react';\nimport { \n Code2, \n Eye, \n Copy, \n CheckCheck, \n Download, \n FileCode, \n FileJson, \n FileText,\n Globe,\n RefreshCw,\n Maximize2,\n Minimize2,\n Monitor,\n Tablet,\n Smartphone,\n RotateCcw\n} from 'lucide-react';\nimport { cn } from '../utils/cn';\nimport { SidePanel, ViewTabs, ToolbarButton } from './SidePanel';\nimport { MarkdownContent } from './message/MessageMarkdown';\nimport type { AgentConfig } from '../types/components';\n\n// ============================================================================\n// 类型定义\n// ============================================================================\n\nexport type ArtifactType = 'html' | 'markdown' | 'json' | 'code' | 'text';\n\nexport interface Artifact {\n id: string;\n type: ArtifactType;\n title: string;\n content: string;\n language?: string;\n timestamp?: number;\n source?: string; // 来源工具调用ID\n}\n\ninterface ArtifactViewerProps {\n /** 当前展示的 Artifact */\n artifact: Artifact | null;\n /** 是否打开 */\n isOpen: boolean;\n /** 关闭回调 */\n onClose: () => void;\n /** Agent 配置 */\n config?: AgentConfig;\n /** 默认视图模式 */\n defaultView?: 'preview' | 'code';\n /** 是否全屏 */\n isFullscreen?: boolean;\n /** 全屏切换回调 */\n onFullscreenToggle?: () => void;\n /** 嵌入模式 - 不使用 SidePanel 包装,直接渲染内容 */\n embedded?: boolean;\n}\n\n// ============================================================================\n// 代码高亮组件\n// ============================================================================\n\nconst CodeBlock = memo(function CodeBlock({ \n code, \n language,\n showLineNumbers = true \n}: { \n code: string; \n language?: string;\n showLineNumbers?: boolean;\n}) {\n const lines = code.split('\\n');\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // ignore\n }\n }, [code]);\n\n return (\n <div className=\"h-full flex flex-col bg-zinc-950 agent-sdk-light:bg-white\">\n {/* 工具栏 */}\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-zinc-800/50 agent-sdk-light:border-zinc-200 bg-zinc-900/30 agent-sdk-light:bg-zinc-50 flex-shrink-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-zinc-500 agent-sdk-light:text-zinc-600 font-mono uppercase\">\n {language || 'text'}\n </span>\n <span className=\"text-xs text-zinc-600 agent-sdk-light:text-zinc-500\">\n {lines.length} lines\n </span>\n </div>\n <button\n onClick={handleCopy}\n className=\"flex items-center gap-1.5 px-2 py-1 text-xs text-zinc-400 agent-sdk-light:text-zinc-600 hover:text-zinc-200 agent-sdk-light:hover:text-zinc-900 hover:bg-zinc-800/50 agent-sdk-light:hover:bg-zinc-200 rounded transition-colors\"\n >\n {copied ? <CheckCheck size={12} className=\"text-green-400\" /> : <Copy size={12} />}\n {copied ? '已复制' : '复制'}\n </button>\n </div>\n\n {/* 代码内容 */}\n <div className=\"flex-1 overflow-auto\">\n <pre className=\"p-4 text-xs font-mono leading-relaxed\">\n <code>\n {lines.map((line, i) => (\n <div key={i} className=\"flex group/line\">\n {showLineNumbers && (\n <span className=\"w-10 text-right pr-4 text-zinc-700 agent-sdk-light:text-zinc-400 select-none flex-shrink-0 group-hover/line:text-zinc-600 agent-sdk-light:group-hover/line:text-zinc-500 transition-colors\">\n {i + 1}\n </span>\n )}\n <span className=\"text-zinc-300 agent-sdk-light:text-zinc-800 whitespace-pre-wrap break-all\">\n {line || ' '}\n </span>\n </div>\n ))}\n </code>\n </pre>\n </div>\n </div>\n );\n});\n\n// ============================================================================\n// HTML 预览组件\n// ============================================================================\n\ntype DeviceMode = 'desktop' | 'tablet' | 'mobile' | 'responsive';\n\nconst HtmlPreview = memo(function HtmlPreview({ content }: { content: string }) {\n const [scale, setScale] = useState(1);\n const [deviceMode, setDeviceMode] = useState<DeviceMode>('responsive');\n const [isLoading, setIsLoading] = useState(true);\n const [iframeHeight, setIframeHeight] = useState(600);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // 创建 blob URL,注入自适应样式\n const blobUrl = useMemo(() => {\n // 注入 CSS 样式让内容自适应容器,移除默认滚动条\n const styleInjection = `\n<style>\n html, body {\n margin: 0;\n padding: 0;\n width: 100%;\n min-height: 100%;\n box-sizing: border-box;\n }\n * {\n box-sizing: border-box;\n }\n</style>\n`;\n // 检查是否已有 <head> 标签\n let modifiedContent = content;\n if (content.includes('<head>')) {\n modifiedContent = content.replace('<head>', '<head>' + styleInjection);\n } else if (content.includes('<html>')) {\n modifiedContent = content.replace('<html>', '<html><head>' + styleInjection + '</head>');\n } else if (content.includes('<!DOCTYPE') || content.includes('<!doctype')) {\n // 在 DOCTYPE 后插入\n modifiedContent = content.replace(/(<!DOCTYPE[^>]*>|<!doctype[^>]*>)/i, '$1<html><head>' + styleInjection + '</head><body>') + '</body></html>';\n } else {\n // 没有 HTML 结构,包装完整的 HTML\n modifiedContent = `<!DOCTYPE html><html><head>${styleInjection}</head><body>${content}</body></html>`;\n }\n \n const blob = new Blob([modifiedContent], { type: 'text/html' });\n return URL.createObjectURL(blob);\n }, [content]);\n\n // 清理 blob URL\n useEffect(() => {\n return () => {\n URL.revokeObjectURL(blobUrl);\n };\n }, [blobUrl]);\n\n // 设备配置\n const deviceConfig = {\n desktop: { width: '100%', maxWidth: '1400px', height: 800, icon: Monitor, label: 'Desktop' },\n tablet: { width: '768px', height: 1024, icon: Tablet, label: 'Tablet' },\n mobile: { width: '375px', height: 667, icon: Smartphone, label: 'Mobile' },\n responsive: { width: '100%', height: 600, icon: Maximize2, label: 'Responsive' },\n };\n\n const currentDevice = deviceConfig[deviceMode];\n\n // 自动调整 iframe 高度\n const adjustIframeHeight = useCallback(() => {\n if (deviceMode === 'responsive' && containerRef.current) {\n const containerHeight = containerRef.current.clientHeight - 32; // 减去 padding\n setIframeHeight(Math.max(containerHeight, 400));\n } else {\n setIframeHeight(currentDevice.height);\n }\n }, [deviceMode, currentDevice.height]);\n\n useEffect(() => {\n adjustIframeHeight();\n window.addEventListener('resize', adjustIframeHeight);\n return () => window.removeEventListener('resize', adjustIframeHeight);\n }, [adjustIframeHeight]);\n\n const handleIframeLoad = useCallback(() => {\n setIsLoading(false);\n // 尝试获取 iframe 内容高度(同源策略允许时)\n try {\n const iframe = iframeRef.current;\n if (iframe && iframe.contentWindow) {\n const body = iframe.contentWindow.document.body;\n const docElement = iframe.contentWindow.document.documentElement;\n const contentHeight = Math.max(\n body?.scrollHeight || 0,\n body?.offsetHeight || 0,\n docElement?.clientHeight || 0,\n docElement?.scrollHeight || 0,\n docElement?.offsetHeight || 0\n );\n if (contentHeight > 0 && deviceMode === 'responsive') {\n setIframeHeight(contentHeight + 20); // 添加一些额外空间\n }\n }\n } catch {\n // 跨域时忽略错误\n }\n }, [deviceMode]);\n\n const handleRefresh = useCallback(() => {\n setIsLoading(true);\n if (iframeRef.current) {\n iframeRef.current.src = blobUrl;\n }\n }, [blobUrl]);\n\n const handleDownload = useCallback(() => {\n const link = document.createElement('a');\n link.href = blobUrl;\n link.download = `artifact-${Date.now()}.html`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }, [blobUrl]);\n\n const handleOpenNewTab = useCallback(() => {\n window.open(blobUrl, '_blank');\n }, [blobUrl]);\n\n return (\n <div className=\"h-full flex flex-col bg-zinc-950 agent-sdk-light:bg-white\">\n {/* 工具栏 */}\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-zinc-800/50 agent-sdk-light:border-zinc-200 bg-zinc-900/30 agent-sdk-light:bg-zinc-50 flex-shrink-0\">\n {/* 设备切换 */}\n <div className=\"flex items-center gap-2\">\n {(Object.keys(deviceConfig) as DeviceMode[]).map((mode) => {\n const DeviceIcon = deviceConfig[mode].icon;\n return (\n <button\n key={mode}\n onClick={() => {\n setDeviceMode(mode);\n setScale(1);\n // 不需要设置 loading,因为只是改变容器尺寸,iframe 内容不变\n }}\n className={cn(\n 'flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md transition-all',\n deviceMode === mode\n ? 'bg-zinc-700 text-zinc-200 agent-sdk-light:bg-zinc-200 agent-sdk-light:text-zinc-900'\n : 'text-zinc-500 agent-sdk-light:text-zinc-600 hover:text-zinc-300 agent-sdk-light:hover:text-zinc-900 hover:bg-zinc-800/50 agent-sdk-light:hover:bg-zinc-200/50'\n )}\n title={deviceConfig[mode].label}\n >\n <DeviceIcon size={14} />\n <span className=\"hidden sm:inline\">{deviceConfig[mode].label}</span>\n </button>\n );\n })}\n </div>\n\n {/* 缩放控制 */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-zinc-500 agent-sdk-light:text-zinc-600\">Scale:</span>\n <div className=\"flex items-center gap-0.5 bg-zinc-900 agent-sdk-light:bg-zinc-200 rounded-md p-0.5\">\n {[0.5, 0.75, 0.85, 1, 1.15, 1.3, 1.5].map((s) => (\n <button\n key={s}\n onClick={() => setScale(s)}\n className={cn(\n 'px-2 py-1 text-[10px] rounded transition-colors',\n scale === s\n ? 'bg-zinc-700 text-zinc-200 agent-sdk-light:bg-zinc-300 agent-sdk-light:text-zinc-900'\n : 'text-zinc-500 agent-sdk-light:text-zinc-600 hover:text-zinc-300 agent-sdk-light:hover:text-zinc-900'\n )}\n >\n {Math.round(s * 100)}%\n </button>\n ))}\n </div>\n </div>\n\n {/* 操作按钮 */}\n <div className=\"flex items-center gap-1\">\n <ToolbarButton\n onClick={handleRefresh}\n title=\"刷新预览\"\n >\n <RotateCcw size={14} />\n </ToolbarButton>\n <ToolbarButton\n onClick={handleDownload}\n title=\"下载 HTML\"\n >\n <Download size={14} />\n </ToolbarButton>\n <ToolbarButton\n onClick={handleOpenNewTab}\n title=\"在新标签页打开\"\n >\n <Globe size={14} />\n </ToolbarButton>\n </div>\n </div>\n\n {/* 预览区域 */}\n <div \n ref={containerRef}\n className=\"flex-1 overflow-auto p-4 bg-zinc-950 agent-sdk-light:bg-zinc-50 flex justify-center\"\n >\n {isLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-zinc-950/80 agent-sdk-light:bg-zinc-50/80 z-10 backdrop-blur-sm\">\n <div className=\"flex flex-col items-center gap-3\">\n <RefreshCw size={32} className=\"text-zinc-500 agent-sdk-light:text-zinc-600 animate-spin\" />\n <span className=\"text-xs text-zinc-500 agent-sdk-light:text-zinc-600\">Loading preview...</span>\n </div>\n </div>\n )}\n \n {/* 设备框架容器 */}\n <div\n className={cn(\n 'bg-white rounded-lg shadow-2xl overflow-hidden transition-all duration-300 relative',\n deviceMode !== 'responsive' && 'border-4 border-zinc-800 agent-sdk-light:border-zinc-300 rounded-xl'\n )}\n style={{\n transform: `scale(${scale})`,\n transformOrigin: 'top center',\n width: deviceMode === 'responsive' ? '100%' : currentDevice.width,\n maxWidth: deviceMode === 'responsive' ? '100%' : undefined,\n height: iframeHeight,\n minWidth: deviceMode === 'mobile' ? '320px' : undefined,\n }}\n >\n {/* 移动设备顶部状态栏模拟 */}\n {deviceMode === 'mobile' && (\n <div className=\"h-6 bg-zinc-900 agent-sdk-light:bg-zinc-200 flex items-center justify-center\">\n <div className=\"w-16 h-4 bg-zinc-800 agent-sdk-light:bg-zinc-300 rounded-full\" />\n </div>\n )}\n \n <iframe\n ref={iframeRef}\n src={blobUrl}\n className=\"border-0 w-full h-full\"\n style={{\n display: 'block',\n }}\n sandbox=\"allow-scripts allow-same-origin allow-popups allow-forms allow-modals\"\n onLoad={handleIframeLoad}\n title=\"HTML Preview\"\n />\n </div>\n </div>\n </div>\n );\n});\n\n// ============================================================================\n// Markdown 预览组件\n// ============================================================================\n\nconst MarkdownPreview = memo(function MarkdownPreview({\n content,\n config,\n}: {\n content: string;\n config?: AgentConfig;\n}) {\n return (\n <div className=\"h-full overflow-auto bg-zinc-950 agent-sdk-light:bg-white\">\n <div className=\"max-w-3xl mx-auto p-8\">\n <div className=\"prose prose-invert prose-zinc agent-sdk-light:prose max-w-none\">\n <MarkdownContent content={content} config={config} />\n </div>\n </div>\n </div>\n );\n});\n\n// ============================================================================\n// JSON 预览组件\n// ============================================================================\n\nconst JsonPreview = memo(function JsonPreview({ content }: { content: string }) {\n const parsedData = useMemo(() => {\n try {\n return JSON.parse(content);\n } catch {\n return null;\n }\n }, [content]);\n\n const formattedJson = useMemo(() => {\n if (parsedData === null) return content;\n try {\n return JSON.stringify(parsedData, null, 2);\n } catch {\n return content;\n }\n }, [parsedData, content]);\n\n if (parsedData === null) {\n return (\n <div className=\"h-full flex flex-col bg-zinc-950 agent-sdk-light:bg-white\">\n <div className=\"flex-1 p-4\">\n <div className=\"p-4 bg-red-500/10 border border-red-500/20 rounded-lg agent-sdk-light:bg-red-50 agent-sdk-light:border-red-200\">\n <p className=\"text-red-400 agent-sdk-light:text-red-600 text-sm\">Invalid JSON</p>\n <pre className=\"mt-2 text-xs text-zinc-500 agent-sdk-light:text-zinc-600 whitespace-pre-wrap\">\n {content}\n </pre>\n </div>\n </div>\n </div>\n );\n }\n\n return <CodeBlock code={formattedJson} language=\"json\" />;\n});\n\n// ============================================================================\n// 类型图标映射\n// ============================================================================\n\nconst artifactTypeConfig: Record<ArtifactType, {\n icon: React.ElementType;\n label: string;\n color: string;\n bgColor: string;\n}> = {\n html: {\n icon: Globe,\n label: 'HTML',\n color: 'text-orange-400',\n bgColor: 'bg-orange-500/10',\n },\n markdown: {\n icon: FileText,\n label: 'Markdown',\n color: 'text-blue-400',\n bgColor: 'bg-blue-500/10',\n },\n json: {\n icon: FileJson,\n label: 'JSON',\n color: 'text-yellow-400',\n bgColor: 'bg-yellow-500/10',\n },\n code: {\n icon: FileCode,\n label: 'Code',\n color: 'text-purple-400',\n bgColor: 'bg-purple-500/10',\n },\n text: {\n icon: FileText,\n label: 'Text',\n color: 'text-zinc-400',\n bgColor: 'bg-zinc-500/10',\n },\n};\n\n// ============================================================================\n// 主组件\n// ============================================================================\n\nexport const ArtifactViewer = memo(function ArtifactViewer({\n artifact,\n isOpen,\n onClose,\n config,\n defaultView = 'preview',\n isFullscreen,\n onFullscreenToggle,\n embedded = false,\n}: ArtifactViewerProps) {\n const [viewMode, setViewMode] = useState<'preview' | 'code'>(defaultView);\n\n // 当 artifact 变化时,根据类型设置默认视图\n useEffect(() => {\n if (artifact) {\n // HTML 和 Markdown 默认预览,其他默认代码\n if (artifact.type === 'html' || artifact.type === 'markdown') {\n setViewMode('preview');\n } else {\n setViewMode('code');\n }\n }\n }, [artifact?.id]);\n\n if (!artifact) return null;\n\n const typeConfig = artifactTypeConfig[artifact.type];\n const canPreview = artifact.type === 'html' || artifact.type === 'markdown';\n\n // 渲染内容\n const renderContent = () => {\n if (viewMode === 'code' || !canPreview) {\n return (\n <CodeBlock\n code={artifact.content}\n language={artifact.language || artifact.type}\n />\n );\n }\n\n switch (artifact.type) {\n case 'html':\n return <HtmlPreview content={artifact.content} />;\n case 'markdown':\n return <MarkdownPreview content={artifact.content} config={config} />;\n default:\n return (\n <CodeBlock\n code={artifact.content}\n language={artifact.language || artifact.type}\n />\n );\n }\n };\n\n // 嵌入模式:直接渲染内容,不使用 SidePanel 包装\n if (embedded) {\n return (\n <div className=\"h-full flex flex-col bg-zinc-900 agent-sdk-light:bg-white relative\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-zinc-800/50 agent-sdk-light:border-zinc-200 bg-zinc-900/95 agent-sdk-light:bg-zinc-50 backdrop-blur-sm flex-shrink-0\">\n <div className=\"flex items-center gap-3 min-w-0\">\n <div className={`w-7 h-7 rounded-lg ${typeConfig.bgColor} flex items-center justify-center flex-shrink-0`}>\n <typeConfig.icon size={14} className={typeConfig.color} />\n </div>\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-medium text-zinc-100 agent-sdk-light:text-zinc-900 truncate\">{artifact.title}</h3>\n <p className={`text-xs ${typeConfig.color}`}>\n {typeConfig.label}\n {artifact.language && artifact.language !== artifact.type && (\n <span className=\"text-zinc-500 agent-sdk-light:text-zinc-500 ml-1\">• {artifact.language}</span>\n )}\n </p>\n </div>\n </div>\n \n <div className=\"flex items-center gap-2\">\n {/* 全屏切换按钮 */}\n {onFullscreenToggle && (\n <button\n onClick={onFullscreenToggle}\n className=\"p-1.5 text-zinc-500 agent-sdk-light:text-zinc-600 hover:text-zinc-300 agent-sdk-light:hover:text-zinc-900 hover:bg-zinc-800 agent-sdk-light:hover:bg-zinc-200 rounded-lg transition-colors\"\n title={isFullscreen ? \"退出全屏\" : \"全屏\"}\n >\n {isFullscreen ? <Minimize2 size={14} /> : <Maximize2 size={14} />}\n </button>\n )}\n \n {/* 视图切换 */}\n {canPreview && (\n <ViewTabs\n activeView={viewMode}\n onViewChange={(v) => setViewMode(v as 'preview' | 'code')}\n views={[\n { id: 'preview', label: 'Preview', icon: <Eye size={12} /> },\n { id: 'code', label: 'Code', icon: <Code2 size={12} /> },\n ]}\n />\n )}\n \n {/* 关闭按钮 */}\n <button\n onClick={onClose}\n className=\"p-1.5 text-zinc-500 agent-sdk-light:text-zinc-600 hover:text-zinc-300 agent-sdk-light:hover:text-zinc-900 hover:bg-zinc-800 agent-sdk-light:hover:bg-zinc-200 rounded-lg transition-colors\"\n title=\"关闭\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n </div>\n \n {/* 内容区域 */}\n <div className=\"flex-1 overflow-hidden\">\n {renderContent()}\n </div>\n </div>\n );\n }\n\n // 非嵌入模式:使用 SidePanel 包装\n return (\n <SidePanel\n isOpen={isOpen}\n onClose={onClose}\n title={\n <div className=\"flex items-center gap-2\">\n <div className={`w-6 h-6 rounded-md ${typeConfig.bgColor} flex items-center justify-center`}>\n <typeConfig.icon size={14} className={typeConfig.color} />\n </div>\n <span className=\"truncate\">{artifact.title}</span>\n </div>\n }\n subtitle={\n <span className={typeConfig.color}>\n {typeConfig.label}\n {artifact.language && artifact.language !== artifact.type && (\n <span className=\"text-zinc-500 agent-sdk-light:text-zinc-500 ml-1\">• {artifact.language}</span>\n )}\n </span>\n }\n isFullscreen={isFullscreen}\n onFullscreenToggle={onFullscreenToggle}\n headerActions={\n canPreview && (\n <ViewTabs\n activeView={viewMode}\n onViewChange={(v) => setViewMode(v as 'preview' | 'code')}\n views={[\n {\n id: 'preview',\n label: 'Preview',\n icon: <Eye size={12} />,\n },\n {\n id: 'code',\n label: 'Code',\n icon: <Code2 size={12} />,\n },\n ]}\n />\n )\n }\n contentClassName=\"bg-zinc-950 agent-sdk-light:bg-white\"\n >\n {renderContent()}\n </SidePanel>\n );\n});\n\nexport default ArtifactViewer;\n","import React from 'react';\nimport { ChevronDown } from 'lucide-react';\n\ninterface IProps {\n main_image?: string;\n reference_image?: string;\n qrcode?: string;\n logo?: string;\n size?: string;\n width?: number;\n height?: number;\n confirmed?: boolean;\n mainImage?: string;\n referenceImage?: string;\n qrCode?: string;\n}\n\nconst Field = ({ label, value }: { label: string; value?: string | number }) => (\n <div className=\"flex items-center justify-between gap-3 text-xs text-zinc-400\">\n <span>{label}</span>\n <span className=\"text-zinc-200 truncate max-w-[60%]\">{value ?? '-'}</span>\n </div>\n);\n\nexport default function InformationSupplement({\n main_image,\n reference_image,\n qrcode,\n logo,\n size = 'CUSTOM',\n width = 1024,\n height = 1024,\n confirmed,\n mainImage,\n referenceImage,\n qrCode,\n}: IProps) {\n const [open, setOpen] = React.useState(!confirmed);\n const resolvedMain = main_image || mainImage;\n const resolvedRef = reference_image || referenceImage;\n const resolvedQr = qrcode || qrCode;\n\n return (\n <div className=\"rounded-xl border border-zinc-700/40 bg-zinc-900/60 p-4 space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm font-medium text-zinc-200\">信息补充</div>\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"text-zinc-400 hover:text-zinc-200\"\n >\n <ChevronDown size={16} className={open ? 'rotate-180' : ''} />\n </button>\n </div>\n\n {open && (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"rounded-lg border border-zinc-700/40 bg-zinc-950/40 p-3 text-xs text-zinc-400\">\n <div className=\"mb-2 text-zinc-300\">主体图</div>\n {resolvedMain ? <img src={resolvedMain} alt=\"main\" className=\"w-full rounded-md\" /> : <div>未提供</div>}\n </div>\n <div className=\"rounded-lg border border-zinc-700/40 bg-zinc-950/40 p-3 text-xs text-zinc-400\">\n <div className=\"mb-2 text-zinc-300\">参考图</div>\n {resolvedRef ? <img src={resolvedRef} alt=\"ref\" className=\"w-full rounded-md\" /> : <div>未提供</div>}\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"rounded-lg border border-zinc-700/40 bg-zinc-950/40 p-3 text-xs text-zinc-400\">\n <div className=\"mb-2 text-zinc-300\">二维码</div>\n {resolvedQr ? <img src={resolvedQr} alt=\"qrcode\" className=\"w-full rounded-md\" /> : <div>未提供</div>}\n </div>\n <div className=\"rounded-lg border border-zinc-700/40 bg-zinc-950/40 p-3 text-xs text-zinc-400\">\n <div className=\"mb-2 text-zinc-300\">Logo</div>\n {logo ? <img src={logo} alt=\"logo\" className=\"w-full rounded-md\" /> : <div>未提供</div>}\n </div>\n </div>\n\n <div className=\"rounded-lg border border-zinc-700/40 bg-zinc-950/40 p-3 space-y-2\">\n <Field label=\"尺寸类型\" value={size} />\n <Field label=\"宽度\" value={width} />\n <Field label=\"高度\" value={height} />\n <Field label=\"状态\" value={confirmed ? '已确认' : '待确认'} />\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useMemo, useState } from 'react';\nimport { ChevronDown } from 'lucide-react';\nimport { MarkdownContent } from '../message/MessageMarkdown';\nimport { sanitizeMarkdownContent } from '../message/utils';\n\ninterface BriefReviewProps {\n content: string\n confirmed?: boolean\n}\n\nexport default function BriefReview({ content, confirmed }: BriefReviewProps) {\n const [open, setOpen] = useState(!confirmed);\n const sanitizedContent = useMemo(() => sanitizeMarkdownContent(content || ''), [content]);\n\n if (!sanitizedContent) {\n return null;\n }\n\n return (\n <div className=\"rounded-xl border border-zinc-700/40 bg-zinc-900/60 p-4 space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <div className=\"text-sm font-medium text-zinc-200\">方案简报</div>\n {confirmed && (\n <div className=\"rounded-[4px] bg-emerald-500/15 px-2 py-0.5 text-xs text-emerald-300\">\n 已确认\n </div>\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"text-zinc-400 hover:text-zinc-200\"\n >\n <ChevronDown size={16} className={open ? 'rotate-180' : ''} />\n </button>\n </div>\n\n {open && (\n <div className=\"rounded-lg border border-zinc-700/40 bg-zinc-950/40 p-3 text-sm text-zinc-200\">\n <MarkdownContent content={sanitizedContent} />\n </div>\n )}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { MessageSquare, Share2, Play, Pencil, Trash2 } from 'lucide-react';\nimport type { AgentSession } from '../../index';\n\ninterface SessionItemProps {\n session: AgentSession;\n isActive: boolean;\n onSelect: () => void;\n onDelete: () => void;\n onRename: (title: string) => void;\n onReplay: () => void;\n onShare: () => void;\n}\n\nexport function SessionItem({\n session,\n isActive,\n onSelect,\n onDelete,\n onRename,\n onReplay,\n onShare,\n}: SessionItemProps) {\n const [editing, setEditing] = useState(false);\n const [title, setTitle] = useState('');\n\n const startEdit = (e: React.MouseEvent) => {\n e.stopPropagation();\n setTitle(session.title || '新对话');\n setEditing(true);\n };\n\n const saveEdit = () => {\n if (title.trim() && title !== session.title) {\n onRename(title.trim());\n }\n setEditing(false);\n };\n\n return (\n <div\n onClick={() => !editing && onSelect()}\n className={`group relative flex items-center gap-2.5 px-3 py-2 rounded-lg cursor-pointer transition-all ${\n isActive ? 'bg-zinc-800/80' : 'hover:bg-zinc-800/40'\n }`}\n >\n <MessageSquare size={14} className={`flex-shrink-0 ${isActive ? 'text-[#d8ff00]' : 'text-zinc-500'}`} />\n\n {editing ? (\n <input\n autoFocus\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n onBlur={saveEdit}\n onKeyDown={(e) => e.key === 'Enter' && saveEdit()}\n onClick={(e) => e.stopPropagation()}\n className=\"flex-1 bg-transparent text-sm text-white border-b border-[#d8ff00] focus:outline-none py-0.5\"\n />\n ) : (\n <span className={`flex-1 text-sm truncate ${isActive ? 'text-white' : 'text-zinc-400'}`}>\n {session.title || '新对话'}\n </span>\n )}\n\n <div className={`flex gap-0.5 ${isActive ? 'opacity-100' : 'opacity-0 group-hover:opacity-100'} transition-opacity`}>\n <button onClick={(e) => { e.stopPropagation(); onShare(); }} className=\"p-1 text-zinc-500 hover:text-[#d8ff00] rounded\" title=\"分享\">\n <Share2 size={12} />\n </button>\n <button onClick={(e) => { e.stopPropagation(); onReplay(); }} className=\"p-1 text-zinc-500 hover:text-[#d8ff00] rounded\" title=\"回放\">\n <Play size={12} />\n </button>\n <button onClick={startEdit} className=\"p-1 text-zinc-500 hover:text-zinc-300 rounded\">\n <Pencil size={12} />\n </button>\n <button onClick={(e) => { e.stopPropagation(); onDelete(); }} className=\"p-1 text-zinc-500 hover:text-red-400 rounded\">\n <Trash2 size={12} />\n </button>\n </div>\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { Bot, Plus, PanelLeftClose, PanelLeft, Search, MessageSquare } from 'lucide-react';\nimport type { AgentSession } from '../../index';\nimport { SessionItem } from './SessionItem';\n\n// 时间分组\nfunction getTimeGroup(date: Date): string {\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const yesterday = new Date(today.getTime() - 86400000);\n const weekAgo = new Date(today.getTime() - 7 * 86400000);\n const d = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n\n if (d >= today) return '今天';\n if (d >= yesterday) return '昨天';\n if (d >= weekAgo) return '7天内';\n return '更早';\n}\n\ninterface SidebarProps {\n sessions: AgentSession[];\n currentId: string | null;\n onSelect: (s: AgentSession) => void;\n onDelete: (id: string) => void;\n onRename: (id: string, title: string) => void;\n onReplay: (s: AgentSession) => void;\n onShare: (s: AgentSession) => void;\n onNew: () => void;\n agentName?: string;\n agentType?: string;\n collapsed: boolean;\n onToggle: () => void;\n}\n\nexport function Sidebar({\n sessions,\n currentId,\n onSelect,\n onDelete,\n onRename,\n onReplay,\n onShare,\n onNew,\n agentName,\n agentType,\n collapsed,\n onToggle,\n}: SidebarProps) {\n const [search, setSearch] = useState('');\n\n const filtered = sessions.filter(s =>\n !search || (s.title || '').toLowerCase().includes(search.toLowerCase())\n );\n\n const grouped = filtered.reduce((acc, s) => {\n const g = getTimeGroup(new Date(s.gmtCreate || Date.now()));\n (acc[g] = acc[g] || []).push(s);\n return acc;\n }, {} as Record<string, AgentSession[]>);\n\n if (collapsed) {\n return (\n <div className=\"w-14 h-full flex flex-col items-center py-3 gap-2 bg-zinc-950 border-r border-zinc-800/50\">\n <button onClick={onToggle} className=\"p-2 text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800 rounded-lg\">\n <PanelLeft size={18} />\n </button>\n <div className=\"w-8 h-px bg-zinc-800 my-1\" />\n <button onClick={onNew} className=\"p-2 bg-[#d8ff00] text-black rounded-lg hover:bg-[#c2e600]\">\n <Plus size={18} />\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"w-64 h-full flex flex-col bg-zinc-950 border-r border-zinc-800/50\">\n {/* 头部 */}\n <div className=\"p-3 border-b border-zinc-800/50\">\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <div className=\"w-7 h-7 rounded-lg bg-[#d8ff00]/10 flex items-center justify-center flex-shrink-0\">\n <Bot size={14} className=\"text-[#d8ff00]\" />\n </div>\n <span className=\"text-sm font-medium text-white truncate\">{agentName || 'Agent'}</span>\n </div>\n <div className=\"flex gap-0.5\">\n <button onClick={onToggle} className=\"p-1.5 text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800 rounded-lg\">\n <PanelLeftClose size={14} />\n </button>\n </div>\n </div>\n <button\n onClick={onNew}\n className=\"w-full flex items-center justify-center gap-1.5 py-2 bg-[#d8ff00] hover:bg-[#c2e600] text-black text-sm font-medium rounded-lg transition-colors\"\n >\n <Plus size={14} />\n 新对话\n </button>\n </div>\n\n {/* 搜索 */}\n <div className=\"px-3 py-2\">\n <div className=\"relative\">\n <Search size={13} className=\"absolute left-2.5 top-1/2 -translate-y-1/2 text-zinc-600\" />\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"搜索对话\"\n className=\"w-full pl-8 pr-3 py-1.5 bg-zinc-900 border border-zinc-800 rounded-lg text-xs text-zinc-300 placeholder-zinc-600 focus:outline-none focus:border-zinc-700\"\n />\n </div>\n </div>\n\n {/* 列表 */}\n <div className=\"flex-1 overflow-y-auto px-2 pb-2 scrollbar-thin\">\n {filtered.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-32 text-zinc-600\">\n <MessageSquare size={20} className=\"mb-1.5 opacity-50\" />\n <span className=\"text-xs\">暂无对话</span>\n </div>\n ) : (\n ['今天', '昨天', '7天内', '更早'].map(g => {\n const items = grouped[g];\n if (!items?.length) return null;\n return (\n <div key={g} className=\"mt-2 first:mt-0\">\n <div className=\"px-3 py-1 text-[10px] font-medium text-zinc-600 uppercase tracking-wide\">{g}</div>\n {items.map(s => (\n <SessionItem\n key={s.sessionId}\n session={s}\n isActive={s.sessionId === currentId}\n onSelect={() => onSelect(s)}\n onDelete={() => onDelete(s.sessionId)}\n onRename={(t) => onRename(s.sessionId, t)}\n onReplay={() => onReplay(s)}\n onShare={() => onShare(s)}\n />\n ))}\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { Plus, Sparkles, Wand2, Code2, HelpCircle, LayoutGrid, Lightbulb, FileText } from 'lucide-react';\n\ninterface WelcomePageProps {\n agentName?: string;\n welcomeMessage?: string;\n tools?: any[];\n onNew: () => void;\n onPrompt: (p: string) => void;\n}\n\nexport function WelcomePage({ agentName, welcomeMessage, tools, onNew, onPrompt }: WelcomePageProps) {\n // 根据工具动态生成快捷提问\n const quickPrompts = React.useMemo(() => {\n const prompts: { icon: any; text: string; desc: string }[] = [];\n\n const hasImageTool = tools?.some((t: any) =>\n t.name?.toLowerCase().includes('image') ||\n t.name?.toLowerCase().includes('图片') ||\n t.type === 'COMFY_APP'\n );\n const hasCodeTool = tools?.some((t: any) =>\n t.name?.toLowerCase().includes('code') ||\n t.name?.toLowerCase().includes('代码')\n );\n const hasSearchTool = tools?.some((t: any) =>\n t.name?.toLowerCase().includes('search') ||\n t.name?.toLowerCase().includes('搜索')\n );\n const hasWorkflowTool = tools?.some((t: any) =>\n t.name?.toLowerCase().includes('workflow') ||\n t.name?.toLowerCase().includes('comfy') ||\n t.type === 'COMFY_APP'\n );\n\n if (hasImageTool || hasWorkflowTool) {\n prompts.push({ icon: Wand2, text: '帮我生成一张图片', desc: '使用 AI 工具创作' });\n }\n if (hasCodeTool) {\n prompts.push({ icon: Code2, text: '帮我写一段代码', desc: '编程与开发' });\n }\n if (hasSearchTool) {\n prompts.push({ icon: HelpCircle, text: '帮我搜索相关信息', desc: '知识检索' });\n }\n if (hasWorkflowTool) {\n prompts.push({ icon: LayoutGrid, text: '帮我创建一个工作流', desc: 'ComfyUI 工作流' });\n }\n\n // 通用提问\n const defaultPrompts = [\n { icon: Lightbulb, text: '你能帮我做什么?', desc: '了解 Agent 能力' },\n { icon: FileText, text: '帮我总结分析一下', desc: '内容理解与提炼' },\n { icon: HelpCircle, text: '我有一个问题想问你', desc: '问答咨询' },\n ];\n\n for (const p of defaultPrompts) {\n if (prompts.length >= 4) break;\n if (!prompts.some(existing => existing.text === p.text)) {\n prompts.push(p);\n }\n }\n\n return prompts.slice(0, 4);\n }, [tools]);\n\n const welcomeText = welcomeMessage || '开始对话,探索 AI 的无限可能';\n\n return (\n <div className=\"flex-1 flex items-center justify-center p-6\">\n <div className=\"max-w-xl w-full\">\n {/* Logo */}\n <div className=\"text-center mb-10\">\n <div className=\"w-16 h-16 rounded-2xl bg-gradient-to-br from-zinc-800 to-zinc-900 flex items-center justify-center mx-auto mb-5 border border-zinc-700/50 shadow-xl\">\n <Sparkles className=\"w-8 h-8 text-[#d8ff00]\" />\n </div>\n <h1 className=\"text-xl font-semibold text-white mb-2\">{agentName || 'AI Assistant'}</h1>\n <p className=\"text-sm text-zinc-500 max-w-sm mx-auto leading-relaxed\">\n {welcomeText}\n </p>\n </div>\n\n {/* 快捷提问 */}\n <div className=\"grid grid-cols-2 gap-2.5 mb-8\">\n {quickPrompts.map((p, i) => (\n <button\n key={i}\n onClick={() => onPrompt(p.text)}\n className=\"flex items-start gap-3 p-3.5 bg-zinc-900/50 hover:bg-zinc-800/70 border border-zinc-800/50 hover:border-zinc-700/50 rounded-xl text-left transition-all group\"\n >\n <div className=\"w-8 h-8 rounded-lg bg-zinc-800 flex items-center justify-center flex-shrink-0 group-hover:bg-zinc-700 transition-colors\">\n <p.icon size={15} className=\"text-[#d8ff00]\" />\n </div>\n <div className=\"min-w-0\">\n <div className=\"text-sm text-zinc-200 group-hover:text-white transition-colors truncate\">{p.text}</div>\n <div className=\"text-xs text-zinc-600 mt-0.5\">{p.desc}</div>\n </div>\n </button>\n ))}\n </div>\n\n {/* 开始按钮 */}\n <div className=\"text-center\">\n <button\n onClick={onNew}\n className=\"inline-flex items-center gap-2 px-6 py-2.5 bg-[#d8ff00] hover:bg-[#c2e600] text-black text-sm font-medium rounded-xl transition-all hover:scale-[1.02]\"\n >\n <Plus size={16} />\n 开始新对话\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useRef } from 'react';\nimport { ImagePlus, X, Send, Square } from 'lucide-react';\nimport { VoiceInput } from '../voice';\nimport { toast } from 'sonner';\nimport type { AgentConfig, Asset } from '../../types/components';\nimport { inferAssetTypeFromFile, resolveAssetForDisplay } from '../../utils/asset';\n\ninterface ChatInputAreaProps {\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n images: { asset: Asset; preview: string }[];\n setImages: React.Dispatch<React.SetStateAction<{ asset: Asset; preview: string }[]>>;\n onSend: () => void;\n onStop: () => void;\n isStreaming: boolean;\n config?: AgentConfig;\n}\n\nexport function ChatInputArea({\n input,\n setInput,\n images,\n setImages,\n onSend,\n onStop,\n isStreaming,\n config,\n}: ChatInputAreaProps) {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const removeImage = (index: number) => {\n setImages((prev) => {\n const newImages = [...prev];\n const target = newImages[index];\n if (target?.asset?.file instanceof File) {\n URL.revokeObjectURL(target.preview);\n }\n newImages.splice(index, 1);\n return newImages;\n });\n };\n\n const addAssetsWithPreview = async (assets: Asset[]) => {\n const previews = await Promise.all(\n assets.map(async (asset) => {\n if (asset.file instanceof File) {\n return { asset, preview: URL.createObjectURL(asset.file) };\n }\n\n if (asset.url) {\n return { asset, preview: asset.url };\n }\n\n if (asset.fileId) {\n const resolved = await resolveAssetForDisplay(asset, config);\n if (resolved?.url) {\n return { asset: { ...asset, url: resolved.url }, preview: resolved.url };\n }\n }\n\n return null;\n })\n );\n\n const validPreviews = previews.filter(Boolean) as Array<{ asset: Asset; preview: string }>;\n if (validPreviews.length > 0) {\n setImages(prev => [...prev, ...validPreviews]);\n }\n };\n\n const handleImageUpload = async (e?: React.ChangeEvent<HTMLInputElement>) => {\n const files = e?.target.files;\n if (!files || files.length === 0) return;\n\n const assets: Asset[] = Array.from(files).map(file => ({\n type: inferAssetTypeFromFile(file),\n file,\n name: file.name,\n size: file.size,\n mimeType: file.type\n }));\n\n // 校验\n const { asset: assetStrategy } = config || {};\n if (assetStrategy?.validate) {\n const invalidResult = assets\n .map(a => ({ asset: a, result: assetStrategy.validate!(a) }))\n .find(({ result }) => !result.ok);\n if (invalidResult) {\n if (invalidResult.result.reason) {\n toast.error(invalidResult.result.reason);\n }\n return;\n }\n }\n\n await addAssetsWithPreview(assets);\n\n if (e) {\n e.target.value = '';\n }\n };\n\n const handleCustomFileSelect = async () => {\n const { asset: assetStrategy } = config || {};\n\n if (assetStrategy?.select) {\n try {\n const result = await assetStrategy.select();\n if (result?.assets?.length) {\n await addAssetsWithPreview(result.assets);\n }\n } catch (error) {\n console.error('自定义文件选择失败:', error);\n toast.error('文件选择失败');\n }\n return;\n }\n\n fileInputRef.current?.click();\n };\n\n return (\n <div className=\"bg-zinc-950 px-4 py-4 flex-shrink-0\">\n <div className=\"max-w-3xl mx-auto\">\n {/* 输入框容器 - 参考 ChatGPT/Claude 设计 */}\n <div className=\"relative bg-zinc-900 border border-zinc-800 rounded-2xl shadow-lg shadow-black/20 focus-within:border-zinc-700 focus-within:shadow-xl focus-within:shadow-black/30 transition-all duration-200\">\n {/* 图片预览区域 */}\n {images.length > 0 && (\n <div className=\"flex flex-wrap gap-3 p-4 pb-2\">\n {images.map((img, i) => (\n <div key={i} className=\"relative group\">\n <img\n src={img.preview}\n alt=\"\"\n className=\"w-20 h-20 object-cover rounded-xl border border-zinc-700/50 shadow-md\"\n />\n <button\n onClick={() => removeImage(i)}\n className=\"absolute -top-2 -right-2 w-6 h-6 bg-zinc-900 hover:bg-red-500 text-zinc-400 hover:text-white rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-all shadow-lg border border-zinc-700\"\n >\n <X size={12} />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* 主输入区域 - 精确对齐 */}\n <div className=\"flex items-end gap-3 p-3\">\n {/* 左侧附件按钮 - 固定在底部 */}\n <button\n onClick={handleCustomFileSelect}\n className=\"flex-shrink-0 w-10 h-10 flex items-center justify-center text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800/80 rounded-xl transition-all duration-150\"\n title=\"上传图片\"\n >\n <ImagePlus size={20} />\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n onChange={handleImageUpload}\n className=\"hidden\"\n />\n\n {/* 文本输入区 - 精确垂直居中 */}\n <div className=\"flex-1 min-w-0\">\n <textarea\n ref={textareaRef}\n value={input}\n onChange={(e) => {\n setInput(e.target.value);\n const target = e.target;\n // 重置高度后计算实际需要的高度\n target.style.height = '44px';\n const scrollHeight = target.scrollHeight;\n target.style.height = `${Math.min(Math.max(scrollHeight, 44), 200)}px`;\n }}\n placeholder=\"输入消息...\"\n rows={1}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n onSend();\n }\n }}\n className=\"w-full bg-transparent text-[15px] text-zinc-100 placeholder-zinc-500 resize-none focus:outline-none\"\n style={{\n height: '44px',\n lineHeight: '24px',\n paddingTop: '10px',\n paddingBottom: '10px',\n }}\n disabled={isStreaming}\n />\n </div>\n\n {/* 右侧按钮组 - 固定在底部,统一尺寸 */}\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {/* 语音输入按钮 */}\n {!isStreaming && (\n <VoiceInput\n onResult={(text) => {\n setInput(prev => {\n const separator = prev && !prev.endsWith(' ') ? ' ' : '';\n return prev + separator + text;\n });\n // 延迟调整 textarea 高度并聚焦\n setTimeout(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = '44px';\n textareaRef.current.style.height = `${Math.min(Math.max(textareaRef.current.scrollHeight, 44), 200)}px`;\n textareaRef.current.focus();\n }\n }, 50);\n }}\n onError={(error) => {\n toast.error(error.message);\n }}\n config={config?.voiceInput}\n disabled={isStreaming}\n />\n )}\n\n {/* 发送/停止按钮 */}\n {isStreaming ? (\n <button\n onClick={onStop}\n className=\"w-10 h-10 flex items-center justify-center bg-red-500/20 hover:bg-red-500/30 text-red-400 rounded-xl transition-all duration-150\"\n title=\"停止生成\"\n >\n <Square size={18} fill=\"currentColor\" />\n </button>\n ) : (\n <button\n onClick={onSend}\n disabled={!input.trim() && images.length === 0}\n className=\"w-10 h-10 flex items-center justify-center bg-[#d8ff00] hover:bg-[#e5ff4d] disabled:bg-zinc-800 text-black disabled:text-zinc-600 rounded-xl transition-all duration-150 shadow-sm hover:shadow-md disabled:shadow-none\"\n >\n <Send size={18} />\n </button>\n )}\n </div>\n </div>\n </div>\n\n {/* 底部提示 - 精致的快捷键提示 */}\n <div className=\"flex items-center justify-between px-2 pt-2.5\">\n <div className=\"flex items-center gap-1 text-[11px] text-zinc-600\">\n <kbd className=\"inline-flex items-center justify-center min-w-[20px] h-5 px-1.5 bg-zinc-800/60 rounded text-[10px] font-medium\">\n {typeof navigator !== 'undefined' && /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? '⌘' : 'Ctrl'}\n </kbd>\n <span className=\"text-zinc-700\">+</span>\n <kbd className=\"inline-flex items-center justify-center min-w-[20px] h-5 px-1.5 bg-zinc-800/60 rounded text-[10px] font-medium\">\n ↵\n </kbd>\n <span className=\"ml-1 text-zinc-500\">发送</span>\n </div>\n {input.trim().length > 0 && (\n <span className=\"text-[11px] text-zinc-500 tabular-nums\">\n {input.trim().length}\n </span>\n )}\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React, { useEffect, useState, useCallback, useRef, useImperativeHandle } from 'react';\nimport {\n useAgentStore,\n sessionService,\n messageService,\n planService,\n createAndStartSession,\n generateSessionTitle,\n uploadOSS,\n getFileUrl,\n useSSE,\n ChatWindow,\n ShareModal,\n type AgentSession,\n agentToolService,\n agentSkillService,\n} from '../index';\nimport { ArtifactViewer, type Artifact, type ArtifactType } from './ArtifactViewer';\nimport { VoiceInput } from './voice';\nimport { toast } from 'sonner';\nimport {\n Bot,\n Plus,\n PanelLeftClose,\n PanelLeft,\n Loader2,\n ArrowLeft,\n Sparkles,\n Settings,\n} from 'lucide-react';\n\nimport type { AgentConfig, Asset } from '../types/components';\nimport { inferAssetTypeFromFile, resolveAssetForDisplay } from '../utils/asset';\nimport { cn } from '../utils/cn';\nimport { ComponentProvider, useComponents as useComponentContext } from '../context/ComponentContext';\nimport InformationSupplement from './biz/InformationSupplement';\nimport BriefReview from './biz/BriefReview';\nimport { Sidebar } from './chat/Sidebar';\nimport { WelcomePage } from './chat/WelcomePage';\nimport { ChatInputArea } from './chat/ChatInputArea';\nimport { SessionItem } from './chat/SessionItem';\n\n// 拖拽 Handle 组件 - 使用 React 状态管理 hover 效果\nconst DragHandle = React.memo(function DragHandle({\n artifactPanelWidth,\n isDragging,\n onMouseDown,\n}: {\n artifactPanelWidth: number;\n isDragging: boolean;\n onMouseDown: (e: React.MouseEvent) => void;\n}) {\n const [isHovered, setIsHovered] = useState(false);\n\n useEffect(() => {\n if (isHovered || isDragging) {\n document.body.style.cursor = 'col-resize';\n } else {\n document.body.style.cursor = '';\n }\n\n }, [isHovered])\n \n return (\n <div\n className=\"absolute z-40 top-0 bottom-0 cursor-col-resize select-none\"\n style={{ \n left: `calc(${100 - artifactPanelWidth}% - 6px)`,\n width: '12px',\n }}\n onMouseDown={onMouseDown}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {/* 可见的拖拽条 */}\n <div \n className={cn(\n 'absolute left-1/2 top-0 bottom-0 -translate-x-1/2',\n 'transition-all duration-100',\n )}\n style={{\n width: isDragging ? '4px' : '3px',\n backgroundColor: isDragging \n ? '#d8ff00' \n : isHovered \n ? 'rgba(216, 255, 0, 0.7)' \n : 'transparent',\n }}\n />\n {/* 中间的拖拽指示器 */}\n {/* <div \n className={cn(\n 'absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 pointer-events-none',\n 'w-5 h-12 rounded-full flex items-center justify-center',\n 'transition-all duration-100',\n )}\n style={{\n backgroundColor: isDragging ? '#d8ff00' : 'rgb(63, 63, 70)',\n opacity: isDragging || isHovered ? 1 : 0,\n transform: `translate(-50%, -50%) ${isDragging ? 'scale(1.1)' : 'scale(1)'}`,\n }}\n >\n <svg width=\"6\" height=\"14\" viewBox=\"0 0 6 14\" fill=\"none\" style={{ color: isDragging ? 'black' : 'rgb(161, 161, 170)' }}>\n <circle cx=\"1.5\" cy=\"2\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"4.5\" cy=\"2\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"1.5\" cy=\"7\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"4.5\" cy=\"7\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"1.5\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"4.5\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div> */}\n </div>\n );\n});\n\ninterface AgentChatProps {\n agentId: string;\n projectId: string;\n sessionId?: string;\n agentName?: string;\n agentType?: 'BUILTIN' | 'EXTERNAL' | 'MULTI';\n welcomeMessage?: string;\n tools?: any[];\n onFrontendToolCall?: (toolCalls: any[], messageId?: string) => void;\n onComponentPending?: (components: any[], messageId?: string) => void;\n onNavigateBack?: () => void;\n onNavigateToSettings?: () => void;\n onNavigateToReplay?: (sessionId: string) => void;\n onSessionIdChange?: (sessionId: string) => void;\n config?: AgentConfig;\n embedded?: boolean;\n hideSidebar?: boolean;\n hideHeader?: boolean;\n hideInput?: boolean;\n className?: string;\n showItemTime?: boolean;\n}\n\nexport interface AgentChatHandle {\n sendTextMessage: (content: string) => Promise<void>;\n abortStreaming: () => Promise<void>;\n}\n\n\nconst AgentChat = React.forwardRef<AgentChatHandle, AgentChatProps>(({\n agentId,\n projectId,\n agentName,\n agentType,\n welcomeMessage,\n tools,\n onFrontendToolCall,\n onComponentPending,\n onNavigateBack,\n onNavigateToSettings,\n onNavigateToReplay,\n sessionId: initialSessionId,\n onSessionIdChange,\n config,\n embedded,\n hideSidebar,\n hideHeader,\n hideInput,\n className,\n showItemTime,\n}: AgentChatProps, ref) => {\n const isLightTheme = config?.theme === 'light';\n const themeClass = config?.themeClassName || (isLightTheme ? 'agent-sdk-light' : 'agent-sdk-dark');\n const themeStyle = config?.themeVars ? (config.themeVars as React.CSSProperties) : undefined;\n const showSidebar = !embedded && !hideSidebar;\n const showHeader = !embedded && !hideHeader;\n const outerComponents = useComponentContext();\n const mergedComponents = React.useMemo(() => {\n const configComponents = config?.components || {};\n const mergedRegistry = {\n InformationSupplement,\n BriefReview,\n ...(outerComponents.ComponentRegistry || {}),\n ...(configComponents.ComponentRegistry || {}),\n };\n return {\n ...outerComponents,\n ...configComponents,\n ComponentRegistry: mergedRegistry,\n };\n }, [config?.components, outerComponents]);\n const { sessions, setSessions, currentSession, setCurrentSession, addSession, removeSession, tools: _tools, setTools, setSkills, setShowItemTime } = useAgentStore();\n const [loading, setLoading] = useState(true);\n const [messagesLoading, setMessagesLoading] = useState(false);\n const [collapsed, setCollapsed] = useState(false);\n const [mobileOpen, setMobileOpen] = useState(false);\n const [input, setInput] = useState('');\n const [images, setImages] = useState<{ asset: Asset; preview: string }[]>([]);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // 记录最后发送的用户消息,用于生成标题\n const lastUserMessageRef = useRef<string>('');\n\n // 分享弹窗状态\n const [shareModalOpen, setShareModalOpen] = useState(false);\n const [shareSession, setShareSession] = useState<AgentSession | null>(null);\n\n // Artifact SidePanel 状态\n const [currentArtifact, setCurrentArtifact] = useState<Artifact | null>(null);\n const [isArtifactFullscreen, setIsArtifactFullscreen] = useState(false);\n const [artifactPanelWidth, setArtifactPanelWidth] = useState(50); // 宽度百分比 (25-75%)\n \n // 拖拽状态 - 在父容器中管理\n const [isDragging, setIsDragging] = useState(false);\n const dragStartRef = useRef<{ startX: number; startWidth: number } | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n \n // 拖拽处理\n const handleDragMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n \n dragStartRef.current = {\n startX: e.clientX,\n startWidth: artifactPanelWidth,\n };\n setIsDragging(true);\n \n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }, [artifactPanelWidth]);\n \n // 拖拽移动和结束 - 使用 useEffect 监听全局事件\n useEffect(() => {\n if (!isDragging) return;\n \n const handleMouseMove = (e: MouseEvent) => {\n if (!dragStartRef.current || !containerRef.current) return;\n \n const containerRect = containerRef.current.getBoundingClientRect();\n const containerWidth = containerRect.width;\n \n // 计算鼠标移动的距离(向左拖拽增加面板宽度,向右拖拽减少)\n const deltaX = dragStartRef.current.startX - e.clientX;\n const deltaPercent = (deltaX / containerWidth) * 100;\n \n // 新宽度 = 初始宽度 + 移动百分比\n const newWidth = dragStartRef.current.startWidth + deltaPercent;\n \n // 限制宽度范围 25%-75%\n const clampedWidth = Math.max(25, Math.min(75, newWidth));\n setArtifactPanelWidth(clampedWidth);\n };\n \n const handleMouseUp = () => {\n setIsDragging(false);\n dragStartRef.current = null;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n \n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n \n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n }, [isDragging]);\n\n useEffect(() => {\n setShowItemTime(showItemTime);\n }, [showItemTime]);\n\n // 打开/切换 Artifact 预览(Toggle 操作)\n const handleOpenArtifact = useCallback((data: { type: string; title: string; content: string; language?: string }) => {\n // 检查是否点击了相同内容的 Artifact(Toggle 操作)\n if (currentArtifact && currentArtifact.content === data.content && currentArtifact.type === data.type) {\n // 相同内容,关闭 Artifact\n setCurrentArtifact(null);\n setIsArtifactFullscreen(false);\n return;\n }\n \n // 打开新的 Artifact\n const artifact: Artifact = {\n id: `artifact-${Date.now()}`,\n type: data.type as ArtifactType,\n title: data.title,\n content: data.content,\n language: data.language,\n timestamp: Date.now(),\n };\n setCurrentArtifact(artifact);\n }, [currentArtifact]);\n\n // 关闭 Artifact 预览\n const handleCloseArtifact = useCallback(() => {\n setCurrentArtifact(null);\n setIsArtifactFullscreen(false);\n }, []);\n \n // ESC 键关闭 Artifact\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && currentArtifact) {\n // 如果是全屏模式,先退出全屏\n if (isArtifactFullscreen) {\n setIsArtifactFullscreen(false);\n } else {\n // 否则关闭 Artifact\n setCurrentArtifact(null);\n }\n }\n };\n \n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [currentArtifact, isArtifactFullscreen]);\n\n // 切换 Artifact 全屏\n const handleToggleArtifactFullscreen = useCallback(() => {\n setIsArtifactFullscreen(prev => !prev);\n }, []);\n\n const { sendMessage, reconnect, abort } = useSSE({\n onFrontendToolCall,\n onComponentPending,\n onComplete: async (content: string) => {\n // 检查是否需要生成标题:当前会话标题是默认的\"新对话\"\n const session = useAgentStore.getState().currentSession;\n if (!session) return;\n\n const isDefaultTitle = !session.title || session.title === '新对话' || session.title === 'New Chat';\n if (!isDefaultTitle) return;\n\n // 获取用户消息\n const userMessage = lastUserMessageRef.current;\n if (!userMessage) return;\n\n console.log('[AgentChat] Generating session title for:', session.sessionId);\n\n try {\n // 调用 LLM 生成标题\n const newTitle = await generateSessionTitle(userMessage, content);\n\n if (newTitle && newTitle !== session.title) {\n // 使用专门的标题更新接口更新后端\n const res = await sessionService.updateTitle(session.sessionId, newTitle);\n if (res.success) {\n // 更新前端状态\n useAgentStore.getState().updateSession(session.sessionId, { title: newTitle });\n console.log('[AgentChat] Session title updated to:', newTitle);\n }\n }\n } catch (error) {\n console.error('[AgentChat] Failed to generate session title:', error);\n }\n }\n });\n const isStreaming = useAgentStore(state => state.chatUI.isStreaming);\n const streamingSessionId = useAgentStore(state => state.chatUI.streamingSessionId);\n const isCurrentSessionStreaming = isStreaming && streamingSessionId === currentSession?.sessionId;\n\n // Plan Mode 状态和 actions\n const { currentPlan, waitingStepId } = useAgentStore(state => state.chatUI);\n const setShowPlanConfirmDialog = useAgentStore(state => state.setShowPlanConfirmDialog);\n const setShowHumanInputDialog = useAgentStore(state => state.setShowHumanInputDialog);\n const clearPlanState = useAgentStore(state => state.clearPlanState);\n\n const [planProcessing, setPlanProcessing] = useState(false);\n\n useEffect(() => {\n if (initialSessionId) {\n console.log('sessions: ', sessions, initialSessionId);\n const session = sessions.find(s => s.sessionId === initialSessionId);\n console.log('in comp session: ', session);\n if (session) {\n handleSelect(session);\n }\n }\n }, [initialSessionId, setCurrentSession, sessions]);\n\n // Plan Mode 处理回调\n const handlePlanConfirm = useCallback(async () => {\n if (!currentPlan?.publicId) return;\n setPlanProcessing(true);\n try {\n await planService.confirm(currentPlan.publicId, { approved: true });\n setShowPlanConfirmDialog(false);\n } catch (err) {\n console.error('[AgentChat] Confirm plan failed:', err);\n toast.error('确认计划失败');\n } finally {\n setPlanProcessing(false);\n }\n }, [currentPlan, setShowPlanConfirmDialog]);\n\n const handlePlanReject = useCallback(async () => {\n if (!currentPlan?.publicId) return;\n setPlanProcessing(true);\n try {\n await planService.confirm(currentPlan.publicId, { approved: false });\n clearPlanState();\n toast.success('计划已取消');\n } catch (err) {\n console.error('[AgentChat] Reject plan failed:', err);\n toast.error('拒绝计划失败');\n } finally {\n setPlanProcessing(false);\n }\n }, [currentPlan, clearPlanState]);\n\n const handlePlanPause = useCallback(async () => {\n if (!currentPlan?.publicId) return;\n try {\n await planService.pause(currentPlan.publicId);\n } catch (err) {\n console.error('[AgentChat] Pause plan failed:', err);\n toast.error('暂停计划失败');\n }\n }, [currentPlan]);\n\n const handlePlanResume = useCallback(async () => {\n if (!currentPlan?.publicId) return;\n try {\n await planService.resume(currentPlan.publicId);\n } catch (err) {\n console.error('[AgentChat] Resume plan failed:', err);\n toast.error('恢复计划失败');\n }\n }, [currentPlan]);\n\n const handlePlanCancel = useCallback(async () => {\n if (!currentPlan?.publicId) return;\n try {\n await planService.cancel(currentPlan.publicId);\n clearPlanState();\n } catch (err) {\n console.error('[AgentChat] Cancel plan failed:', err);\n toast.error('取消计划失败');\n }\n }, [currentPlan, clearPlanState]);\n\n const handlePlanRetry = useCallback(async () => {\n if (!currentPlan?.publicId) return;\n setPlanProcessing(true);\n try {\n await planService.retry(currentPlan.publicId);\n toast.success('已重新尝试执行');\n } catch (err) {\n console.error('[AgentChat] Retry failed step failed:', err);\n toast.error('重试失败');\n } finally {\n setPlanProcessing(false);\n }\n }, [currentPlan]);\n\n const handlePlanSkip = useCallback(async () => {\n if (!currentPlan?.publicId) return;\n setPlanProcessing(true);\n try {\n await planService.skip(currentPlan.publicId);\n toast.success('已跳过失败步骤');\n } catch (err) {\n console.error('[AgentChat] Skip failed step failed:', err);\n toast.error('跳过失败');\n } finally {\n setPlanProcessing(false);\n }\n }, [currentPlan]);\n\n const handleHumanInputSubmit = useCallback(async (stepId: string, input: string) => {\n if (!stepId || !currentPlan?.publicId) return;\n try {\n await planService.provideHumanInput(currentPlan.publicId, stepId, { input });\n setShowHumanInputDialog(false);\n } catch (err) {\n console.error('[AgentChat] Submit human input failed:', err);\n toast.error('提交输入失败');\n }\n }, [currentPlan, setShowHumanInputDialog]);\n\n const handleHumanInputCancel = useCallback(() => {\n setShowHumanInputDialog(false);\n }, [setShowHumanInputDialog]);\n\n // 加载会话,工具,skills\n useEffect(() => {\n sessionService.list({ projectId, agentId, pageSize: 100 }).then(async res => {\n if (res.success && res.data) {\n const list = res.data.list.map((s: any) => ({ ...s, sessionId: s.publicId || s.session_id || s.id }));\n setSessions(list);\n }\n }).finally(() => setLoading(false));\n agentToolService.list(agentId).then(res => {\n res?.data?.length && setTools(res.data)\n })\n agentSkillService.list(agentId).then(res => {\n res?.data?.length && setSkills(res.data)\n })\n }, [agentId, projectId]);\n\n\n const loadMessages = async (sid: string) => {\n const res = await sessionService.getMessages(sid, { pageNo: 1, pageSize: 100 });\n if (res.success && res.data?.list) {\n const msgs = res.data.list\n .map((m: any) => {\n let status = m.status || 'completed';\n if (status === 'PENDING' || status === 'RUNNING' || status === 'pending' || status === 'running') {\n status = 'streaming';\n } else if (status === 'COMPLETED' || status === 'completed' || status === 'SUCCESS') {\n status = 'completed';\n } else if (status === 'FAILED' || status === 'failed' || status === 'ERROR') {\n status = 'failed';\n }\n\n return {\n ...m,\n messageId: m.publicId || m.messageId || m.id,\n sessionId: sid,\n content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n status,\n extraData: m.extraData,\n };\n })\n .sort((a: any, b: any) => {\n const timeA = new Date(a.gmtCreate || 0).getTime();\n const timeB = new Date(b.gmtCreate || 0).getTime();\n return timeA - timeB;\n });\n\n useAgentStore.getState().setMessages(msgs);\n\n // 查找未完成的消息:streaming、waiting_tool_confirmation、waiting_component 等状态\n const incompleteStatuses = ['streaming', 'waiting_tool_confirmation', 'waiting_component', 'waitingtoolconfirmation', 'waitingcomponent'];\n const pendingMsg = msgs.find((m: any) => {\n const statusLower = (m.status || '').toLowerCase();\n return incompleteStatuses.includes(statusLower);\n });\n \n if (pendingMsg) {\n console.log('[AgentChat] Found incomplete message, reconnecting:', pendingMsg.messageId, 'status:', pendingMsg.status);\n useAgentStore.getState().setIsStreaming(true, sid);\n setTimeout(() => {\n // 使用后端 messageId 进行重连(如果有的话)\n const backendId = pendingMsg.metadata?.backendId || pendingMsg.publicId || pendingMsg.messageId;\n reconnect(backendId);\n }, 200);\n }\n }\n };\n\n const handleNew = useCallback(async () => {\n const s = await createAndStartSession(projectId, agentId, '新对话');\n if (s?.sessionId) {\n addSession(s);\n setCurrentSession(s);\n useAgentStore.getState().setMessages([]);\n }\n }, [projectId, agentId]);\n\n const handlePrompt = useCallback(async (p: string) => {\n await handleNew();\n setInput(p);\n setTimeout(() => textareaRef.current?.focus(), 100);\n }, [handleNew]);\n\n const handleSelect = useCallback(async (s: AgentSession) => {\n setCurrentSession(s);\n onSessionIdChange?.(s.sessionId);\n setMobileOpen(false);\n useAgentStore.getState().setMessages([]);\n setMessagesLoading(true);\n await loadMessages(s.sessionId);\n setMessagesLoading(false);\n }, []);\n\n const handleDelete = useCallback(async (id: string) => {\n toast('删除此对话?', {\n action: {\n label: '确认删除',\n onClick: async () => {\n await sessionService.delete(id);\n removeSession(id);\n\n if (currentSession?.sessionId === id) {\n const remainingSessions = sessions.filter(s => s.sessionId !== id);\n if (remainingSessions.length > 0) {\n setCurrentSession(remainingSessions[0]);\n } else {\n setCurrentSession(null);\n }\n }\n\n toast.success('已删除');\n },\n },\n cancel: {\n label: '取消',\n onClick: () => {},\n },\n });\n }, [currentSession, sessions, removeSession]);\n\n const handleRename = useCallback(async (id: string, title: string) => {\n const res = await sessionService.updateTitle(id, title);\n if (res.success) useAgentStore.getState().updateSession(id, { title });\n }, []);\n\n const handleDeleteMessage = useCallback(async (messageId: string): Promise<boolean> => {\n try {\n const res = await messageService.delete(messageId);\n if (res.success) {\n useAgentStore.getState().removeMessage(messageId);\n toast.success('消息已删除');\n return true;\n } else {\n toast.error('删除失败');\n return false;\n }\n } catch (error) {\n console.error('[AgentChat] Delete message failed:', error);\n toast.error('删除消息失败');\n return false;\n }\n }, []);\n\n const handleSend = useCallback(async () => {\n if (!input.trim() && images.length === 0) return;\n if (!currentSession) return;\n\n let messageContent = input.trim();\n\n if (images.length > 0) {\n try {\n const { asset: assetStrategy } = config || {};\n const urls: string[] = [];\n\n for (const item of images) {\n let working = item.asset;\n\n if (assetStrategy?.validate) {\n const validation = assetStrategy.validate(working);\n if (!validation.ok) {\n if (validation.reason) toast.error(validation.reason);\n return;\n }\n }\n\n if (working.file instanceof File) {\n if (assetStrategy?.upload) {\n working = await assetStrategy.upload(working);\n } else {\n const uploadRes = await uploadOSS(working.file);\n const url = await getFileUrl(uploadRes.key);\n working = { ...working, fileId: uploadRes.key, url };\n }\n }\n\n const rendered = await resolveAssetForDisplay(working, config);\n if (rendered?.url) {\n urls.push(rendered.url);\n }\n }\n\n if (urls.length > 0) {\n const imageMarkdown = urls.map(url => `![image](${url})`).join('\\n');\n messageContent = imageMarkdown + (messageContent ? '\\n\\n' + messageContent : '');\n }\n } catch (err) {\n console.error('[handleSend] 图片上传失败:', err);\n toast.error('图片上传失败,请重试');\n return;\n }\n }\n\n lastUserMessageRef.current = input.trim();\n setInput('');\n images.forEach(img => {\n if (img.asset.file instanceof File) {\n URL.revokeObjectURL(img.preview);\n }\n });\n setImages([]);\n await sendMessage(currentSession.sessionId, messageContent);\n }, [input, images, currentSession, sendMessage, config]);\n\n const sendTextMessage = useCallback(async (content: string) => {\n if (!content.trim()) return;\n if (!currentSession) return;\n lastUserMessageRef.current = content.trim();\n await sendMessage(currentSession.sessionId, content.trim());\n }, [currentSession, sendMessage]);\n\n const abortStreaming = useCallback(async () => {\n await abort();\n }, [abort]);\n\n useImperativeHandle(ref, () => ({\n sendTextMessage,\n abortStreaming,\n }), [sendTextMessage, abortStreaming]);\n\n const handleAbortMessage = useCallback(async (messageId: string) => {\n const { messages, updateMessage } = useAgentStore.getState();\n const target = messages.find(m => m.messageId === messageId);\n const backendId = target?.metadata?.backendId || target?.messageId || messageId;\n const activeStreaming = messages.find(m => m.status === 'streaming');\n\n updateMessage(messageId, { status: 'failed' });\n\n if (activeStreaming?.messageId === messageId) {\n await abort();\n }\n\n try {\n if (backendId) {\n await messageService.cancel(backendId);\n }\n } catch (err) {\n console.error('[AgentChat] Cancel message failed:', err);\n }\n }, [abort]);\n\n const addAssetsWithPreview = useCallback(async (assets: Asset[]) => {\n const previews = await Promise.all(\n assets.map(async (asset) => {\n if (asset.file instanceof File) {\n return { asset, preview: URL.createObjectURL(asset.file) };\n }\n\n if (asset.url) {\n return { asset, preview: asset.url };\n }\n\n if (asset.fileId) {\n const resolved = await resolveAssetForDisplay(asset, config);\n if (resolved?.url) {\n return { asset: { ...asset, url: resolved.url }, preview: resolved.url };\n }\n }\n\n return null;\n })\n );\n\n const validPreviews = previews.filter(Boolean) as Array<{ asset: Asset; preview: string }>;\n if (validPreviews.length > 0) {\n setImages(prev => [...prev, ...validPreviews]);\n }\n }, [config]);\n\n const handleImageUpload = async (e?: React.ChangeEvent<HTMLInputElement>) => {\n const files = e?.target.files;\n if (!files || files.length === 0) return;\n\n const assets: Asset[] = Array.from(files).map(file => ({\n type: inferAssetTypeFromFile(file),\n file,\n name: file.name,\n size: file.size,\n mimeType: file.type\n }));\n\n // 校验\n const { asset: assetStrategy } = config || {};\n if (assetStrategy?.validate) {\n const invalidResult = assets\n .map(a => ({ asset: a, result: assetStrategy.validate!(a) }))\n .find(({ result }) => !result.ok);\n if (invalidResult) {\n if (invalidResult.result.reason) {\n toast.error(invalidResult.result.reason);\n }\n return;\n }\n }\n\n await addAssetsWithPreview(assets);\n\n if (e) {\n e.target.value = '';\n }\n };\n\n const handleCustomFileSelect = async () => {\n const { asset: assetStrategy } = config || {};\n\n if (assetStrategy?.select) {\n try {\n const result = await assetStrategy.select();\n if (result?.assets?.length) {\n await addAssetsWithPreview(result.assets);\n }\n } catch (error) {\n console.error('自定义文件选择失败:', error);\n toast.error('文件选择失败');\n }\n return;\n }\n\n fileInputRef.current?.click();\n };\n\n const removeImage = (index: number) => {\n setImages(prev => {\n const newImages = [...prev];\n const target = newImages[index];\n if (target?.asset?.file instanceof File) {\n URL.revokeObjectURL(target.preview);\n }\n newImages.splice(index, 1);\n return newImages;\n });\n };\n\n const handleStop = useCallback(() => {\n const streamingMsg = useAgentStore.getState().messages.find(m => m.status === 'streaming');\n if (streamingMsg) {\n handleAbortMessage(streamingMsg.messageId);\n } else {\n abort();\n }\n }, [handleAbortMessage, abort]);\n\n if (loading) {\n return (\n <div className={`agent-sdk-theme h-screen flex items-center justify-center bg-black ${themeClass} ${className || ''}`}>\n <Loader2 className=\"w-6 h-6 text-[#d8ff00] animate-spin\" />\n </div>\n );\n }\n\n return (\n <ComponentProvider components={mergedComponents}>\n <div\n className={`agent-sdk-theme h-screen flex bg-black overflow-hidden ${themeClass} ${className || ''} ${embedded ? 'h-full' : ''}`}\n style={themeStyle}\n >\n {/* 移动端遮罩 */}\n {showSidebar && mobileOpen && <div className=\"fixed inset-0 bg-black/70 z-40 lg:hidden\" onClick={() => setMobileOpen(false)} />}\n\n {/* 侧边栏 - 桌面 */}\n {showSidebar && (\n <div className=\"hidden lg:block h-full\">\n <Sidebar\n sessions={sessions}\n currentId={currentSession?.sessionId || null}\n onSelect={handleSelect}\n onDelete={handleDelete}\n onRename={handleRename}\n onReplay={(s) => onNavigateToReplay?.(s.sessionId)}\n onShare={(s) => { setShareSession(s); setShareModalOpen(true); }}\n onNew={handleNew}\n agentName={agentName}\n agentType={agentType}\n collapsed={collapsed}\n onToggle={() => setCollapsed(!collapsed)}\n />\n </div>\n )}\n\n {/* 侧边栏 - 移动端 */}\n {showSidebar && (\n <div className={`fixed inset-y-0 left-0 z-50 lg:hidden transform transition-transform ${mobileOpen ? 'translate-x-0' : '-translate-x-full'}`}>\n <Sidebar\n sessions={sessions}\n currentId={currentSession?.sessionId || null}\n onSelect={handleSelect}\n onDelete={handleDelete}\n onRename={handleRename}\n onReplay={(s) => onNavigateToReplay?.(s.sessionId)}\n onShare={(s) => { setShareSession(s); setShareModalOpen(true); }}\n onNew={handleNew}\n agentName={agentName}\n agentType={agentType}\n collapsed={false}\n onToggle={() => setMobileOpen(false)}\n />\n </div>\n )}\n\n {/* 主区域 */}\n <div className=\"flex-1 flex flex-col min-w-0 h-full\">\n\n {/* 内容区 - 左右分栏布局 */}\n {currentSession ? (\n <div \n ref={containerRef}\n className=\"flex-1 flex min-h-0 relative\"\n data-artifact-container\n >\n {/* 拖拽时的全局遮罩层 - 防止 iframe 抢焦点 */}\n {isDragging && (\n <div \n className=\"absolute inset-0 z-50 bg-transparent cursor-col-resize\"\n style={{ pointerEvents: 'all' }}\n />\n )}\n \n {/* 左侧:聊天区域 - 当 Artifact 打开时被挤压 */}\n <div \n className={cn(\n 'flex flex-col min-h-0 overflow-hidden',\n !isDragging && 'transition-[width,opacity,transform] duration-300 ease-out',\n isArtifactFullscreen \n ? 'w-0 min-w-0 opacity-0 -translate-x-4' \n : currentArtifact \n ? 'min-w-[350px]' \n : 'w-full'\n )}\n style={currentArtifact && !isArtifactFullscreen ? { width: `${100 - artifactPanelWidth}%` } : undefined}\n >\n {/* 顶栏 */}\n {showHeader && (\n <div className=\"flex items-center gap-2 h-12 px-3 border-b border-zinc-800/50 bg-zinc-950/80 backdrop-blur-sm flex-shrink-0\">\n <button onClick={() => setMobileOpen(true)} className=\"lg:hidden p-1.5 text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800 rounded-lg\">\n <PanelLeft size={18} />\n </button>\n {onNavigateBack && (\n <button onClick={onNavigateBack} className=\"p-1.5 text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800 rounded-lg\">\n <ArrowLeft size={18} />\n </button>\n )}\n <div className=\"h-4 w-px bg-zinc-800 mx-1\" />\n <span className=\"text-sm text-zinc-300 font-medium\">{agentName || 'Agent'}</span>\n {agentType && (\n <span className=\"text-[10px] text-zinc-600 bg-zinc-800/50 px-1.5 py-0.5 rounded\">\n {agentType === 'BUILTIN' ? '内置' : agentType === 'EXTERNAL' ? '外部' : '多Agent'}\n </span>\n )}\n {onNavigateToSettings && (\n <button onClick={onNavigateToSettings} className=\"ml-auto p-1.5 text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800 rounded-lg\">\n <Settings size={18} />\n </button>\n )}\n </div>\n )}\n <ChatWindow\n sessionId={currentSession.sessionId}\n loading={messagesLoading}\n config={config}\n onAbortMessage={handleAbortMessage}\n onDeleteMessage={handleDeleteMessage}\n onPlanConfirm={handlePlanConfirm}\n onPlanReject={handlePlanReject}\n onHumanInput={handleHumanInputSubmit}\n isPlanProcessing={planProcessing}\n waitingStepId={waitingStepId}\n onPlanPause={handlePlanPause}\n onPlanResume={handlePlanResume}\n onPlanRetry={handlePlanRetry}\n onPlanSkip={handlePlanSkip}\n onPlanCancel={handlePlanCancel}\n onOpenArtifact={handleOpenArtifact}\n />\n\n {!hideInput && (\n <ChatInputArea\n input={input}\n setInput={setInput}\n images={images}\n setImages={setImages}\n onSend={handleSend}\n onStop={handleStop}\n isStreaming={isCurrentSessionStreaming}\n config={config}\n />\n )}\n </div>\n \n {/* 拖拽 Handle - 使用绝对定位居中于两个面板边界 */}\n {currentArtifact && !isArtifactFullscreen && (\n <DragHandle \n artifactPanelWidth={artifactPanelWidth}\n isDragging={isDragging}\n onMouseDown={handleDragMouseDown}\n />\n )}\n\n {/* 右侧:Artifact 面板 - 与聊天区域并排,丝滑动画展开 */}\n <div \n className={cn(\n 'flex-shrink-0 overflow-hidden h-full relative',\n !isDragging && 'transition-[width,opacity] duration-300 ease-out',\n currentArtifact \n ? isArtifactFullscreen \n ? 'w-full min-w-0 border-l-0' \n : 'min-w-[400px]'\n : 'w-0 min-w-0 opacity-0'\n )}\n style={currentArtifact && !isArtifactFullscreen ? { width: `${artifactPanelWidth}%` } : undefined}\n >\n {/* 拖拽时的遮罩层 - 防止 iframe 抢焦点 */}\n {isDragging && (\n <div \n className=\"absolute inset-0 z-50 bg-transparent cursor-col-resize\"\n />\n )}\n {currentArtifact && (\n <ArtifactViewer\n artifact={currentArtifact}\n isOpen={true}\n onClose={handleCloseArtifact}\n config={config}\n isFullscreen={isArtifactFullscreen}\n onFullscreenToggle={handleToggleArtifactFullscreen}\n embedded\n />\n )}\n </div>\n </div>\n ) : (\n <WelcomePage\n agentName={agentName}\n welcomeMessage={welcomeMessage}\n tools={[...(_tools || []), ...(tools || [])]}\n onNew={handleNew}\n onPrompt={handlePrompt}\n />\n )}\n </div>\n\n {/* 分享弹窗 */}\n <ShareModal\n sessionId={shareSession?.sessionId || ''}\n sessionTitle={shareSession?.title}\n isOpen={shareModalOpen}\n onClose={() => { setShareModalOpen(false); setShareSession(null); }}\n />\n </div>\n </ComponentProvider>\n );\n});\n\nexport default AgentChat;\n","'use client';\n\nimport React, { useEffect, useState, useCallback, useRef, useMemo } from 'react';\nimport {\n shareService,\n MessageBubble,\n type AgentMessage,\n type SharedSessionDTO,\n} from '../index';\nimport { toast } from 'sonner';\nimport {\n Bot,\n Play,\n Pause,\n RotateCcw,\n SkipForward,\n Share2,\n CheckCircle,\n Loader2,\n Lock,\n Eye,\n Calendar,\n User,\n AlertCircle,\n ArrowLeft,\n} from 'lucide-react';\n\ntype PlayState = 'idle' | 'playing' | 'paused' | 'finished';\ntype PageState = 'loading' | 'password-required' | 'invalid' | 'ready' | 'error';\n\nconst SPEED_OPTIONS = [\n { value: 1, label: '1x' },\n { value: 2, label: '2x' },\n { value: 5, label: '5x' },\n { value: 10, label: '10x' },\n { value: 20, label: '20x' },\n];\n\ninterface ShareReplayPageProps {\n shareId: string;\n onNavigateBack?: () => void;\n}\n\nexport default function ShareReplayPage({ shareId, onNavigateBack }: ShareReplayPageProps) {\n // 页面状态\n const [pageState, setPageState] = useState<PageState>('loading');\n const [error, setError] = useState<string | null>(null);\n\n // 密码输入\n const [password, setPassword] = useState('');\n const [verifying, setVerifying] = useState(false);\n const [shareToken, setShareToken] = useState<string | null>(null);\n\n // 分享数据\n const [sharedData, setSharedData] = useState<SharedSessionDTO | null>(null);\n const [allMessages, setAllMessages] = useState<AgentMessage[]>([]);\n\n // 播放状态\n const [playState, setPlayState] = useState<PlayState>('idle');\n const [currentIndex, setCurrentIndex] = useState(0);\n const [displayedMessages, setDisplayedMessages] = useState<AgentMessage[]>([]);\n const [speed, setSpeed] = useState(2);\n const [isTyping, setIsTyping] = useState(false);\n const [typingContent, setTypingContent] = useState('');\n\n // Refs\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const playStateRef = useRef<PlayState>('idle');\n const currentIndexRef = useRef(0);\n const isTypingRef = useRef(false);\n const typingStartTimeRef = useRef<string>('');\n\n // 缓存正在打字的消息对象\n const typingMessage = useMemo(() => {\n const sessionIdValue = sharedData?.session?.sessionId || shareId;\n if (!sessionIdValue) return null;\n return {\n messageId: 'typing',\n sessionId: sessionIdValue,\n role: 'assistant' as const,\n content: '',\n status: 'streaming' as const,\n gmtCreate: typingStartTimeRef.current || new Date().toISOString(),\n };\n }, [sharedData?.session?.sessionId, shareId]);\n\n // 获取存储的 token key\n const getTokenStorageKey = (id: string) => `share_token_${id}`;\n\n // 检查分享有效性和密码需求\n useEffect(() => {\n async function checkShare() {\n if (!shareId) {\n setError('分享 ID 无效');\n setPageState('error');\n return;\n }\n\n try {\n setPageState('loading');\n setError(null);\n\n // 检查分享是否有效\n const validRes = await shareService.isValid(shareId);\n if (!validRes.success || !validRes.data) {\n throw new Error('分享链接已失效');\n }\n\n // 检查是否需要密码\n const passwordRes = await shareService.isPasswordRequired(shareId);\n if (passwordRes.success && passwordRes.data) {\n setPageState('password-required');\n return;\n }\n\n // 无需密码,直接加载内容\n await loadShareContent(shareId);\n } catch (err: any) {\n setError(err.message || '加载失败');\n setPageState('error');\n }\n }\n\n checkShare();\n }, [shareId]);\n\n // 加载分享内容\n const loadShareContent = async (id: string, token?: string) => {\n try {\n const res = await shareService.getPublicContent(id, token);\n if (res.success && res.data) {\n setSharedData(res.data);\n const messages = (res.data.messages || []).sort((a, b) =>\n new Date(a.gmtCreate || 0).getTime() - new Date(b.gmtCreate || 0).getTime()\n );\n setAllMessages(messages);\n setPageState('ready');\n } else {\n throw new Error('加载内容失败');\n }\n } catch (err: any) {\n setError(err.message || '加载失败');\n setPageState('error');\n }\n };\n\n // 验证密码\n const handleVerifyPassword = async () => {\n if (!password.trim()) {\n toast.error('请输入密码');\n return;\n }\n\n setVerifying(true);\n try {\n const res = await shareService.verifyPassword({ shareId, password });\n if (res.success && res.data) {\n const token = res.data;\n setShareToken(token);\n localStorage.setItem(getTokenStorageKey(shareId), token);\n await loadShareContent(shareId, token);\n } else {\n toast.error('密码错误');\n }\n } catch (err: any) {\n toast.error(err.message || '验证失败');\n } finally {\n setVerifying(false);\n }\n };\n\n // 滚动到底部\n const scrollToBottom = useCallback(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, []);\n\n useEffect(() => {\n scrollToBottom();\n }, [displayedMessages, typingContent, scrollToBottom]);\n\n // 清理定时器\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n // 同步 ref 值\n useEffect(() => {\n playStateRef.current = playState;\n }, [playState]);\n\n useEffect(() => {\n currentIndexRef.current = currentIndex;\n }, [currentIndex]);\n\n useEffect(() => {\n isTypingRef.current = isTyping;\n }, [isTyping]);\n\n // 播放下一条消息\n const scheduleNext = useCallback(() => {\n if (playStateRef.current !== 'playing') return;\n\n const idx = currentIndexRef.current;\n if (idx >= allMessages.length) {\n setPlayState('finished');\n playStateRef.current = 'finished';\n return;\n }\n\n const message = allMessages[idx];\n const content = message.content || '';\n\n // 用户消息直接显示\n if (!content || message.role === 'user') {\n setDisplayedMessages(prev => [...prev, message]);\n setCurrentIndex(idx + 1);\n currentIndexRef.current = idx + 1;\n timerRef.current = setTimeout(scheduleNext, 200 / speed);\n return;\n }\n\n // 检查消息是否包含 markdown 图片\n const hasMarkdownImages = /!\\[.*?\\]\\(.*?\\)/.test(content);\n\n // 提取纯文本内容(移除图片 markdown),用于打字机效果\n const textOnlyContent = hasMarkdownImages\n ? content.replace(/!\\[.*?\\]\\(.*?\\)/g, '').trim()\n : content;\n\n // AI 消息使用打字机效果\n typingStartTimeRef.current = new Date().toISOString();\n setIsTyping(true);\n isTypingRef.current = true;\n setTypingContent('');\n\n let charIndex = 0;\n const baseInterval = 15 / speed;\n\n const typeChar = () => {\n if (playStateRef.current !== 'playing' && playStateRef.current !== 'paused') {\n return;\n }\n\n if (charIndex < textOnlyContent.length) {\n const chunkSize = Math.min(Math.ceil(speed), 3);\n const chunk = textOnlyContent.slice(charIndex, charIndex + chunkSize);\n setTypingContent(prev => prev + chunk);\n charIndex += chunkSize;\n timerRef.current = setTimeout(typeChar, baseInterval);\n } else {\n setIsTyping(false);\n isTypingRef.current = false;\n setTypingContent('');\n setDisplayedMessages(prev => [...prev, message]);\n setCurrentIndex(idx + 1);\n currentIndexRef.current = idx + 1;\n\n const delay = hasMarkdownImages ? 600 / speed : 300 / speed;\n if (playStateRef.current === 'playing') {\n timerRef.current = setTimeout(scheduleNext, delay);\n }\n }\n };\n\n typeChar();\n }, [allMessages, speed]);\n\n // 播放控制\n const handlePlay = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n if (playState === 'finished') {\n setCurrentIndex(0);\n currentIndexRef.current = 0;\n setDisplayedMessages([]);\n setIsTyping(false);\n isTypingRef.current = false;\n setTypingContent('');\n }\n\n if (playState === 'paused' && isTypingRef.current) {\n const idx = currentIndexRef.current;\n if (idx < allMessages.length) {\n const message = allMessages[idx];\n setIsTyping(false);\n isTypingRef.current = false;\n setTypingContent('');\n setDisplayedMessages(prev => [...prev, message]);\n setCurrentIndex(idx + 1);\n currentIndexRef.current = idx + 1;\n }\n }\n\n setPlayState('playing');\n playStateRef.current = 'playing';\n setTimeout(() => {\n scheduleNext();\n }, 100);\n }, [playState, allMessages, scheduleNext]);\n\n const handlePause = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n setPlayState('paused');\n playStateRef.current = 'paused';\n }, []);\n\n const handleReset = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n setPlayState('idle');\n playStateRef.current = 'idle';\n setCurrentIndex(0);\n currentIndexRef.current = 0;\n setDisplayedMessages([]);\n setIsTyping(false);\n isTypingRef.current = false;\n setTypingContent('');\n }, []);\n\n const handleSkip = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n const idx = currentIndexRef.current;\n if (isTypingRef.current && idx < allMessages.length) {\n const message = allMessages[idx];\n setIsTyping(false);\n isTypingRef.current = false;\n setTypingContent('');\n setDisplayedMessages(prev => [...prev, message]);\n setCurrentIndex(idx + 1);\n currentIndexRef.current = idx + 1;\n\n if (playStateRef.current === 'playing') {\n timerRef.current = setTimeout(scheduleNext, 300);\n }\n }\n }, [allMessages, scheduleNext]);\n\n // 复制分享链接\n const handleShare = useCallback(() => {\n const url = window.location.href;\n navigator.clipboard.writeText(url);\n toast.success('链接已复制到剪贴板');\n }, []);\n\n // 跳转到完整显示\n const handleShowAll = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n setDisplayedMessages(allMessages);\n setCurrentIndex(allMessages.length);\n currentIndexRef.current = allMessages.length;\n setPlayState('finished');\n playStateRef.current = 'finished';\n setIsTyping(false);\n isTypingRef.current = false;\n setTypingContent('');\n }, [allMessages]);\n\n // 渲染加载状态\n if (pageState === 'loading') {\n return (\n <div className=\"flex items-center justify-center h-screen bg-zinc-950\">\n <Loader2 className=\"w-8 h-8 animate-spin text-[#d8ff00]\" />\n </div>\n );\n }\n\n // 渲染密码输入\n if (pageState === 'password-required') {\n return (\n <div className=\"flex flex-col items-center justify-center h-screen bg-zinc-950 p-4\">\n <div className=\"w-full max-w-md bg-zinc-900 border border-zinc-800 rounded-xl p-6\">\n <div className=\"flex items-center justify-center mb-4\">\n <Lock size={48} className=\"text-[#d8ff00]\" />\n </div>\n <h2 className=\"text-xl font-semibold text-white mb-2 text-center\">需要密码</h2>\n <p className=\"text-zinc-500 text-center mb-6\">请输入密码查看分享内容</p>\n\n <div className=\"space-y-4\">\n <input\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleVerifyPassword()}\n placeholder=\"输入密码\"\n className=\"w-full px-4 py-3 bg-zinc-800 border border-zinc-700 rounded-lg text-white placeholder-zinc-500 focus:outline-none focus:border-[#d8ff00]\"\n />\n <button\n onClick={handleVerifyPassword}\n disabled={verifying || !password.trim()}\n className=\"w-full py-3 bg-[#d8ff00] hover:bg-[#c2e600] disabled:bg-zinc-700 text-black font-medium rounded-lg transition-colors\"\n >\n {verifying ? '验证中...' : '确认'}\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // 渲染错误状态\n if (pageState === 'error' || !shareId) {\n return (\n <div className=\"flex flex-col items-center justify-center h-screen bg-zinc-950 gap-4\">\n <AlertCircle size={48} className=\"text-red-400\" />\n <p className=\"text-red-400 text-lg\">{error || '未指定分享'}</p>\n {onNavigateBack && (\n <button\n onClick={onNavigateBack}\n className=\"px-4 py-2 text-sm bg-zinc-800 text-white rounded-lg hover:bg-zinc-700\"\n >\n 返回\n </button>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col h-screen bg-zinc-950\">\n {/* 顶部栏 */}\n <div className=\"flex items-center justify-between px-4 py-2.5 border-b border-zinc-800/50 bg-zinc-950/80 backdrop-blur-sm\">\n <div className=\"flex items-center gap-3\">\n {onNavigateBack && (\n <button\n onClick={onNavigateBack}\n className=\"p-1.5 text-zinc-400 hover:text-white hover:bg-zinc-800 rounded-lg transition-colors\"\n >\n <ArrowLeft size={18} />\n </button>\n )}\n <div className=\"flex items-center gap-2\">\n <div className=\"w-7 h-7 rounded-lg bg-[#d8ff00]/10 flex items-center justify-center\">\n <Bot size={14} className=\"text-[#d8ff00]\" />\n </div>\n <div>\n <h1 className=\"text-sm font-medium text-white\">{sharedData?.title || '分享回放'}</h1>\n <div className=\"flex items-center gap-2 text-[11px] text-zinc-500 mt-0.5\">\n {sharedData?.creatorName && (\n <>\n <User size={12} />\n <span>{sharedData.creatorName}</span>\n </>\n )}\n {sharedData?.shareTime && (\n <>\n <Calendar size={12} />\n <span>{new Date(sharedData.shareTime).toLocaleDateString()}</span>\n </>\n )}\n <Eye size={12} />\n <span>{sharedData?.viewCount || 0} 次查看</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* 分享按钮 */}\n <button\n onClick={handleShare}\n className=\"p-2 text-zinc-400 hover:text-[#d8ff00] hover:bg-zinc-800 rounded-lg transition-colors\"\n title=\"复制分享链接\"\n >\n <Share2 size={16} />\n </button>\n </div>\n\n {/* 消息区域 */}\n <div className=\"flex-1 overflow-y-auto px-4 py-6 pb-24\">\n <div className=\"max-w-3xl mx-auto space-y-4\">\n {displayedMessages.map((msg, index) => (\n <MessageBubble\n key={msg.messageId || index}\n message={msg}\n isStreaming={false}\n />\n ))}\n\n {/* 正在打字的消息 */}\n {isTyping && typingContent && typingMessage && (\n <MessageBubble\n message={typingMessage as AgentMessage}\n isStreaming={true}\n streamingContent={typingContent}\n />\n )}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n\n {/* 悬浮控制栏 */}\n <div className=\"fixed bottom-6 left-1/2 -translate-x-1/2 z-50\">\n <div className=\"flex items-center gap-2 px-4 py-2.5 bg-zinc-900/95 backdrop-blur-sm border border-zinc-700/50 rounded-full shadow-xl\">\n {/* 重置 */}\n <button\n onClick={handleReset}\n disabled={playState === 'idle' && currentIndex === 0}\n className=\"p-2 text-zinc-400 hover:text-white hover:bg-zinc-800 rounded-full transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n title=\"重置\"\n >\n <RotateCcw size={16} />\n </button>\n\n {/* 播放/暂停 */}\n {playState === 'playing' ? (\n <button\n onClick={handlePause}\n className=\"p-2.5 bg-[#d8ff00] text-black rounded-full hover:bg-[#c2e600] transition-colors\"\n title=\"暂停\"\n >\n <Pause size={18} />\n </button>\n ) : (\n <button\n onClick={handlePlay}\n disabled={allMessages.length === 0}\n className=\"p-2.5 bg-[#d8ff00] text-black rounded-full hover:bg-[#c2e600] transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n title={playState === 'finished' ? '再播一次' : playState === 'paused' ? '继续播放' : '开始播放'}\n >\n <Play size={18} />\n </button>\n )}\n\n {/* 跳过 */}\n <button\n onClick={handleSkip}\n disabled={!isTyping}\n className=\"p-2 text-zinc-400 hover:text-white hover:bg-zinc-800 rounded-full transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n title=\"跳过当前消息\"\n >\n <SkipForward size={16} />\n </button>\n\n <div className=\"w-px h-5 bg-zinc-700\" />\n\n {/* 显示全部 */}\n <button\n onClick={handleShowAll}\n disabled={playState === 'finished'}\n className=\"px-2.5 py-1 text-xs text-zinc-400 hover:text-white hover:bg-zinc-800 rounded-full transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n 全部\n </button>\n\n {/* 进度指示 */}\n <span className=\"text-xs text-zinc-500\">\n {displayedMessages.length}/{allMessages.length}\n </span>\n\n {/* 速度选择 */}\n <select\n value={speed}\n onChange={(e) => setSpeed(Number(e.target.value))}\n className=\"px-2 py-1 text-xs bg-zinc-800 text-zinc-300 rounded-full border-0 focus:ring-1 focus:ring-[#d8ff00]/50 cursor-pointer\"\n >\n {SPEED_OPTIONS.map(opt => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n\n {/* 完成状态 */}\n {playState === 'finished' && (\n <CheckCircle size={14} className=\"text-green-400\" />\n )}\n </div>\n </div>\n </div>\n );\n}\n"]}