@axiom-lattice/react-sdk 4.1.4 → 4.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AgentDetailSideApp-KVL27KAF.mjs → AgentDetailSideApp-EBS7FGQS.mjs} +8 -8
- package/dist/AgentGovernanceWorkbench-IHYEFXEU.mjs +20 -0
- package/dist/{MessageGraph-LOSAZQ2V.mjs → MessageGraph-CU7TPJJI.mjs} +3 -3
- package/dist/{ReactChart-NDLIHCJJ.mjs → ReactChart-INAST7XW.mjs} +3 -3
- package/dist/{SkillFlow-OVKEKBOL.mjs → SkillFlow-TBKF765E.mjs} +4 -4
- package/dist/{TasksSideApp-37YKH7HV.mjs → TasksSideApp-IN46CQ4D.mjs} +4 -4
- package/dist/{TeamWorkspace-EAFZU3KS.mjs → TeamWorkspace-IH6F5QYO.mjs} +3 -3
- package/dist/{TopologyRuntimeView-53OCKDYA.mjs → TopologyRuntimeView-LR3YQQIU.mjs} +4 -4
- package/dist/{WorkflowAutomationView-R4EHXT7I.mjs → WorkflowAutomationView-GWBROX7L.mjs} +6 -6
- package/dist/{chunk-SLXJAOF2.mjs → chunk-4PV75HKR.mjs} +2 -2
- package/dist/{chunk-YYP5ASCR.mjs → chunk-EOBSSJ2W.mjs} +5 -5
- package/dist/{chunk-LEEQPRDB.mjs → chunk-HMBSH53V.mjs} +102 -33
- package/dist/chunk-HMBSH53V.mjs.map +1 -0
- package/dist/{chunk-NHD2XFH4.mjs → chunk-K7WBURGK.mjs} +3 -3
- package/dist/{chunk-AMIVRDYB.mjs → chunk-MFAPAXZ2.mjs} +2 -2
- package/dist/{chunk-WQBBDRPU.mjs → chunk-MSQON5ZR.mjs} +32 -28
- package/dist/chunk-MSQON5ZR.mjs.map +1 -0
- package/dist/{chunk-OT7IZRSM.mjs → chunk-O7PTPMW2.mjs} +2 -2
- package/dist/{chunk-EWLXRAWY.mjs → chunk-PBKPYK27.mjs} +237 -298
- package/dist/chunk-PBKPYK27.mjs.map +1 -0
- package/dist/{chunk-N4C7TX7T.mjs → chunk-R4XGQTDJ.mjs} +3 -3
- package/dist/{chunk-FKK4AXDU.mjs → chunk-YRPBTDOU.mjs} +5 -5
- package/dist/{embed-page-AgentDetailSideApp-3LBCEKFU.js → embed-page-AgentDetailSideApp-YPN3NDEA.js} +1 -1
- package/dist/{embed-page-AgentGovernanceWorkbench-K3JUQNBW.js → embed-page-AgentGovernanceWorkbench-FAZQNPAM.js} +1 -1
- package/dist/{embed-page-MessageGraph-3X4ROEN6.js → embed-page-MessageGraph-CEOPX4GM.js} +1 -1
- package/dist/{embed-page-ReactChart-F6VYCIYY.js → embed-page-ReactChart-NZAYQOQH.js} +1 -1
- package/dist/{embed-page-SkillFlow-3CF7R3CW.js → embed-page-SkillFlow-TPESM4DI.js} +1 -1
- package/dist/{embed-page-TasksSideApp-3WRDBZU3.js → embed-page-TasksSideApp-3EAPMISU.js} +1 -1
- package/dist/{embed-page-TeamWorkspace-6JSMZYUF.js → embed-page-TeamWorkspace-HB7ER45L.js} +1 -1
- package/dist/{embed-page-TopologyRuntimeView-YDFENLHH.js → embed-page-TopologyRuntimeView-O7JPR22B.js} +1 -1
- package/dist/{embed-page-WorkflowAutomationView-MP5B7Q2Q.js → embed-page-WorkflowAutomationView-OUXOBHXC.js} +1 -1
- package/dist/{embed-page-chunk-YMJGPA3F.js → embed-page-chunk-4SKSUBXL.js} +93 -102
- package/dist/{embed-page-chunk-B2E2XOH2.js → embed-page-chunk-5XKUKLZQ.js} +1 -1
- package/dist/{embed-page-chunk-UOL6CUAL.js → embed-page-chunk-6C2UZV63.js} +1 -1
- package/dist/{embed-page-chunk-IRP6JSSX.js → embed-page-chunk-GCDGRO6A.js} +1 -1
- package/dist/{embed-page-chunk-GDTBDOUE.js → embed-page-chunk-ILNGM4RN.js} +38 -38
- package/dist/embed-page-chunk-KFUAWYJ7.js +5 -0
- package/dist/{embed-page-chunk-FFO7CAYL.js → embed-page-chunk-RTVQJYET.js} +1 -1
- package/dist/{embed-page-chunk-QEYWJHEK.js → embed-page-chunk-TQPMRDLI.js} +1 -1
- package/dist/{embed-page-chunk-PAJ5NG2Z.js → embed-page-chunk-U6JBLAYD.js} +1 -1
- package/dist/{embed-page-chunk-RVXX5HKF.js → embed-page-chunk-ZTRCHYWV.js} +1 -1
- package/dist/embed-page.js +1 -1
- package/dist/index.d.mts +31 -6
- package/dist/index.d.ts +31 -6
- package/dist/index.js +224 -194
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +26 -14
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/AgentGovernanceWorkbench-I6S4XU3T.mjs +0 -20
- package/dist/chunk-EWLXRAWY.mjs.map +0 -1
- package/dist/chunk-LEEQPRDB.mjs.map +0 -1
- package/dist/chunk-WQBBDRPU.mjs.map +0 -1
- package/dist/embed-page-chunk-URNZX66S.js +0 -5
- /package/dist/{AgentDetailSideApp-KVL27KAF.mjs.map → AgentDetailSideApp-EBS7FGQS.mjs.map} +0 -0
- /package/dist/{AgentGovernanceWorkbench-I6S4XU3T.mjs.map → AgentGovernanceWorkbench-IHYEFXEU.mjs.map} +0 -0
- /package/dist/{MessageGraph-LOSAZQ2V.mjs.map → MessageGraph-CU7TPJJI.mjs.map} +0 -0
- /package/dist/{ReactChart-NDLIHCJJ.mjs.map → ReactChart-INAST7XW.mjs.map} +0 -0
- /package/dist/{SkillFlow-OVKEKBOL.mjs.map → SkillFlow-TBKF765E.mjs.map} +0 -0
- /package/dist/{TasksSideApp-37YKH7HV.mjs.map → TasksSideApp-IN46CQ4D.mjs.map} +0 -0
- /package/dist/{TeamWorkspace-EAFZU3KS.mjs.map → TeamWorkspace-IH6F5QYO.mjs.map} +0 -0
- /package/dist/{TopologyRuntimeView-53OCKDYA.mjs.map → TopologyRuntimeView-LR3YQQIU.mjs.map} +0 -0
- /package/dist/{WorkflowAutomationView-R4EHXT7I.mjs.map → WorkflowAutomationView-GWBROX7L.mjs.map} +0 -0
- /package/dist/{chunk-SLXJAOF2.mjs.map → chunk-4PV75HKR.mjs.map} +0 -0
- /package/dist/{chunk-YYP5ASCR.mjs.map → chunk-EOBSSJ2W.mjs.map} +0 -0
- /package/dist/{chunk-NHD2XFH4.mjs.map → chunk-K7WBURGK.mjs.map} +0 -0
- /package/dist/{chunk-AMIVRDYB.mjs.map → chunk-MFAPAXZ2.mjs.map} +0 -0
- /package/dist/{chunk-OT7IZRSM.mjs.map → chunk-O7PTPMW2.mjs.map} +0 -0
- /package/dist/{chunk-N4C7TX7T.mjs.map → chunk-R4XGQTDJ.mjs.map} +0 -0
- /package/dist/{chunk-FKK4AXDU.mjs.map → chunk-YRPBTDOU.mjs.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useChat.ts","../src/components/Chat/AssistantContext.tsx","../src/theme/axiom-tokens.ts","../src/theme/axiom-antd-theme.ts","../src/theme/useAxiomTheme.ts","../src/components/Auth/LoginForm.tsx","../src/components/Auth/UserProfile.tsx","../src/components/Auth/TenantLogo.tsx","../src/hooks/useTenantBranding.ts","../src/components/Auth/TenantSelector.tsx","../src/components/Auth/ChangePasswordModal.tsx","../src/hooks/useTenants.ts","../src/context/WorkspaceContext.tsx","../src/components/Chat/ConversationContext.tsx","../src/context/AgentThreadContext.tsx","../src/stream/ThreadStream.ts","../src/hooks/useAgentChat.ts","../src/hooks/useAgentState.ts","../src/hooks/useAgentGraph.ts","../src/hooks/eval/useEvalProjects.ts","../src/hooks/eval/useEvalSuites.ts","../src/hooks/eval/evalGuards.ts","../src/hooks/eval/useEvalCases.ts","../src/hooks/eval/useEvalRuns.ts","../src/hooks/eval/useEvalRunStream.ts","../src/components/Chat/ChatUIContext.tsx","../src/components/Chat/SideAppBrowserContext.tsx","../src/components/GenUI/elements/generic_data_table.tsx","../src/components/GenUI/MDResponse.tsx","../src/components/GenUI/Code.tsx","../src/components/GenUI/elements/confirm_feedback.tsx","../src/hooks/useCollections.ts","../src/hooks/useExportImport.ts","../src/hooks/useVoiceRecorder.ts","../src/components/GenUI/elements/clarify_feedback.tsx","../src/context/ClarifyInterruptContext.ts","../src/components/GenUI/elements/task_review.tsx","../src/components/GenUI/elements/generic_data_table_side_app.tsx","../src/components/GenUI/elements/ToolCall.tsx","../src/components/GenUI/elements/ToolCard.tsx","../src/components/GenUI/elements/getStatusIcon.tsx","../src/components/GenUI/elements/formatToolName.ts","../src/components/GenUI/elements/eval_manage_card.tsx","../src/components/EntityList/EntityCard.tsx","../src/components/EntityList/types.ts","../src/components/GenUI/elements/eval_detail_side_app.tsx","../src/components/Eval/EvalPanel.tsx","../src/components/Eval/EvalSuiteCardList.tsx","../src/components/Eval/EvalSuiteDetail.tsx","../src/components/EntityList/EntityListView.tsx","../src/components/EntityList/EntityRow.tsx","../src/components/EntityList/EntityCreateTrigger.tsx","../src/components/EntityList/EntityListShell.tsx","../src/components/EntityList/ViewToggle.tsx","../src/components/Eval/RunEnvModal.tsx","../src/components/ProjectSelector.tsx","../src/components/EntityList/FilterSelect.tsx","../src/components/Eval/EvalRunResults.tsx","../src/hooks/eval/useEvalRunDetail.ts","../src/components/GenUI/elements/run_eval_card.tsx","../src/components/GenUI/elements/read_eval_card.tsx","../src/components/GenUI/elements/task_manage_card.tsx","../src/components/GenUI/elements/builtIns.tsx","../src/components/GenUI/elements/Todo.tsx","../src/components/GenUI/elements/WriteTodos.tsx","../src/components/GenUI/FileExplorer.tsx","../src/components/GenUI/MarkdownViewer.tsx","../src/utils/fileUtils.ts","../src/components/GenUI/elements/getFileIcon.tsx","../src/components/GenUI/elements/attachments_card.tsx","../src/components/GenUI/elements/attachments_viewer_side_app.tsx","../src/components/GenUI/FileRenderer.tsx","../src/components/GenUI/RenderMDFromURL.tsx","../src/components/GenUI/ShareModal.tsx","../src/components/GenUI/elements/WriteFile.tsx","../src/components/GenUI/elements/ContentPreviewCollapse.tsx","../../../node_modules/.pnpm/@alexbruf+react-diff-viewer@3.1.5_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@alexbruf/react-diff-viewer/dist/esm/index.js","../src/components/GenUI/elements/file_content_diff_view.tsx","../src/components/GenUI/elements/EditFile.tsx","../src/components/GenUI/elements/task_card.tsx","../src/components/GenUI/elements/task_detail.tsx","../src/components/Chat/Chating.tsx","../src/components/Chat/MessageViewPanel.tsx","../src/components/Chat/MessageList.tsx","../src/components/Chat/useStyle.tsx","../src/components/Chat/messageGraphUtils.ts","../src/components/GenUI/HITLContainer.tsx","../src/components/GenUI/PendingMessagesContainer.tsx","../src/components/Chat/AgentHeader/ThreadArtifacts.tsx","../src/components/Chat/TodoProgress.tsx","../src/components/Chat/TaskProgress.tsx","../src/components/Chat/ProgressTracker.tsx","../src/components/Chat/FileExplorerButton.tsx","../src/components/Chat/ScheduleButton.tsx","../src/components/Chat/TeamButton.tsx","../src/components/Chat/MailboxButton.tsx","../src/components/Chat/AgentHeader.tsx","../src/components/Chat/AgentHeader/AgentLoadingSpinner.tsx","../src/components/Chat/ChatViewToggle.tsx","../src/components/shared/SegmentedToggle.tsx","../src/components/Chat/ThreadManagementButtons.tsx","../src/components/Chat/DatabasePicker.tsx","../src/components/Chat/SkillPicker.tsx","../src/components/Chat/AgentPicker.tsx","../src/components/Chat/MetricsDataSourcePicker.tsx","../src/components/Chat/ModelSelector.tsx","../src/components/Chat/SkillCategoryPrompts.tsx","../src/components/Chat/BusinessAnalysisPrompts.tsx","../src/components/Chat/VoiceInputButton.tsx","../src/components/Chat/workspaceFileCollector.ts","../src/components/Chat/fileQueryFilter.ts","../src/components/Chat/suggestionNav.ts","../src/components/Chat/InitialMessageSubmitter.tsx","../src/components/Chat/EmbedChatBridge.tsx","../src/components/GenUI/elements/internet_search_card.tsx","../src/components/GenUI/elements/schedule_viewer.tsx","../src/components/GenUI/elements/browser_view_card.tsx","../src/components/GenUI/elements/execute_code.tsx","../src/components/GenUI/elements/TeamGraph.tsx","../src/components/GenUI/elements/TaskBoard.tsx","../src/components/GenUI/elements/TaskBoardCard.tsx","../src/components/GenUI/elements/Mailbox.tsx","../src/components/GenUI/elements/MailboxPanel.tsx","../src/components/GenUI/elements/MailboxDetailModal.tsx","../src/components/GenUI/elements/ShowWidget.tsx","../src/streaming-html/StreamingHTMLRenderer.tsx","../src/streaming-html/show-widget-css-generator.ts","../src/streaming-html/IframeHTMLBridge.ts","../src/components/GenUI/elements/ShowWidgetApp.tsx","../src/components/GenUI/elements/search_collection_result.tsx","../src/components/GenUI/elements/index.tsx","../src/components/GenUI/Embed.tsx","../src/components/GenUI/MDComponentWrap.tsx","../src/components/GenUI/elements/file_link.tsx","../src/components/GenUI/elements/file_path_link.tsx","../src/components/GenUI/elements/MarkdownTable.tsx","../src/components/GenUI/mdComponents.tsx","../src/utils/filePathLinkify.ts"],"sourcesContent":["import { useState, useCallback, useEffect, useRef } from \"react\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { useClient } from \"../context\";\nimport {\n ChatState,\n ChatStateWithAgent,\n UseChatOptions,\n StreamEventHandlerOptions,\n ChatResponse,\n AgentState,\n} from \"../types\";\nimport {\n InterruptMessage,\n Message,\n MessageChunk,\n} from \"@axiom-lattice/protocols\";\nimport { createSimpleMessageMerger } from \"@axiom-lattice/client-sdk\";\n\n/**\n * Hook for managing chat interactions with an agent\n *\n * This hook provides functionality for:\n * - Sending messages to an agent\n * - Receiving streaming and non-streaming responses\n * - Loading message history\n * - Managing the chat state\n * - Optionally returning agent state when streaming completes\n *\n * @param threadId - Thread ID to use for chat\n * @param assistantId - Assistant ID to chat with\n * @param options - Chat options\n * @returns Chat state and operations\n *\n * @example\n * ```tsx\n * const {\n * messages,\n * isLoading,\n * sendMessage,\n * stopStreaming,\n * loadMessages,\n * clearMessages,\n * } = useChat(\"thread-1\", \"assistant-1\", {\n * initialMessages: [],\n * enableResumeStream: true,\n * });\n *\n * await sendMessage({ input: { message: \"Hello!\" } });\n * ```\n */\nexport function useChat<T extends UseChatOptions>(\n threadId: string | null,\n assistantId: string,\n options: T = {} as T\n): (T[\"enableReturnStateWhenStreamCompleted\"] extends true\n ? ChatStateWithAgent\n : ChatState) & {\n sendMessage: (data: {\n input?: { message: string; files?: { name: string; id: string }[] };\n command?: {\n resume?: {\n action: string;\n data: Record<string, any> & {\n config?: { thread_id?: string; work_log_id?: string };\n };\n message: string;\n };\n update?: any;\n send?: { node: string; input: any };\n };\n streaming?: boolean;\n }) => Promise<void>;\n stopStreaming: () => void;\n loadMessages: (limit?: number) => Promise<void>;\n clearMessages: () => void;\n clearError: () => void;\n } {\n const client = useClient(assistantId);\n const [state, setState] = useState<\n T[\"enableReturnStateWhenStreamCompleted\"] extends true\n ? ChatStateWithAgent\n : ChatState\n >({\n messages: options.initialMessages || [],\n isLoading: false,\n error: null,\n interrupts: undefined,\n ...(options.enableReturnStateWhenStreamCompleted\n ? { agentState: null }\n : {}),\n } as T[\"enableReturnStateWhenStreamCompleted\"] extends true ? ChatStateWithAgent : ChatState);\n\n // Reference to the stop function for streaming\n const stopStreamingRef = useRef<(() => void) | null>(null);\n\n // Create a message merger to handle streaming chunks\n const chunkMessageMerger = useRef(createSimpleMessageMerger());\n\n // Flag set when stream ends due to interrupt — skip fetchAndUpdateAgentState\n // because the checkpointer may not have committed the interrupt state yet\n const streamEndedByInterruptRef = useRef<boolean>(false);\n\n /**\n * Fetches and updates the agent state when streaming completes\n * @param threadId - Thread ID to fetch state for\n */\n const fetchAndUpdateAgentState = useCallback(\n async (threadId: string) => {\n if (!options.enableReturnStateWhenStreamCompleted) return;\n\n try {\n const agentState = await client.getAgentState(threadId);\n const fetchedInterrupts = agentState?.tasks?.flatMap((task) => {\n return task.interrupts.map((interrupt) => {\n return {\n id: interrupt.id,\n value: interrupt.value,\n role: \"ai\",\n type: \"interrupt\",\n };\n });\n });\n setState(\n (prev) =>\n ({\n ...prev,\n agentState,\n ...(fetchedInterrupts?.length ? { interrupts: fetchedInterrupts } : {}),\n } as T[\"enableReturnStateWhenStreamCompleted\"] extends true\n ? ChatStateWithAgent\n : ChatState)\n );\n } catch (error) {\n console.warn(\"Failed to fetch agent state:\", error);\n // Don't throw error, just log it to avoid breaking the chat flow\n }\n },\n [client, options.enableReturnStateWhenStreamCompleted]\n );\n\n // Initialize message merger with initial messages\n useEffect(() => {\n if (options.initialMessages && options.initialMessages.length > 0) {\n chunkMessageMerger.current.initialMessages(options.initialMessages);\n }\n }, [options.initialMessages]);\n\n /**\n * Handles stream events\n * @param chunk - Message chunk\n * @param customHandlers - Custom event handlers\n */\n const handleStreamEvent = useCallback(\n (chunk: MessageChunk | InterruptMessage) => {\n const anyChunk = chunk as any;\n\n // Error frames are transport-level end signals, not conversation\n // content. Surface the reason (or a neutral stop) instead of dropping it.\n if (anyChunk.type === \"error\") {\n const code = typeof anyChunk.data?.code === \"string\" ? anyChunk.data.code : \"stream_error\";\n const isStop = code === \"aborted\" || code === \"superseded\";\n setState((prev) => ({\n ...prev,\n messages: chunkMessageMerger.current.getMessages(),\n isLoading: false,\n streamingMessage: null,\n error: isStop\n ? null\n : new Error(\n typeof anyChunk.data?.content === \"string\" && anyChunk.data.content\n ? anyChunk.data.content\n : \"Stream error\"\n ),\n }));\n return;\n }\n\n // Handle interrupt chunk by setting state instead of pushing to merger\n let interrupt: InterruptMessage | undefined;\n if ((chunk as InterruptMessage).type === \"interrupt\") {\n interrupt = chunk as InterruptMessage;\n streamEndedByInterruptRef.current = true;\n } else if (anyChunk.type === \"queue_status\") {\n return;\n } else {\n // Push the chunk to the message merger\n chunkMessageMerger.current.push(chunk as MessageChunk);\n }\n\n let todos:\n | Array<{\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n }>\n | undefined;\n\n // Check if the chunk is a tool chunk with todo_list\n if (\n chunk.type === \"tool\" &&\n chunk.data &&\n typeof chunk.data.content === \"string\" &&\n chunk.data.content.startsWith(\"```todo_list\")\n ) {\n try {\n const content = chunk.data.content;\n const match = content.match(/```todo_list\\s*([\\s\\S]*?)\\s*```/);\n if (match && match[1]) {\n todos = JSON.parse(match[1]);\n }\n } catch (e) {\n console.error(\"Failed to parse todo list from chunk\", e);\n }\n }\n\n // Get the updated messages\n const updatedMessages = chunkMessageMerger.current.getMessages();\n\n const isStopSignal = interrupt !== undefined || anyChunk.type === \"message_failed\";\n\n // Update the state with the updated messages\n if (isStopSignal) {\n setState((prev) => ({\n ...prev,\n interrupts: interrupt ? [interrupt] : undefined,\n todos: todos || prev.todos,\n messages: updatedMessages,\n isLoading: false,\n streamingMessage: null,\n }));\n } else {\n setState((prev) => ({\n ...prev,\n todos: todos || prev.todos,\n messages: updatedMessages,\n isLoading: true,\n streamingMessage: null,\n }));\n }\n },\n []\n );\n\n /**\n * Sends a message to the agent\n * @param data - Message data\n */\n const sendMessage = useCallback(\n async (data: {\n input?: {\n message: string;\n files?: { name: string; id: string }[];\n } & Record<string, any>;\n command?: {\n resume?: {\n action: string;\n data: Record<string, any> & {\n config?: { thread_id?: string; work_log_id?: string };\n };\n message: string;\n };\n update?: any;\n send?: { node: string; input: any };\n };\n streaming?: boolean;\n }) => {\n if (!threadId) {\n throw new Error(\"Thread ID is required to send messages\");\n }\n\n // Stop any ongoing streaming\n // if (stopStreamingRef.current) {\n // stopStreamingRef.current();\n // stopStreamingRef.current = null;\n // }\n\n streamEndedByInterruptRef.current = false;\n\n const { input, command, streaming = true } = data;\n const { message, files, ...rest } = input || {};\n\n setState((prev) => ({\n ...prev,\n isLoading: true,\n error: null,\n interrupts: undefined,\n streamingMessage: null,\n }));\n\n // Create user message\n const userMessage: Message = {\n id: uuidv4(),\n content: message || command?.resume?.message || \"\",\n files,\n role: \"human\",\n };\n\n // Add user message to the message merger\n chunkMessageMerger.current.push({\n type: \"human\",\n data: {\n id: userMessage.id,\n content: userMessage.content,\n },\n });\n\n // Update state with messages from the merger\n setState((prev) => ({\n ...prev,\n messages: chunkMessageMerger.current.getMessages(),\n }));\n\n try {\n if (options.streaming !== false && streaming !== false) {\n // Use streaming API\n const stopStreaming = client.chat.stream(\n {\n threadId,\n messages: [userMessage as any],\n command,\n ...rest,\n },\n (chunk: MessageChunk) => handleStreamEvent(chunk),\n async () => {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n }));\n // Stream completed - fetch agent state if enabled\n if (options.enableReturnStateWhenStreamCompleted && !streamEndedByInterruptRef.current) {\n await fetchAndUpdateAgentState(threadId);\n }\n streamEndedByInterruptRef.current = false;\n stopStreamingRef.current = null;\n },\n (error: Error) => {\n // Stream error\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error,\n streamingMessage: null,\n }));\n streamEndedByInterruptRef.current = false;\n stopStreamingRef.current = null;\n }\n );\n\n stopStreamingRef.current = stopStreaming;\n } else {\n // Use non-streaming API\n const response = await client.chat.send({\n threadId,\n messages: [userMessage as any],\n command,\n ...rest,\n });\n\n // Add the response to the message merger\n chunkMessageMerger.current.initialMessages(response.messages);\n\n // Update state with messages from the merger\n setState((prev) => ({\n ...prev,\n messages: chunkMessageMerger.current.getMessages(),\n isLoading: false,\n }));\n }\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n }\n },\n [\n client,\n threadId,\n options.streaming,\n options.enableReturnStateWhenStreamCompleted,\n handleStreamEvent,\n fetchAndUpdateAgentState,\n ]\n );\n\n /**\n * Stops any ongoing streaming\n */\n const stopStreaming = useCallback(() => {\n if (stopStreamingRef.current) {\n stopStreamingRef.current();\n stopStreamingRef.current = null;\n\n // Get the current messages from the merger\n const currentMessages = chunkMessageMerger.current\n .getMessages()\n .map((msg) => ({\n id: msg.id,\n role:\n msg.role === \"ai\"\n ? \"assistant\"\n : msg.role === \"human\"\n ? \"user\"\n : msg.role === \"system\"\n ? \"system\"\n : \"tool\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content || \"\"),\n createdAt: new Date().toISOString(),\n })) as Message[];\n\n setState((prev) => ({\n ...prev,\n messages: currentMessages,\n isLoading: false,\n streamingMessage: null,\n }));\n }\n }, []);\n\n /**\n * Loads messages from the thread\n * @param limit - Maximum number of messages to load\n */\n const loadMessages = useCallback(\n async (limit?: number) => {\n if (!threadId) {\n return;\n }\n\n // Stop any ongoing streaming before loading messages\n if (stopStreamingRef.current) {\n stopStreamingRef.current();\n stopStreamingRef.current = null;\n }\n\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n\n try {\n const agentState = await client.getAgentState(threadId);\n const interrupts = agentState?.tasks?.flatMap((task) => {\n return task.interrupts.map((interrupt) => {\n return {\n id: interrupt.id,\n value: interrupt.value,\n };\n });\n });\n const fetchedMessages = await client.getMessages({ threadId });\n\n // Reset and initialize the message merger with fetched messages\n chunkMessageMerger.current.reset();\n chunkMessageMerger.current.initialMessages(fetchedMessages);\n\n setState((prev) => ({\n ...prev,\n agentState,\n interrupts,\n todos: agentState?.values?.todos,\n messages: chunkMessageMerger.current.getMessages(),\n isLoading: false,\n }));\n\n // If resume stream is enabled and there are messages, start streaming new messages\n if (options.enableResumeStream && fetchedMessages.length > 0) {\n const lastMessage = fetchedMessages[fetchedMessages.length - 1];\n // const lastContent =\n // typeof lastMessage.content === \"string\"\n // ? lastMessage.content\n // : JSON.stringify(lastMessage.content || \"\");\n\n // remove the last message from the message merger, due to resume stream will return first chunk of the message\n chunkMessageMerger.current.removeMessageById(lastMessage.id);\n\n // Start resume streaming\n const stopResumeStream = client.resumeStream(\n {\n assistantId,\n threadId,\n messageId: lastMessage.id,\n knownContent: \"\",\n pollInterval: options.resumeStreamPollInterval || 100,\n },\n handleStreamEvent,\n async () => {\n // Resume stream completed\n\n setState((prev) => ({\n ...prev,\n isLoading: false,\n }));\n if (options.enableReturnStateWhenStreamCompleted && !streamEndedByInterruptRef.current) {\n await fetchAndUpdateAgentState(threadId);\n }\n streamEndedByInterruptRef.current = false;\n stopStreamingRef.current = null;\n },\n (error: Error) => {\n // Resume stream error\n console.error(\"Resume stream error:\", error);\n setState((prev) => ({\n ...prev,\n error,\n }));\n streamEndedByInterruptRef.current = false;\n stopStreamingRef.current = null;\n }\n );\n\n stopStreamingRef.current = stopResumeStream;\n }\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n }\n },\n [\n client,\n threadId,\n options.enableResumeStream,\n options.resumeStreamPollInterval,\n handleStreamEvent,\n ]\n );\n\n /**\n * Clears all messages from state\n */\n const clearMessages = useCallback(() => {\n chunkMessageMerger.current.reset();\n setState((prev) => ({\n ...prev,\n messages: [],\n interrupts: undefined,\n streamingMessage: null,\n }));\n }, []);\n\n /**\n * Clears the error state\n */\n const clearError = useCallback(() => {\n setState((prev) => ({\n ...prev,\n error: null,\n }));\n }, []);\n\n // Load messages when thread ID changes\n useEffect(() => {\n if (threadId) {\n loadMessages();\n } else {\n clearMessages();\n }\n\n // Clean up streaming when component unmounts or thread changes\n return () => {\n if (stopStreamingRef.current) {\n stopStreamingRef.current();\n stopStreamingRef.current = null;\n }\n };\n }, [threadId, loadMessages, clearMessages]);\n\n return {\n ...state,\n sendMessage,\n stopStreaming,\n loadMessages,\n clearMessages,\n clearError,\n };\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n Assistant,\n CreateAssistantOptions,\n UpdateAssistantOptions,\n} from \"@axiom-lattice/client-sdk\";\nimport { useClient } from \"../../context\";\n\n/**\n * Assistant state interface\n */\nexport interface AssistantState {\n /**\n * List of all assistants\n */\n assistants: Assistant[];\n /**\n * Currently selected assistant\n */\n currentAssistant: Assistant | null;\n /**\n * Whether data is being loaded\n */\n isLoading: boolean;\n /**\n * Error message if any\n */\n error: Error | null;\n}\n\n/**\n * Assistant context value interface\n */\nexport interface AssistantContextValue extends AssistantState {\n /**\n * List all assistants\n */\n listAssistants: () => Promise<void>;\n /**\n * Get a single assistant by ID\n */\n getAssistant: (id: string) => Promise<Assistant>;\n /**\n * Create a new assistant\n */\n createAssistant: (options: CreateAssistantOptions) => Promise<Assistant>;\n /**\n * Update an existing assistant\n */\n updateAssistant: (\n id: string,\n options: UpdateAssistantOptions\n ) => Promise<Assistant>;\n /**\n * Delete an assistant\n */\n deleteAssistant: (id: string) => Promise<void>;\n /**\n * Select an assistant as current\n */\n selectAssistant: (id: string) => Promise<void>;\n /**\n * Clear the current assistant selection\n */\n clearCurrentAssistant: () => void;\n /**\n * Refresh the assistant list\n */\n refresh: () => Promise<void>;\n}\n\n/**\n * Assistant context\n */\nexport const AssistantContext = createContext<AssistantContextValue>({\n assistants: [],\n currentAssistant: null,\n isLoading: false,\n error: null,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n listAssistants: async () => { },\n getAssistant: async () => {\n throw new Error(\"Not implemented\");\n },\n createAssistant: async () => {\n throw new Error(\"Not implemented\");\n },\n updateAssistant: async () => {\n throw new Error(\"Not implemented\");\n },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n deleteAssistant: async () => { },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n selectAssistant: async () => { },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n clearCurrentAssistant: () => { },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n refresh: async () => { },\n});\n\n/**\n * Props for AssistantContextProvider\n */\nexport interface AssistantContextProviderProps {\n /**\n * Children components\n */\n children: React.ReactNode;\n /**\n * Whether to automatically load assistants on mount\n */\n autoLoad?: boolean;\n /**\n * Initial assistant ID to select\n */\n initialAssistantId?: string | null;\n}\n\n/**\n * Provider component for AssistantContext.\n * Manages assistant state and operations including CRUD, selection, and auto-loading.\n *\n * @description\n * Coordinates with the client SDK to provide assistant management:\n * - **Auto-load**: When `autoLoad` is `true` (default), fetches the assistant list on mount.\n * - **Auto-selection**: If `initialAssistantId` is provided, selects that assistant after loading.\n * Otherwise, auto-selects the first available assistant.\n * - **Re-selection**: If the currently selected assistant is removed from the list (e.g., deleted),\n * falls back to selecting the first available assistant.\n * - **CRUD operations**: Provides `createAssistant`, `updateAssistant`, `deleteAssistant`, and\n * `getAssistant` backed by the SDK, keeping local state in sync.\n *\n * Requires an {@link AxiomLatticeProvider} ancestor for the API client.\n *\n * @param props - {@link AssistantContextProviderProps}\n * @param props.children - React children to render within the assistant context.\n * @param props.autoLoad - Whether to automatically load assistants on mount. Defaults to `true`.\n * @param props.initialAssistantId - Optional assistant ID to auto-select on load.\n *\n * @returns A React context provider wrapping children with {@link AssistantContext.Provider}.\n *\n * @example\n * ```tsx\n * <AssistantContextProvider initialAssistantId=\"asst_123\">\n * <AssistantSelector />\n * </AssistantContextProvider>\n * ```\n */\nexport const AssistantContextProvider = ({\n children,\n autoLoad = true,\n initialAssistantId = null,\n}: AssistantContextProviderProps) => {\n // Use the client from AxiomLatticeProvider which already has tenantId configured\n const client = useClient(initialAssistantId || \"\");\n const [state, setState] = useState<AssistantState>({\n assistants: [],\n currentAssistant: null,\n isLoading: false,\n error: null,\n });\n // Use ref to access current assistants in callbacks\n const assistantsRef = useRef<Assistant[]>([]);\n useEffect(() => {\n assistantsRef.current = state.assistants;\n }, [state.assistants]);\n\n /**\n * List all assistants\n */\n const listAssistants = useCallback(async () => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n const assistants = (await client.assistants.list()) ?? [];\n setState((prev) => ({\n ...prev,\n assistants,\n isLoading: false,\n currentAssistant:\n prev.currentAssistant &&\n assistants.some((assistant) => assistant.id === prev.currentAssistant?.id)\n ? prev.currentAssistant\n : prev.currentAssistant\n ? assistants[0] || null\n : null,\n }));\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n }\n }, [client]);\n\n /**\n * Get a single assistant by ID\n */\n const getAssistant = useCallback(\n async (id: string): Promise<Assistant> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n const assistant = await client.assistants.get(id);\n setState((prev) => ({\n ...prev,\n // Update assistant in list if it exists\n assistants: prev.assistants.map((a) => (a.id === id ? assistant : a)),\n isLoading: false,\n }));\n return assistant;\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Create a new assistant\n */\n const createAssistant = useCallback(\n async (options: CreateAssistantOptions): Promise<Assistant> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n const newAssistant = await client.assistants.create(options);\n setState((prev) => ({\n ...prev,\n assistants: [...prev.assistants, newAssistant],\n isLoading: false,\n }));\n return newAssistant;\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Update an existing assistant\n */\n const updateAssistant = useCallback(\n async (id: string, options: UpdateAssistantOptions): Promise<Assistant> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n const updatedAssistant = await client.assistants.update(id, options);\n setState((prev) => ({\n ...prev,\n assistants: prev.assistants.map((a) =>\n a.id === id ? updatedAssistant : a\n ),\n currentAssistant:\n prev.currentAssistant?.id === id\n ? updatedAssistant\n : prev.currentAssistant,\n isLoading: false,\n }));\n return updatedAssistant;\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Delete an assistant\n */\n const deleteAssistant = useCallback(\n async (id: string): Promise<void> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n await client.assistants.delete(id);\n setState((prev) => ({\n ...prev,\n assistants: prev.assistants.filter((a) => a.id !== id),\n currentAssistant:\n prev.currentAssistant?.id === id ? null : prev.currentAssistant,\n isLoading: false,\n }));\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Select an assistant as current\n */\n const selectAssistant = useCallback(\n async (id: string): Promise<void> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n // Check if assistant is already in the list using ref\n const assistant = assistantsRef.current.find((a) => a.id === id);\n\n if (!assistant) {\n // If not in list, fetch it\n const fetchedAssistant = await client.assistants.get(id);\n setState((prev) => ({\n ...prev,\n assistants: [...prev.assistants, fetchedAssistant],\n currentAssistant: fetchedAssistant,\n isLoading: false,\n }));\n } else {\n setState((prev) => ({\n ...prev,\n currentAssistant: assistant,\n isLoading: false,\n }));\n }\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Clear the current assistant selection\n */\n const clearCurrentAssistant = useCallback(() => {\n setState((prev) => ({\n ...prev,\n currentAssistant: null,\n }));\n }, []);\n\n /**\n * Refresh the assistant list\n */\n const refresh = useCallback(async () => {\n await listAssistants();\n }, [listAssistants]);\n\n // Auto-load assistants on mount if enabled\n useEffect(() => {\n if (autoLoad) {\n listAssistants();\n }\n }, [autoLoad, listAssistants]);\n\n // Select initial assistant if provided, or auto-select first assistant if not configured\n // Also re-select if currentAssistant is no longer in the assistants list\n useEffect(() => {\n console.log(\n \"[AssistantContext] selection effect fired\",\n {\n initialAssistantId,\n assistantsCount: state.assistants.length,\n currentAssistantId: state.currentAssistant?.id,\n currentAssistantName: state.currentAssistant?.name,\n }\n );\n\n if (state.assistants.length > 0) {\n const isCurrentAssistantValid =\n state.currentAssistant &&\n state.assistants.some((a) => a.id === state.currentAssistant?.id);\n\n console.log(\n \"[AssistantContext] isCurrentAssistantValid:\", isCurrentAssistantValid,\n \"initialAssistantId:\", initialAssistantId\n );\n\n if (!isCurrentAssistantValid) {\n if (initialAssistantId) {\n // Select the specified assistant\n const assistant = state.assistants.find(\n (a) => a.id === initialAssistantId\n );\n console.log(\n \"[AssistantContext] find result for\", initialAssistantId, \":\", assistant?.id ?? \"NOT FOUND\"\n );\n if (assistant) {\n setState((prev) => ({\n ...prev,\n currentAssistant: assistant,\n }));\n } else {\n // If initialAssistantId is not found, fallback to first assistant\n console.warn(\n `[AssistantContext] initialAssistantId \"${initialAssistantId}\" not found in assistant list, falling back to first assistant`,\n \"\\nassistants:\", state.assistants.map((a) => ({ id: a.id, name: a.name }))\n );\n setState((prev) => ({\n ...prev,\n currentAssistant: prev.assistants[0],\n }));\n }\n } else {\n // Auto-select the first assistant if no initialAssistantId is configured\n setState((prev) => ({\n ...prev,\n currentAssistant: prev.assistants[0],\n }));\n }\n }\n }\n }, [initialAssistantId, state.assistants, state.currentAssistant]);\n\n return (\n <AssistantContext.Provider\n value={{\n ...state,\n listAssistants,\n getAssistant,\n createAssistant,\n updateAssistant,\n deleteAssistant,\n selectAssistant,\n clearCurrentAssistant,\n refresh,\n }}\n >\n {children}\n </AssistantContext.Provider>\n );\n};\n\n/**\n * Hook to access AssistantContext\n * @returns Assistant context value\n * @throws Error if used outside of AssistantContextProvider\n */\nexport const useAssistantContext = (): AssistantContextValue => {\n const context = useContext(AssistantContext);\n\n if (!context) {\n throw new Error(\n \"useAssistantContext must be used within an AssistantContextProvider\"\n );\n }\n\n return context;\n};\n","/**\n * Axiom Theme Design Tokens\n *\n * Core design tokens for Axiom AI Design System.\n * Features: Indigo primary, medium radius, subtle shadows, slight transparency.\n */\n\n// ============================================\n// Color System\n// ============================================\n\nexport const colors = {\n // Primary - Indigo\n primary: {\n 50: '#f0f4ff',\n 100: '#e0e7ff',\n 200: '#c7d2fe',\n 300: '#a5b4fc',\n 400: '#818cf8',\n 500: '#6366f1', // main\n 600: '#4f46e5', // hover\n 700: '#4338ca',\n 800: '#3730a3',\n 900: '#312e81',\n },\n\n // Functional colors\n success: '#22c55e',\n warning: '#f59e0b',\n error: '#ef4444',\n info: '#3b82f6',\n\n // Neutral - Light Mode\n light: {\n bg: '#fafafa', // Page background\n surface: 'rgba(255, 255, 255, 1)', // Card background (slight transparency)\n surfaceHover: '#f9fafb',\n surfaceActive: '#f3f4f6',\n border: '#e5e7eb',\n borderHover: '#d1d5db',\n text: '#111827',\n textSecondary: '#6b7280',\n textMuted: '#9ca3af',\n },\n\n // Neutral - Dark Mode\n dark: {\n bg: '#0a0a0a',\n surface: 'rgba(23, 23, 23, 0.95)',\n surfaceHover: '#1f1f1f',\n surfaceActive: '#262626',\n border: '#27272a',\n borderHover: '#3f3f46',\n text: '#fafafa',\n textSecondary: '#a1a1aa',\n textMuted: '#71717a',\n },\n} as const;\n\n// ============================================\n// Border Radius - Medium\n// ============================================\n\nexport const radius = {\n none: '0',\n sm: '4px', // Small tags\n md: '10px', // Buttons, inputs\n lg: '16px', // Cards\n xl: '20px', // Large cards, modals (同步自 iOS 26)\n xxl: '28px', // Extra large containers\n xxxl: '32px', // Feature cards\n full: '9999px', // Fully rounded\n} as const;\n\n// ============================================\n// Spacing - 4px base\n// ============================================\n\nexport const spacing = {\n 0: '0',\n 1: '4px',\n 2: '8px',\n 3: '12px',\n 4: '16px',\n 5: '20px',\n 6: '24px',\n 8: '32px',\n 10: '40px',\n 12: '48px',\n} as const;\n\n// ============================================\n// Shadows - Subtle\n// ============================================\n\nexport const shadows = {\n none: 'none',\n sm: '0 1px 2px rgba(0, 0, 0, 0.04)',\n md: '0 2px 8px rgba(0, 0, 0, 0.06)', // Card default\n lg: '0 4px 12px rgba(0, 0, 0, 0.08)', // Card hover\n xl: '0 8px 24px rgba(0, 0, 0, 0.1)', // Modals\n} as const;\n\n// ============================================\n// Typography\n// ============================================\n\nexport const typography = {\n fontFamily: 'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n\n sizes: {\n xs: { size: '12px', lineHeight: '16px', weight: 400 },\n sm: { size: '14px', lineHeight: '20px', weight: 400 },\n base: { size: '16px', lineHeight: '24px', weight: 400 },\n lg: { size: '18px', lineHeight: '28px', weight: 500 },\n xl: { size: '20px', lineHeight: '28px', weight: 600 },\n '2xl': { size: '24px', lineHeight: '32px', weight: 600 },\n },\n} as const;\n\n// ============================================\n// Animation\n// ============================================\n\nexport const animation = {\n duration: {\n fast: '150ms',\n normal: '250ms',\n slow: '350ms',\n },\n easing: {\n default: 'cubic-bezier(0.4, 0, 0.2, 1)',\n bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\n },\n} as const;\n\n// ============================================\n// Complete Tokens Export\n// ============================================\n\nexport const axiomTokens = {\n colors,\n radius,\n spacing,\n shadows,\n typography,\n animation,\n} as const;\n\nexport default axiomTokens;\n","/**\n * Axiom Ant Design Theme Configuration\n *\n * Maps Axiom design tokens to Ant Design's theme system.\n * Used with ConfigProvider to style all antd components.\n */\n\nimport type { ThemeConfig } from 'antd';\nimport { axiomTokens } from './axiom-tokens';\n\n/**\n * Axiom Light Theme for Ant Design\n */\nexport const axiomAntdTheme: ThemeConfig = {\n token: {\n // ===== Colors =====\n colorPrimary: axiomTokens.colors.primary[500],\n colorPrimaryHover: axiomTokens.colors.primary[600],\n colorPrimaryActive: axiomTokens.colors.primary[700],\n\n colorSuccess: axiomTokens.colors.success,\n colorWarning: axiomTokens.colors.warning,\n colorError: axiomTokens.colors.error,\n colorInfo: axiomTokens.colors.info,\n\n // Text\n colorText: axiomTokens.colors.light.text,\n colorTextSecondary: axiomTokens.colors.light.textSecondary,\n colorTextTertiary: axiomTokens.colors.light.textMuted,\n\n // Backgrounds\n colorBgContainer: axiomTokens.colors.light.surface,\n colorBgElevated: axiomTokens.colors.light.surface,\n colorBgLayout: axiomTokens.colors.light.bg,\n\n // Borders\n colorBorder: axiomTokens.colors.light.border,\n colorBorderSecondary: axiomTokens.colors.light.borderHover,\n\n // ===== Typography =====\n fontFamily: axiomTokens.typography.fontFamily,\n fontSize: 16,\n fontSizeSM: 14,\n fontSizeLG: 18,\n lineHeight: 1.5,\n\n // ===== Border Radius =====\n borderRadius: 8, // md - buttons, inputs\n borderRadiusLG: 12, // lg - cards\n borderRadiusSM: 4, // sm - small elements\n borderRadiusXS: 2,\n\n // ===== Shadows =====\n boxShadow: axiomTokens.shadows.md,\n boxShadowSecondary: axiomTokens.shadows.lg,\n boxShadowTertiary: axiomTokens.shadows.xl,\n\n // ===== Animation =====\n motionDurationFast: axiomTokens.animation.duration.fast,\n motionDurationMid: axiomTokens.animation.duration.normal,\n motionDurationSlow: axiomTokens.animation.duration.slow,\n },\n\n // ===== Component Overrides =====\n components: {\n // Card - 12px radius, subtle shadow\n Card: {\n borderRadius: 12,\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.06)',\n },\n\n // Button - 8px radius, 40px height\n Button: {\n borderRadius: 8,\n controlHeight: 40,\n controlHeightLG: 44,\n controlHeightSM: 32,\n },\n\n // Input - 8px radius\n Input: {\n borderRadius: 8,\n controlHeight: 40,\n },\n\n // Modal - 16px radius\n Modal: {\n borderRadius: 16,\n },\n\n // Select - 8px radius\n Select: {\n borderRadius: 8,\n controlHeight: 40,\n },\n\n // Tag - 4px radius\n Tag: {\n borderRadius: 4,\n },\n\n // Alert\n Alert: {\n borderRadius: 8,\n },\n\n // Menu\n Menu: {\n borderRadius: 8,\n },\n\n // Dropdown\n Dropdown: {\n borderRadius: 8,\n },\n },\n};\n\n/**\n * Axiom Dark Theme for Ant Design\n */\nexport const axiomAntdThemeDark: ThemeConfig = {\n ...axiomAntdTheme,\n token: {\n ...axiomAntdTheme.token,\n // Dark mode colors\n colorText: axiomTokens.colors.dark.text,\n colorTextSecondary: axiomTokens.colors.dark.textSecondary,\n colorTextTertiary: axiomTokens.colors.dark.textMuted,\n\n colorBgContainer: axiomTokens.colors.dark.surface,\n colorBgElevated: axiomTokens.colors.dark.surface,\n colorBgLayout: axiomTokens.colors.dark.bg,\n colorBgMask: 'rgba(0, 0, 0, 0.7)',\n\n colorBorder: axiomTokens.colors.dark.border,\n colorBorderSecondary: axiomTokens.colors.dark.borderHover,\n },\n components: {\n ...axiomAntdTheme.components,\n // Modal needs explicit background override for dark mode\n Modal: {\n ...axiomAntdTheme.components?.Modal,\n colorBgElevated: axiomTokens.colors.dark.surface,\n },\n },\n};\n\n/**\n * Get Axiom theme based on dark mode preference\n */\nexport const getAxiomAntdTheme = (isDark = false): ThemeConfig => {\n return isDark ? axiomAntdThemeDark : axiomAntdTheme;\n};\n\nexport default axiomAntdTheme;\n","/**\n * useAxiomTheme Hook\n *\n * Provides access to Axiom design tokens and component styles.\n * Used for custom layouts and component-specific styling.\n * \n * Note: Ant Design components are automatically styled via ConfigProvider.\n * This hook is for custom elements and layout components only.\n */\n\nimport { createStyles } from 'antd-style';\nimport { axiomTokens } from './axiom-tokens';\n\nconst { colors, radius, spacing, shadows, typography, animation } = axiomTokens;\n\nexport const useAxiomTheme = () => {\n const { styles } = createStyles(({ css }) => ({\n // ============================================\n // Layout Containers\n // ============================================\n \n pageContainer: css`\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: ${spacing[8]};\n `,\n \n // ============================================\n // Card Styles (for custom cards, not antd Card)\n // ============================================\n \n card: css`\n background: ${colors.light.surface};\n border: 1px solid ${colors.light.border};\n border-radius: ${radius.lg};\n box-shadow: ${shadows.md};\n transition: all ${animation.duration.fast} ${animation.easing.default};\n \n &:hover {\n box-shadow: ${shadows.lg};\n }\n `,\n \n // ============================================\n // Header Section (for auth cards)\n // ============================================\n \n header: css`\n text-align: center;\n margin-bottom: ${spacing[8]};\n `,\n \n logo: css`\n width: 64px;\n height: 64px;\n background: ${colors.primary[500]};\n border-radius: ${radius.lg};\n margin: 0 auto ${spacing[5]};\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n \n title: css`\n margin: 0 0 ${spacing[2]} 0;\n font-size: ${typography.sizes.xl.size};\n font-weight: ${typography.sizes.xl.weight};\n color: ${colors.light.text};\n line-height: ${typography.sizes.xl.lineHeight};\n `,\n \n subtitle: css`\n font-size: ${typography.sizes.base.size};\n color: ${colors.light.textSecondary};\n margin: 0;\n line-height: ${typography.sizes.base.lineHeight};\n `,\n \n // ============================================\n // Form Elements (for custom forms, extends antd)\n // ============================================\n\n input: css`\n height: 44px;\n border-radius: ${radius.md};\n border: 1px solid ${colors.light.border};\n\n &:hover, &:focus {\n border-color: ${colors.primary[500]};\n }\n `,\n\n button: css`\n height: 44px;\n border-radius: ${radius.md};\n background: ${colors.primary[500]};\n border: none;\n\n &:hover {\n background: ${colors.primary[600]};\n }\n `,\n\n buttonGhost: css`\n height: 44px;\n border-radius: ${radius.md};\n background: transparent;\n border: 1px solid ${colors.light.border};\n color: ${colors.light.textSecondary};\n\n &:hover {\n border-color: ${colors.primary[500]};\n color: ${colors.primary[500]};\n }\n `,\n\n form: css`\n .ant-form-item {\n margin-bottom: ${spacing[4]};\n }\n\n .ant-form-item:last-child {\n margin-bottom: 0;\n }\n `,\n \n // ============================================\n // List Styles (for custom lists)\n // ============================================\n \n list: css`\n display: flex;\n flex-direction: column;\n gap: ${spacing[3]};\n margin-bottom: ${spacing[6]};\n `,\n \n listItem: css`\n display: flex;\n align-items: center;\n gap: ${spacing[4]};\n padding: ${spacing[4]};\n background: white;\n border: 1px solid ${colors.light.border};\n border-radius: ${radius.lg};\n cursor: pointer;\n transition: all ${animation.duration.fast} ${animation.easing.default};\n \n &:hover {\n border-color: ${colors.primary[500]};\n background: ${colors.light.surfaceHover};\n }\n \n &.selected {\n border-color: ${colors.primary[500]};\n background: ${colors.primary[100]}20;\n }\n `,\n \n listItemAvatar: css`\n width: 40px;\n height: 40px;\n border-radius: ${radius.md};\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${colors.light.border};\n color: ${colors.light.textSecondary};\n font-weight: 600;\n font-size: 16px;\n flex-shrink: 0;\n \n &.selected {\n background: ${colors.primary[500]};\n color: white;\n }\n `,\n \n listItemContent: css`\n flex: 1;\n min-width: 0;\n `,\n \n listItemTitle: css`\n font-size: ${typography.sizes.base.size};\n font-weight: 600;\n color: ${colors.light.text};\n margin: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n \n listItemDescription: css`\n font-size: ${typography.sizes.sm.size};\n color: ${colors.light.textSecondary};\n margin: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n \n // ============================================\n // Status & Feedback\n // ============================================\n \n alert: css`\n margin-bottom: ${spacing[5]};\n border-radius: ${radius.md};\n `,\n \n // ============================================\n // Footer\n // ============================================\n \n footer: css`\n margin-top: ${spacing[6]};\n padding-top: ${spacing[6]};\n border-top: 1px solid ${colors.light.border};\n text-align: center;\n `,\n \n // ============================================\n // Grid Layouts\n // ============================================\n \n grid: css`\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));\n gap: ${spacing[4]};\n `,\n \n // ============================================\n // Empty State\n // ============================================\n \n emptyIcon: css`\n width: 80px;\n height: 80px;\n border-radius: ${radius.xl};\n background: ${colors.light.surfaceHover};\n border: 1px solid ${colors.light.border};\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto ${spacing[5]};\n `,\n \n emptyTitle: css`\n font-size: ${typography.sizes.lg.size};\n font-weight: ${typography.sizes.lg.weight};\n color: ${colors.light.text};\n margin-bottom: ${spacing[1]};\n `,\n \n emptyDescription: css`\n font-size: ${typography.sizes.sm.size};\n color: ${colors.light.textSecondary};\n margin-bottom: ${spacing[5]};\n `,\n \n // ============================================\n // Create New Card (dashed border)\n // ============================================\n \n createCard: css`\n background: white;\n border: 1px dashed ${colors.light.borderHover};\n border-radius: ${radius.lg};\n transition: all ${animation.duration.fast} ${animation.easing.default};\n cursor: pointer;\n min-height: 140px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: ${spacing[3]};\n \n &:hover {\n border-color: ${colors.primary[500]};\n border-style: solid;\n background: ${colors.primary[50]};\n }\n `,\n \n createCardList: css`\n display: flex;\n align-items: center;\n gap: ${spacing[4]};\n padding: ${spacing[4]};\n background: white;\n border: 1px dashed ${colors.light.borderHover};\n border-radius: ${radius.md};\n transition: all ${animation.duration.fast} ${animation.easing.default};\n cursor: pointer;\n \n &:hover {\n border-color: ${colors.primary[500]};\n border-style: solid;\n background: ${colors.primary[50]};\n }\n `,\n \n createIconWrapper: css`\n width: 48px;\n height: 48px;\n border-radius: ${radius.md};\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${colors.light.surfaceHover};\n `,\n \n createText: css`\n font-size: ${typography.sizes.base.size};\n font-weight: 500;\n color: ${colors.light.textSecondary};\n `,\n }))();\n \n return {\n tokens: axiomTokens,\n styles,\n };\n};\n\nexport default useAxiomTheme;\n","/**\n * Login Form Components\n * Uses base styles from design system\n */\n\nimport React, { useState } from \"react\";\nimport { Button, Form, Input, Typography, Alert, Card } from \"antd\";\nimport { UserOutlined, LockOutlined, MailOutlined } from \"@ant-design/icons\";\nimport { useAuth } from \"../../context/AuthContext\";\nimport { Sparkles } from \"lucide-react\";\nimport { useAxiomTheme } from \"../../theme\";\n\nconst { Text } = Typography;\n\nexport interface LoginFormProps {\n onSuccess?: () => void;\n onCancel?: () => void;\n logo?: React.ReactNode;\n title?: string;\n subtitle?: string;\n footer?: React.ReactNode;\n className?: string;\n}\n\nexport const LoginForm: React.FC<LoginFormProps> = ({\n onSuccess,\n onCancel,\n logo,\n title = \"Welcome Back\",\n subtitle = \"Sign in to your account\",\n footer,\n className = \"\",\n}) => {\n const { styles } = useAxiomTheme();\n const { login, isLoading, error, clearError } = useAuth();\n const [form] = Form.useForm();\n\n const handleSubmit = async (values: { email: string; password: string }) => {\n clearError();\n try {\n await login(values.email, values.password);\n onSuccess?.();\n } catch { /* intentionally empty */ }\n };\n\n return (\n <Card className={`${styles.card} ${className}`} style={{ width: 400 }}>\n <div className={styles.header}>\n {logo || (\n <div className={styles.logo}>\n <Sparkles size={28} color=\"white\" />\n </div>\n )}\n <h2 className={styles.title}>{title}</h2>\n <p className={styles.subtitle}>{subtitle}</p>\n </div>\n\n {error && (\n <Alert message={error} type=\"error\" showIcon className={styles.alert} />\n )}\n\n <Form form={form} onFinish={handleSubmit} layout=\"vertical\" className={styles.form}>\n <Form.Item name=\"email\" rules={[{ required: true }, { type: \"email\" }]}>\n <Input prefix={<MailOutlined />} placeholder=\"Email\" className={styles.input} />\n </Form.Item>\n\n <Form.Item name=\"password\" rules={[{ required: true }]}>\n <Input.Password prefix={<LockOutlined />} placeholder=\"Password\" className={styles.input} />\n </Form.Item>\n\n <Button type=\"primary\" htmlType=\"submit\" loading={isLoading} block>\n Sign In\n </Button>\n\n {onCancel && (\n <Button onClick={onCancel} block className={styles.buttonGhost} style={{ marginTop: 8 }}>\n Cancel\n </Button>\n )}\n </Form>\n\n {footer && <div className={styles.footer}>{footer}</div>}\n </Card>\n );\n};\n\nexport const LoginPage: React.FC<any> = (props) => {\n return (\n <div style={{ minHeight: '100vh', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <LoginForm {...props} />\n </div>\n );\n};\n\nexport interface RegisterFormProps {\n onSuccess?: () => void;\n onCancel?: () => void;\n logo?: React.ReactNode;\n title?: string;\n subtitle?: string;\n footer?: React.ReactNode;\n className?: string;\n}\n\nexport const RegisterForm: React.FC<RegisterFormProps> = ({\n onSuccess,\n onCancel,\n logo,\n title = \"Create Account\",\n subtitle = \"Start your journey with us\",\n footer,\n className = \"\",\n}) => {\n const { styles } = useAxiomTheme();\n const { login, register } = useAuth();\n const [form] = Form.useForm();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\n\n const handleSubmit = async (values: {\n email: string;\n password: string;\n confirmPassword: string;\n name: string;\n }) => {\n setError(null);\n setSuccessMessage(null);\n\n if (values.password !== values.confirmPassword) {\n setError(\"Passwords do not match\");\n return;\n }\n\n setIsLoading(true);\n\n try {\n const result = await register(values.email, values.password, values.name);\n setSuccessMessage(result.message);\n\n if (result.token) {\n await login(values.email, values.password);\n onSuccess?.();\n } else {\n setTimeout(() => onSuccess?.(), 2000);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Registration failed\");\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Card className={`${styles.card} ${className}`} style={{ width: 400 }}>\n <div className={styles.header}>\n {logo || (\n <div className={styles.logo}>\n <Sparkles size={28} color=\"white\" />\n </div>\n )}\n <h2 className={styles.title}>{title}</h2>\n <p className={styles.subtitle}>{subtitle}</p>\n </div>\n\n {error && <Alert message={error} type=\"error\" showIcon className={styles.alert} />}\n {successMessage && <Alert message={successMessage} type=\"success\" showIcon className={styles.alert} />}\n\n <Form form={form} onFinish={handleSubmit} layout=\"vertical\" className={styles.form}>\n <Form.Item name=\"name\" rules={[{ required: true }]}>\n <Input prefix={<UserOutlined />} placeholder=\"Full name\" className={styles.input} />\n </Form.Item>\n\n <Form.Item name=\"email\" rules={[{ required: true }, { type: \"email\" }]}>\n <Input prefix={<MailOutlined />} placeholder=\"Email\" className={styles.input} />\n </Form.Item>\n\n <Form.Item name=\"password\" rules={[{ required: true }, { min: 6 }]}>\n <Input.Password prefix={<LockOutlined />} placeholder=\"Password\" className={styles.input} />\n </Form.Item>\n\n <Form.Item name=\"confirmPassword\" rules={[{ required: true }]}>\n <Input.Password prefix={<LockOutlined />} placeholder=\"Confirm password\" className={styles.input} />\n </Form.Item>\n\n <Button type=\"primary\" htmlType=\"submit\" loading={isLoading} block>\n Create Account\n </Button>\n\n {onCancel && (\n <Button onClick={onCancel} block className={styles.buttonGhost} style={{ marginTop: 8 }}>\n Cancel\n </Button>\n )}\n </Form>\n\n {footer && <div className={styles.footer}>{footer}</div>}\n </Card>\n );\n};\n","/**\n * User Profile Components\n * Using Axiom Theme with Ant Design\n */\n\nimport React from \"react\";\nimport { Button, Avatar, Typography, Space, Card, Spin } from \"antd\";\nimport { LogOut, User, Building2 } from \"lucide-react\";\nimport { useAuth } from \"../../context/AuthContext\";\n\nconst { Text } = Typography;\n\nexport interface UserProfileProps {\n /** Called when user clicks logout */\n onLogout?: () => void;\n /** Show tenant information */\n showTenantSwitcher?: boolean;\n /** Custom class name */\n className?: string;\n}\n\n/**\n * User Profile Component\n */\nexport const UserProfile: React.FC<UserProfileProps> = ({\n onLogout,\n showTenantSwitcher = true,\n className = \"\",\n}) => {\n const { user, currentTenant, logout, isLoading } = useAuth();\n\n if (!user) {\n return null;\n }\n\n const handleLogout = () => {\n logout();\n onLogout?.();\n };\n\n const userInitial = user.name?.charAt(0).toUpperCase() || user.email.charAt(0).toUpperCase();\n\n return (\n <Card\n className={className}\n style={{ width: 320, borderRadius: 20 }}\n bodyStyle={{ padding: 24 }}\n >\n <Space direction=\"vertical\" size={20} style={{ width: \"100%\" }}>\n {/* User Info */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 16 }}>\n <Avatar\n size={56}\n style={{\n background: `linear-gradient(135deg, ${'#6366f1'} 0%, ${'#818cf8'} 100%)`,\n color: \"white\",\n fontSize: 22,\n fontWeight: 700,\n flexShrink: 0,\n }}\n >\n {userInitial}\n </Avatar>\n \n <div style={{ flex: 1, minWidth: 0 }}>\n <Text\n style={{\n fontWeight: 600,\n marginBottom: 4,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"block\",\n fontSize: 16,\n }}\n >\n {user.name || user.email}\n </Text>\n <Text\n type=\"secondary\"\n style={{\n fontSize: 13,\n display: \"block\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {user.email}\n </Text>\n </div>\n </div>\n\n {/* Tenant Info */}\n {showTenantSwitcher && currentTenant && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: 12,\n background: '#f2f2f7',\n borderRadius: 12,\n }}\n >\n <Building2 size={18} color=\"#6366f1\" />\n <div style={{ flex: 1, minWidth: 0 }}>\n <Text\n style={{\n fontSize: 11,\n color: '#8e8e93',\n textTransform: \"uppercase\",\n letterSpacing: 0.5,\n display: \"block\",\n marginBottom: 2,\n }}\n >\n Current Workspace\n </Text>\n <Text\n style={{\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"block\",\n }}\n >\n {currentTenant.name}\n </Text>\n </div>\n </div>\n )}\n\n {/* Logout Button */}\n <Button\n onClick={handleLogout}\n disabled={isLoading}\n block\n icon={<LogOut size={18} />}\n danger\n size=\"large\"\n style={{ height: 48 }}\n >\n {isLoading ? \"Logging out...\" : \"Sign Out\"}\n </Button>\n </Space>\n </Card>\n );\n};\n\nexport interface ProtectedRouteProps {\n children: React.ReactNode;\n /** Component to show when not authenticated */\n fallback?: React.ReactNode;\n /** Redirect URL (if using react-router) */\n redirectTo?: string;\n}\n\n/**\n * Protected Route Component\n * Shows loading state, redirects, or fallback when not authenticated\n */\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({\n children,\n fallback,\n redirectTo,\n}) => {\n const { isAuthenticated, isLoading } = useAuth();\n\n if (isLoading) {\n return (\n <div\n style={{\n minHeight: \"100vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: '#f2f2f7',\n }}\n >\n <Card style={{ borderRadius: 20 }}>\n <div style={{ textAlign: \"center\", padding: \"32px 48px\" }}>\n <Spin size=\"large\" />\n <Text type=\"secondary\" style={{ display: 'block', marginTop: 16 }}>Loading...</Text>\n </div>\n </Card>\n </div>\n );\n }\n\n if (!isAuthenticated) {\n if (fallback) {\n return <>{fallback}</>;\n }\n if (redirectTo && typeof window !== \"undefined\") {\n window.location.href = redirectTo;\n return null;\n }\n return (\n <div\n style={{\n minHeight: \"100vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: '#f2f2f7',\n padding: 32,\n }}\n >\n <Card style={{ textAlign: \"center\", borderRadius: 20 }}>\n <div\n style={{\n width: 64,\n height: 64,\n background: '#e5e5ea',\n borderRadius: 16,\n margin: \"0 auto 20px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <User size={28} color=\"#8e8e93\" />\n </div>\n <Typography.Title level={4} style={{ marginBottom: 8 }}>\n Authentication Required\n </Typography.Title>\n <Text type=\"secondary\">\n Please log in to access this page.\n </Text>\n </Card>\n </div>\n );\n }\n\n return <>{children}</>;\n};\n","import React, { useState, useEffect } from \"react\";\nimport { Building2 } from \"lucide-react\";\n\nexport interface TenantLogoProps {\n /** Tenant logo URL (or null if not configured) */\n logoUrl: string | null;\n /** Logo size in pixels (default 28, matches Menu's default Cpu size) */\n size?: number;\n /** Fallback icon color (default #1677ff to match Menu's Cpu icon) */\n fallbackColor?: string;\n /** Tenant name for accessible alt text */\n tenantName?: string;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Renders a tenant's logo image with fallback to the Building2 icon.\n *\n * On image load error, switches to Building2 icon.\n * When logoUrl changes, resets error state so the new URL is attempted.\n * When no logoUrl is provided, renders Building2 immediately.\n */\nexport const TenantLogo: React.FC<TenantLogoProps> = ({\n logoUrl,\n size = 28,\n fallbackColor = \"#1677ff\",\n tenantName,\n className,\n}) => {\n const [imgError, setImgError] = useState(false);\n\n useEffect(() => {\n setImgError(false);\n }, [logoUrl]);\n\n if (!logoUrl || imgError) {\n return <Building2 size={size} color={fallbackColor} className={className} />;\n }\n\n return (\n <img\n src={logoUrl}\n alt={tenantName ? `${tenantName} logo` : \"Tenant logo\"}\n width={size}\n height={size}\n referrerPolicy=\"no-referrer\"\n style={{\n borderRadius: 4,\n objectFit: \"contain\",\n display: \"block\",\n }}\n onError={() => setImgError(true)}\n className={className}\n />\n );\n};\n","import { useAuth } from \"../context/AuthContext\";\nimport { useMemo } from \"react\";\n\nexport interface TenantBrandingData {\n /** Raw logo URL from tenant metadata, or null if not configured */\n logoUrl: string | null;\n /** Current tenant name, or empty string if no tenant selected */\n tenantName: string;\n}\n\nexport const getLogoSrc = (metadata?: Record<string, unknown>): string | null => {\n const url = metadata?.logoUrl;\n return typeof url === \"string\" && url.length > 0 ? url : null;\n};\n\n/**\n * Reads the current tenant's branding information from AuthContext.\n * Extracts `metadata.logoUrl` and tenant name for use in UI components.\n *\n * @returns Tenant branding data — logo URL and name.\n */\nexport function useTenantBranding(): TenantBrandingData {\n const { currentTenant } = useAuth();\n\n return useMemo(() => {\n const logoUrl = getLogoSrc(currentTenant?.metadata as Record<string, unknown>);\n const tenantName = currentTenant?.name ?? \"\";\n\n return { logoUrl, tenantName };\n }, [currentTenant?.metadata?.logoUrl, currentTenant?.name]);\n}\n","/**\n * Tenant Selector\n *\n * Picker for choosing a tenant. Designed for the \"many tenants\" case:\n * search + status filter, a two-column card grid in its own scroll region,\n * and a footer that stays pinned so Confirm is always reachable.\n *\n * Renders correctly both inside a modal (the two Chat hosts) and standalone\n * centered on a page (apps/web), so the panel is width:100% + maxWidth rather\n * than a fixed width.\n */\n\nimport React, { useState, useEffect, useMemo, useRef, useCallback } from \"react\";\nimport { Tenant, TenantStatus } from \"@axiom-lattice/protocols\";\nimport { Button, Input, Select, Spin, theme } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { X, Search, ArrowRight, LogOut } from \"lucide-react\";\nimport { TenantLogo } from \"./TenantLogo\";\nimport { useAuth } from \"../../context/AuthContext\";\nimport { getLogoSrc } from \"../../hooks/useTenantBranding\";\n\nconst { useToken } = theme;\n\nexport type TenantStatusFilter = TenantStatus | \"all\";\n\n/** Two columns; collapses to one on narrow viewports. */\nconst GRID_COLUMNS = 2;\n\nconst STATUS_OPTIONS: { value: TenantStatusFilter; label: string }[] = [\n { value: \"active\", label: \"Active\" },\n { value: \"inactive\", label: \"Inactive\" },\n { value: \"suspended\", label: \"Suspended\" },\n { value: \"all\", label: \"All tenants\" },\n];\n\n/** Status shown as a colored dot + label on the card — color is the whole signal. */\nconst getStatusConfig = (status: string, token: any) => {\n switch (status) {\n case \"active\":\n return { color: token.colorSuccess, text: \"Active\" };\n case \"inactive\":\n return { color: token.colorTextTertiary, text: \"Inactive\" };\n case \"suspended\":\n return { color: token.colorError, text: \"Suspended\" };\n default:\n return { color: token.colorTextTertiary, text: status };\n }\n};\n\nconst useStyles = createStyles(({ token, css }) => ({\n surface: css`\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n max-width: 720px;\n max-height: min(84vh, 760px);\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorBorderSecondary};\n border-radius: 16px;\n box-shadow: ${token.boxShadowSecondary};\n overflow: hidden;\n `,\n\n closeButton: css`\n position: absolute;\n top: 12px;\n right: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: ${token.colorTextTertiary};\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n\n &:hover {\n background: ${token.colorFillSecondary};\n color: ${token.colorText};\n }\n\n &:focus-visible {\n outline: 2px solid ${token.colorPrimary};\n outline-offset: 2px;\n }\n `,\n\n // ============================================\n // Header\n // ============================================\n\n header: css`\n flex-shrink: 0;\n padding: 24px 24px 16px;\n text-align: center;\n `,\n\n logo: css`\n width: 64px;\n height: 64px;\n background: ${token.colorPrimary};\n border-radius: 16px;\n margin: 0 auto 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n\n title: css`\n margin: 0 0 4px;\n font-size: ${token.fontSizeHeading4}px;\n font-weight: 600;\n color: ${token.colorText};\n line-height: 1.4;\n `,\n\n subtitle: css`\n margin: 0;\n font-size: ${token.fontSize}px;\n color: ${token.colorTextSecondary};\n line-height: 1.5;\n `,\n\n // ============================================\n // Toolbar\n // ============================================\n\n toolbar: css`\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0 24px 12px;\n `,\n\n // ============================================\n // Scroll region — the list scrolls, not the panel\n // ============================================\n\n scrollRegion: css`\n flex: 1 1 auto;\n min-height: 120px;\n max-height: min(52vh, 460px);\n overflow-y: auto;\n overflow-x: hidden;\n padding: 0 24px;\n position: relative;\n\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-track {\n background: transparent;\n }\n &::-webkit-scrollbar-thumb {\n background: ${token.colorBorder};\n border-radius: 4px;\n }\n `,\n\n grid: css`\n display: grid;\n grid-template-columns: repeat(${GRID_COLUMNS}, minmax(0, 1fr));\n gap: ${token.marginSM}px;\n padding-bottom: 4px;\n\n @media (max-width: 480px) {\n grid-template-columns: minmax(0, 1fr);\n }\n `,\n\n // ============================================\n // Tenant card\n // ============================================\n\n card: css`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n min-height: 64px;\n width: 100%;\n min-width: 0;\n text-align: left;\n /* A <button> does not inherit the page font by default. */\n font: inherit;\n color: inherit;\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorBorderSecondary};\n border-radius: 12px;\n cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n\n &:hover {\n border-color: ${token.colorPrimaryBorder};\n background: ${token.colorFillQuaternary};\n }\n\n &:focus-visible {\n outline: 2px solid ${token.colorPrimary};\n outline-offset: 2px;\n }\n\n /* The border + tint is the whole selected affordance — no check icon. */\n &[aria-pressed=\"true\"] {\n border-color: ${token.colorPrimary};\n background: ${token.colorPrimaryBg};\n }\n `,\n\n avatar: css`\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n overflow: hidden;\n font-size: ${token.fontSizeLG}px;\n font-weight: 600;\n `,\n\n cardBody: css`\n flex: 1;\n min-width: 0;\n `,\n\n cardName: css`\n margin: 0;\n font-size: ${token.fontSize}px;\n font-weight: 600;\n line-height: 1.4;\n color: ${token.colorText};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n\n cardDescription: css`\n margin: 2px 0 0;\n font-size: ${token.fontSizeSM}px;\n line-height: 1.4;\n color: ${token.colorTextTertiary};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n\n status: css`\n display: flex;\n align-items: center;\n gap: 5px;\n flex-shrink: 0;\n font-size: ${token.fontSizeSM}px;\n line-height: 1;\n `,\n\n statusDot: css`\n width: 6px;\n height: 6px;\n border-radius: 50%;\n flex-shrink: 0;\n `,\n\n // ============================================\n // Empty / loading states\n // ============================================\n\n centeredBody: css`\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 48px 24px;\n text-align: center;\n color: ${token.colorTextSecondary};\n `,\n\n emptyTitle: css`\n font-size: ${token.fontSizeLG}px;\n font-weight: 600;\n color: ${token.colorText};\n `,\n\n // ============================================\n // Footer — pinned\n // ============================================\n\n footer: css`\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 16px 24px;\n border-top: 1px solid ${token.colorBorderSecondary};\n background: ${token.colorFillQuaternary};\n `,\n\n srOnly: css`\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n `,\n}));\n\nexport interface TenantSelectorProps {\n tenants: Tenant[];\n currentTenantId?: string | null;\n onSelect: (tenant: Tenant) => void;\n /** Renders a \"Log Out\" button in the footer when no onCancel is given. */\n onLogout?: () => void;\n /**\n * When provided, renders a Cancel button and a close icon in the panel header.\n * Omit for a flow the user cannot back out of (e.g. first-run tenant selection).\n */\n onCancel?: () => void;\n isLoading?: boolean;\n className?: string;\n title?: string;\n description?: string;\n}\n\nexport const TenantSelector: React.FC<TenantSelectorProps> = ({\n tenants,\n currentTenantId,\n onSelect,\n onLogout,\n onCancel,\n isLoading = false,\n className = \"\",\n title = \"Select Tenant\",\n description = \"Choose a tenant to continue\",\n}) => {\n const { styles } = useStyles();\n const { token } = useToken();\n const { logout } = useAuth();\n\n const currentTenant = useMemo(\n () => tenants.find((t) => t.id === currentTenantId) ?? null,\n [tenants, currentTenantId]\n );\n\n const [selectedId, setSelectedId] = useState<string | null>(currentTenantId ?? null);\n const [search, setSearch] = useState(\"\");\n // Default to Active, unless the user's own tenant is not active — otherwise\n // their current tenant would be hidden from them on open.\n const [statusFilter, setStatusFilter] = useState<TenantStatusFilter>(\n () => (currentTenant && currentTenant.status !== \"active\" ? \"all\" : \"active\")\n );\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const filterTouchedRef = useRef(false);\n\n useEffect(() => {\n setSelectedId(currentTenantId ?? null);\n }, [currentTenantId]);\n\n // `currentTenantId` often arrives a frame or more after mount (tenants load\n // async). Re-apply the default once we know the current tenant — but never\n // fight a filter the user has already set by hand.\n useEffect(() => {\n if (filterTouchedRef.current) return;\n if (currentTenant && currentTenant.status !== \"active\") setStatusFilter(\"all\");\n }, [currentTenant?.id, currentTenant?.status]);\n\n const filtered = useMemo(() => {\n const query = search.trim().toLowerCase();\n return tenants.filter((tenant) => {\n if (statusFilter !== \"all\" && tenant.status !== statusFilter) return false;\n if (!query) return true;\n return (\n tenant.name.toLowerCase().includes(query) ||\n (tenant.description ?? \"\").toLowerCase().includes(query)\n );\n });\n }, [tenants, search, statusFilter]);\n\n // Deliberately keyed off `tenants`, not `filtered`: a tenant hidden by the\n // filter must not silently disable Confirm.\n const canConfirm = !!selectedId && tenants.some((t) => t.id === selectedId);\n const isFiltering = search.trim().length > 0 || statusFilter !== \"all\";\n\n const handleContinue = useCallback(async () => {\n const tenant = tenants.find((t) => t.id === selectedId);\n if (!tenant) return;\n setIsSubmitting(true);\n try {\n await onSelect(tenant);\n } finally {\n setIsSubmitting(false);\n }\n }, [tenants, selectedId, onSelect]);\n\n const handleLogout = useCallback(() => {\n logout();\n onLogout?.();\n }, [logout, onLogout]);\n\n const handleResetFilters = useCallback(() => {\n setSearch(\"\");\n filterTouchedRef.current = true;\n setStatusFilter(\"all\");\n }, []);\n\n const selectedTenant = tenants.find((t) => t.id === selectedId);\n const headerLogoUrl = getLogoSrc(selectedTenant?.metadata as Record<string, unknown>);\n const hasHeaderLogo = !!headerLogoUrl;\n\n const closeButton = onCancel ? (\n <button\n type=\"button\"\n className={styles.closeButton}\n onClick={onCancel}\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n ) : null;\n\n if (isLoading) {\n return (\n <div className={`${styles.surface} ${className}`}>\n {closeButton}\n <div className={styles.centeredBody}>\n <Spin />\n <span>Loading...</span>\n </div>\n </div>\n );\n }\n\n if (tenants.length === 0) {\n return (\n <div className={`${styles.surface} ${className}`}>\n {closeButton}\n <div className={styles.centeredBody}>\n <span className={styles.emptyTitle}>No workspaces available</span>\n <span>Contact your administrator to be added to a tenant.</span>\n </div>\n {onLogout && (\n <div className={styles.footer}>\n <Button onClick={handleLogout} icon={<LogOut size={16} />}>\n Log Out\n </Button>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className={`${styles.surface} ${className}`}>\n {closeButton}\n\n <div className={styles.header}>\n <div\n className={styles.logo}\n style={hasHeaderLogo ? { background: \"transparent\" } : undefined}\n >\n <TenantLogo\n logoUrl={headerLogoUrl}\n size={hasHeaderLogo ? 48 : 28}\n fallbackColor=\"white\"\n />\n </div>\n <h2 className={styles.title}>{title}</h2>\n <p className={styles.subtitle}>{description}</p>\n </div>\n\n <div className={styles.toolbar}>\n <Input\n style={{ flex: 1, minWidth: 0 }}\n placeholder=\"Search tenant...\"\n aria-label=\"Search tenants\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onPressEnter={() => {\n if (canConfirm) handleContinue();\n }}\n prefix={<Search size={16} style={{ color: token.colorTextTertiary }} />}\n allowClear\n autoFocus\n />\n <Select\n data-testid=\"tenant-status-filter\"\n aria-label=\"Filter by status\"\n style={{ width: 150 }}\n value={statusFilter}\n onChange={(value) => {\n filterTouchedRef.current = true;\n setStatusFilter(value);\n }}\n options={STATUS_OPTIONS}\n />\n </div>\n\n <div className={styles.scrollRegion}>\n <span className={styles.srOnly} aria-live=\"polite\">\n {filtered.length} {filtered.length === 1 ? \"tenant\" : \"tenants\"}\n </span>\n\n {filtered.length === 0 ? (\n <div className={styles.centeredBody}>\n <span className={styles.emptyTitle}>No tenants match</span>\n <span>Try a different search or status filter.</span>\n {isFiltering && (\n <Button size=\"small\" onClick={handleResetFilters}>\n Show all tenants\n </Button>\n )}\n </div>\n ) : (\n <div className={styles.grid}>\n {filtered.map((tenant) => {\n const isSelected = selectedId === tenant.id;\n const statusConfig = getStatusConfig(tenant.status, token);\n const logoSrc = getLogoSrc(tenant.metadata as Record<string, unknown>);\n\n return (\n <button\n key={tenant.id}\n type=\"button\"\n aria-pressed={isSelected}\n data-testid=\"tenant-option\"\n data-tenant-id={tenant.id}\n data-tenant-name={tenant.name}\n className={styles.card}\n onClick={() => setSelectedId(tenant.id)}\n >\n <div\n className={styles.avatar}\n style={{\n background: logoSrc\n ? \"transparent\"\n : isSelected\n ? token.colorPrimary\n : token.colorFillSecondary,\n }}\n >\n {logoSrc ? (\n <TenantLogo logoUrl={logoSrc} size={28} />\n ) : (\n <span\n style={{\n color: isSelected ? \"white\" : token.colorTextSecondary,\n }}\n >\n {tenant.name.charAt(0).toUpperCase() || \"?\"}\n </span>\n )}\n </div>\n\n <div className={styles.cardBody}>\n <p className={styles.cardName}>{tenant.name}</p>\n {tenant.description && (\n <p className={styles.cardDescription}>{tenant.description}</p>\n )}\n </div>\n\n <div className={styles.status}>\n <span\n className={styles.statusDot}\n style={{ background: statusConfig.color }}\n />\n <span style={{ color: statusConfig.color }}>\n {statusConfig.text}\n </span>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n <div className={styles.footer}>\n {onCancel ? (\n <Button onClick={onCancel}>Cancel</Button>\n ) : onLogout ? (\n <Button onClick={handleLogout} icon={<LogOut size={16} />}>\n Log Out\n </Button>\n ) : (\n <span />\n )}\n\n <Button\n type=\"primary\"\n onClick={handleContinue}\n loading={isSubmitting}\n disabled={!canConfirm}\n icon={<ArrowRight size={16} />}\n >\n Confirm\n </Button>\n </div>\n </div>\n );\n};\n\nexport default TenantSelector;\n","import React, { useState } from \"react\";\nimport { Modal, Form, Input, Button, Alert } from \"antd\";\nimport { LockOutlined } from \"@ant-design/icons\";\nimport { useAuth } from \"../../context/AuthContext\";\n\nexport interface ChangePasswordModalProps {\n open: boolean;\n onClose: () => void;\n onSuccess?: () => void;\n}\n\nexport const ChangePasswordModal: React.FC<ChangePasswordModalProps> = ({\n open,\n onClose,\n onSuccess,\n}) => {\n const { changePassword, isLoading } = useAuth();\n const [form] = Form.useForm();\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n\n const handleSubmit = async (values: {\n currentPassword: string;\n newPassword: string;\n confirmPassword: string;\n }) => {\n setError(null);\n setSuccess(false);\n\n if (values.newPassword !== values.confirmPassword) {\n setError(\"New passwords do not match\");\n return;\n }\n\n try {\n await changePassword(values.currentPassword, values.newPassword);\n setSuccess(true);\n form.resetFields();\n onSuccess?.();\n setTimeout(() => {\n onClose();\n setSuccess(false);\n }, 1500);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to change password\");\n }\n };\n\n const handleCancel = () => {\n form.resetFields();\n setError(null);\n setSuccess(false);\n onClose();\n };\n\n return (\n <Modal\n title=\"Change Password\"\n open={open}\n onCancel={handleCancel}\n footer={null}\n width={400}\n >\n {error && (\n <Alert\n message={error}\n type=\"error\"\n showIcon\n style={{ marginBottom: 16 }}\n />\n )}\n {success && (\n <Alert\n message=\"Password changed successfully!\"\n type=\"success\"\n showIcon\n style={{ marginBottom: 16 }}\n />\n )}\n\n <Form\n form={form}\n onFinish={handleSubmit}\n layout=\"vertical\"\n >\n <Form.Item\n name=\"currentPassword\"\n rules={[{ required: true, message: \"Please enter current password\" }]}\n >\n <Input.Password\n prefix={<LockOutlined />}\n placeholder=\"Current password\"\n />\n </Form.Item>\n\n <Form.Item\n name=\"newPassword\"\n rules={[\n { required: true, message: \"Please enter new password\" },\n { min: 6, message: \"Password must be at least 6 characters\" },\n ]}\n >\n <Input.Password\n prefix={<LockOutlined />}\n placeholder=\"New password\"\n />\n </Form.Item>\n\n <Form.Item\n name=\"confirmPassword\"\n rules={[\n { required: true, message: \"Please confirm new password\" },\n ]}\n >\n <Input.Password\n prefix={<LockOutlined />}\n placeholder=\"Confirm new password\"\n />\n </Form.Item>\n\n <Form.Item style={{ marginBottom: 0 }}>\n <Button\n type=\"primary\"\n htmlType=\"submit\"\n loading={isLoading}\n block\n >\n Change Password\n </Button>\n </Form.Item>\n </Form>\n </Modal>\n );\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport { Tenant } from \"@axiom-lattice/protocols\";\n\nexport interface UseTenantsOptions {\n baseURL: string;\n token?: string;\n}\n\nexport interface UseTenantsReturn {\n tenants: Tenant[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n getTenantById: (id: string) => Tenant | undefined;\n}\n\n/**\n * Fetches and manages a list of tenants from the API.\n *\n * @param options - Configuration options\n * @param options.baseURL - The base URL of the API gateway\n * @param options.token - Optional authentication token\n * @returns Tenant list, loading state, error, refresh function, and lookup helper\n *\n * @example\n * ```tsx\n * const { tenants, isLoading, error, refresh, getTenantById } = useTenants({\n * baseURL: \"https://api.example.com\",\n * token: \"your-auth-token\",\n * });\n * ```\n */\nexport function useTenants(options: UseTenantsOptions): UseTenantsReturn {\n const { baseURL, token } = options;\n const [tenants, setTenants] = useState<Tenant[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchTenants = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const headers: Record<string, string> = {};\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n const response = await fetch(`${baseURL}/api/tenants`, { headers });\n \n if (!response.ok) {\n throw new Error(\"Failed to fetch tenants\");\n }\n\n const { data } = await response.json();\n setTenants(data || []);\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to fetch tenants\";\n setError(message);\n } finally {\n setIsLoading(false);\n }\n }, [baseURL, token]);\n\n useEffect(() => {\n fetchTenants();\n }, [fetchTenants]);\n\n const getTenantById = useCallback((id: string) => {\n return tenants.find(t => t.id === id);\n }, [tenants]);\n\n return {\n tenants,\n isLoading,\n error,\n refresh: fetchTenants,\n getTenantById,\n };\n}\n\nexport interface UseUsersOptions {\n baseURL: string;\n tenantId: string;\n token?: string;\n}\n\nexport interface UseUsersReturn {\n users: import(\"@axiom-lattice/protocols\").User[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n searchByEmail: (email: string) => Promise<import(\"@axiom-lattice/protocols\").User | null>;\n}\n\n/**\n * Fetches and manages a list of users within a tenant.\n *\n * @param options - Configuration options\n * @param options.baseURL - The base URL of the API gateway\n * @param options.tenantId - The tenant ID to fetch users for\n * @param options.token - Optional authentication token\n * @returns User list, loading state, error, refresh function, and email search helper\n *\n * @example\n * ```tsx\n * const { users, isLoading, error, searchByEmail } = useUsers({\n * baseURL: \"https://api.example.com\",\n * tenantId: \"tenant-123\",\n * });\n *\n * const user = await searchByEmail(\"user@example.com\");\n * ```\n */\nexport function useUsers(options: UseUsersOptions): UseUsersReturn {\n const { baseURL, tenantId, token } = options;\n const [users, setUsers] = useState<import(\"@axiom-lattice/protocols\").User[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchUsers = useCallback(async () => {\n if (!tenantId) return;\n \n setIsLoading(true);\n setError(null);\n try {\n const headers: Record<string, string> = {\n \"x-tenant-id\": tenantId,\n };\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n const response = await fetch(`${baseURL}/api/users`, { headers });\n \n if (!response.ok) {\n throw new Error(\"Failed to fetch users\");\n }\n\n const { data } = await response.json();\n setUsers(data || []);\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to fetch users\";\n setError(message);\n } finally {\n setIsLoading(false);\n }\n }, [baseURL, tenantId, token]);\n\n useEffect(() => {\n fetchUsers();\n }, [fetchUsers]);\n\n const searchByEmail = useCallback(async (email: string) => {\n if (!tenantId || !email) return null;\n \n try {\n const headers: Record<string, string> = {\n \"x-tenant-id\": tenantId,\n };\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n const response = await fetch(\n `${baseURL}/api/users?email=${encodeURIComponent(email)}`,\n { headers }\n );\n \n if (!response.ok) {\n return null;\n }\n\n const { data } = await response.json();\n return data?.[0] || null;\n } catch {\n return null;\n }\n }, [baseURL, tenantId, token]);\n\n return {\n users,\n isLoading,\n error,\n refresh: fetchUsers,\n searchByEmail,\n };\n}\n","/**\n * WorkspaceContext\n *\n * Context for workspace and project management\n */\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n ReactNode,\n} from \"react\";\nimport { WorkspaceClient, Client, type Workspace, type Project, type FileItem, type CreateWorkspaceRequest, type UpdateWorkspaceRequest, type CreateProjectRequest, type UpdateProjectRequest } from \"@axiom-lattice/client-sdk\";\nimport { useLatticeChatShellContext } from \"../components/Chat/LatticeChatShellContext\";\nimport { useClient } from \"../context\";\nimport { useAuth } from \"@auth\";\n\nexport interface WorkspaceContextValue {\n workspaceId: string | null;\n projectId: string | null;\n\n workspaces: Workspace[];\n projects: Project[];\n trainingProjects: Project[];\n personalProjects: Project[];\n\n loading: boolean;\n error: string | null;\n\n setWorkspace: (id: string | null) => void;\n setProject: (id: string | null) => void;\n\n createWorkspace: (data: CreateWorkspaceRequest) => Promise<Workspace>;\n updateWorkspace: (id: string, updates: UpdateWorkspaceRequest) => Promise<Workspace>;\n deleteWorkspace: (id: string) => Promise<void>;\n\n createProject: (workspaceId: string, data: CreateProjectRequest) => Promise<Project>;\n updateProject: (workspaceId: string, id: string, updates: UpdateProjectRequest) => Promise<Project>;\n deleteProject: (workspaceId: string, id: string, Promise: void) => Promise<void>;\n\n refreshWorkspaces: () => Promise<void>;\n refreshProjects: () => Promise<void>;\n listPath: (path: string, assistantId?: string) => Promise<FileItem[]>;\n listPathByFolder: (folder: string, assistantId?: string) => Promise<FileItem[]>;\n uploadFile: (path: string, file: File, assistantId?: string) => Promise<FileItem>;\n uploadFileToFolder: (folder: string, file: File, assistantId?: string) => Promise<FileItem>;\n /** Upload to an explicit project (unlike uploadFile, which targets the context-selected project). */\n uploadFileToProject: (projectId: string, path: string, file: File, assistantId?: string) => Promise<FileItem>;\n getFileViewUrl: (filePath: string, assistantId?: string) => string;\n getFileDownloadUrl: (filePath: string, assistantId?: string) => string;\n /** Download the selected project folder through authenticated SDK headers as a Blob. */\n downloadFolder: (folderPath: string, assistantId?: string) => Promise<Blob>;\n getDirectFileUrl: (filePath: string) => string;\n shareFile: (\n filePath: string,\n assistantId?: string,\n options?: {\n title?: string;\n visibility?: \"public\" | \"password\";\n password?: string;\n expiresAt?: string;\n maxAccess?: number;\n }\n ) => Promise<{ token: string; url: string }>;\n /** List all active shares for the current user */\n listShares: () => Promise<import(\"@axiom-lattice/protocols\").ShareRecord[]>;\n /** Revoke a share by token */\n unshareFile: (token: string) => Promise<void>;\n}\n\nexport const WorkspaceContext = createContext<WorkspaceContextValue | null>(null);\n\n/**\n * Hook to access the workspace context. Must be used within a {@link WorkspaceContextProvider}.\n *\n * @description\n * Provides the current workspace and project selection, plus operations to create, update,\n * delete, and refresh workspaces and projects. Also offers file browsing (`listPath`,\n * `listPathByFolder`) and file upload utilities.\n *\n * @returns The current {@link WorkspaceContextValue}.\n *\n * @throws {Error} If used outside of a {@link WorkspaceContextProvider}.\n *\n * @example\n * ```tsx\n * const {\n * workspaces, projects, workspaceId, projectId,\n * createWorkspace, deleteWorkspace, listPath,\n * } = useWorkspaceContext();\n *\n * await createWorkspace({ name: 'My Workspace' });\n * const files = await listPath('/src');\n * ```\n */\nexport const useWorkspaceContext = (): WorkspaceContextValue => {\n const context = useContext(WorkspaceContext);\n if (!context) {\n throw new Error(\"useWorkspaceContext must be used within a WorkspaceContextProvider\");\n }\n return context;\n};\n\n/** Like {@link useWorkspaceContext} but returns null when no provider is present. */\nexport const useWorkspaceContextOptional = (): WorkspaceContextValue | null =>\n useContext(WorkspaceContext);\n\nexport interface WorkspaceContextProviderProps {\n children: ReactNode;\n /** Default workspace ID when sessionStorage is empty */\n workspaceId?: string;\n /** Default project ID when sessionStorage is empty */\n projectId?: string;\n /**\n * When provided (page-level containers), workspace/project changes sync\n * to THIS Client instance's headers (instance-scoped isolation).\n * When omitted, syncs to the global static Client headers (default).\n */\n client?: import(\"@axiom-lattice/client-sdk\").Client;\n /**\n * When true, the provider does NOT read or write sessionStorage. Its\n * workspace/project state is fully scoped to this provider instance, so a\n * nested isolated app (e.g. CoSpace) cannot leak its selections into the\n * outer workspace app or vice versa.\n */\n isolated?: boolean;\n}\n\n/**\n * Workspace context provider. Wraps components that need access to workspace and project state.\n *\n * @description\n * Manages the full workspace lifecycle:\n * - **Session restoration**: Reads the previously selected `workspaceId` and `projectId` from\n * `sessionStorage` on mount to persist selections across page reloads.\n * - **Workspace CRUD**: Provides {@link createWorkspace}, {@link updateWorkspace}, and\n * {@link deleteWorkspace} backed by the workspace API client.\n * - **Project CRUD**: Project-level create, update, and delete scoped to the selected workspace.\n * - **File operations**: {@link listPath}, {@link listPathByFolder}, {@link uploadFile},\n * {@link getFileViewUrl}, and {@link getFileDownloadUrl} for workspace file management.\n * - **Auto-selection**: Automatically selects the first available workspace when the list loads\n * and no workspace is currently selected.\n * - **Global header sync**: Automatically sets the selected workspace/project as HTTP headers on\n * the shared {@link Client} instance so all outgoing API calls include the correct context.\n *\n * Requires {@link AuthProvider} and {@link LatticeChatShellContextProvider} ancestors.\n *\n * @param props - Provider props.\n * @param props.children - React children to render within the workspace context.\n *\n * @returns A React context provider wrapping children with {@link WorkspaceContext.Provider}.\n *\n * @example\n * ```tsx\n * <WorkspaceContextProvider>\n * <FileExplorer />\n * </WorkspaceContextProvider>\n * ```\n */\n/**\n * Build /f/ payload from workspace/project/tenant IDs.\n * Format: hex of 3 UUIDs without dashes (96 chars, compact).\n */\nexport const WorkspaceContextProvider: React.FC<WorkspaceContextProviderProps> = ({\n children,\n workspaceId: defaultWorkspaceId,\n projectId: defaultProjectId,\n client: scopeClient,\n isolated = false,\n}) => {\n const { currentTenant, isAuthenticated } = useAuth();\n const tenantId = currentTenant?.id || \"\";\n const { config } = useLatticeChatShellContext();\n\n // Initialize from sessionStorage or use null\n const getInitialWorkspaceId = () => {\n if (defaultWorkspaceId !== undefined) return defaultWorkspaceId;\n if (!isolated && typeof window !== 'undefined') return sessionStorage.getItem('workspaceId');\n return null;\n };\n\n const getInitialProjectId = () => {\n if (defaultProjectId !== undefined) return defaultProjectId;\n if (!isolated && typeof window !== 'undefined') return sessionStorage.getItem('projectId');\n return null;\n };\n\n\n\n const [workspaceId, setWorkspaceId] = useState<string | null>(getInitialWorkspaceId);\n const [projectId, setProjectId] = useState<string | null>(getInitialProjectId);\n\n // Apply the initial workspace context to the client family SYNCHRONOUSLY\n // (layout phase), BEFORE children's passive effects dispatch their first\n // requests (thread list, assistant fetch, ...). Passive effects fire\n // bottom-up, so a passive-effect-only sync would send the first requests\n // with the global fallback headers (or none) — the backend then scopes\n // them to the \"default\"/global project instead of the scope's project.\n useLayoutEffect(() => {\n if (scopeClient) {\n scopeClient.setWorkspaceContext(workspaceId || undefined, projectId || undefined);\n } else {\n Client.setWorkspaceContext(workspaceId || undefined, projectId || undefined);\n }\n }, [workspaceId, projectId, scopeClient]);\n\n const [workspaces, setWorkspaces] = useState<Workspace[]>([]);\n const [projects, setProjects] = useState<Project[]>([]);\n const [trainingProjects, setTrainingProjects] = useState<Project[]>([]);\n const [personalProjects, setPersonalProjects] = useState<Project[]>([]);\n\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const client = React.useMemo(() => {\n const authApiKey = isAuthenticated\n ? sessionStorage.getItem(\"lattice_token\") || config.apiKey || \"\"\n : config.apiKey || \"\";\n return new WorkspaceClient({\n baseURL: config.baseURL,\n apiKey: authApiKey,\n assistantId: \"\",\n transport: \"sse\",\n }, tenantId);\n }, [config.baseURL, config.apiKey, tenantId, isAuthenticated]);\n\n\n const resetSelectedWorkspace = useCallback(() => {\n\n setProjects([]);\n setTrainingProjects([]);\n setPersonalProjects([]);\n setWorkspaceId(defaultWorkspaceId ?? null);\n if (!isolated) sessionStorage.removeItem('workspaceId');\n setProjectId(defaultProjectId ?? null);\n if (!isolated) sessionStorage.removeItem('projectId');\n }, [setProjects, setWorkspaceId, setProjectId, defaultWorkspaceId, defaultProjectId, isolated]);\n const resetWS = useCallback(() => {\n setWorkspaces([]);\n resetSelectedWorkspace();\n }, [resetSelectedWorkspace, setWorkspaces]);\n\n useEffect(() => {\n\n resetWS();\n refreshWorkspaces();\n }, [tenantId]);\n const refreshWorkspaces = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const data = await client.listWorkspaces();\n setWorkspaces(data);\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to load workspaces\");\n } finally {\n setLoading(false);\n }\n }, [client]);\n\n const refreshProjects = useCallback(async (wsId?: string) => {\n const targetWorkspaceId = wsId || workspaceId;\n if (!targetWorkspaceId) {\n setProjects([]);\n setTrainingProjects([]);\n setPersonalProjects([]);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const data = await client.listProjects(targetWorkspaceId);\n setProjects(data.filter((p) => p.kind !== \"training\" && p.kind !== \"personal\" && p.kind !== \"public\"));\n setTrainingProjects(data.filter((p) => p.kind === \"training\"));\n setPersonalProjects(data.filter((p) => p.kind === \"personal\"));\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to load projects\");\n } finally {\n setLoading(false);\n }\n }, [client, workspaceId]);\n\n // Persist workspaceId to sessionStorage\n useEffect(() => {\n if (!isolated && workspaceId && typeof window !== 'undefined') {\n sessionStorage.setItem('workspaceId', workspaceId);\n }\n }, [workspaceId, isolated]);\n\n // Persist projectId to sessionStorage\n useEffect(() => {\n if (!isolated && projectId && typeof window !== 'undefined') {\n sessionStorage.setItem('projectId', projectId);\n }\n }, [projectId, isolated]);\n\n useEffect(() => {\n refreshWorkspaces().catch((err) => {\n console.warn(\"Failed to load workspaces:\", err);\n });\n }, [refreshWorkspaces]);\n\n // Auto-select first workspace only (not projects)\n useEffect(() => {\n if (workspaces.length > 0 && !workspaceId) {\n const firstWorkspace = workspaces[0];\n setWorkspaceId(firstWorkspace.id);\n }\n }, [workspaces, workspaceId]);\n\n // Workspace context is automatically synced to sessionStorage\n // Client will read from sessionStorage on each request\n\n // Track previous workspaceId to only reset project when workspace actually changes\n const prevWorkspaceId = useRef(workspaceId);\n\n useEffect(() => {\n if (workspaceId) {\n refreshProjects(workspaceId);\n } else {\n setProjects([]);\n setTrainingProjects([]);\n }\n\n // Only clear projectId when workspaceId actually changed (not on initial mount)\n if (prevWorkspaceId.current != null && prevWorkspaceId.current !== workspaceId) {\n setProjectId(defaultProjectId ?? null);\n }\n\n prevWorkspaceId.current = workspaceId;\n }, [workspaceId, refreshProjects]);\n\n const createWorkspace = useCallback(async (data: CreateWorkspaceRequest) => {\n setLoading(true);\n setError(null);\n try {\n const workspace = await client.createWorkspace(data);\n await refreshWorkspaces();\n return workspace;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : \"Failed to create workspace\";\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, refreshWorkspaces]);\n\n const updateWorkspace = useCallback(async (id: string, updates: UpdateWorkspaceRequest) => {\n setLoading(true);\n setError(null);\n try {\n const workspace = await client.updateWorkspace(id, updates);\n await refreshWorkspaces();\n return workspace;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : \"Failed to update workspace\";\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, refreshWorkspaces]);\n\n const deleteWorkspace = useCallback(async (id: string) => {\n setLoading(true);\n setError(null);\n try {\n await client.deleteWorkspace(id);\n if (workspaceId === id) {\n resetSelectedWorkspace();\n }\n await refreshWorkspaces();\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : \"Failed to delete workspace\";\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, workspaceId, refreshWorkspaces]);\n\n const createProject = useCallback(async (wsId: string, data: CreateProjectRequest) => {\n setLoading(true);\n setError(null);\n try {\n const project = await client.createProject(wsId, data);\n await refreshProjects(wsId);\n return project;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : \"Failed to create project\";\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, refreshProjects]);\n\n const updateProject = useCallback(async (wsId: string, id: string, updates: UpdateProjectRequest) => {\n setLoading(true);\n setError(null);\n try {\n const project = await client.updateProject(wsId, id, updates);\n await refreshProjects(wsId);\n return project;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : \"Failed to update project\";\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, refreshProjects]);\n\n const deleteProject = useCallback(async (wsId: string, id: string) => {\n setLoading(true);\n setError(null);\n try {\n await client.deleteProject(wsId, id);\n if (projectId === id) {\n setProjectId(null);\n }\n await refreshProjects(wsId);\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : \"Failed to delete project\";\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, projectId, refreshProjects]);\n\n const listPath = useCallback(\n async (path = \"/\", assistantId?: string) => {\n if (!workspaceId || !projectId) {\n return [];\n }\n setLoading(true);\n setError(null);\n try {\n const data = await client.listPath(workspaceId, projectId, path, assistantId);\n return data;\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to load files\");\n return [];\n } finally {\n setLoading(false);\n }\n },\n [client, workspaceId, projectId]\n );\n\n const listPathByFolder = useCallback(\n async (folder: string, assistantId?: string): Promise<FileItem[]> => {\n let normalizedPath = folder;\n // Strip legacy ~/ prefix if present\n if (normalizedPath.startsWith(\"~/\")) {\n normalizedPath = `/${normalizedPath.slice(2)}`;\n }\n if (!normalizedPath.startsWith(\"/\")) {\n normalizedPath = `/${normalizedPath}`;\n }\n return listPath(normalizedPath, assistantId);\n },\n [listPath]\n );\n\n const uploadFile = useCallback(\n async (path: string, file: File, assistantId?: string): Promise<FileItem> => {\n if (!workspaceId || !projectId) {\n throw new Error(\"Workspace and project must be selected before uploading files\");\n }\n setLoading(true);\n setError(null);\n try {\n const item = await client.uploadFile(workspaceId, projectId, file, path, assistantId);\n return item;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : \"Failed to upload file\";\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n },\n [client, workspaceId, projectId]\n );\n\n const uploadFileToFolder = useCallback(\n async (folder: string, file: File, assistantId?: string): Promise<FileItem> => {\n // Normalize legacy ~/ prefix\n let normalizedFolder = folder;\n if (normalizedFolder.startsWith(\"~/\")) {\n normalizedFolder = `/${normalizedFolder.slice(2)}`;\n }\n return uploadFile(normalizedFolder, file, assistantId);\n },\n [uploadFile]\n );\n\n const uploadFileToProject = useCallback(\n async (targetProjectId: string, path: string, file: File, assistantId?: string): Promise<FileItem> => {\n if (!workspaceId) {\n throw new Error(\"Workspace must be selected before uploading files\");\n }\n return client.uploadFile(workspaceId, targetProjectId, file, path, assistantId);\n },\n [client, workspaceId]\n );\n\n /** File preview — uses viewfile (backward compat). */\n const getFileViewUrl = useCallback( (filePath: string, assistantId?: string): string => {\n if (!workspaceId || !projectId) return \"\";\n return client.getFileViewUrl(workspaceId, projectId, filePath, assistantId);\n },\n [client, workspaceId, projectId]\n );\n\n /** File download — uses downloadfile so the response is served as an attachment. */\n const getFileDownloadUrl = useCallback(\n (filePath: string, assistantId?: string): string => {\n if (!workspaceId || !projectId) return \"\";\n return client.getFileDownloadUrl(workspaceId, projectId, filePath, assistantId);\n },\n [client, workspaceId, projectId]\n );\n\n /** Download a folder using the selected workspace/project scope and authenticated client. */\n const downloadFolder = useCallback(\n async (folderPath: string, assistantId?: string): Promise<Blob> => {\n if (!workspaceId || !projectId) throw new Error(\"Workspace and project must be selected\");\n return client.downloadFolder(workspaceId, projectId, folderPath, assistantId);\n },\n [client, workspaceId, projectId],\n );\n\n /** Direct file access via /f/ — for sharing, pinning, directory preview. */\n const getDirectFileUrl = useCallback(\n (filePath: string): string => {\n if (!tenantId || !workspaceId || !projectId) return \"\";\n const normalized = filePath.replace(/^\\/?project\\//, \"\").replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n return `${config.baseURL}/f/${tenantId}/${workspaceId}/${projectId}/${normalized}`;\n },\n [tenantId, workspaceId, projectId, config.baseURL]\n );\n\n const shareFile = useCallback(\n async (\n filePath: string,\n assistantId?: string,\n options?: {\n title?: string;\n visibility?: \"public\" | \"password\";\n password?: string;\n expiresAt?: string;\n maxAccess?: number;\n }\n ) => {\n if (!workspaceId || !projectId) {\n throw new Error(\"Workspace and project must be selected\");\n }\n return client.resources.share({\n resourcePath: filePath,\n assistantId,\n ...options,\n });\n },\n [client, workspaceId, projectId]\n );\n\n const listShares = useCallback(\n async () => {\n return client.resources.listShares();\n },\n [client]\n );\n\n const unshareFile = useCallback(\n async (token: string) => {\n await client.resources.unshare(token);\n },\n [client]\n );\n\n const value: WorkspaceContextValue = {\n workspaceId,\n projectId,\n workspaces,\n projects,\n trainingProjects,\n personalProjects,\n loading,\n error,\n setWorkspace: setWorkspaceId,\n setProject: setProjectId,\n createWorkspace,\n updateWorkspace,\n deleteWorkspace,\n createProject,\n updateProject,\n deleteProject,\n refreshWorkspaces,\n refreshProjects,\n listPath,\n listPathByFolder,\n uploadFile,\n uploadFileToFolder,\n uploadFileToProject,\n getFileViewUrl,\n getFileDownloadUrl,\n downloadFolder,\n getDirectFileUrl,\n shareFile,\n listShares,\n unshareFile,\n };\n\n // Get current workspace name\n const currentWorkspace = workspaces.find((w) => w.id === workspaceId);\n const workspaceName = currentWorkspace?.name;\n\n // Handle project selection\n const handleSelectProject = (project: Project) => {\n setProjectId(project.id);\n };\n\n // Handle project creation\n const handleCreateProject = async (name: string, description?: string) => {\n if (workspaceId) {\n await createProject(workspaceId, { name, description });\n }\n };\n\n return (\n <WorkspaceContext.Provider value={value}>\n {children}\n </WorkspaceContext.Provider>\n );\n};\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useAssistantContext } from \"./AssistantContext\";\nimport { useClient } from \"../../context\";\nimport { Client, Thread } from \"@axiom-lattice/client-sdk\";\nimport { useLatticeChatShellContext } from \"./LatticeChatShellContext\";\nimport { WorkspaceContext } from \"../../context/WorkspaceContext\";\n\n/**\n * Thread information for a conversation\n */\nexport interface ConversationThread {\n id: string;\n label: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n/**\n * Conversation context value\n */\nexport interface ConversationContextValue {\n /**\n * Current assistant ID\n */\n assistantId: string | null;\n /**\n * Current thread for the assistant\n */\n thread: ConversationThread | null;\n /**\n * Current thread ID\n */\n threadId: string | null;\n /**\n * List of threads for the current assistant\n */\n threads: ConversationThread[];\n /**\n * Whether threads are being loaded\n */\n isLoading: boolean;\n /**\n * Error message if any\n */\n error: Error | null;\n /**\n * Set the current thread\n */\n setThread: (thread: ConversationThread | null) => void;\n /**\n * Select a thread by ID\n */\n selectThread: (threadId: string) => void;\n /**\n * Create a new thread for the current assistant\n */\n createThread: (label?: string) => Promise<ConversationThread>;\n /**\n * List all threads for the current assistant\n */\n listThreads: () => Promise<ConversationThread[]>;\n /**\n * Update thread for the current assistant\n */\n updateThread: (thread: ConversationThread) => Promise<void>;\n /**\n * Get thread by ID\n */\n getThreadById: (threadId: string) => ConversationThread | null;\n /**\n * Delete a thread by ID\n */\n deleteThread: (threadId: string) => Promise<void>;\n /**\n * Clear the current thread\n */\n clearThread: () => void;\n /**\n * Refresh threads for the current assistant\n */\n refresh: () => Promise<void>;\n /**\n * Custom run configuration (cross-thread, assistant-level)\n * Used for metrics datasource and other assistant-wide settings\n */\n customRunConfig: Record<string, any>;\n /**\n * Update custom run configuration\n */\n updateCustomRunConfig: (config: Record<string, any>) => void;\n}\n\n/**\n * Conversation context.\n *\n * The default value is `null` so consumers can detect whether a\n * {@link ConversationContextProvider} is present (e.g. {@link AgentThreadContext}\n * falls back to local `customRunConfig` when it is not). Use\n * {@link useConversationContext} when a provider is required (throws otherwise),\n * or {@link useOptionalConversationContext} when it is optional.\n */\nexport const ConversationContext = createContext<ConversationContextValue | null>(null);\n\n/**\n * Props for ConversationContextProvider\n */\nexport interface ConversationContextProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Helper function to convert API Thread to ConversationThread\n */\nfunction convertThreadToConversationThread(\n thread: Thread,\n label?: string\n): ConversationThread {\n return {\n id: thread.id,\n label:\n label ||\n (thread.metadata?.label as string) ||\n new Date(thread.createdAt).toLocaleString(),\n createdAt: thread.createdAt?.toString(),\n updatedAt: thread.updatedAt?.toString(),\n };\n}\n\n/**\n * Helper function to convert ConversationThread to API Thread metadata\n */\nfunction getThreadMetadata(label?: string): Record<string, any> {\n return label ? { label } : {};\n}\n\n/**\n * Generate a thread label from the first message content\n * Extracts first 15 characters of text content, excluding attachments\n */\nexport function generateLabelFromMessage(message: string): string {\n // Remove attachment markers\n const cleanMessage = message.replace(/```attachments[\\s\\S]*?```/g, '').trim();\n\n // If empty after cleaning, return empty string (will fallback to date)\n if (!cleanMessage) {\n return '';\n }\n\n // If message is short, use it as-is\n if (cleanMessage.length <= 15) {\n return cleanMessage;\n }\n\n // Otherwise truncate with ellipsis\n return cleanMessage.slice(0, 15) + '...';\n}\n\n/**\n * Provider component for ConversationContext.\n * Manages conversation thread state for the currently selected assistant.\n *\n * @description\n * Coordinates with {@link AssistantContext} to load threads for the current assistant.\n * Key behaviors:\n * - **Thread loading**: Fetches threads from the API when the assistant changes. If no threads\n * exist, a new thread is automatically created.\n * - **Auto-selection**: Selects the most recently updated thread as the active thread when loading.\n * - **Cross-thread config**: Maintains an assistant-level `customRunConfig` shared across all threads\n * (useful for metrics datasource and other assistant-wide settings).\n * - **Thread operations**: Provides full CRUD operations (create, update, delete, list, select)\n * backed by the client SDK.\n *\n * Requires {@link AssistantContextProvider} ancestor and {@link LatticeChatShellContextProvider}.\n *\n * @param props - {@link ConversationContextProviderProps}\n * @param props.children - React children to render within the conversation context.\n *\n * @returns A React context provider wrapping children with {@link ConversationContext.Provider}.\n *\n * @example\n * ```tsx\n * <ConversationContextProvider>\n * <ThreadList />\n * </ConversationContextProvider>\n * ```\n */\nexport const ConversationContextProvider = ({\n children,\n}: ConversationContextProviderProps) => {\n // Get current assistant from AssistantContext\n const { currentAssistant } = useAssistantContext();\n const assistantId = currentAssistant?.id || null;\n\n // Get client for the current assistant\n const _unused = useLatticeChatShellContext(); void _unused;\n const client = useClient(assistantId || \"\");\n\n // Current threads for the current assistant\n const [threads, setThreads] = useState<ConversationThread[]>([]);\n // Current thread ID\n const [threadId, setThreadId] = useState<string | null>(null);\n // Loading state\n const [isLoading, setIsLoading] = useState<boolean>(false);\n // Error state\n const [error, setError] = useState<Error | null>(null);\n // Custom run config for assistant-level settings (cross-thread)\n const [customRunConfig, setCustomRunConfig] = useState<Record<string, any>>({});\n // Track if we've loaded threads for the current assistant (using ref to avoid re-renders)\n const loadedAssistantIdRef = useRef<string | null>(null);\n // Track previous assistantId to detect changes\n const prevAssistantIdRef = useRef<string | null>(null);\n // Track if we're currently loading to prevent concurrent loads\n const isLoadingRef = useRef<boolean>(false);\n // Ignore results from loads superseded by an assistant change or forced refresh.\n const loadRequestIdRef = useRef(0);\n // Store client in ref to avoid dependency issues\n const clientRef = useRef<Client>(client);\n // Update client ref when it changes\n useEffect(() => {\n clientRef.current = client;\n }, [client]);\n\n /**\n * Load threads for the current assistant from the API\n * If no threads exist, automatically create a new one\n */\n const loadThreads = useCallback(async (force = false) => {\n const currentClient = clientRef.current;\n if (!assistantId || !currentClient.assistantId) {\n loadRequestIdRef.current += 1;\n setThreads([]);\n setIsLoading(false);\n isLoadingRef.current = false;\n loadedAssistantIdRef.current = null;\n return;\n }\n\n // Prevent concurrent loads for the same assistant\n if (!force && isLoadingRef.current && loadedAssistantIdRef.current === assistantId) {\n return;\n }\n\n const requestId = ++loadRequestIdRef.current;\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const apiThreads = await currentClient.threads.list();\n if (requestId !== loadRequestIdRef.current) {\n return;\n }\n\n // Sort threads by updatedAt in descending order (most recently updated first)\n const sortedApiThreads = apiThreads.sort((a, b) => {\n const dateA = new Date(a.updatedAt).getTime();\n const dateB = new Date(b.updatedAt).getTime();\n return dateB - dateA;\n });\n const conversationThreads = sortedApiThreads.map((t) =>\n convertThreadToConversationThread(t)\n );\n\n // If no threads exist, create a new one\n if (conversationThreads.length === 0) {\n try {\n const apiThread = await currentClient.threads.create({\n metadata: getThreadMetadata(),\n });\n if (requestId !== loadRequestIdRef.current) {\n return;\n }\n\n const newThread = convertThreadToConversationThread(apiThread);\n setThreads([newThread]);\n setThreadId(newThread.id);\n } catch (createErr) {\n if (requestId !== loadRequestIdRef.current) {\n return;\n }\n\n const createError =\n createErr instanceof Error\n ? createErr\n : new Error(String(createErr));\n setError(createError);\n console.error(\"Failed to create initial thread:\", createError);\n setThreads([]);\n }\n } else {\n setThreads(conversationThreads);\n\n // Select the most recently updated thread if we haven't selected one yet\n // or if the current thread doesn't belong to this assistant's threads\n setThreadId((currentThreadId) => {\n if (!currentThreadId) {\n // Threads are sorted by updatedAt desc, so first one is most recent\n const latestThread = conversationThreads[0];\n return latestThread.id;\n }\n // Check if currentThreadId belongs to the new assistant's threads\n const threadExists = conversationThreads.some(\n (t) => t.id === currentThreadId\n );\n if (!threadExists) {\n // Current thread doesn't belong to this assistant, select the most recent\n const latestThread = conversationThreads[0];\n return latestThread.id;\n }\n return currentThreadId;\n });\n }\n\n loadedAssistantIdRef.current = assistantId;\n } catch (err) {\n if (requestId !== loadRequestIdRef.current) {\n return;\n }\n\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n console.error(\"Failed to load threads:\", error);\n } finally {\n if (requestId === loadRequestIdRef.current) {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }\n }, [assistantId]);\n\n // Load threads when assistantId changes\n useEffect(() => {\n const currentClient = clientRef.current;\n const prevAssistantId = prevAssistantIdRef.current;\n\n // Check if assistantId actually changed\n const assistantChanged = prevAssistantId !== assistantId;\n\n if (assistantId && currentClient.assistantId === assistantId) {\n // If assistant changed, clear threadId first\n if (assistantChanged) {\n setThreadId(null);\n prevAssistantIdRef.current = assistantId;\n }\n\n // Only load if we haven't loaded for this assistant yet\n if (loadedAssistantIdRef.current !== assistantId) {\n loadThreads();\n }\n } else {\n setThreadId(null);\n setThreads([]);\n loadedAssistantIdRef.current = null;\n prevAssistantIdRef.current = null;\n }\n }, [assistantId, loadThreads]);\n\n // Reload threads when the workspace/project scope changes: the thread list\n // is filtered by the project headers, so switching projects must refresh\n // the list and drop the now-invalid active thread (a new one is selected\n // or auto-created for the new project).\n const workspaceCtx = useContext(WorkspaceContext);\n const scopeKey = `${workspaceCtx?.workspaceId ?? \"\"}:${workspaceCtx?.projectId ?? \"\"}`;\n const prevScopeKeyRef = useRef(scopeKey);\n useEffect(() => {\n const currentClient = clientRef.current;\n if (!assistantId || !currentClient.assistantId) return;\n if (prevScopeKeyRef.current === scopeKey) return;\n\n prevScopeKeyRef.current = scopeKey;\n setThreadId(null);\n loadedAssistantIdRef.current = null;\n loadThreads();\n }, [scopeKey, assistantId, loadThreads]);\n\n // Get current thread for the current assistant\n const thread = useMemo((): ConversationThread | null => {\n if (!assistantId || !threadId) {\n return null;\n }\n return threads.find((t) => t.id === threadId) || null;\n }, [assistantId, threadId, threads]);\n\n // Set thread for the current assistant\n const setThread = useCallback((newThread: ConversationThread | null) => {\n if (newThread) {\n setThreadId(newThread.id);\n } else {\n setThreadId(null);\n }\n }, []);\n\n // Select a thread by ID\n const selectThread = useCallback(\n (targetThreadId: string) => {\n const foundThread = threads.find((t) => t.id === targetThreadId);\n if (foundThread) {\n setThreadId(targetThreadId);\n }\n },\n [threads]\n );\n\n // Create a new thread for the current assistant\n const createThread = useCallback(\n async (label?: string): Promise<ConversationThread> => {\n if (!assistantId || !client.assistantId) {\n throw new Error(\"No assistant selected\");\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const apiThread = await client.threads.create({\n metadata: getThreadMetadata(label),\n });\n const newThread = convertThreadToConversationThread(apiThread, label);\n\n // Reload threads to get the latest data from backend\n await loadThreads();\n setThreadId(newThread.id);\n return newThread;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [assistantId, client, loadThreads]\n );\n\n // List all threads for the current assistant\n const listThreads = useCallback(async (): Promise<ConversationThread[]> => {\n if (!assistantId || !client.assistantId) {\n return [];\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const apiThreads = await client.threads.list();\n // Sort threads by updatedAt in descending order (most recently updated first)\n const sortedApiThreads = apiThreads.sort((a, b) => {\n const dateA = new Date(a.updatedAt).getTime();\n const dateB = new Date(b.updatedAt).getTime();\n return dateB - dateA;\n });\n const conversationThreads = sortedApiThreads.map((t) =>\n convertThreadToConversationThread(t)\n );\n\n setThreads(conversationThreads);\n return conversationThreads;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n // Return current threads if available\n return threads;\n } finally {\n setIsLoading(false);\n }\n }, [assistantId, client, threads]);\n\n // Update thread for the current assistant.\n // Applies the change to local state in place instead of reloading the whole\n // list, so a rename doesn't flash a loading state or re-sort the threads.\n // The thread's existing sort position (updatedAt) is preserved; the next full\n // list load reconciles with the backend.\n const updateThread = useCallback(\n async (newThread: ConversationThread): Promise<void> => {\n if (!assistantId || !client.assistantId) {\n throw new Error(\"No assistant selected\");\n }\n\n setError(null);\n\n try {\n // Get existing thread to preserve other metadata fields\n const existingThread = await client.threads.get(newThread.id);\n const existingMetadata = existingThread.metadata || {};\n\n await client.threads.update(newThread.id, {\n metadata: {\n ...existingMetadata,\n label: newThread.label,\n },\n });\n\n // Apply the new label to local state only.\n setThreads((prev) =>\n prev.map((t) =>\n t.id === newThread.id ? { ...t, label: newThread.label } : t\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n }\n },\n [assistantId, client]\n );\n\n // Get thread by ID\n const getThreadById = useCallback(\n (targetThreadId: string): ConversationThread | null => {\n return threads.find((t) => t.id === targetThreadId) || null;\n },\n [threads]\n );\n\n // Delete a thread by ID\n const deleteThread = useCallback(\n async (targetThreadId: string): Promise<void> => {\n if (!assistantId || !client.assistantId) {\n throw new Error(\"No assistant selected\");\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await client.threads.delete(targetThreadId);\n\n // Reload threads to get the latest data from backend\n await loadThreads(true);\n\n // Keep a replacement selected by loadThreads, but clear a stale deleted selection.\n setThreadId((currentThreadId) =>\n currentThreadId === targetThreadId ? null : currentThreadId\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [assistantId, client, loadThreads]\n );\n\n // Clear the current thread\n const clearThread = useCallback(() => {\n setThreadId(null);\n }, []);\n\n // Update custom run config (assistant-level, cross-thread)\n const updateCustomRunConfig = useCallback((config: Record<string, any>) => {\n setCustomRunConfig((prev) => ({\n ...prev,\n ...config,\n }));\n }, []);\n\n return (\n <ConversationContext.Provider\n value={{\n assistantId,\n thread,\n threadId,\n threads,\n isLoading,\n error,\n setThread,\n selectThread,\n createThread,\n listThreads,\n updateThread,\n getThreadById,\n deleteThread,\n clearThread,\n refresh: loadThreads,\n customRunConfig,\n updateCustomRunConfig,\n }}\n >\n {children}\n </ConversationContext.Provider>\n );\n};\n\n/**\n * Hook to access ConversationContext. Throws when no\n * {@link ConversationContextProvider} is present — use only in components that\n * are guaranteed to render inside the shell's provider tree.\n *\n * @returns Conversation context value\n * @throws Error if used outside of ConversationContextProvider\n */\nexport const useConversationContext = (): ConversationContextValue => {\n const context = useContext(ConversationContext);\n\n if (!context) {\n throw new Error(\n \"useConversationContext must be used within a ConversationContextProvider\"\n );\n }\n\n return context;\n};\n\n/**\n * Hook to access ConversationContext without throwing. Returns `null` when no\n * {@link ConversationContextProvider} is present, letting consumers degrade\n * gracefully (e.g. GenUI elements rendering inside the architect copilot dock,\n * which lives outside the shell's ConversationContextProvider).\n *\n * @returns Conversation context value, or null if no provider is present\n */\nexport const useOptionalConversationContext = (): ConversationContextValue | null =>\n useContext(ConversationContext);\n","import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useTransition,\n ReactNode,\n} from \"react\";\nimport { useClient } from \"../context\";\nimport {\n ChatState,\n ChatStateWithAgent,\n UseChatOptions,\n AgentState,\n} from \"../types\";\nimport {\n InterruptMessage,\n Message,\n MessageChunk,\n} from \"@axiom-lattice/protocols\";\nimport {\n createSimpleMessageMerger,\n} from \"@axiom-lattice/client-sdk\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { ConversationContext, generateLabelFromMessage } from \"../components/Chat/ConversationContext\";\nimport { ThreadStream } from \"../stream/ThreadStream\";\n\n/**\n * Context value for AgentThreadContext\n */\ninterface AgentThreadContextValue<T extends UseChatOptions> {\n state: ChatStateWithAgent;\n\n sendMessage: (data: {\n input?: { message: string; files?: { name: string; id: string }[] };\n command?: {\n resume?: {\n action: string;\n data: Record<string, any> & {\n config?: { thread_id?: string; work_log_id?: string };\n };\n message: string;\n };\n update?: any;\n send?: { node: string; input: any };\n };\n streaming?: boolean;\n mode?: 'collect' | 'followup' | 'steer';\n throwOnError?: boolean;\n }) => Promise<void>;\n stopStreaming: () => void;\n /**\n * @deprecated ThreadStream auto-manages connection. Pass onMessageChunk\n * for custom handlers (unregistered when cleanup is called).\n */\n resumeStream: (messageId?: string, onMessageChunk?: (chunk: MessageChunk) => void) => () => void;\n loadMessages: (limit?: number) => Promise<void>;\n clearMessages: () => void;\n clearError: () => void;\n customRunConfig: Record<string, any>;\n updateCustomRunConfig: (config: Record<string, any>) => void;\n removePendingMessage: (messageId: string) => Promise<boolean>;\n abortAgent: () => Promise<void>;\n}\n\n/**\n * AgentThreadContext\n */\nconst AgentThreadContext = createContext<AgentThreadContextValue<any> | null>(\n null\n);\n\n/**\n * Props for AgentThreadProvider\n */\nexport interface AgentThreadProviderProps<T extends UseChatOptions> {\n threadId: string | null;\n assistantId?: string;\n options?: T;\n children: ReactNode;\n onToolCompleted?: (toolName: string) => void;\n onStreamCompleted?: () => void;\n}\n\n/**\n * Provider component for AgentThreadContext.\n *\n * ADR-026: Dual-granularity SSE architecture.\n * - sendMessage uses background mode (enqueue only, no SSE).\n * - ThreadStream manages a thread-level SSE via resume_stream.\n * - Chunk delivery is handled by the shared thread-level connection.\n *\n * Manages all agent thread state and operations including message streaming, interrupts,\n * queue management, and agent state polling.\n *\n * @param props - {@link AgentThreadProviderProps}\n * @param props.threadId - The ID of the thread to manage. If `null`, the provider renders nothing.\n * @param props.assistantId - The assistant ID to associate with this thread. Falls back to the client's assistant ID if omitted.\n * @param props.options - Configuration options for chat behavior (streaming, resume stream polling, initial messages, etc.).\n * @param props.children - React children to render within the thread context.\n * @param props.onToolCompleted - Callback invoked each time a tool call completes, receiving the tool name.\n * @param props.onStreamCompleted - Callback invoked when the SSE stream completes for any message.\n *\n * @returns A React context provider wrapping children with {@link AgentThreadContext.Provider}, or `null` if no `threadId` is provided.\n */\nexport function AgentThreadProvider<T extends UseChatOptions>({\n threadId,\n assistantId,\n options = {} as T,\n children,\n onToolCompleted,\n onStreamCompleted,\n}: AgentThreadProviderProps<T>) {\n const client = useClient(assistantId || \"\");\n const { assistantId: clientAssistantId, tenantId } = client;\n\n if (!threadId) {\n return null;\n }\n\n const [state, setState] = useState<ChatStateWithAgent>({\n assistantId: clientAssistantId,\n tenantId,\n threadId,\n messages: options.initialMessages || [],\n isLoading: false,\n error: null,\n stopReason: null,\n interrupts: undefined,\n agentState: null,\n // 新增队列状态\n threadStatus: 'idle',\n queueConfig: { mode: 'collect', maxSize: 15 },\n pendingMessages: [],\n });\n\n // Mark streaming state updates as interruptible to prevent render\n // backlog on slow machines (React #185). This is one half of a two-part\n // architecture — see MessageList.tsx for the matching useDeferredValue.\n //\n // Why startTransition alone isn't enough:\n // Without useDeferredValue, every render still runs the expensive\n // useMemo (messages.map) in MessageList. startTransition makes the\n // render interruptible, but if each render attempt takes 30ms on a\n // slow machine, React repeatedly abandons it and the user sees nothing.\n //\n // Why useDeferredValue alone isn't enough:\n // It skips the expensive compute, but without startTransition the\n // render chain still runs at normal React priority. On slow machines\n // 60 synchronous renders/sec can still accumulate past the 50-update\n // limit and trigger #185.\n //\n // Together: useDeferredValue lightens each render; startTransition\n // makes the light renders interruptible, preventing any backlog.\n // Stop signals (interrupt / message_failed) bypass startTransition\n // and update at normal priority so the UI reacts immediately.\n const [, startTransition] = useTransition();\n\n // Get customRunConfig from ConversationContext (cross-thread, assistant-level)\n // If ConversationContext is not available (e.g., when used outside LatticeChatShell),\n // fall back to local state\n const conversationContext = useContext(ConversationContext);\n\n // Local state as fallback when not in ConversationContext\n const [localCustomRunConfig, setLocalCustomRunConfig] = useState<Record<string, any>>({});\n\n // Use ConversationContext's customRunConfig if available, otherwise use local state\n const customRunConfig = conversationContext\n ? conversationContext.customRunConfig\n : localCustomRunConfig;\n\n const updateCustomRunConfig = useCallback((config: Record<string, any>) => {\n if (conversationContext) {\n conversationContext.updateCustomRunConfig(config);\n } else {\n setLocalCustomRunConfig((prev) => ({\n ...prev,\n ...config,\n }));\n }\n }, [conversationContext]);\n\n // Sync state with props when they change\n useEffect(() => {\n setState((prev) => ({\n ...prev,\n assistantId: clientAssistantId,\n tenantId,\n threadId,\n }));\n }, [clientAssistantId, tenantId, threadId]);\n\n // ThreadStream manages the single SSE connection per thread\n const threadStreamRef = useRef<ThreadStream | null>(null);\n\n // Create a message merger to handle streaming chunks\n const chunkMessageMerger = useRef(createSimpleMessageMerger());\n\n // Reference to track the last agentState createdAt timestamp for optimization\n const lastAgentStateCreatedAtRef = useRef<string | null>(null);\n\n // Flag set when stream ends due to interrupt — skip fetchAndUpdateAgentState\n // because the checkpointer may not have committed the interrupt state yet\n const streamEndedByInterruptRef = useRef<boolean>(false);\n\n // Track current threadId to guard against stale startTransition commits.\n // Updated on every render so transitions check against the latest thread.\n const currentThreadIdRef = useRef(threadId);\n currentThreadIdRef.current = threadId;\n\n // Reference to track message count for detecting first message\n const messageCountRef = useRef<number>(0);\n\n // Refs for external event callbacks\n const onToolCompletedRef = useRef(onToolCompleted);\n onToolCompletedRef.current = onToolCompleted;\n const onStreamCompletedRef = useRef(onStreamCompleted);\n onStreamCompletedRef.current = onStreamCompleted;\n\n // Ref-based pending message tracking to avoid race between optimistic insertion\n // and SSE human-chunk arrival (#4). Mutated synchronously before any async gap.\n const pendingIdsRef = useRef<Set<string>>(new Set());\n\n // In-flight message counter to prevent double-loading state corruption (#8)\n const inFlightRef = useRef(0);\n\n // History, transport, and stream activity independently own loading.\n const historyLoadingRef = useRef(false);\n // Stream activity owns loading independently from transport requests.\n const streamActiveRef = useRef(false);\n const historyGenerationRef = useRef(0);\n const messageActivityGenerationRef = useRef(0);\n const streamStopGenerationRef = useRef(0);\n const threadEpochRef = useRef(0);\n const ownershipThreadIdRef = useRef(threadId);\n\n if (ownershipThreadIdRef.current !== threadId) {\n ownershipThreadIdRef.current = threadId;\n threadEpochRef.current += 1;\n streamStopGenerationRef.current += 1;\n historyGenerationRef.current += 1;\n historyLoadingRef.current = false;\n inFlightRef.current = 0;\n streamActiveRef.current = false;\n }\n\n // Keep loading available to stable async callbacks without relying on a\n // render-time state closure. Send paths update this synchronously.\n const isLoadingRef = useRef(state.isLoading);\n isLoadingRef.current = state.isLoading;\n\n const getOwnedLoading = useCallback(() => (\n historyLoadingRef.current ||\n inFlightRef.current > 0 ||\n streamActiveRef.current\n ), []);\n\n // Update message count ref when state.messages changes\n useEffect(() => {\n messageCountRef.current = state.messages.length;\n }, [state.messages]);\n\n /**\n * Fetches and updates the agent state when streaming completes\n * @param threadId - Thread ID to fetch state for\n */\n const fetchAndUpdateAgentState = useCallback(\n async (threadId: string) => {\n if (!options.enableReturnStateWhenStreamCompleted) return;\n\n try {\n const agentState = await client.getAgentState(threadId);\n // Check if agentState has changed by comparing createdAt\n const currentCreatedAt = agentState?.createdAt;\n const needsUpdate =\n !lastAgentStateCreatedAtRef.current ||\n currentCreatedAt !== lastAgentStateCreatedAtRef.current;\n\n // Update the cached createdAt timestamp\n if (currentCreatedAt) {\n lastAgentStateCreatedAtRef.current = currentCreatedAt;\n }\n\n const needUpdateFields: Partial<ChatStateWithAgent> = {};\n //if (needsUpdate) {\n needUpdateFields.agentState = agentState;\n const fetchedInterrupts: InterruptMessage[] | undefined = agentState?.tasks?.flatMap((task) => {\n return task.interrupts.map((interrupt) => {\n return {\n id: interrupt.id,\n value: interrupt.value,\n role: \"ai\",\n type: \"interrupt\",\n };\n });\n });\n if (fetchedInterrupts?.length) {\n needUpdateFields.interrupts = fetchedInterrupts;\n }\n needUpdateFields.todos = agentState?.values?.todos;\n needUpdateFields.tasks = agentState?.values?.tasks;\n // }\n setState((prev) => ({\n ...prev,\n ...needUpdateFields,\n }));\n } catch (error) {\n console.warn(\"Failed to fetch agent state:\", error);\n // Don't throw error, just log it to avoid breaking the chat flow\n }\n },\n [client, options.enableReturnStateWhenStreamCompleted]\n );\n\n // Initialize message merger with initial messages\n useEffect(() => {\n if (options.initialMessages && options.initialMessages.length > 0) {\n chunkMessageMerger.current.initialMessages(options.initialMessages);\n }\n }, [options.initialMessages]);\n\n /**\n * Handles stream events\n * @param chunk - Message chunk\n */\n const handleStreamEvent = useCallback(\n (chunk: MessageChunk | InterruptMessage) => {\n if (currentThreadIdRef.current !== threadId) return;\n const anyChunk = chunk as any;\n\n // Error frames are transport-level end signals, not conversation\n // content. Surface the real reason (or a neutral stop for a user\n // abort) instead of letting them become an assistant message.\n if (anyChunk.type === \"error\") {\n const code = typeof anyChunk.data?.code === \"string\" ? anyChunk.data.code : \"stream_error\";\n const isStop = code === \"aborted\" || code === \"superseded\";\n streamActiveRef.current = false;\n const isLoading = getOwnedLoading();\n isLoadingRef.current = isLoading;\n setState((prev) => ({\n ...prev,\n messages: chunkMessageMerger.current.getMessages(),\n isLoading,\n stopReason: isStop ? code : null,\n error: isStop\n ? null\n : new Error(\n typeof anyChunk.data?.content === \"string\" && anyChunk.data.content\n ? anyChunk.data.content\n : \"Stream error\"\n ),\n }));\n return;\n }\n\n // Handle human chunks - remove matching pending message.\n // Match by ID first, fall back to content for compatibility.\n if (anyChunk.type === \"human\") {\n const chunkId = anyChunk.data?.id;\n const chunkContent = anyChunk.data?.content;\n\n setState((prev) => {\n const matchById = chunkId\n ? prev.pendingMessages.some((msg: any) => msg.id === chunkId)\n : false;\n const matchByContent = chunkContent\n ? prev.pendingMessages.some((msg: any) => msg.content === chunkContent)\n : false;\n\n if (matchById || matchByContent) {\n return {\n ...prev,\n pendingMessages: prev.pendingMessages.filter(\n (msg: any) => !(msg.id === chunkId || msg.content === chunkContent)\n ),\n };\n }\n\n return prev;\n });\n\n if (chunkId) pendingIdsRef.current.delete(chunkId);\n }\n\n // Detect tool completions before pushing to merger\n let completedToolName: string | undefined;\n if (\n anyChunk.type === \"tool\" &&\n anyChunk.data?.tool_call_id\n ) {\n const msgs = chunkMessageMerger.current.getMessages();\n for (const msg of msgs) {\n if (msg.role === \"ai\" && msg.tool_calls) {\n const tc = msg.tool_calls.find(\n (tc: any) => tc.id === anyChunk.data.tool_call_id\n );\n if (tc?.name) {\n completedToolName = tc.name;\n break;\n }\n }\n }\n }\n\n // Handle interrupt chunk by setting state instead of pushing to merger\n let interrupt: InterruptMessage | undefined;\n if ((chunk as InterruptMessage).type === \"interrupt\") {\n const rawChunk = chunk as any;\n streamEndedByInterruptRef.current = true;\n interrupt = {\n type: \"interrupt\",\n id: rawChunk.id,\n role: \"ai\",\n value: rawChunk.data?.content || rawChunk.data,\n } as InterruptMessage;\n } else if (anyChunk.type === \"queue_status\") {\n return;\n } else {\n chunkMessageMerger.current.push(chunk as MessageChunk);\n }\n messageActivityGenerationRef.current += 1;\n\n if (completedToolName) {\n onToolCompletedRef.current?.(completedToolName);\n }\n\n let todos:\n | Array<{\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n }>\n | undefined;\n\n // Check if the chunk is a tool chunk with todo_list\n if (\n chunk.type === \"tool\" &&\n chunk.data &&\n typeof chunk.data.content === \"string\" &&\n chunk.data.content.startsWith(\"```todo_list\")\n ) {\n try {\n const content = chunk.data.content;\n const match = content.match(/```todo_list\\s*([\\s\\S]*?)\\s*```/);\n if (match && match[1]) {\n todos = JSON.parse(match[1]);\n }\n } catch (e) {\n console.error(\"Failed to parse todo list from chunk\", e);\n }\n }\n\n // Get the updated messages\n\n // On interrupt, failure, completion, or idle the agent has stopped.\n const isStopSignal =\n interrupt !== undefined ||\n anyChunk.type === \"message_failed\" ||\n anyChunk.type === \"message_completed\" ||\n anyChunk.type === \"thread_idle\";\n\n // Stop signals update state at normal priority to avoid a\n // one-frame flash: onComplete runs at normal priority and would\n // render before a low-priority startTransition commit.\n if (isStopSignal) {\n if (currentThreadIdRef.current !== threadId) return;\n streamActiveRef.current = false;\n const isLoading = getOwnedLoading();\n isLoadingRef.current = isLoading;\n setState((prev) => {\n if (currentThreadIdRef.current !== threadId) return prev;\n return {\n ...prev,\n todos: todos || prev.todos,\n messages: chunkMessageMerger.current.getMessages(),\n isLoading,\n stopReason: null,\n interrupts: interrupt ? [interrupt] : undefined,\n };\n });\n } else {\n if (currentThreadIdRef.current !== threadId) return;\n streamActiveRef.current = true;\n const isLoading = getOwnedLoading();\n isLoadingRef.current = isLoading;\n startTransition(() => {\n // Skip if the thread changed between scheduling and commit.\n // currentThreadIdRef is updated on every render; threadId in this\n // closure is the value from when handleStreamEvent was created.\n // If they differ, this transition belongs to a previous thread.\n if (currentThreadIdRef.current !== threadId) return;\n\n setState((prev) => ({\n ...prev,\n todos: todos || prev.todos,\n messages: chunkMessageMerger.current.getMessages(),\n isLoading,\n stopReason: null,\n }));\n });\n }\n },\n [getOwnedLoading, startTransition, threadId]\n );\n\n // Keep a ref to the latest handleStreamEvent so ThreadStream always\n // calls the current handler without needing to re-register.\n const handleStreamEventRef = useRef(handleStreamEvent);\n handleStreamEventRef.current = handleStreamEvent;\n\n /**\n * Sends a message to the agent\n * @param data - Message data\n */\n const sendMessage = useCallback(\n async (data: {\n input?: {\n message: string;\n files?: { name: string; id: string }[];\n } & Record<string, any>;\n command?: {\n resume?: {\n action: string;\n data: Record<string, any> & {\n config?: { thread_id?: string; work_log_id?: string };\n };\n message: string;\n };\n update?: any;\n send?: { node: string; input: any };\n };\n streaming?: boolean;\n mode?: 'collect' | 'followup' | 'steer';\n throwOnError?: boolean;\n }) => {\n if (!threadId) {\n throw new Error(\"Thread ID is required to send messages\");\n }\n\n // Ensure the ThreadStream connection is active so we receive\n // chunk responses through the shared SSE connection.\n const stream = threadStreamRef.current;\n if (!stream) {\n if (data.throwOnError) {\n throw new Error(\"Thread stream is not available\");\n }\n return; // ThreadStream destroyed, don't send (#3)\n }\n\n const { input, command, streaming = true, mode, throwOnError = false } = data;\n const { message, files, ...rest } = input || {};\n const capturedEpoch = threadEpochRef.current;\n const capturedStopGeneration = streamStopGenerationRef.current;\n const capturedStream = stream;\n\n // Create userMessage BEFORE starting the stream so we have a messageId\n // to position the SSE connection at.\n const userMessage: Message = {\n id: uuidv4(),\n content: message || command?.resume?.message || \"\",\n files,\n role: \"human\",\n };\n\n messageActivityGenerationRef.current += 1;\n const wasIdle = !getOwnedLoading();\n inFlightRef.current += 1;\n if (wasIdle) {\n const isLoading = getOwnedLoading();\n isLoadingRef.current = isLoading;\n setState((prev) => ({\n ...prev,\n isLoading,\n error: null,\n stopReason: null,\n interrupts: undefined,\n }));\n } else {\n // A new run supersedes any prior stop notice, even when one was\n // already in flight (e.g. STEER while streaming).\n setState((prev) => (prev.stopReason == null ? prev : { ...prev, stopReason: null }));\n }\n\n pendingIdsRef.current.add(userMessage.id);\n\n // Add to pendingMessages for optimistic UI\n // When server returns this message via stream, it will be removed from pending\n setState((prev) => ({\n ...prev,\n pendingMessages: [\n ...prev.pendingMessages,\n {\n id: userMessage.id,\n content: userMessage.content,\n type: 'human' as const,\n sequence: prev.pendingMessages.length + 1,\n createdAt: new Date(),\n },\n ],\n }));\n\n // Note: We no longer immediately add the message to the merger\n // Messages will appear in the list when the server returns them in the stream\n // This allows proper handling of queued messages (they only appear when processing starts)\n\n // Check if this is the first message and update thread label\n // Use ref to get current message count (state may be stale in callback)\n const isFirstMessage = messageCountRef.current === 0;\n if (isFirstMessage && message && conversationContext) {\n const label = generateLabelFromMessage(message);\n if (label) {\n // Update thread label asynchronously (don't await to avoid blocking)\n conversationContext.updateThread({\n id: threadId,\n label,\n }).catch((err) => {\n console.warn(\"Failed to update thread label:\", err);\n });\n }\n }\n\n try {\n if (options.streaming !== false && streaming !== false) {\n // Enqueue via background first to activate the ChunkBuffer if idle.\n // Then open the SSE so it connects to an ACTIVE (not COMPLETED) subject.\n await client.chat.sendBackground({\n threadId,\n messages: [userMessage as any],\n command,\n custom_run_config: customRunConfig,\n mode,\n ...rest,\n });\n\n if (\n capturedEpoch !== threadEpochRef.current ||\n currentThreadIdRef.current !== threadId ||\n threadStreamRef.current !== capturedStream\n ) {\n pendingIdsRef.current.delete(userMessage.id);\n return;\n }\n\n inFlightRef.current = Math.max(0, inFlightRef.current - 1);\n if (capturedStopGeneration === streamStopGenerationRef.current) {\n streamActiveRef.current = true;\n\n // Open SSE if not already connected. If connected, the existing\n // connection covers the new message too — all chunks share the\n // same ReplaySubject. Don't disconnect/reconnect mid-stream.\n if (!capturedStream.isConnected) {\n capturedStream.open(userMessage.id);\n }\n }\n // Clean up the ref-based registry on success (#4). The human chunk\n // may have already removed it via handleStreamEvent, which is safe.\n pendingIdsRef.current.delete(userMessage.id);\n const isLoading = getOwnedLoading();\n isLoadingRef.current = isLoading;\n setState((prev) => ({ ...prev, isLoading }));\n } else {\n // Use non-streaming API\n const response = await client.chat.send({\n threadId,\n messages: [userMessage as any],\n command,\n custom_run_config: customRunConfig,\n ...rest,\n });\n\n if (\n capturedEpoch !== threadEpochRef.current ||\n currentThreadIdRef.current !== threadId\n ) {\n pendingIdsRef.current.delete(userMessage.id);\n return;\n }\n\n // Add the response to the message merger\n chunkMessageMerger.current.initialMessages(response.messages);\n\n inFlightRef.current = Math.max(0, inFlightRef.current - 1);\n pendingIdsRef.current.delete(userMessage.id);\n\n // Update state with messages from the merger\n const isLoading = getOwnedLoading();\n isLoadingRef.current = isLoading;\n setState((prev) => ({\n ...prev,\n messages: chunkMessageMerger.current.getMessages(),\n isLoading,\n }));\n }\n } catch (error) {\n const normalizedError = error instanceof Error ? error : new Error(String(error));\n pendingIdsRef.current.delete(userMessage.id); // (#4)\n if (\n capturedEpoch !== threadEpochRef.current ||\n currentThreadIdRef.current !== threadId\n ) {\n if (throwOnError) throw normalizedError;\n return;\n }\n inFlightRef.current = Math.max(0, inFlightRef.current - 1); // (#8)\n const isLoading = getOwnedLoading();\n isLoadingRef.current = isLoading;\n setState((prev) => ({\n ...prev,\n isLoading,\n error: normalizedError,\n pendingMessages: prev.pendingMessages.filter(\n (msg) => msg.id !== userMessage.id\n ),\n }));\n if (throwOnError) {\n throw normalizedError;\n }\n }\n },\n [\n client,\n threadId,\n options.streaming,\n options.enableReturnStateWhenStreamCompleted,\n handleStreamEvent,\n fetchAndUpdateAgentState,\n customRunConfig,\n getOwnedLoading,\n ]\n );\n\n /**\n * Stops any ongoing streaming\n */\n const stopStreaming = useCallback(() => {\n streamStopGenerationRef.current += 1;\n // Disconnect SSE without permanently closing — user can send again\n if (threadStreamRef.current) {\n threadStreamRef.current.stop();\n }\n\n // Get the current messages from the merger\n const currentMessages = chunkMessageMerger.current.getMessages();\n\n streamActiveRef.current = false;\n const isLoading = getOwnedLoading();\n isLoadingRef.current = isLoading;\n setState((prev) => ({\n ...prev,\n messages: currentMessages,\n isLoading,\n }));\n }, [getOwnedLoading]);\n\n /**\n * Ensures the ThreadStream connection is active. Accepts an optional chunk\n * callback for backward compatibility with the pre-ThreadStream signature.\n *\n * @deprecated ThreadStream auto-manages the connection — callers should not\n * need to manually resume. Use {@link sendMessage} for message delivery.\n * @param messageId - Optional message ID to position the stream from\n * @param onMessageChunk - Optional custom chunk handler (deprecated)\n * @returns A cleanup function that unregisters the custom handler\n */\n const resumeStream = useCallback(\n (messageId?: string, onMessageChunk?: (chunk: MessageChunk) => void): (() => void) => {\n const stream = threadStreamRef.current;\n if (!stream) return () => { /* noop */ };\n\n // Register custom handler if provided\n const unsub = onMessageChunk ? stream.onChunk(onMessageChunk) : undefined;\n\n if (messageId) {\n stream.open(messageId);\n }\n // Without messageId, cannot position the stream — no-op.\n // Stream opens on demand via sendMessage.\n\n return () => {\n unsub?.();\n // Do NOT close the ThreadStream — the SSE connection is shared\n };\n },\n []\n );\n\n /**\n * Loads messages from the thread\n * @param limit - Maximum number of messages to load\n */\n const loadMessages = useCallback(async () => {\n if (!threadId) {\n return;\n }\n\n // Capture the thread ID at invocation time to guard against stale\n // async completions contaminating a different thread's state.\n const capturedThreadId = threadId;\n const capturedEpoch = threadEpochRef.current;\n const capturedGeneration = historyGenerationRef.current + 1;\n const capturedMessageActivity = messageActivityGenerationRef.current;\n historyGenerationRef.current = capturedGeneration;\n\n historyLoadingRef.current = true;\n const initialIsLoading = getOwnedLoading();\n isLoadingRef.current = initialIsLoading;\n setState((prev) => {\n if (currentThreadIdRef.current !== capturedThreadId) return prev;\n return { ...prev, messages: [], isLoading: initialIsLoading, error: null, stopReason: null };\n });\n\n try {\n const agentState = await client.getAgentState(threadId);\n if (\n capturedEpoch !== threadEpochRef.current ||\n currentThreadIdRef.current !== capturedThreadId ||\n capturedGeneration !== historyGenerationRef.current\n ) return;\n\n // Check if agentState has changed by comparing createdAt\n const currentCreatedAt = agentState?.createdAt;\n const needsUpdate =\n !lastAgentStateCreatedAtRef.current ||\n currentCreatedAt !== lastAgentStateCreatedAtRef.current;\n\n // Update the cached createdAt timestamp\n if (currentCreatedAt) {\n lastAgentStateCreatedAtRef.current = currentCreatedAt;\n }\n\n const needUpdateFields: Partial<ChatStateWithAgent> = {};\n\n //if (needsUpdate) {\n needUpdateFields.agentState = agentState;\n needUpdateFields.todos = agentState?.values?.todos;\n needUpdateFields.tasks = agentState?.values?.tasks;\n\n // 新增:更新队列状态\n needUpdateFields.threadStatus = agentState?.threadStatus || 'idle';\n needUpdateFields.queueConfig = agentState?.queueConfig || { mode: 'collect', maxSize: 15 };\n needUpdateFields.pendingMessages = agentState?.pendingMessages || [];\n\n const interrupts: InterruptMessage[] = agentState?.tasks?.flatMap(\n (task) => {\n return task.interrupts.map((interrupt) => {\n return {\n id: interrupt.id,\n value: interrupt.value,\n role: \"ai\",\n type: \"interrupt\",\n };\n });\n }\n );\n needUpdateFields.interrupts = interrupts;\n const fetchedMessages = await client.getMessages({ threadId: capturedThreadId });\n if (\n capturedEpoch !== threadEpochRef.current ||\n currentThreadIdRef.current !== capturedThreadId ||\n capturedGeneration !== historyGenerationRef.current\n ) return;\n historyLoadingRef.current = false;\n const isLoading = getOwnedLoading();\n isLoadingRef.current = isLoading;\n if (capturedMessageActivity !== messageActivityGenerationRef.current) {\n setState((prev) => ({ ...prev, isLoading }));\n return;\n }\n // Reset and initialize the message merger with fetched messages\n chunkMessageMerger.current.reset();\n chunkMessageMerger.current.initialMessages(fetchedMessages);\n needUpdateFields.messages = chunkMessageMerger.current.getMessages();\n\n // } else {\n // // No update needed - use existing messages from merger\n // fetchedMessages = chunkMessageMerger.current.getMessages();\n // }\n\n setState((prev) => {\n if (currentThreadIdRef.current !== capturedThreadId) return prev;\n return {\n ...prev,\n ...needUpdateFields,\n interrupts: prev.interrupts ?? needUpdateFields.interrupts,\n messages: chunkMessageMerger.current.getMessages(),\n isLoading,\n };\n });\n } catch (error) {\n if (\n capturedEpoch !== threadEpochRef.current ||\n currentThreadIdRef.current !== capturedThreadId ||\n capturedGeneration !== historyGenerationRef.current\n ) return;\n historyLoadingRef.current = false;\n const isLoading = getOwnedLoading();\n isLoadingRef.current = isLoading;\n setState((prev) => ({\n ...prev,\n isLoading,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n }\n }, [\n client,\n threadId,\n options.enableResumeStream,\n options.resumeStreamPollInterval,\n handleStreamEvent,\n fetchAndUpdateAgentState,\n getOwnedLoading,\n resumeStream,\n ]);\n\n /**\n * Clears all messages from state\n */\n const clearMessages = useCallback(() => {\n messageActivityGenerationRef.current += 1;\n chunkMessageMerger.current.reset();\n lastAgentStateCreatedAtRef.current = null;\n setState((prev) => ({\n ...prev,\n messages: [],\n interrupts: undefined,\n }));\n }, []);\n\n /**\n * Clears the error state\n */\n const clearError = useCallback(() => {\n setState((prev) => ({\n ...prev,\n error: null,\n stopReason: null,\n }));\n }, []);\n\n /**\n * Remove a pending message from the queue\n * @param messageId - ID of the pending message to remove\n */\n const removePendingMessage = useCallback(\n async (messageId: string): Promise<boolean> => {\n if (!threadId) {\n throw new Error(\"Thread ID is required\");\n }\n\n try {\n\n const result = await client.chat.removePendingMessage({\n assistantId: assistantId || clientAssistantId,\n threadId,\n messageId,\n });\n\n // Update local state to remove the message\n setState((prev) => ({\n ...prev,\n pendingMessages: prev.pendingMessages.filter(\n (msg) => msg.id !== messageId\n ),\n }));\n\n return result.success;\n } catch (error) {\n console.error(\"Failed to remove pending message:\", error);\n throw error;\n }\n },\n [client, threadId, assistantId, clientAssistantId]\n );\n\n /**\n * Aborts the current agent execution\n * First disconnects all SSE streams, then notifies the backend to stop\n */\n const abortAgent = useCallback(async () => {\n const wasActive = getOwnedLoading();\n stopStreaming();\n if (wasActive) {\n setState((prev) => ({ ...prev, stopReason: \"aborted\", error: null }));\n }\n\n if (assistantId && threadId) {\n try {\n await client.chat.abort({\n assistantId,\n threadId,\n });\n } catch (error) {\n console.error(\"Failed to abort agent:\", error);\n }\n }\n }, [stopStreaming, getOwnedLoading, assistantId, threadId, client]);\n\n // Reset displayed messages immediately when thread changes — useLayoutEffect\n // runs synchronously before the browser paints, preventing a flash of the\n // previous thread's messages.\n useLayoutEffect(() => {\n if (threadId && state.threadId !== threadId) {\n chunkMessageMerger.current.reset();\n historyLoadingRef.current = true;\n const isLoading = getOwnedLoading();\n isLoadingRef.current = isLoading;\n setState((prev) => ({\n ...prev,\n threadId,\n messages: [],\n agentState: null,\n interrupts: undefined,\n isLoading,\n error: null,\n stopReason: null,\n }));\n }\n }, [getOwnedLoading, threadId, state.threadId]);\n\n // Load messages when thread ID changes\n useEffect(() => {\n const capturedTid = threadId;\n const capturedEpoch = threadEpochRef.current;\n let stream: ThreadStream | null = null;\n if (threadId && clientAssistantId === assistantId) {\n // Reset the cached createdAt when thread changes\n lastAgentStateCreatedAtRef.current = null;\n\n // Create ThreadStream for this thread\n stream = new ThreadStream(client, {\n assistantId: assistantId || clientAssistantId,\n threadId,\n pollInterval: options.resumeStreamPollInterval,\n onConnectionEnd: () => {\n if (\n capturedEpoch !== threadEpochRef.current ||\n currentThreadIdRef.current !== capturedTid ||\n threadStreamRef.current !== stream\n ) return;\n streamActiveRef.current = false;\n const isLoading = getOwnedLoading();\n isLoadingRef.current = isLoading;\n setState((prev) => {\n if (\n capturedEpoch !== threadEpochRef.current ||\n currentThreadIdRef.current !== capturedTid ||\n threadStreamRef.current !== stream\n ) return prev;\n return { ...prev, isLoading };\n });\n },\n });\n // Register handler with cross-thread guard\n stream.onChunk((chunk) => {\n if (currentThreadIdRef.current !== capturedTid) return;\n handleStreamEventRef.current(chunk as MessageChunk);\n });\n threadStreamRef.current = stream;\n const activeStream = stream;\n\n // Always open when there are messages. The ChunkBuffer now uses\n // skip(startIndex) for positioning, avoiding both replay duplicates\n // and premature THREAD_IDLE closures on idle threads.\n loadMessages().then(() => {\n const msgs = chunkMessageMerger.current.getMessages();\n const lastMsg = msgs[msgs.length - 1];\n // Only open if stream isn't already connected — sendMessage may\n // have opened it mid-loadMessages, and re-connecting would\n // re-skip and miss the just-produced human chunk.\n if (lastMsg && !activeStream.isConnected && threadStreamRef.current === activeStream) {\n activeStream.open(lastMsg.id);\n }\n });\n } else {\n clearMessages();\n }\n\n // Clean up streaming when component unmounts or thread changes\n return () => {\n threadEpochRef.current += 1;\n streamStopGenerationRef.current += 1;\n historyGenerationRef.current += 1;\n if (ownershipThreadIdRef.current === capturedTid) {\n historyLoadingRef.current = false;\n inFlightRef.current = 0;\n streamActiveRef.current = false;\n isLoadingRef.current = getOwnedLoading();\n }\n if (stream && threadStreamRef.current === stream) {\n stream.destroy();\n threadStreamRef.current = null;\n }\n };\n }, [threadId, loadMessages, clearMessages, clientAssistantId, assistantId, getOwnedLoading]);\n\n const value: AgentThreadContextValue<T> = useMemo(() => ({\n state,\n sendMessage,\n stopStreaming,\n abortAgent,\n resumeStream,\n loadMessages,\n clearMessages,\n clearError,\n customRunConfig,\n updateCustomRunConfig,\n removePendingMessage,\n }), [state, sendMessage, stopStreaming, abortAgent, resumeStream, loadMessages, clearMessages, clearError, customRunConfig, updateCustomRunConfig, removePendingMessage]);\n\n return (\n <AgentThreadContext.Provider value={value}>\n {children}\n </AgentThreadContext.Provider>\n );\n}\n\n/**\n * Hook to access AgentThreadContext.\n *\n * @param T - The {@link UseChatOptions} type parameter, allowing typed access to options.\n * @returns Agent thread context value of type {@link AgentThreadContextValue}.\n * @throws {Error} If used outside of an {@link AgentThreadProvider}.\n *\n * @example\n * ```tsx\n * const { state, sendMessage, stopStreaming, abortAgent } = useAgentThreadContext();\n *\n * await sendMessage({ input: { message: 'Hello!' } });\n * ```\n */\nexport function useAgentThreadContext<\n T extends UseChatOptions\n>(): AgentThreadContextValue<T> {\n const context = useContext(AgentThreadContext);\n\n if (!context) {\n throw new Error(\n \"useAgentThreadContext must be used within an AgentThreadProvider\"\n );\n }\n\n return context as AgentThreadContextValue<T>;\n}\n\n/**\n * Optional version of {@link useAgentThreadContext} that returns `null` instead of throwing\n * when used outside an {@link AgentThreadProvider}.\n *\n * Use this in components that may be rendered both inside and outside a thread context\n * (e.g. side-app views, widgets) where thread operations like `sendMessage` are optional.\n *\n * @returns Agent thread context value or `null` if no provider is available.\n */\nexport function useOptionalAgentThreadContext<\n T extends UseChatOptions\n>(): AgentThreadContextValue<T> | null {\n const context = useContext(AgentThreadContext);\n return context as AgentThreadContextValue<T> | null;\n}\n","import {\n ResumeStreamOptions,\n} from \"@axiom-lattice/client-sdk\";\nimport {\n MessageChunk,\n} from \"@axiom-lattice/protocols\";\n\ntype ChunkHandler = (chunk: MessageChunk) => void;\n\ninterface ResumeStreamClient {\n resumeStream: (\n options: ResumeStreamOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: () => void,\n onError?: (error: Error) => void\n ) => () => void;\n}\n\ninterface ThreadStreamOptions {\n assistantId: string;\n threadId: string;\n pollInterval?: number;\n onConnectionEnd?: (reason: \"complete\" | \"error\", error?: Error) => void;\n}\n\n/**\n * ADR-026: Thread-level SSE connection.\n *\n * One SSE per thread, opened on mount (via loadMessages) or on first\n * sendMessage. The connection stays alive until the component unmounts\n * or the server's ChunkBuffer reaches its stop condition (client\n * disconnect detected, no stop types).\n *\n * Key behaviors:\n * - #connect() is a no-op if already connected — prevents racing opens\n * from losing in-flight chunks (Scenario 5 bug).\n * - No reconnect loop, no TTL, no polling.\n * - onComplete (server close) just cleans up; next sendMessage re-opens.\n */\nexport class ThreadStream {\n readonly threadId: string;\n readonly assistantId: string;\n readonly pollInterval: number;\n\n #client: ResumeStreamClient;\n #stopStreaming: (() => void) | null = null;\n #connectionId = 0;\n #chunkHandlers = new Set<ChunkHandler>();\n #lastMessageId: string | null = null;\n #closed = false;\n #onConnectionEnd?: ThreadStreamOptions[\"onConnectionEnd\"];\n\n constructor(\n client: ResumeStreamClient,\n options: ThreadStreamOptions\n ) {\n this.#client = client;\n this.threadId = options.threadId;\n this.assistantId = options.assistantId;\n this.pollInterval = options.pollInterval || 100;\n this.#onConnectionEnd = options.onConnectionEnd;\n }\n\n get isConnected(): boolean {\n return this.#stopStreaming !== null;\n }\n\n onChunk(handler: ChunkHandler): () => void {\n this.#chunkHandlers.add(handler);\n return () => { this.#chunkHandlers.delete(handler); };\n }\n\n open(messageId: string): void {\n if (this.#closed) return;\n if (!messageId) return;\n\n this.#lastMessageId = messageId;\n this.#connect();\n }\n\n close(): void {\n this.#closed = true;\n this.#disconnect();\n }\n\n stop(): void {\n this.#disconnect();\n }\n\n destroy(): void {\n this.close();\n this.#chunkHandlers.clear();\n }\n\n #connect(): void {\n if (this.#closed) return;\n if (!this.#lastMessageId) return;\n\n // Already connected or connecting — don't disrupt in-flight SSE.\n // The current connection (set up with an earlier messageId) will\n // receive all chunks including those for newer messages because\n // skip() positions at that earlier position.\n if (this.#stopStreaming) return;\n\n this.#connectionId += 1;\n const connId = this.#connectionId;\n\n const options: ResumeStreamOptions = {\n assistantId: this.assistantId,\n threadId: this.threadId,\n messageId: this.#lastMessageId,\n knownContent: '',\n pollInterval: this.pollInterval,\n };\n\n this.#stopStreaming = this.#client.resumeStream(\n options,\n (chunk: MessageChunk) => {\n if (this.#connectionId !== connId) return;\n this.#handleChunk(chunk);\n },\n () => {\n if (this.#connectionId !== connId) return;\n try {\n this.#onConnectionEnd?.(\"complete\");\n } finally {\n this.#disconnect();\n }\n },\n (error: Error) => {\n if (this.#connectionId !== connId) return;\n console.error('ThreadStream error:', error);\n try {\n this.#onConnectionEnd?.(\"error\", error);\n } finally {\n this.#disconnect();\n }\n }\n );\n }\n\n #disconnect(): void {\n this.#connectionId += 1;\n if (this.#stopStreaming) {\n this.#stopStreaming();\n this.#stopStreaming = null;\n }\n }\n\n #handleChunk(chunk: MessageChunk): void {\n for (const handler of this.#chunkHandlers) {\n try {\n handler(chunk);\n } catch (err) {\n console.error('ThreadStream: chunk handler error:', err);\n }\n }\n }\n}\n","import { useAgentThreadContext } from \"../context/AgentThreadContext\";\nimport { ChatState, ChatStateWithAgent, UseChatOptions } from \"../types\";\nimport { MessageChunk } from \"@axiom-lattice/protocols\";\n\n/**\n * Hook for managing chat interactions with an agent using AgentThreadContext\n *\n * This hook provides functionality for:\n * - Accessing agent thread state from AgentThreadContext\n * - Sending messages to an agent\n * - Receiving streaming and non-streaming responses\n * - Loading message history\n * - Managing the agent thread state\n * - Optionally returning agent state when streaming completes\n *\n * @template T - UseChatOptions type\n * @param options - Optional chat configuration including streaming, resume stream, and initial messages\n * @returns Agent thread state and operations from AgentThreadContext\n */\nexport function useAgentChat<T extends UseChatOptions>(\n options?: T\n): ChatStateWithAgent & {\n sendMessage: (data: {\n input?: { message: string; files?: { name: string; id: string }[] };\n command?: {\n resume?: {\n action: string;\n data: Record<string, any> & {\n config?: { thread_id?: string; work_log_id?: string };\n };\n message: string;\n };\n update?: any;\n send?: { node: string; input: any };\n };\n streaming?: boolean;\n mode?: 'collect' | 'followup' | 'steer';\n throwOnError?: boolean;\n }) => Promise<void>;\n stopStreaming: () => void;\n resumeStream: (messageId?: string, onMessageChunk?: (chunk: MessageChunk) => void) => () => void;\n loadMessages: (limit?: number) => Promise<void>;\n clearMessages: () => void;\n clearError: () => void;\n customRunConfig: Record<string, any>;\n updateCustomRunConfig: (config: Record<string, any>) => void;\n removePendingMessage: (messageId: string) => Promise<boolean>;\n abortAgent: () => Promise<void>;\n} {\n const context = useAgentThreadContext<T>();\n\n // Return state and operations from context\n return {\n ...context.state,\n sendMessage: context.sendMessage,\n stopStreaming: context.stopStreaming,\n resumeStream: context.resumeStream,\n loadMessages: context.loadMessages,\n clearMessages: context.clearMessages,\n clearError: context.clearError,\n customRunConfig: context.customRunConfig,\n updateCustomRunConfig: context.updateCustomRunConfig,\n removePendingMessage: context.removePendingMessage,\n abortAgent: context.abortAgent,\n };\n}\n","import { useState, useCallback, useEffect, useRef } from \"react\";\nimport { useClient } from \"../context\";\nimport { UseAgentStateOptions, UseAgentStateReturn, AgentState } from \"../types\";\n\n/**\n * Hook for monitoring agent state\n * @param threadId - Thread ID to monitor\n * @param assistantId - Assistant ID to monitor (required for factory pattern)\n * @param options - Agent state options\n * @returns Agent state and control functions\n */\nexport function useAgentState(\n threadId: string | null,\n assistantId: string,\n options: UseAgentStateOptions = {}\n): UseAgentStateReturn {\n const client = useClient(assistantId);\n const [agentState, setAgentState] = useState<AgentState | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n\n const pollingIntervalRef = useRef<number | null>(null);\n const pollingTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const hasFetchedRef = useRef<boolean>(false);\n\n // Default options\n const {\n pollingInterval = 2000, // 2 seconds by default\n autoStart = true,\n } = options;\n\n /**\n * Fetches the current agent state\n * @param isPollingRequest - Whether this is a polling request (silent update)\n */\n const fetchAgentState = useCallback(async (isPollingRequest = false) => {\n if (!threadId) {\n return;\n }\n\n // Only show loading for initial load or manual refresh, not for polling\n if (!isPollingRequest) {\n setIsLoading(true);\n }\n setError(null);\n\n try {\n const state = await client.getAgentState(threadId);\n setAgentState(state);\n hasFetchedRef.current = true;\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n if (!isPollingRequest) {\n setIsLoading(false);\n }\n }\n }, [client, threadId]);\n\n /**\n * Starts polling for agent state\n */\n const startPolling = useCallback(() => {\n if (!threadId) {\n return;\n }\n\n // Clear any existing polling\n if (pollingTimeoutRef.current) {\n clearTimeout(pollingTimeoutRef.current);\n pollingTimeoutRef.current = null;\n }\n\n // Generate a unique ID for this polling session\n const pollingId = Date.now();\n pollingIntervalRef.current = pollingId;\n\n // Define the polling function - silent update\n const poll = async () => {\n // Check if this polling session is still active\n if (pollingIntervalRef.current !== pollingId) {\n return;\n }\n\n // Silent polling - pass true to avoid loading state\n await fetchAgentState(true);\n\n // Schedule next poll if still active\n if (pollingIntervalRef.current === pollingId) {\n pollingTimeoutRef.current = setTimeout(poll, pollingInterval);\n }\n };\n\n // Start polling\n poll();\n }, [threadId, pollingInterval, fetchAgentState]);\n\n /**\n * Stops polling for agent state\n */\n const stopPolling = useCallback(() => {\n pollingIntervalRef.current = null;\n\n if (pollingTimeoutRef.current) {\n clearTimeout(pollingTimeoutRef.current);\n pollingTimeoutRef.current = null;\n }\n }, []);\n\n /**\n * Manually refreshes agent state\n */\n const refresh = useCallback(async () => {\n await fetchAgentState(false); // Manual refresh shows loading\n }, [fetchAgentState]);\n\n // Start/stop polling when thread ID changes\n useEffect(() => {\n if (threadId && autoStart) {\n startPolling();\n } else {\n stopPolling();\n }\n\n return () => {\n stopPolling();\n };\n }, [threadId, autoStart, startPolling, stopPolling]);\n\n return {\n agentState,\n isLoading,\n error,\n startPolling,\n stopPolling,\n refresh,\n };\n}\n","import { useState, useCallback } from \"react\";\nimport { useClient } from \"../context\";\n\n/**\n * Hook for fetching agent graph visualization\n * @param assistantId - Assistant ID to fetch graph for\n * @returns Graph state and operations\n */\nexport function useAgentGraph(assistantId: string): {\n graphImage: string | null;\n isLoading: boolean;\n error: Error | null;\n fetchGraph: () => Promise<void>;\n} {\n const client = useClient(assistantId);\n const [graphImage, setGraphImage] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n\n /**\n * Fetches the agent graph visualization\n */\n const fetchGraph = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const image = await client.getAgentGraph();\n setGraphImage(image);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n return {\n graphImage,\n isLoading,\n error,\n fetchGraph,\n };\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useApi } from \"../useApi\";\n\n/**\n * Fetches and manages evaluation projects.\n *\n * @returns Project list, loading state, error, and CRUD operations\n *\n * @example\n * ```tsx\n * const { projects, loading, create, update, remove, refresh } = useEvalProjects();\n *\n * await create({ name: \"My Project\" });\n * ```\n */\nexport function useEvalProjects() {\n const { get, post, put, del } = useApi();\n const [projects, setProjects] = useState<unknown[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchProjects = useCallback(async () => {\n try {\n setLoading(true);\n setError(null);\n const res = await get<{ success: boolean; data?: { records?: unknown[] } }>(\n \"/api/eval/projects\"\n );\n setProjects(res.data?.records || []);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [get]);\n\n useEffect(() => {\n void fetchProjects();\n }, [fetchProjects]);\n\n const create = async (data: Record<string, unknown>) => {\n const res = await post<{ success: boolean; data?: unknown }>(\"/api/eval/projects\", data);\n await fetchProjects();\n return res.data;\n };\n\n const update = async (id: string, patch: Record<string, unknown>) => {\n await put<{ success: boolean }>(`/api/eval/projects/${id}`, patch);\n await fetchProjects();\n };\n\n const remove = async (id: string) => {\n await del<{ success: boolean }>(`/api/eval/projects/${id}`);\n await fetchProjects();\n };\n\n return { projects, loading, error, create, update, remove, refresh: fetchProjects };\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport { useApi } from \"../useApi\";\nimport { parseEvalSuiteList, type EvalSuiteRecord } from \"./evalGuards\";\n\nfunction normalizeError(reason: unknown): Error {\n if (reason instanceof Error) return reason;\n if (typeof reason === \"string\") return new Error(reason);\n if (typeof reason === \"object\" && reason !== null && \"message\" in reason) {\n const message = (reason as { message?: unknown }).message;\n if (typeof message === \"string\") return new Error(message);\n }\n return new Error(String(reason));\n}\n\n/**\n * Fetches and manages evaluation suites within a project.\n *\n * @param projectId - The project ID to fetch suites for\n * @returns Suite list, loading state, error, and CRUD operations\n *\n * @example\n * ```tsx\n * const { suites, loading, create, remove } = useEvalSuites(\"proj-123\");\n *\n * await create(\"proj-123\", { name: \"Accuracy Suite\" });\n * ```\n */\nexport function useEvalSuites(projectId: string) {\n const { get, post, put, del } = useApi();\n const [inventory, setInventory] = useState<{ projectId: string; suites: EvalSuiteRecord[] }>({\n projectId,\n suites: [],\n });\n const [loading, setLoading] = useState(Boolean(projectId));\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(false);\n const projectIdRef = useRef(projectId);\n const requestTokenRef = useRef(0);\n projectIdRef.current = projectId;\n\n const fetchSuites = useCallback(async (): Promise<EvalSuiteRecord[]> => {\n const requestedProjectId = projectId;\n if (!requestedProjectId || projectIdRef.current !== requestedProjectId) return [];\n const requestToken = ++requestTokenRef.current;\n const ownsState = (): boolean => (\n mountedRef.current\n && projectIdRef.current === requestedProjectId\n && requestTokenRef.current === requestToken\n );\n try {\n if (ownsState()) {\n setLoading(true);\n setError(null);\n }\n const res = await get<{\n success?: boolean;\n error?: string;\n data?: { suites?: unknown[] };\n }>(\n `/api/eval/projects/${requestedProjectId}`\n );\n if (res.success !== true) {\n throw new Error(res.error || \"Failed to fetch evaluation suites\");\n }\n if (!Array.isArray(res.data?.suites)) {\n throw new Error(\"Invalid evaluation suites response\");\n }\n const suites = parseEvalSuiteList(res.data.suites, requestedProjectId);\n if (!suites) throw new Error(\"Invalid evaluation suites response\");\n if (ownsState()) setInventory({ projectId: requestedProjectId, suites });\n return suites;\n } catch (err) {\n const normalizedError = normalizeError(err);\n if (ownsState()) setError(normalizedError);\n throw normalizedError;\n } finally {\n if (ownsState()) setLoading(false);\n }\n }, [get, projectId]);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n requestTokenRef.current += 1;\n };\n }, []);\n\n useEffect(() => {\n requestTokenRef.current += 1;\n setInventory({ projectId, suites: [] });\n setError(null);\n setLoading(Boolean(projectId));\n if (!projectId) return;\n void fetchSuites().catch(() => undefined);\n return () => {\n requestTokenRef.current += 1;\n };\n }, [fetchSuites, projectId]);\n\n const create = async (pid: string, data: Record<string, unknown>) => {\n const res = await post<{ success: boolean; data?: unknown }>(\n `/api/eval/projects/${pid}/suites`,\n data\n );\n if (projectIdRef.current === pid) await fetchSuites();\n return res.data;\n };\n\n const update = async (pid: string, id: string, patch: Record<string, unknown>) => {\n await put<{ success: boolean }>(`/api/eval/projects/${pid}/suites/${id}`, patch);\n if (projectIdRef.current === pid) await fetchSuites();\n };\n\n const remove = async (pid: string, id: string) => {\n await del<{ success: boolean }>(`/api/eval/projects/${pid}/suites/${id}`);\n if (projectIdRef.current === pid) await fetchSuites();\n };\n\n const inventoryProjectChanged = inventory.projectId !== projectId;\n return {\n suites: inventoryProjectChanged ? [] : inventory.suites,\n loading: inventoryProjectChanged ? Boolean(projectId) : loading,\n error: inventoryProjectChanged ? null : error,\n create,\n update,\n remove,\n refresh: fetchSuites,\n };\n}\n","import type { EvalRunResultRecord, EvalRunRecord } from \"./evalTypes\";\n\nexport interface EvalSuiteRecord {\n id: string;\n projectId: string;\n name: string;\n caseCount?: number;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n [key: string]: unknown;\n}\n\nconst RUN_STATUSES = new Set([\"running\", \"completed\", \"failed\", \"aborted\"]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction validDate(value: unknown): value is Date | string {\n return (value instanceof Date || typeof value === \"string\") && Number.isFinite(new Date(value).getTime());\n}\n\nfunction finiteNonNegative(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n}\n\nconst RUN_OPTIONALS = [\"taskId\", \"envProjectId\", \"envWorkspaceId\", \"error\", \"startedAt\", \"completedAt\"] as const;\nconst RESULT_OPTIONALS = [\"caseId\", \"summary\", \"dimensionResults\", \"durationMs\", \"messages\", \"logs\", \"error\", \"interrupted\", \"createdAt\"] as const;\n\nfunction normalizeNullable(value: Record<string, unknown>, fields: readonly string[]): Record<string, unknown> {\n const normalized: Record<string, unknown> = { ...value };\n for (const field of fields) if (normalized[field] === null) normalized[field] = undefined;\n return normalized;\n}\n\nfunction parseRun(value: unknown, projectId?: string): EvalRunRecord | null {\n if (!isRecord(value)) return null;\n const run = normalizeNullable(value, RUN_OPTIONALS);\n if (!nonEmptyString(run.id) || !nonEmptyString(run.projectId)\n || (projectId !== undefined && run.projectId !== projectId)\n || typeof run.status !== \"string\" || !RUN_STATUSES.has(run.status)\n || !finiteNonNegative(run.totalCases) || !finiteNonNegative(run.passedCases)\n || !finiteNonNegative(run.failedCases) || !finiteNonNegative(run.avgScore)\n || !validDate(run.createdAt) || run.passedCases + run.failedCases > run.totalCases\n || (run.taskId !== undefined && typeof run.taskId !== \"string\")\n || (run.envProjectId !== undefined && typeof run.envProjectId !== \"string\")\n || (run.envWorkspaceId !== undefined && typeof run.envWorkspaceId !== \"string\")\n || (run.error !== undefined && typeof run.error !== \"string\")\n || (run.startedAt !== undefined && !validDate(run.startedAt))\n || (run.completedAt !== undefined && !validDate(run.completedAt))) return null;\n return run as unknown as EvalRunRecord;\n}\n\nexport function parseEvalRunList(value: unknown, projectId: string): EvalRunRecord[] | null {\n if (!Array.isArray(value)) return null;\n const runs = value.map((item) => parseRun(item, projectId));\n return runs.every((run): run is EvalRunRecord => run !== null) ? runs : null;\n}\n\nexport function parseEvalSuiteList(value: unknown, projectId: string): EvalSuiteRecord[] | null {\n if (!Array.isArray(value)) return null;\n if (!value.every((item) => isRecord(item) && nonEmptyString(item.id) && item.projectId === projectId\n && nonEmptyString(item.name) && (item.caseCount === undefined || finiteNonNegative(item.caseCount))\n && (item.createdAt === undefined || validDate(item.createdAt))\n && (item.updatedAt === undefined || validDate(item.updatedAt)))) return null;\n return value as EvalSuiteRecord[];\n}\n\nfunction parseResult(value: unknown, runId: string): EvalRunResultRecord | null {\n if (!isRecord(value)) return null;\n const result = normalizeNullable(value, RESULT_OPTIONALS);\n if (!nonEmptyString(result.id) || result.runId !== runId || !nonEmptyString(result.suiteName)\n || typeof result.pass !== \"boolean\" || typeof result.score !== \"number\" || !Number.isFinite(result.score)\n || (result.caseId !== undefined && typeof result.caseId !== \"string\")\n || (result.summary !== undefined && typeof result.summary !== \"string\")\n || (result.durationMs !== undefined && !finiteNonNegative(result.durationMs))\n || (result.error !== undefined && typeof result.error !== \"string\")\n || (result.interrupted !== undefined && typeof result.interrupted !== \"boolean\")) return null;\n if (result.dimensionResults !== undefined && (!Array.isArray(result.dimensionResults) || !result.dimensionResults.every((item) =>\n isRecord(item) && nonEmptyString(item.name) && finiteNonNegative(item.score) && typeof item.reason === \"string\"))) return null;\n if (result.messages !== undefined && (!Array.isArray(result.messages) || !result.messages.every((item) =>\n isRecord(item) && typeof item.role === \"string\" && typeof item.content === \"string\"))) return null;\n if (result.logs !== undefined && (!Array.isArray(result.logs) || !result.logs.every((item) =>\n isRecord(item) && typeof item.timestamp === \"string\" && typeof item.level === \"string\" && typeof item.message === \"string\"))) return null;\n if (result.createdAt !== undefined && !validDate(result.createdAt)) return null;\n return result as unknown as EvalRunResultRecord;\n}\n\nexport function parseEvalRunDetail(value: unknown, runId: string): (EvalRunRecord & { results: EvalRunResultRecord[] }) | null {\n if (!isRecord(value)) return null;\n const run = parseRun(value);\n if (!run || run.id !== runId || !Array.isArray(value.results)) return null;\n const results = value.results.map((item) => parseResult(item, runId));\n if (!results.every((result): result is EvalRunResultRecord => result !== null)) return null;\n return { ...run, results };\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useApi } from \"../useApi\";\n\n/**\n * Fetches and manages evaluation cases within a suite.\n *\n * @param projectId - The project ID the suite belongs to\n * @param suiteId - The suite ID to fetch cases for\n * @returns Case list, loading state, error, and CRUD operations\n *\n * @example\n * ```tsx\n * const { cases, loading, create } = useEvalCases(\"proj-123\", \"suite-456\");\n *\n * await create(\"proj-123\", \"suite-456\", { question: \"What is 2+2?\", answer: \"4\" });\n * ```\n */\nexport function useEvalCases(projectId: string, suiteId: string) {\n const { get, post, put, del } = useApi();\n const [cases, setCases] = useState<unknown[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchCases = useCallback(async () => {\n if (!projectId || !suiteId) return;\n try {\n setLoading(true);\n setError(null);\n const res = await get<{ success: boolean; data?: { records?: unknown[] } }>(\n `/api/eval/projects/${projectId}/suites/${suiteId}/cases`\n );\n setCases(res.data?.records || []);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [get, projectId, suiteId]);\n\n useEffect(() => {\n void fetchCases();\n }, [fetchCases]);\n\n const create = async (pid: string, sid: string, data: Record<string, unknown>) => {\n const res = await post<{ success: boolean; data?: unknown }>(\n `/api/eval/projects/${pid}/suites/${sid}/cases`,\n data\n );\n await fetchCases();\n return res.data;\n };\n\n const update = async (\n pid: string,\n sid: string,\n id: string,\n patch: Record<string, unknown>\n ) => {\n await put<{ success: boolean }>(\n `/api/eval/projects/${pid}/suites/${sid}/cases/${id}`,\n patch\n );\n await fetchCases();\n };\n\n const remove = async (pid: string, sid: string, id: string) => {\n await del<{ success: boolean }>(`/api/eval/projects/${pid}/suites/${sid}/cases/${id}`);\n await fetchCases();\n };\n\n return { cases, loading, error, create, update, remove, refresh: fetchCases };\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport { useApi } from \"../useApi\";\nimport type { EvalRunRecord } from \"./evalTypes\";\nimport { parseEvalRunList } from \"./evalGuards\";\n\nfunction normalizeError(reason: unknown): Error {\n if (reason instanceof Error) return reason;\n if (typeof reason === \"string\") return new Error(reason);\n if (typeof reason === \"object\" && reason !== null && \"message\" in reason) {\n const message = (reason as { message?: unknown }).message;\n if (typeof message === \"string\") return new Error(message);\n }\n return new Error(String(reason));\n}\n\n/**\n * Fetches and manages evaluation runs, optionally scoped to a project.\n *\n * @param projectId - Optional project ID to filter runs by project\n * @returns Run list, loading state, error, and operations (start, abort, remove)\n *\n * @example\n * ```tsx\n * const { runs, loading, start, abort } = useEvalRuns(\"proj-123\");\n *\n * const result = await start(\"proj-123\");\n * ```\n */\nexport function useEvalRuns(projectId?: string) {\n const { get, post, del } = useApi();\n const [inventory, setInventory] = useState<{ projectId: string | null; runs: EvalRunRecord[] }>({\n projectId: null,\n runs: [],\n });\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(false);\n const projectIdRef = useRef(projectId);\n const requestTokenRef = useRef(0);\n projectIdRef.current = projectId;\n\n const fetchRuns = useCallback(async (): Promise<EvalRunRecord[]> => {\n const requestedProjectId = projectId;\n if (!requestedProjectId || projectIdRef.current !== requestedProjectId) return [];\n const requestToken = ++requestTokenRef.current;\n const ownsState = (): boolean => (\n mountedRef.current\n && projectIdRef.current === requestedProjectId\n && requestTokenRef.current === requestToken\n );\n try {\n if (ownsState()) {\n setLoading(true);\n setError(null);\n }\n const url = `/api/eval/runs?project_id=${encodeURIComponent(requestedProjectId)}`;\n const res = await get<{\n success?: boolean;\n error?: string;\n data?: { records?: EvalRunRecord[]; total?: number };\n }>(url);\n if (res.success !== true) {\n throw new Error(res.error || \"Failed to fetch evaluation runs\");\n }\n const records = parseEvalRunList(res.data?.records ?? [], requestedProjectId);\n if (!records) throw new Error(\"Invalid evaluation runs response\");\n if (ownsState()) setInventory({ projectId: requestedProjectId, runs: records });\n return records;\n } catch (err) {\n const normalizedError = normalizeError(err);\n if (ownsState()) setError(normalizedError);\n throw normalizedError;\n } finally {\n if (ownsState()) setLoading(false);\n }\n }, [get, projectId]);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n requestTokenRef.current += 1;\n };\n }, []);\n\n useEffect(() => {\n requestTokenRef.current += 1;\n setInventory({ projectId: null, runs: [] });\n setError(null);\n setLoading(Boolean(projectId));\n if (!projectId) return;\n void fetchRuns().catch(() => undefined);\n return () => {\n requestTokenRef.current += 1;\n };\n }, [fetchRuns, projectId]);\n\n const start = async (pid: string, runConfig?: { workspaceId?: string; projectId?: string }) => {\n const res = await post<{ success: boolean; data?: { run_id: string } }>(\n `/api/eval/projects/${pid}/runs`,\n runConfig ? { runConfig } : undefined\n );\n await fetchRuns();\n return res.data;\n };\n\n const abort = async (runId: string) => {\n await post<{ success: boolean }>(`/api/eval/runs/${runId}/abort`);\n await fetchRuns();\n };\n\n const remove = async (runId: string) => {\n await del<{ success: boolean }>(`/api/eval/runs/${runId}`);\n await fetchRuns();\n };\n\n const inventoryMatches = inventory.projectId === projectId;\n return {\n runs: inventoryMatches ? inventory.runs : [],\n inventoryProjectId: inventoryMatches ? inventory.projectId : null,\n loading: inventoryMatches ? loading : error ? false : Boolean(projectId),\n error,\n start,\n abort,\n remove,\n refresh: fetchRuns,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useClient } from \"../../context\";\n\n/** A validated case result received from an evaluation progress stream. */\nexport interface CompletedEvalCaseSummary {\n caseId: string;\n suiteName: string;\n pass: boolean;\n score: number;\n interrupted: boolean;\n}\n\n/** Current lifecycle state of an evaluation stream subscription. */\nexport type EvalStreamStatus = \"idle\" | \"running\" | \"completed\" | \"error\" | \"disconnected\";\n\n/** Persisted terminal state explicitly reported by the evaluation server. */\nexport interface EvalStreamTerminal {\n type: \"completed\" | \"error\";\n runId: string;\n generation: number;\n data: Record<string, unknown>;\n}\n\ninterface EvalProgress {\n completed: number;\n total: number;\n passed: number;\n failed: number;\n}\n\ninterface UseEvalRunStreamResult {\n stateRunId: string | null;\n status: EvalStreamStatus;\n progress: EvalProgress;\n connected: boolean;\n completedCases: CompletedEvalCaseSummary[];\n terminal: EvalStreamTerminal | null;\n error: Error | null;\n lastUpdatedAt: Date | null;\n reconnect: () => void;\n stopStreaming: () => void;\n}\n\nconst EMPTY_PROGRESS: EvalProgress = { completed: 0, total: 0, passed: 0, failed: 0 };\n\nfunction isNonnegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && Number.isInteger(value) && value >= 0;\n}\n\nfunction normalizeError(value: unknown, fallback: string): Error {\n if (value instanceof Error) return value;\n if (typeof value === \"string\" && value.length > 0) return new Error(value);\n return new Error(fallback);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction toCaseSummary(value: unknown): CompletedEvalCaseSummary | null {\n if (!isRecord(value) || typeof value.caseId !== \"string\" || value.caseId.length === 0) return null;\n if (typeof value.pass !== \"boolean\") return null;\n return {\n caseId: value.caseId,\n suiteName: typeof value.suiteName === \"string\" ? value.suiteName : \"Unknown suite\",\n pass: value.pass,\n score: typeof value.score === \"number\" && Number.isFinite(value.score) ? value.score : 0,\n interrupted: typeof value.interrupted === \"boolean\" ? value.interrupted : false,\n };\n}\n\nfunction parseRunSnapshot(value: unknown, runId: string): {\n status: \"running\" | \"completed\" | \"failed\" | \"aborted\";\n progress: EvalProgress;\n results: CompletedEvalCaseSummary[] | null;\n error: string | null;\n avgScore: number | null;\n} | null {\n if (!isRecord(value) || value.success !== true || !isRecord(value.data)) return null;\n const data = value.data;\n if (\n data.id !== runId\n || typeof data.status !== \"string\"\n || ![\"running\", \"completed\", \"failed\", \"aborted\"].includes(data.status)\n ) return null;\n if (\n !isNonnegativeInteger(data.totalCases)\n || !isNonnegativeInteger(data.passedCases)\n || !isNonnegativeInteger(data.failedCases)\n ) return null;\n const completed = data.passedCases + data.failedCases;\n const results = Array.isArray(data.results)\n ? data.results.map(toCaseSummary).filter((result): result is CompletedEvalCaseSummary => result !== null)\n : null;\n return {\n status: data.status as \"running\" | \"completed\" | \"failed\" | \"aborted\",\n progress: {\n completed,\n total: Math.max(data.totalCases, completed),\n passed: data.passedCases,\n failed: data.failedCases,\n },\n results,\n error: typeof data.error === \"string\" && data.error.length > 0 ? data.error : null,\n avgScore: typeof data.avgScore === \"number\" && Number.isFinite(data.avgScore)\n ? data.avgScore\n : null,\n };\n}\n\n/**\n * Streams real-time progress of an evaluation run via SSE.\n *\n * Duplicate case events replace the first case's details in place while keeping\n * its original completion order and correcting aggregate pass/fail counters.\n *\n * @param runId - The evaluation run ID to stream, or `null` to disable streaming\n */\nexport function useEvalRunStream(runId: string | null): UseEvalRunStreamResult {\n const client = useClient(\"__GLOBAL__\");\n const [status, setStatus] = useState<EvalStreamStatus>(\"idle\");\n const [stateRunId, setStateRunId] = useState<string | null>(runId);\n const [progress, setProgress] = useState<EvalProgress>(EMPTY_PROGRESS);\n const [connected, setConnected] = useState(false);\n const [completedCases, setCompletedCases] = useState<CompletedEvalCaseSummary[]>([]);\n const [terminal, setTerminal] = useState<EvalStreamTerminal | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [lastUpdatedAt, setLastUpdatedAt] = useState<Date | null>(null);\n const [subscription, setSubscription] = useState(0);\n const abortRef = useRef<AbortController | null>(null);\n const generationRef = useRef(0);\n const runIdRef = useRef(runId);\n const previousRunIdRef = useRef<string | null | undefined>(undefined);\n const caseIndexesRef = useRef(new Map<string, number>());\n const casesRef = useRef<CompletedEvalCaseSummary[]>([]);\n const progressRef = useRef<EvalProgress>(EMPTY_PROGRESS);\n const manuallyStoppedRunIdRef = useRef<string | null>(null);\n runIdRef.current = runId;\n\n const stopStreaming = useCallback(() => {\n generationRef.current += 1;\n abortRef.current?.abort();\n abortRef.current = null;\n manuallyStoppedRunIdRef.current = runIdRef.current;\n setConnected(false);\n setStatus(\"idle\");\n setTerminal(null);\n setError(null);\n }, []);\n\n const reconnect = useCallback(() => {\n if (!runIdRef.current) return;\n manuallyStoppedRunIdRef.current = null;\n generationRef.current += 1;\n abortRef.current?.abort();\n abortRef.current = null;\n setConnected(false);\n setStatus(\"running\");\n setTerminal(null);\n setError(null);\n setSubscription((value) => value + 1);\n }, []);\n\n useEffect(() => {\n const runChanged = previousRunIdRef.current !== runId;\n previousRunIdRef.current = runId;\n\n if (runChanged) {\n setStateRunId(runId);\n manuallyStoppedRunIdRef.current = null;\n caseIndexesRef.current = new Map();\n casesRef.current = [];\n progressRef.current = EMPTY_PROGRESS;\n setProgress(EMPTY_PROGRESS);\n setCompletedCases([]);\n setTerminal(null);\n setError(null);\n setLastUpdatedAt(null);\n }\n\n if (!runId) {\n setStatus(\"idle\");\n setConnected(false);\n return;\n }\n\n if (manuallyStoppedRunIdRef.current === runId) return;\n\n const generation = generationRef.current + 1;\n generationRef.current = generation;\n const controller = new AbortController();\n abortRef.current = controller;\n setStatus(\"running\");\n setConnected(true);\n setTerminal(null);\n setError(null);\n\n const isGenerationCurrent = () => generationRef.current === generation;\n\n const encodedRunId = encodeURIComponent(runId);\n\n const liveProgressEvents: Record<string, unknown>[] = [];\n const applyProgressEvent = (data: Record<string, unknown>, updateTime: boolean): boolean => {\n const summary = toCaseSummary(data);\n if (!summary) return false;\n const existingIndex = caseIndexesRef.current.get(summary.caseId);\n\n if (existingIndex === undefined) {\n caseIndexesRef.current.set(summary.caseId, casesRef.current.length);\n casesRef.current = [...casesRef.current, summary];\n const previous = progressRef.current;\n progressRef.current = {\n completed: isNonnegativeInteger(data.completed) ? data.completed : previous.completed,\n total: isNonnegativeInteger(data.total) ? data.total : previous.total,\n passed: previous.passed + (summary.pass ? 1 : 0),\n failed: previous.failed + (summary.pass ? 0 : 1),\n };\n setProgress(progressRef.current);\n } else {\n const previousSummary = casesRef.current[existingIndex];\n const nextCases = [...casesRef.current];\n nextCases[existingIndex] = summary;\n casesRef.current = nextCases;\n if (previousSummary && previousSummary.pass !== summary.pass) {\n const previous = progressRef.current;\n progressRef.current = {\n ...previous,\n passed: previous.passed + (summary.pass ? 1 : -1),\n failed: previous.failed + (summary.pass ? -1 : 1),\n };\n setProgress(progressRef.current);\n }\n }\n\n setCompletedCases(casesRef.current);\n if (updateTime) setLastUpdatedAt(new Date());\n return true;\n };\n\n void (async () => {\n let receivedTerminal = false;\n let snapshotTerminal = false;\n try {\n const snapshotRequest = client.request<unknown>(`/api/eval/runs/${encodedRunId}`, { method: \"GET\" });\n const stream = client.streamEvents(\n `/api/eval/runs/${encodedRunId}/stream`,\n controller.signal\n );\n void snapshotRequest.then((response) => {\n const snapshot = parseRunSnapshot(response, runId);\n if (!isGenerationCurrent() || !snapshot) return;\n if (receivedTerminal && snapshot.status === \"running\") return;\n progressRef.current = snapshot.progress;\n if (snapshot.results) {\n casesRef.current = snapshot.results;\n caseIndexesRef.current = new Map(\n casesRef.current.map((result, index) => [result.caseId, index])\n );\n }\n if (snapshot.status === \"running\") {\n const replayedPassByCase = new Map<string, boolean>();\n for (const eventData of liveProgressEvents) {\n const summary = toCaseSummary(eventData);\n if (!summary) continue;\n const eventCompleted = isNonnegativeInteger(eventData.completed) ? eventData.completed : null;\n if (eventCompleted !== null && eventCompleted > progressRef.current.completed) {\n const previous = progressRef.current;\n progressRef.current = {\n completed: eventCompleted,\n total: isNonnegativeInteger(eventData.total) ? eventData.total : previous.total,\n passed: previous.passed + (summary.pass ? 1 : 0),\n failed: previous.failed + (summary.pass ? 0 : 1),\n };\n replayedPassByCase.set(summary.caseId, summary.pass);\n } else {\n const replayedPass = replayedPassByCase.get(summary.caseId);\n if (replayedPass !== undefined && replayedPass !== summary.pass) {\n const previous = progressRef.current;\n progressRef.current = {\n ...previous,\n passed: previous.passed + (summary.pass ? 1 : -1),\n failed: previous.failed + (summary.pass ? -1 : 1),\n };\n replayedPassByCase.set(summary.caseId, summary.pass);\n }\n }\n const existingIndex = caseIndexesRef.current.get(summary.caseId);\n if (existingIndex === undefined) {\n caseIndexesRef.current.set(summary.caseId, casesRef.current.length);\n casesRef.current = [...casesRef.current, summary];\n } else if (replayedPassByCase.has(summary.caseId)) {\n const nextCases = [...casesRef.current];\n nextCases[existingIndex] = summary;\n casesRef.current = nextCases;\n }\n }\n } else {\n liveProgressEvents.length = 0;\n }\n setProgress(progressRef.current);\n if (snapshot.results || liveProgressEvents.length > 0) {\n setCompletedCases(casesRef.current);\n }\n if (snapshot.status === \"completed\") {\n snapshotTerminal = true;\n const data: Record<string, unknown> = {\n passed: snapshot.progress.passed,\n failed: snapshot.progress.failed,\n };\n if (snapshot.avgScore !== null) data.avgScore = snapshot.avgScore;\n setStatus(\"completed\");\n setTerminal({ type: \"completed\", runId, generation, data });\n setConnected(false);\n setError(null);\n setLastUpdatedAt(new Date());\n controller.abort();\n } else if (snapshot.status === \"failed\" || snapshot.status === \"aborted\") {\n snapshotTerminal = true;\n // The public status contract has no aborted state, so persisted aborts are terminal errors.\n const message = snapshot.status === \"aborted\"\n ? \"Evaluation aborted\"\n : snapshot.error ?? \"Evaluation failed\";\n setStatus(\"error\");\n setTerminal({\n type: \"error\",\n runId,\n generation,\n data: {\n passed: snapshot.progress.passed,\n failed: snapshot.progress.failed,\n error: message,\n message,\n },\n });\n setConnected(false);\n setError(new Error(message));\n setLastUpdatedAt(new Date());\n controller.abort();\n }\n }).catch(() => {\n // Snapshot reconciliation is best-effort; SSE owns connection errors.\n });\n\n for await (const event of stream) {\n if (!isGenerationCurrent() || snapshotTerminal) return;\n const data = isRecord(event.data) ? event.data : {};\n\n if (event.event === \"progress\") {\n if (applyProgressEvent(data, true)) liveProgressEvents.push(data);\n } else if (event.event === \"completed\") {\n receivedTerminal = true;\n const previous = progressRef.current;\n const passed = isNonnegativeInteger(data.passed) ? data.passed : previous.passed;\n const failed = isNonnegativeInteger(data.failed) ? data.failed : previous.failed;\n const completed = passed + failed;\n progressRef.current = {\n completed,\n total: Math.max(previous.total, completed),\n passed,\n failed,\n };\n setProgress(progressRef.current);\n setStatus(\"completed\");\n setTerminal({ type: \"completed\", runId, generation, data });\n setConnected(false);\n setError(null);\n setLastUpdatedAt(new Date());\n return;\n } else if (event.event === \"error\") {\n receivedTerminal = true;\n const message = typeof data.message === \"string\" && data.message.length > 0\n ? data.message\n : \"Evaluation stream failed\";\n setStatus(\"error\");\n setTerminal({ type: \"error\", runId, generation, data });\n setConnected(false);\n setError(new Error(message));\n setLastUpdatedAt(new Date());\n return;\n }\n }\n\n if (isGenerationCurrent() && !snapshotTerminal && !receivedTerminal) {\n setStatus(\"disconnected\");\n setConnected(false);\n setError(new Error(\"Evaluation stream disconnected\"));\n }\n } catch (reason) {\n if (!isGenerationCurrent() || snapshotTerminal) return;\n setStatus(\"disconnected\");\n setConnected(false);\n setTerminal(null);\n setError(normalizeError(reason, \"Evaluation stream disconnected\"));\n }\n })();\n\n return () => {\n if (generationRef.current === generation) generationRef.current += 1;\n controller.abort();\n if (abortRef.current === controller) abortRef.current = null;\n };\n }, [client, runId, subscription]);\n\n return {\n stateRunId,\n status,\n progress,\n connected,\n completedCases,\n terminal,\n error,\n lastUpdatedAt,\n reconnect,\n stopStreaming,\n };\n}\n","import React, { createContext, useCallback, useContext, useState } from \"react\";\nimport type { ReactNode } from \"react\";\n\nconst emptyHandler = () => {\n throw new Error(\"ChatUIContextProvider not found\");\n};\n\ntype PanelCardData = Record<string, unknown> & {\n component?: ReactNode;\n message?: string;\n};\n\nexport type PanelCard = {\n component_key: string;\n data: PanelCardData;\n message?: string;\n context?: {\n thread_id?: string;\n assistant_id?: string;\n };\n};\n\nexport const ChatUIContext = createContext<{\n detailVisible: boolean;\n setDetailVisible: (visible: boolean) => void;\n detailSize: \"small\" | \"middle\" | \"large\" | \"full\";\n setDetailSize: (size: \"small\" | \"middle\" | \"large\" | \"full\") => void;\n detailSelectedCard: PanelCard | null;\n setDetailSelectedCard: (card: PanelCard | null) => void;\n openDetail: (card: PanelCard) => void;\n closeDetail: () => void;\n toolsVisible: boolean;\n setToolsVisible: (visible: boolean) => void;\n toggleTools: () => void;\n toolSelectedCard: PanelCard | null;\n setToolSelectedCard: (card: PanelCard | null) => void;\n openTools: (card: PanelCard) => void;\n closeTools: () => void;\n sideAppVisible: boolean;\n setSideAppVisible: (visible: boolean) => void;\n sideAppSize: \"small\" | \"middle\" | \"large\" | \"full\";\n setSideAppSize: (size: \"small\" | \"middle\" | \"large\" | \"full\") => void;\n sideAppSelectedCard: PanelCard | null;\n setSideAppSelectedCard: (card: PanelCard | null) => void;\n openSideApp: (card: PanelCard) => void;\n closeSideApp: () => void;\n menuCollapsed: boolean | undefined;\n setMenuCollapsed: (collapsed: boolean) => void;\n openContentApp: (card: PanelCard) => void;\n closeContentApp: () => void;\n contentAppVisible: boolean;\n setcontentAppVisible: (visible: boolean) => void;\n contentAppSelectedCard: PanelCard | null;\n setContentAppSelectedCard: (card: PanelCard | null) => void;\n}>({\n detailVisible: false,\n setDetailVisible: emptyHandler,\n detailSize: \"large\",\n setDetailSize: emptyHandler,\n detailSelectedCard: null,\n setDetailSelectedCard: emptyHandler,\n openDetail: emptyHandler,\n closeDetail: emptyHandler,\n toolsVisible: false,\n setToolsVisible: emptyHandler,\n toggleTools: emptyHandler,\n toolSelectedCard: null,\n setToolSelectedCard: emptyHandler,\n openTools: emptyHandler,\n closeTools: emptyHandler,\n sideAppVisible: false,\n setSideAppVisible: emptyHandler,\n sideAppSize: \"large\",\n setSideAppSize: emptyHandler,\n sideAppSelectedCard: null,\n setSideAppSelectedCard: emptyHandler,\n openSideApp: emptyHandler,\n closeSideApp: emptyHandler,\n menuCollapsed: undefined,\n setMenuCollapsed: emptyHandler,\n openContentApp: emptyHandler,\n closeContentApp: emptyHandler,\n contentAppVisible: false,\n setcontentAppVisible: emptyHandler,\n contentAppSelectedCard: null,\n setContentAppSelectedCard: emptyHandler,\n});\n\n/**\n * Chat UI context provider. Manages visibility and selected cards for chat panel areas\n * (detail, tools, side app, content app) and the sidebar menu collapsed state.\n *\n * @description\n * Tracks the open/closed state and the currently selected {@link PanelCard} for each panel:\n * - **Detail panel**: A slide-out detail view that displays a chosen card's content.\n * - **Tools panel**: A tools sidebar/drawer for tool-specific cards.\n * - **Side app**: Aliases to the detail panel (shared state).\n * - **Content app**: An inline content area for embedded app cards.\n * - **Menu collapsed**: Whether the sidebar navigation menu is collapsed.\n *\n * Provides action helpers (`openDetail`, `closeDetail`, `openTools`, `toggleTools`, etc.)\n * that set both visibility and selected card atomically.\n *\n * @param props - Provider props.\n * @param props.children - React children to render within the UI context.\n *\n * @returns A React context provider wrapping children with {@link ChatUIContext.Provider}.\n *\n * @example\n * ```tsx\n * <ChatUIContextProvider>\n * <ChatLayout />\n * </ChatUIContextProvider>\n * ```\n */\nexport const ChatUIContextProvider = ({\n children,\n defaultMenuCollapsed,\n}: {\n children: React.ReactNode;\n /** Default collapsed state for the sidebar menu. Default: undefined (auto) */\n defaultMenuCollapsed?: boolean;\n}) => {\n const [detailVisible, setDetailVisible] = useState(false);\n const [contentAppVisible, setcontentAppVisible] = useState(false);\n const [detailSize, setDetailSize] = useState<\"small\" | \"middle\" | \"large\" | \"full\">(\"large\");\n const [detailSelectedCard, setDetailSelectedCard] = useState<PanelCard | null>(null);\n const [toolsVisible, setToolsVisible] = useState(false);\n const [toolSelectedCard, setToolSelectedCard] = useState<PanelCard | null>(null);\n const [contentAppSelectedCard, setContentAppSelectedCard] = useState<PanelCard | null>(null);\n const [menuCollapsed, setMenuCollapsed] = useState<boolean | undefined>(defaultMenuCollapsed ?? undefined);\n\n const openDetail = useCallback((card: PanelCard) => {\n setDetailSelectedCard(card);\n setDetailVisible(true);\n }, []);\n\n const closeDetail = useCallback(() => {\n setDetailSelectedCard(null);\n setDetailVisible(false);\n }, []);\n\n const openTools = useCallback((card: PanelCard) => {\n setToolSelectedCard(card);\n setToolsVisible(true);\n }, []);\n\n const closeTools = useCallback(() => {\n setToolSelectedCard(null);\n setToolsVisible(false);\n }, []);\n\n const openSideApp = useCallback((card: PanelCard) => {\n openDetail(card);\n }, [openDetail]);\n\n const openContentApp = useCallback((card: PanelCard) => {\n setContentAppSelectedCard(card);\n setcontentAppVisible(true);\n }, []);\n\n const closeSideApp = useCallback(() => {\n closeDetail();\n }, [closeDetail]);\n\n const closeContentApp = useCallback(() => {\n setContentAppSelectedCard(null);\n setcontentAppVisible(false);\n }, []);\n\n const toggleTools = useCallback(() => {\n setToolsVisible((prev) => !prev);\n }, []);\n\n return (\n <ChatUIContext.Provider\n value={{\n detailVisible,\n setDetailVisible,\n detailSize,\n setDetailSize,\n detailSelectedCard,\n setDetailSelectedCard,\n openDetail,\n closeDetail,\n toolsVisible,\n setToolsVisible,\n toggleTools,\n toolSelectedCard,\n setToolSelectedCard,\n openTools,\n closeTools,\n sideAppVisible: detailVisible,\n setSideAppVisible: setDetailVisible,\n sideAppSize: detailSize,\n setSideAppSize: setDetailSize,\n sideAppSelectedCard: detailSelectedCard,\n setSideAppSelectedCard: setDetailSelectedCard,\n openSideApp,\n closeSideApp,\n openContentApp,\n closeContentApp,\n menuCollapsed,\n setMenuCollapsed,\n contentAppVisible,\n setcontentAppVisible,\n contentAppSelectedCard,\n setContentAppSelectedCard,\n }}\n >\n {children}\n </ChatUIContext.Provider>\n );\n};\n\n/**\n * Hook to access the chat UI context. Must be used within a {@link ChatUIContextProvider}.\n *\n * @description\n * Returns panel visibility state, selected panel cards, and action functions for controlling\n * the chat interface panels (detail, tools, side app, content app) and menu collapsed state.\n *\n * @returns The current chat UI context value containing panel state and control functions.\n *\n * @example\n * ```tsx\n * const { detailVisible, openDetail, closeDetail, toggleTools, menuCollapsed } = useChatUIContext();\n *\n * const handleCardClick = (card: PanelCard) => {\n * openDetail(card);\n * };\n * ```\n */\nexport const useChatUIContext = () => {\n return useContext(ChatUIContext);\n};\n","import { createContext, useContext } from \"react\";\nimport { useChatUIContext } from \"./ChatUIContext\";\nimport type { PanelCard } from \"./ChatUIContext\";\n\nexport interface SideAppBrowserContextValue {\n openApp: (card: PanelCard) => void;\n}\n\nexport const SideAppBrowserContext = createContext<SideAppBrowserContextValue | null>(null);\n\nexport const useSideAppBrowser = (): SideAppBrowserContextValue | null => {\n return useContext(SideAppBrowserContext);\n};\n\nexport const useSideAppOpener = (): ((card: PanelCard) => void) => {\n const { openSideApp } = useChatUIContext();\n const browserCtx = useContext(SideAppBrowserContext);\n return browserCtx?.openApp ?? openSideApp;\n};\n","import { Table, Card, Typography, Button, Flex, Space } from \"antd\";\nimport { ElementProps } from \"../types\";\nimport { MDResponse } from \"../MDResponse\";\nimport { useState } from \"react\";\nimport type { ColumnsType } from \"antd/es/table\";\nimport type { Key } from \"react\";\n// import * as XLSX from \"xlsx\"; // Removed XLSX dependency for now as it wasn't in the list of added dependencies, or I should add it.\n// Wait, I didn't add xlsx to package.json. I should probably comment out the export functionality or add xlsx.\n// The user asked to replicate components. I should probably add xlsx or remove the feature.\n// Let's check if xlsx is used in the original file. Yes it is.\n// I will comment out the export functionality for now to avoid adding another heavy dependency unless requested, or I can add it.\n// Actually, let's add it to be safe and complete.\n// But for now, I'll comment it out and add a TODO.\nimport { DownloadOutlined, ExpandAltOutlined } from \"@ant-design/icons\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\nconst { Text } = Typography;\n\ninterface ExpandItemData {\n content?: string;\n dataSource?: any[];\n}\n\ninterface GenericDataTableProps {\n dataSource: any[];\n message?: string;\n}\n\nexport const GenericDataTable: React.FC<\n ElementProps<GenericDataTableProps>\n> = ({ data, interactive = true, default_open_in_side_app = true }) => {\n const { dataSource, message } = data ?? {};\n const [expandedRowKeys, setExpandedRowKeys] = useState<readonly Key[]>([]);\n const openSideApp = useSideAppOpener();\n // Process data to add unique keys\n const processedData =\n dataSource?.map((item: any, index: number) => ({\n ...item,\n key: `${index}_${JSON.stringify(item).slice(0, 20)}`,\n })) || [];\n\n // Generate columns automatically from data keys\n const generateColumns = (dataItem: any): ColumnsType<any> => {\n if (!dataItem || typeof dataItem !== \"object\") {\n return [];\n }\n\n const keys = Object.keys(dataItem).filter(\n (key) => key !== \"key\" && key !== \"expandItem\"\n );\n\n return keys.map((key) => ({\n title: formatColumnTitle(key),\n dataIndex: key,\n key: key,\n sorter: (a: any, b: any) => {\n const aVal = a[key];\n const bVal = b[key];\n\n // Handle null/undefined values\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n\n // Handle numbers\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\n return aVal - bVal;\n }\n\n // Handle dates (ISO strings or date-like strings)\n const aDate = new Date(aVal);\n const bDate = new Date(bVal);\n if (!isNaN(aDate.getTime()) && !isNaN(bDate.getTime())) {\n return aDate.getTime() - bDate.getTime();\n }\n\n // Handle strings\n return String(aVal).localeCompare(String(bVal), \"zh-CN\");\n },\n render: (value: any) => {\n if (value === null || value === undefined) {\n return \"-\";\n }\n if (typeof value === \"object\") {\n return (\n <span style={{ whiteSpace: \"normal\", wordBreak: \"break-word\" }}>\n {JSON.stringify(value)}\n </span>\n );\n }\n return (\n <span style={{ whiteSpace: \"normal\", wordBreak: \"break-word\" }}>\n {String(value)}\n </span>\n );\n },\n }));\n };\n\n // Format column title from camelCase/snake_case to readable text\n const formatColumnTitle = (key: string): string => {\n return key\n .replace(/([A-Z])/g, \" $1\")\n .replace(/_/g, \" \")\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n };\n\n // Get columns based on first data item\n const columns =\n processedData.length > 0 ? generateColumns(processedData[0]) : [];\n\n // Expandable row render for expandItem\n const expandedRowRender = (record: any) => {\n const expandItem: ExpandItemData = record.expandItem;\n\n if (!expandItem) {\n return null;\n }\n\n return (\n <div style={{ padding: \"16px\" }}>\n {expandItem.content && (\n <div style={{ marginBottom: \"16px\" }}>\n <Text strong style={{ display: \"block\", marginBottom: \"8px\" }}>\n Details:\n </Text>\n <MDResponse content={expandItem.content} />\n </div>\n )}\n\n {expandItem.dataSource && expandItem.dataSource.length > 0 && (\n <div>\n <Text strong style={{ display: \"block\", marginBottom: \"8px\" }}>\n Sub-table Data:\n </Text>\n <GenericDataTable\n component_key={`nested_${record.key}`}\n data={{\n dataSource: expandItem.dataSource,\n message: undefined,\n }}\n interactive={interactive}\n />\n </div>\n )}\n </div>\n );\n };\n\n // Export to CSV functionality\n const exportToCSV = () => {\n if (!processedData || processedData.length === 0) return;\n\n // Get headers (exclude key and expandItem)\n const headers = Object.keys(processedData[0]).filter(\n (key) => key !== \"key\" && key !== \"expandItem\"\n );\n\n // CSV escape function\n const escapeCSV = (value: any): string => {\n const str = String(value ?? \"\");\n // If contains comma, quote, or newline, wrap in quotes and escape internal quotes\n if (str.includes(\",\") || str.includes('\"') || str.includes(\"\\n\")) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n };\n\n // Build CSV content\n const csvContent = [\n // Header row\n headers.map(formatColumnTitle).map(escapeCSV).join(\",\"),\n // Data rows\n ...processedData.map((row) =>\n headers.map((key) => escapeCSV(row[key])).join(\",\")\n ),\n ].join(\"\\n\");\n\n // Add BOM for UTF-8 support in Excel\n const BOM = \"\\uFEFF\";\n const blob = new Blob([BOM + csvContent], {\n type: \"text/csv;charset=utf-8;\",\n });\n\n // Trigger download\n const link = document.createElement(\"a\");\n const filename = `${message || \"data\"}_${new Date().toISOString().split(\"T\")[0]\n }.csv`;\n link.href = URL.createObjectURL(blob);\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(link.href);\n };\n\n // Check if any row has expandItem\n const hasExpandableRows = processedData.some((item) => item.expandItem);\n\n return (\n <div\n className=\"generic-data-table-wrapper\"\n style={{ width: \"100%\", display: \"block\" }}\n >\n <Table\n size=\"small\"\n tableLayout=\"fixed\"\n style={{ width: \"100% !important\" }}\n title={() => (\n <Flex justify=\"space-between\" align=\"center\">\n <Space>\n <Text strong style={{ fontSize: 16 }}>\n {message || \"\"}\n </Text>\n </Space>\n <Space>\n <Button\n title=\"Export CSV\"\n type=\"text\"\n size=\"small\"\n icon={<DownloadOutlined />}\n onClick={exportToCSV}\n disabled={!processedData || processedData.length === 0}\n >\n\n </Button>\n {default_open_in_side_app && (\n <Button\n title=\"Expand\"\n type=\"text\"\n size=\"small\"\n onClick={() => {\n openSideApp({\n component_key: \"generic_data_table\",\n message: message || \"\",\n data: { dataSource, message },\n });\n }}\n >\n <ExpandAltOutlined />\n\n </Button>\n )}\n </Space>\n </Flex>\n )}\n dataSource={processedData}\n columns={columns}\n // pagination={{\n // pageSize: 10,\n // showSizeChanger: true,\n // showQuickJumper: true,\n // showTotal: (total, range) =>\n // `${range[0]}-${range[1]} of ${total} items`,\n // }}\n scroll={{ x: \"max-content\" }}\n expandable={\n hasExpandableRows\n ? {\n expandedRowRender,\n expandedRowKeys,\n onExpandedRowsChange: (keys) => setExpandedRowKeys(keys),\n rowExpandable: (record) => !!record.expandItem,\n }\n : undefined\n }\n rowKey=\"key\"\n bordered\n />\n </div>\n );\n};\n","import XMarkdown, { type ComponentProps } from \"@ant-design/x-markdown\";\n\nimport React, { useRef, useState, useMemo, useEffect, useCallback, useDeferredValue } from \"react\";\nimport { createStyles } from \"antd-style\";\n\nimport { mdComponents } from \"./mdComponents\";\nimport { linkifySandboxPaths } from \"../../utils/filePathLinkify\";\n\n// Memoize mdComponents at module level to ensure stable reference\nconst memoizedMdComponents = mdComponents;\n\nconst useStyles = createStyles(({ token, css }) => ({\n markdownContainer: css`\n white-space: normal;\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n color: ${token.colorTextHeading};\n margin-top: 24px;\n margin-bottom: 16px;\n }\n\n p {\n color: ${token.colorText};\n line-height: 1.6;\n margin-bottom: 16px;\n }\n\n blockquote {\n border-left: 4px solid ${token.colorPrimary};\n background: ${token.colorFillAlter};\n padding: 16px;\n margin: 16px 0;\n border-radius: 0 ${token.borderRadius}px ${token.borderRadius}px 0;\n }\n\n code:not(pre code) {\n background: ${token.colorFillAlter};\n padding: 2px 6px;\n border-radius: ${token.borderRadius}px;\n font-family: ${token.fontFamilyCode};\n color: ${token.colorError};\n }\n\n /* Override XMarkdown table styles for GenericDataTable */\n .generic-data-table-wrapper table {\n width: 100% !important;\n display: table !important;\n }\n\n /* Make GenericDataTable background 30% transparent */\n .generic-data-table-wrapper .ant-table {\n background: transparent !important;\n }\n .generic-data-table-wrapper .ant-table-container {\n background: ${token.colorBgContainer}30 !important;\n }\n .generic-data-table-wrapper .ant-table-thead > tr > th {\n background: ${token.colorFillAlter}30 !important;\n }\n .generic-data-table-wrapper .ant-table-tbody > tr > td {\n background: transparent !important;\n }\n .generic-data-table-wrapper .ant-table-tbody > tr:hover > td {\n background: ${token.colorFillTertiary}30 !important;\n }\n `,\n}));\n\n// Error Boundary to catch infinite loop errors\nclass MarkdownErrorBoundary extends React.Component<\n { children: React.ReactNode; fallback: React.ReactNode },\n { hasError: boolean }\n> {\n constructor(props: { children: React.ReactNode; fallback: React.ReactNode }) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error) {\n console.error(\"Markdown rendering error:\", error);\n }\n\n render() {\n if (this.state.hasError) {\n return this.props.fallback;\n }\n return this.props.children;\n }\n}\n\nconst SafeXMarkdown = React.memo(({ content, components, className }: {\n content: string;\n components: any;\n className: string;\n}) => {\n // Use useDeferredValue to tell React this state has lower rendering priority\n // When content changes frequently (like streaming), React prepares rendering in background,\n // keeping main thread smooth while ensuring final content is always rendered\n const deferredContent = useDeferredValue(content);\n\n // Ensure content is always a string - XMarkdown requires string input\n if (typeof deferredContent !== 'string') {\n console.warn('[MDResponse] Content is not a string:', typeof deferredContent, deferredContent);\n }\n const safeContent = typeof deferredContent === 'string' ? deferredContent : String(deferredContent ?? \"\");\n\n return (\n <div className={className}>\n <XMarkdown\n components={components}\n content={safeContent}\n paragraphTag=\"div\"\n />\n </div>\n );\n});\nSafeXMarkdown.displayName = \"SafeXMarkdown\";\n\nconst MDResponseInner = ({\n content = \"\",\n context,\n embeddedLink,\n interactive,\n userData,\n noGenUI,\n disableFilePathLinks = false,\n}: {\n context?: any;\n content: string;\n embeddedLink?: boolean;\n interactive?: boolean;\n userData?: any;\n noGenUI?: boolean;\n disableFilePathLinks?: boolean;\n}) => {\n const { styles } = useStyles();\n\n const linkifiedContent = useMemo(() => {\n if (disableFilePathLinks) {\n return content;\n }\n return linkifySandboxPaths(content);\n }, [content, disableFilePathLinks]);\n\n // Fallback content in case of error\n const fallbackContent = useMemo(() => (\n <div className={styles.markdownContainer}>\n <pre style={{ whiteSpace: \"pre-wrap\", wordBreak: \"break-word\" }}>\n {content}\n </pre>\n </div >\n ), [content, styles.markdownContainer]);\n\n return (\n <MarkdownErrorBoundary fallback={fallbackContent}>\n <SafeXMarkdown\n content={linkifiedContent}\n components={memoizedMdComponents}\n className={styles.markdownContainer}\n />\n </MarkdownErrorBoundary>\n );\n};\n\nexport const MDResponse = React.memo(MDResponseInner);\n\nMDResponse.displayName = \"MDResponse\";\n\nexport const MDViewFormItem = ({ value }: { value?: string }) => {\n return <MDResponse content={value || \"\"} />;\n};\n\nconst IFrameCard = ({ src }: { src?: string }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState(\"640px\");\n const [height, setHeight] = useState(\"320px\");\n const valid_images = [\n \"jpg\",\n \"jpeg\",\n \"png\",\n \"gif\",\n \"bmp\",\n \"svg\",\n \"tif\",\n \"tiff\",\n \"webp\",\n ];\n\n if (!src) {\n return null;\n }\n const spitedSrc = src.split(\".\");\n if (valid_images.includes(spitedSrc[spitedSrc.length - 1].toLowerCase())) {\n return (\n <div>\n <img src={src} style={{ width: \"100%\" }} />\n </div>\n );\n } else {\n return (\n <div>\n <a href={src} target=\"_black\">\n {src}\n </a>\n </div>\n );\n }\n};\n","import React, { ComponentProps, Suspense, lazy } from \"react\";\nimport { getElement } from \"./elements\";\nimport { CodeHighlighter } from \"@ant-design/x\";\nimport { Embed } from \"./Embed\";\n\n// mermaid / echarts / @antv/infographic dominate the bundle size but are only\n// needed when an assistant actually emits the matching fenced block, so they\n// are loaded on demand via dynamic import. The mermaid renderer keeps the\n// @ant-design/x Mermaid component (same initialize/parse/render behavior),\n// just deferred behind the chunk boundary.\nconst LazyMermaid = lazy(() => import(\"@ant-design/x/es/mermaid\"));\nconst LazyReactInfographic = lazy(() =>\n import(\"./ReactInfographic\").then((m) => ({ default: m.ReactInfographic }))\n);\nconst LazyReactChart = lazy(() =>\n import(\"./ReactChart\").then((m) => ({ default: m.ReactChart }))\n);\n\nfunction BlockLoading(): React.ReactElement {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: 200,\n color: \"rgba(0, 0, 0, 0.45)\",\n fontSize: 13,\n }}\n >\n Loading…\n </div>\n );\n}\n\nexport const Code: React.FC<ComponentProps<any>> = (props) => {\n const { className, children } = props;\n const language = className?.match(/language-(\\w+)/)?.[1] || \"\";\n\n let childrenStr;\n\n if (typeof children === \"string\") {\n childrenStr = children;\n }\n if (Array.isArray(children)) {\n childrenStr = children.join(\"\");\n }\n // if (isFileName(childrenStr)) {\n // return <FileLink data={{ path: childrenStr || \"\" }} component_key=\"file_link\" />\n // }\n if (language) {\n const Element = getElement(language)?.card_view;\n if (Element) {\n let childrenData;\n try {\n childrenData = JSON.parse(childrenStr as string);\n } catch (error) { /* intentionally empty */ }\n\n if (language === \"task_review\") {\n return <Element component_key={language} data={childrenData} interactive={false} />;\n }\n return <Element component_key={language} data={childrenData} />;\n }\n switch (language) {\n case \"infographic\":\n return (\n <Suspense fallback={<BlockLoading />}>\n <LazyReactInfographic>{children}</LazyReactInfographic>\n </Suspense>\n );\n case \"mermaid\":\n return (\n <Suspense fallback={<BlockLoading />}>\n <LazyMermaid>{children}</LazyMermaid>\n </Suspense>\n );\n case \"chart\":\n return (\n <Suspense fallback={<BlockLoading />}>\n <LazyReactChart>{children}</LazyReactChart>\n </Suspense>\n );\n case \"embed\":\n return <Embed>{children}</Embed>;\n\n default:\n return (\n <Suspense fallback={<BlockLoading />}>\n <CodeHighlighter lang={language}>{children}</CodeHighlighter>\n </Suspense>\n );\n }\n }\n return (\n <Suspense fallback={<BlockLoading />}>\n <CodeHighlighter lang={language}>{children}</CodeHighlighter>\n </Suspense>\n );\n};\n","import { Button, Space, Typography } from \"antd\";\nimport { ElementProps } from \"../types\";\nimport { useState } from \"react\";\nimport { createStyles } from \"antd-style\";\nimport { MDResponse } from \"../MDResponse\";\nimport { useAgentChat } from \"@hooks\";\nconst { Text } = Typography;\n\nexport const ConfirmFeedback: React.FC<ElementProps> = ({\n data,\n interactive = true,\n}) => {\n const { message, type, config, feedback, options } = data ?? {};\n const { sendMessage } = useAgentChat();\n const [clicked, setClicked] = useState(false);\n return (\n <Space direction=\"vertical\" style={{ width: \"100%\" }}>\n <MDResponse content={message} />\n {options ? (\n <Space style={{ justifyContent: \"flex-end\", width: \"100%\" }}>\n {options?.map((option: any) => (\n <Button\n title={option.description}\n key={option.value}\n disabled={!interactive || clicked || feedback}\n style={{\n border:\n feedback?.data?.action === option.value\n ? \"2px dashed rgb(74 73 77)\"\n : \"none\",\n }}\n onClick={() => {\n setClicked(true);\n sendMessage({\n command: {\n resume: {\n action: option.value,\n data: config,\n message: option.label,\n },\n },\n });\n }}\n >\n {option.label}\n </Button>\n ))}\n </Space>\n ) : (\n <Space style={{ justifyContent: \"flex-end\", width: \"100%\" }}>\n <Button\n disabled={!interactive || clicked || feedback}\n style={{\n border:\n feedback?.data?.action === \"yes\"\n ? \"2px dashed rgb(74 73 77)\"\n : \"none\",\n }}\n type=\"primary\"\n onClick={() => {\n setClicked(true);\n sendMessage({\n command: {\n resume: {\n action: \"yes\",\n data: config,\n message: \"Confirm\",\n },\n },\n });\n }}\n >\n Confirm\n </Button>\n <Button\n disabled={!interactive || clicked || feedback}\n type=\"default\"\n style={{\n border:\n feedback?.data?.action === \"no\"\n ? \"2px dashed rgb(74 73 77)\"\n : \"none\",\n }}\n onClick={() => {\n setClicked(true);\n sendMessage({\n command: {\n resume: {\n action: \"no\",\n data: config,\n message: \"Reject\",\n },\n },\n });\n }}\n >\n Reject\n </Button>\n </Space>\n )}\n </Space>\n );\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useClient } from \"../context\";\n\n/**\n * Fetches and manages collections via the client SDK.\n *\n * @returns Collection list, loading state, error, and CRUD operations\n *\n * @example\n * ```tsx\n * const { collections, isLoading, create, remove } = useCollections();\n *\n * await create({ name: \"my_collection\", label: \"My Collection\", embeddingKey: \"default\" });\n * ```\n */\nexport function useCollections() {\n const client = useClient(\"__GLOBAL__\");\n const [collections, setCollections] = useState<any[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchAll = useCallback(async () => {\n try {\n setIsLoading(true);\n setError(null);\n const records = await client.collections.list();\n setCollections(records);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n useEffect(() => {\n void fetchAll();\n }, [fetchAll]);\n\n const create = async (opts: {\n name: string;\n label: string;\n embeddingKey: string;\n schema?: { fields: Array<{ key: string; type: string; enumValues?: string[]; required?: boolean }> };\n }) => {\n const result = await client.collections.create(opts);\n await fetchAll();\n return result;\n };\n\n const update = async (\n name: string,\n patch: { label?: string; embeddingKey?: string; schema?: any }\n ) => {\n await client.collections.update(name, patch);\n await fetchAll();\n };\n\n const remove = async (name: string) => {\n await client.collections.delete(name);\n await fetchAll();\n };\n\n return { collections, isLoading, error, create, update, remove, refresh: fetchAll };\n}\n","import { useState, useCallback, useRef } from \"react\";\nimport { useApi } from \"./useApi\";\nimport { useClient } from \"../context\";\nimport type { ImportResolutions } from \"@axiom-lattice/client-sdk\";\nimport { useAuth } from \"../context/AuthContext\";\n\nexport interface ExportableType {\n entityType: string;\n label: string;\n category: string;\n dependsOn: string[];\n cascadeParents: string[];\n}\n\ninterface ExportDataNeedsConfirm {\n needsConfirmation: true;\n missingDependencies: string[];\n cascadeAdditions: string[];\n}\n\ninterface ExportDataDone {\n jobId: string;\n summary: Record<string, number>;\n}\n\ntype ExportData = ExportDataNeedsConfirm | ExportDataDone;\n\ninterface ImportPreviewData {\n conflicts: Array<{ _exportId: string; entityType: string; conflictType: string; existingName?: string; existingId?: string }>;\n insertions: Array<{ _exportId: string; entityType: string; name: string }>;\n errors: Array<{ _exportId: string; entityType: string; error: string }>;\n}\n\ninterface ImportApplyData {\n results: Array<{ _exportId: string; entityType: string; status: string; newId?: string; error?: string }>;\n idMap: Record<string, string>;\n}\n\nexport interface ExportImportState {\n exportableTypes: ExportableType[];\n selectedTypes: string[];\n exportLoading: boolean;\n exportJobId: string | null;\n importLoading: boolean;\n previewResult: ImportPreviewData | null;\n applyResult: ImportApplyData | null;\n error: string | null;\n}\n\nexport interface UseExportImportReturn {\n exportableTypes: ExportableType[];\n selectedTypes: string[];\n exportLoading: boolean;\n exportJobId: string | null;\n importLoading: boolean;\n previewResult: ImportPreviewData | null;\n applyResult: ImportApplyData | null;\n error: string | null;\n fetchExportableTypes: () => Promise<void>;\n toggleType: (entityType: string) => void;\n selectAll: () => void;\n deselectAll: () => void;\n doExport: (entityIds?: Record<string, string[]>) => Promise<ExportData | null>;\n confirmExport: (entityTypes: string[], entityIds?: Record<string, string[]>) => Promise<ExportDataDone | null>;\n fetchEntityPreview: (entityTypes: string[]) => Promise<Record<string, Array<{ id: string; name: string; description?: string }>> | null>;\n downloadExport: (jobId: string) => Promise<void>;\n doImportPreview: (file: File) => Promise<ImportPreviewData | null>;\n doImportApply: (resolutions: ImportResolutions) => Promise<ImportApplyData | null>;\n}\n\ninterface ApiResponse<T> {\n success: boolean;\n data: T;\n}\n\n/**\n * Hook for tenant configuration export/import operations.\n * Uses the standard API client (useApi) for automatic auth headers and tenant ID.\n *\n * @returns Export/import state and action functions\n */\nexport function useExportImport(): UseExportImportReturn {\n const api = useApi();\n const client = useClient(\"__GLOBAL__\");\n const { currentTenant } = useAuth();\n const tenantId = currentTenant?.id ?? \"_\";\n const archiveRef = useRef<File | null>(null);\n\n const [state, setState] = useState<ExportImportState>({\n exportableTypes: [],\n selectedTypes: [],\n exportLoading: false,\n exportJobId: null,\n importLoading: false,\n previewResult: null,\n applyResult: null,\n error: null,\n });\n\n const fetchExportableTypes = useCallback(async () => {\n try {\n const json = await api.get<ApiResponse<ExportableType[]>>(\n \"/api/tenants/exportable-types\",\n );\n setState((s) => ({ ...s, exportableTypes: json.data || [] }));\n } catch (err) {\n setState((s) => ({ ...s, error: (err as Error).message }));\n }\n }, [api]);\n\n const toggleType = useCallback((entityType: string) => {\n setState((s) => ({\n ...s,\n selectedTypes: s.selectedTypes.includes(entityType)\n ? s.selectedTypes.filter((t) => t !== entityType)\n : [...s.selectedTypes, entityType],\n }));\n }, []);\n\n const selectAll = useCallback(() => {\n setState((s) => ({\n ...s,\n selectedTypes: s.exportableTypes.map((t) => t.entityType),\n }));\n }, []);\n\n const deselectAll = useCallback(() => {\n setState((s) => ({ ...s, selectedTypes: [] }));\n }, []);\n\n const doExport = useCallback(async (entityIds?: Record<string, string[]>): Promise<ExportData | null> => {\n setState((s) => ({ ...s, exportLoading: true, error: null }));\n try {\n const json = await api.post<ApiResponse<ExportData>>(\n `/api/tenants/${tenantId}/export`,\n { entityTypes: state.selectedTypes, entityIds },\n );\n const result = json.data;\n if (\"needsConfirmation\" in result) {\n setState((s) => ({ ...s, exportLoading: false }));\n return result;\n }\n setState((s) => ({ ...s, exportJobId: result.jobId, exportLoading: false }));\n return result;\n } catch (err) {\n setState((s) => ({ ...s, exportLoading: false, error: (err as Error).message }));\n return null;\n }\n }, [api, state.selectedTypes, tenantId]);\n\n const confirmExport = useCallback(async (entityTypes: string[], entityIds?: Record<string, string[]>): Promise<ExportDataDone | null> => {\n setState((s) => ({ ...s, exportLoading: true }));\n try {\n const json = await api.post<ApiResponse<ExportDataDone>>(\n `/api/tenants/${tenantId}/export/confirm`,\n { entityTypes, entityIds },\n );\n setState((s) => ({ ...s, exportJobId: json.data.jobId, exportLoading: false }));\n return json.data;\n } catch (err) {\n setState((s) => ({ ...s, exportLoading: false, error: (err as Error).message }));\n return null;\n }\n }, [api, tenantId]);\n\n const doImportPreview = useCallback(async (file: File): Promise<ImportPreviewData | null> => {\n setState((s) => ({ ...s, importLoading: true, error: null }));\n try {\n archiveRef.current = file;\n const preview = await client.exportImport.importPreview(tenantId, { archive: file });\n setState((s) => ({ ...s, previewResult: preview, importLoading: false }));\n return preview;\n } catch (err) {\n setState((s) => ({ ...s, importLoading: false, error: (err as Error).message }));\n return null;\n }\n }, [client, tenantId]);\n\n const doImportApply = useCallback(async (resolutions: ImportResolutions): Promise<ImportApplyData | null> => {\n setState((s) => ({ ...s, importLoading: true, error: null }));\n try {\n if (!archiveRef.current) throw new Error(\"Select and preview a tar.gz archive first\");\n const applied = await client.exportImport.importApply(\n tenantId,\n { archive: archiveRef.current },\n resolutions,\n );\n setState((s) => ({ ...s, applyResult: applied, importLoading: false }));\n return applied;\n } catch (err) {\n setState((s) => ({ ...s, importLoading: false, error: (err as Error).message }));\n return null;\n }\n }, [client, tenantId]);\n\n const fetchEntityPreview = useCallback(async (entityTypes: string[]) => {\n try {\n const json = await api.post<ApiResponse<Record<string, Array<{ id: string; name: string; description?: string }>>>>(\n `/api/tenants/${tenantId}/export/entities`,\n { entityTypes },\n );\n return json.data;\n } catch (err) {\n setState((s) => ({ ...s, error: (err as Error).message }));\n return null;\n }\n }, [api, tenantId]);\n\n const downloadExport = useCallback(async (jobId: string) => {\n setState((s) => ({ ...s, exportLoading: true, error: null }));\n try {\n const { filename, data } = await client.exportImport.downloadExport(tenantId, jobId);\n const archiveBytes = data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength,\n ) as ArrayBuffer;\n const blob = new Blob([archiveBytes], { type: 'application/gzip' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename || 'tenant-export.tar.gz';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n setState((s) => ({ ...s, exportLoading: false }));\n } catch (err) {\n setState((s) => ({ ...s, exportLoading: false, error: (err as Error).message }));\n }\n }, [client, tenantId]);\n\n return {\n ...state,\n fetchExportableTypes,\n toggleType,\n selectAll,\n deselectAll,\n doExport,\n confirmExport,\n fetchEntityPreview,\n downloadExport,\n doImportPreview,\n doImportApply,\n };\n}\n","import { useState, useRef, useCallback, useEffect } from \"react\";\nimport { useClient } from \"../context\";\n\nexport type RecorderMode = \"manual\" | \"auto\";\nexport type RecorderStatus = \"idle\" | \"requesting\" | \"recording\" | \"uploading\";\n\nexport type RecorderError =\n | \"permission_denied\"\n | \"not_supported\"\n | \"recorder_error\"\n | \"upload_failed\"\n | \"timeout\";\n\nexport interface VoiceRecorderState {\n status: RecorderStatus;\n duration: number;\n /** Real-time volume level 0-1, drives ring animation */\n voiceLevel: number;\n /** Frequency band levels for wave visualization */\n frequencyBands: number[];\n mode: RecorderMode;\n /** Accumulated partial transcription texts in auto mode */\n partialTexts: string[];\n error?: { type: RecorderError; message: string };\n}\n\nexport interface UseVoiceRecorderOptions {\n /** Recording mode, defaults to \"auto\" */\n mode?: RecorderMode;\n /** Auto-mode parameters */\n autoMode?: {\n /** Volume threshold below which is considered silence, default 0.05 */\n silenceThreshold?: number;\n /** Continuous silence duration in ms before triggering upload, default 2000 */\n silenceDuration?: number;\n /** MediaRecorder timeslice interval in ms, default 1000 */\n timeslice?: number;\n };\n /** Callback invoked with transcribed text (incremental in auto mode) */\n onTranscription: (text: string) => void;\n /** Recording time limit in seconds, default 120 */\n maxDuration?: number;\n}\n\nexport function useVoiceRecorder(options: UseVoiceRecorderOptions) {\n const {\n mode: initialMode = \"auto\",\n autoMode = {},\n onTranscription,\n maxDuration = 120,\n } = options;\n\n const { silenceThreshold = 0.05, silenceDuration = 2000, timeslice = 1000 } = autoMode;\n\n const [state, setState] = useState<VoiceRecorderState>({\n status: \"idle\",\n duration: 0,\n voiceLevel: 0,\n frequencyBands: [0, 0, 0, 0, 0],\n mode: initialMode,\n partialTexts: [],\n });\n\n const client = useClient(\"__GLOBAL__\");\n\n // Fix 6: stale onTranscription closure\n const onTranscriptionRef = useRef(onTranscription);\n onTranscriptionRef.current = onTranscription;\n\n // Fix 9: double-click guard uses stale state\n const statusRef = useRef(state.status);\n useEffect(() => {\n statusRef.current = state.status;\n }, [state.status]);\n\n // Fix 10: cleanupAudio idempotency\n const cleanedRef = useRef(false);\n // Fix 1: volume interval ref for cleanup\n const volIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n // Fix 3: cancel recording async race\n const isCancellingRef = useRef(false);\n\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n const streamRef = useRef<MediaStream | null>(null);\n const analyserRef = useRef<AnalyserNode | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const durationRef = useRef(0);\n const lastBlobRef = useRef<Blob | null>(null);\n const modeRef = useRef(initialMode);\n\n // Auto-mode VAD state\n const vadSilenceStartRef = useRef<number | null>(null);\n const vadSpeechBufferRef = useRef<Blob[]>([]);\n const vadNoiseRef = useRef(0.1); // realistic ambient noise floor\n const vadHadSpeechRef = useRef(false); // whether current buffer contains real speech\n const vadSpeechStartRef = useRef<number | null>(null); // when speech started in current buffer\n const stopSafetyTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isStoppingRef = useRef(false);\n const minSpeechDuration = 1500; // minimum 1.5s of speech before auto-upload\n\n const cleanupAudio = useCallback(() => {\n // Fix 10: idempotency guard\n if (cleanedRef.current) return;\n cleanedRef.current = true;\n\n if (timerRef.current) { clearInterval(timerRef.current); timerRef.current = null; }\n // Fix 1: clear volume interval\n if (volIntervalRef.current) { clearInterval(volIntervalRef.current); volIntervalRef.current = null; }\n if (analyserRef.current) { analyserRef.current.disconnect(); analyserRef.current = null; }\n if (audioContextRef.current) { audioContextRef.current.close(); audioContextRef.current = null; }\n if (streamRef.current) { streamRef.current.getTracks().forEach((t) => t.stop()); streamRef.current = null; }\n if (stopSafetyTimerRef.current) { clearTimeout(stopSafetyTimerRef.current); stopSafetyTimerRef.current = null; }\n mediaRecorderRef.current = null;\n durationRef.current = 0;\n vadSilenceStartRef.current = null;\n vadSpeechBufferRef.current = [];\n vadHadSpeechRef.current = false;\n vadSpeechStartRef.current = null;\n vadNoiseRef.current = 0.1;\n }, []);\n\n const uploadChunk = useCallback(\n async (blob: Blob): Promise<string> => {\n console.log(\"[STT] uploading size:\", blob.size, \"bytes\");\n const formData = new FormData();\n const ext = blob.type.includes(\"webm\") ? \"webm\" : blob.type.includes(\"mp4\") ? \"m4a\" : \"webm\";\n formData.append(\"file\", blob, `audio.${ext}`);\n const data = await client.request<{ text: string }>(\"/api/stt/transcribe\", {\n method: \"POST\",\n body: formData,\n });\n return data.text || \"\";\n },\n [client],\n );\n\n const startRecording = useCallback(async () => {\n // Fix 9: use ref-based guard instead of stale state\n if (statusRef.current !== \"idle\") return;\n\n setState((prev) => ({ ...prev, status: \"requesting\" }));\n\n // Fix 10: reset cleanedRef when starting new recording\n cleanedRef.current = false;\n isStoppingRef.current = false;\n // Fix 3: reset isCancellingRef\n isCancellingRef.current = false;\n\n try {\n if (!navigator.mediaDevices) {\n setState((prev) => ({\n ...prev,\n status: \"idle\",\n error: { type: \"not_supported\", message: \"Voice input not supported. Use Chrome, Edge, or Safari.\" },\n }));\n return;\n }\n\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n streamRef.current = stream;\n\n const mimeTypes = [\"audio/webm;codecs=opus\", \"audio/webm\", \"audio/mp4\"];\n let selectedMimeType = \"\";\n for (const mt of mimeTypes) {\n if (MediaRecorder.isTypeSupported(mt)) {\n selectedMimeType = mt;\n break;\n }\n }\n if (!selectedMimeType) {\n stream.getTracks().forEach((t) => t.stop());\n setState((prev) => ({\n ...prev,\n status: \"idle\",\n error: { type: \"not_supported\", message: \"Audio recording format not supported in this browser.\" },\n }));\n return;\n }\n\n // Set up AnalyserNode for volume\n const audioCtx = new AudioContext();\n audioContextRef.current = audioCtx;\n const source = audioCtx.createMediaStreamSource(stream);\n const analyser = audioCtx.createAnalyser();\n analyser.fftSize = 256;\n source.connect(analyser);\n analyserRef.current = analyser;\n const dataArray = new Uint8Array(analyser.frequencyBinCount);\n\n // Volume sampling every 100ms\n const volInterval = setInterval(() => {\n analyser.getByteFrequencyData(dataArray);\n const rms = Math.sqrt(\n dataArray.reduce((sum, v) => sum + v * v, 0) / dataArray.length,\n ) / 255;\n\n // Extract frequency bands for visualization (log-spaced, speech-heavy low end)\n const total = dataArray.length;\n const logStep = Math.log(total) / 5;\n const bands = [0, 1, 2, 3, 4].map((i) => {\n const start = Math.floor(Math.exp(i * logStep));\n const end = Math.floor(Math.exp((i + 1) * logStep));\n const slice = dataArray.slice(start, end);\n return slice.reduce((s, v) => s + v, 0) / slice.length / 255;\n });\n // Combine into single setState to avoid double re-render\n setState((prev) => ({ ...prev, voiceLevel: rms, frequencyBands: bands }));\n\n // VAD for auto mode — adaptive threshold\n if (modeRef.current === \"auto\") {\n // Noise floor adapts from CURRENT threshold — only track actual background\n const currentThreshold = Math.max(vadNoiseRef.current * 1.5, silenceThreshold);\n // Hysteresis: higher threshold to start speech, lower to return to silence\n const enterSpeechThreshold = currentThreshold * 1.3;\n const exitSilenceThreshold = currentThreshold;\n const isSilent = rms < (vadHadSpeechRef.current ? exitSilenceThreshold : enterSpeechThreshold);\n\n // Only update noise floor during silence (speech shouldn't inflate it)\n if (isSilent) {\n const alpha = 0.01;\n vadNoiseRef.current = alpha * rms + (1 - alpha) * vadNoiseRef.current;\n }\n\n // Log every ~5s\n if (Math.random() < 0.02) console.log(\"[STT] VAD:\", \"rms:\", rms.toFixed(3), \"thresh:\", currentThreshold.toFixed(3), isSilent ? \"S\" : \"🔊\");\n\n if (isSilent) {\n if (vadSilenceStartRef.current === null) {\n vadSilenceStartRef.current = Date.now();\n } else if (Date.now() - vadSilenceStartRef.current >= silenceDuration) {\n // Only upload if we had real speech + enough duration\n const hadSpeech = vadHadSpeechRef.current;\n const speechDuration = vadSpeechStartRef.current\n ? Date.now() - vadSpeechStartRef.current - silenceDuration\n : 0;\n\n if (hadSpeech && speechDuration >= minSpeechDuration && !isStoppingRef.current) {\n console.log(\"[STT] VAD trigger: speech:\", (speechDuration / 1000).toFixed(1), \"s, threshold:\", currentThreshold.toFixed(4), \"rms:\", rms.toFixed(4));\n const bufferSnapshot = [...vadSpeechBufferRef.current];\n if (bufferSnapshot.length === 0) {\n vadSilenceStartRef.current = null;\n return;\n }\n const combinedBlob = new Blob(bufferSnapshot, {\n type: mediaRecorderRef.current?.mimeType || \"audio/webm\",\n });\n console.log(\"[STT] VAD upload:\", bufferSnapshot.length, \"chunks, speech:\", (speechDuration / 1000).toFixed(1), \"s\");\n vadSpeechBufferRef.current = [];\n chunksRef.current = [];\n vadHadSpeechRef.current = false;\n vadSpeechStartRef.current = null;\n uploadChunk(combinedBlob)\n .then((text) => {\n if (text) {\n setState((prev) => ({\n ...prev,\n partialTexts: [...prev.partialTexts, text],\n error: undefined,\n }));\n onTranscriptionRef.current(text);\n }\n // Auto-stop after successful upload\n isStoppingRef.current = true;\n if (mediaRecorderRef.current?.state === \"recording\") {\n mediaRecorderRef.current.stop();\n }\n })\n .catch((err) => {\n if (!cleanedRef.current) {\n console.error(\"STT auto upload failed:\", err);\n const errorMessage = err instanceof Error ? err.message : \"Transcription failed\";\n setState((prev) => ({\n ...prev,\n error: { type: \"upload_failed\", message: errorMessage },\n }));\n }\n // Also stop on upload failure\n isStoppingRef.current = true;\n if (mediaRecorderRef.current?.state === \"recording\") {\n mediaRecorderRef.current.stop();\n }\n });\n }\n vadSilenceStartRef.current = null;\n }\n } else {\n // Speech detected: mark and track start time\n if (!vadHadSpeechRef.current) {\n vadHadSpeechRef.current = true;\n vadSpeechStartRef.current = Date.now();\n console.log(\"[STT] VAD speech start, threshold:\", currentThreshold.toFixed(4));\n }\n vadSilenceStartRef.current = null;\n }\n }\n }, 100);\n // Fix 1: store volume interval ref\n volIntervalRef.current = volInterval;\n\n // Fix 2: wrap MediaRecorder construction in try/catch\n try {\n const recorder = new MediaRecorder(stream, { mimeType: selectedMimeType });\n mediaRecorderRef.current = recorder;\n recorder.addEventListener(\"stop\", handleStop);\n chunksRef.current = [];\n\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) {\n if (modeRef.current === \"auto\") {\n vadSpeechBufferRef.current.push(e.data);\n } else {\n chunksRef.current.push(e.data);\n }\n }\n };\n\n recorder.onerror = () => {\n cleanupAudio();\n setState((prev) => ({\n ...prev,\n status: \"idle\",\n error: { type: \"recorder_error\", message: \"Recording failed, please try again.\" },\n }));\n };\n\n recorder.start(timeslice);\n } catch {\n // Fix 2: clean up resources if recorder construction fails\n cleanupAudio();\n setState((prev) => ({\n ...prev,\n status: \"idle\",\n error: { type: \"recorder_error\", message: \"Recording initialization failed.\" },\n }));\n return;\n }\n\n // Duration timer\n const startTime = Date.now();\n timerRef.current = setInterval(() => {\n const elapsed = Math.floor((Date.now() - startTime) / 1000);\n durationRef.current = elapsed;\n setState((prev) => ({ ...prev, duration: elapsed }));\n if (elapsed >= maxDuration) {\n if (mediaRecorderRef.current?.state === \"recording\") {\n mediaRecorderRef.current.requestData();\n mediaRecorderRef.current.stop();\n }\n }\n }, 200);\n\n setState((prev) => ({\n ...prev,\n status: \"recording\",\n duration: 0,\n error: undefined,\n partialTexts: [],\n }));\n } catch (err: unknown) {\n cleanupAudio();\n const isPermission = (err as { name?: string })?.name === \"NotAllowedError\";\n setState((prev) => ({\n ...prev,\n status: \"idle\",\n error: {\n type: \"permission_denied\",\n message: isPermission\n ? \"Please allow microphone access in browser settings\"\n : \"Cannot access microphone\",\n },\n }));\n }\n }, [silenceThreshold, silenceDuration, timeslice, maxDuration, uploadChunk, cleanupAudio]);\n\n const stopRecording = useCallback(() => {\n if (!mediaRecorderRef.current || mediaRecorderRef.current.state !== \"recording\") return;\n console.log(\"[STT] stopping recording, chunks:\", chunksRef.current.length);\n isStoppingRef.current = true;\n mediaRecorderRef.current.requestData();\n mediaRecorderRef.current.stop();\n\n // Safety: if stop event never fires, force idle after 10s\n if (stopSafetyTimerRef.current) clearTimeout(stopSafetyTimerRef.current);\n stopSafetyTimerRef.current = setTimeout(() => {\n cleanupAudio();\n setState((prev) => ({\n ...prev,\n status: \"idle\",\n voiceLevel: 0,\n error: { type: \"upload_failed\", message: \"Stop recording timed out\" },\n }));\n }, 10000);\n }, [cleanupAudio]);\n\n // Handle recorder stop event — attached in startRecording\n const handleStop = useCallback(async () => {\n console.log(\"[STT] handleStop fired, isCancelling:\", isCancellingRef.current, \"chunks:\", chunksRef.current.length, \"vadChunks:\", vadSpeechBufferRef.current.length);\n // Clear safety timeout — stop event fired successfully\n if (stopSafetyTimerRef.current) { clearTimeout(stopSafetyTimerRef.current); stopSafetyTimerRef.current = null; }\n\n // Snapshot — in auto mode, use vadSpeechBufferRef (chunksRef is duplicate)\n const chunkSnapshot = modeRef.current === \"auto\"\n ? [...vadSpeechBufferRef.current]\n : [...chunksRef.current];\n chunksRef.current = [];\n vadSpeechBufferRef.current = [];\n\n if (isCancellingRef.current) {\n cleanupAudio();\n setState((prev) => ({ ...prev, status: \"idle\", voiceLevel: 0 }));\n return;\n }\n\n if (chunkSnapshot.length === 0 || !vadHadSpeechRef.current) {\n cleanupAudio();\n setState((prev) => ({ ...prev, status: \"idle\" }));\n return;\n }\n\n setState((prev) => ({ ...prev, status: \"uploading\" }));\n\n const combinedBlob = new Blob(chunkSnapshot, {\n type: mediaRecorderRef.current?.mimeType || \"audio/webm\",\n });\n lastBlobRef.current = combinedBlob;\n\n try {\n console.log(\"[STT] uploading final chunk, size:\", combinedBlob.size);\n const text = await uploadChunk(combinedBlob);\n console.log(\"[STT] upload done, text:\", text?.substring(0, 50), text ? `(${text.length} chars)` : \"(empty)\");\n cleanupAudio();\n if (text) onTranscriptionRef.current(text);\n setState((prev) => ({ ...prev, status: \"idle\", voiceLevel: 0 }));\n } catch (err: unknown) {\n console.error(\"[STT] upload failed:\", err);\n const message = err instanceof Error ? err.message : \"Transcription failed\";\n cleanupAudio();\n setState((prev) => ({\n ...prev,\n status: \"idle\",\n voiceLevel: 0,\n error: { type: \"upload_failed\", message },\n }));\n }\n }, [cleanupAudio, uploadChunk]);\n\n const cancelRecording = useCallback(() => {\n if (mediaRecorderRef.current?.state === \"recording\") {\n // Fix 3: set cancelling flag before stop so handleStop skips upload\n isCancellingRef.current = true;\n mediaRecorderRef.current.stop();\n }\n chunksRef.current = [];\n vadSpeechBufferRef.current = [];\n lastBlobRef.current = null;\n cleanupAudio();\n setState((prev) => ({ ...prev, status: \"idle\", voiceLevel: 0, error: undefined }));\n }, [cleanupAudio]);\n\n const retryTranscription = useCallback(async () => {\n const blob = lastBlobRef.current;\n if (!blob || state.status !== \"idle\") return;\n setState((prev) => ({ ...prev, status: \"uploading\", error: undefined }));\n try {\n const text = await uploadChunk(blob);\n if (text) onTranscriptionRef.current(text);\n setState((prev) => ({ ...prev, status: \"idle\", voiceLevel: 0 }));\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Retry failed\";\n setState((prev) => ({\n ...prev,\n status: \"idle\",\n error: { type: \"upload_failed\", message },\n }));\n }\n }, [state.status, uploadChunk]);\n\n const setMode = useCallback((newMode: RecorderMode) => {\n if (state.status !== \"idle\") return;\n modeRef.current = newMode;\n setState((prev) => ({ ...prev, mode: newMode }));\n }, [state.status]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cleanupAudio();\n };\n }, []);\n\n return {\n startRecording,\n stopRecording,\n cancelRecording,\n retryTranscription,\n setMode,\n state,\n };\n}\n","import { Button, Space, Typography, List, Checkbox, Input, Upload } from \"antd\";\nimport { InboxOutlined } from \"@ant-design/icons\";\nimport { ElementProps } from \"../types\";\nimport React, { useState, useContext } from \"react\";\nimport { useOptionalAgentThreadContext } from \"@context/AgentThreadContext\";\nimport { MDResponse } from \"../MDResponse\";\nimport { useLatticeChatShellContext } from \"@components/Chat/LatticeChatShellContext\";\nimport { WorkspaceContext } from \"@context/WorkspaceContext\";\nimport { ClarifyInterruptContext } from \"@context/ClarifyInterruptContext\";\nimport type { UploadProps } from \"antd\";\n\nconst { Text } = Typography;\nconst { Dragger } = Upload;\n\nconst QUESTION_MAX_HEIGHT = 300;\n\ninterface Question {\n question: string;\n options: string[];\n type: \"single\" | \"multiple\" | \"file_upload\" | \"input\";\n required: boolean;\n allowOther: boolean;\n}\n\ninterface ClarifyData {\n questions: Question[];\n}\n\nconst QuestionTitle: React.FC<{ question: string }> = ({ question }) => (\n <div\n style={{\n maxHeight: QUESTION_MAX_HEIGHT,\n overflowY: \"auto\",\n WebkitMaskImage:\n \"linear-gradient(to bottom, black 80%, transparent 100%)\",\n maskImage:\n \"linear-gradient(to bottom, black 80%, transparent 100%)\",\n }}\n >\n <MDResponse content={question} />\n </div>\n);\n\ninterface Answer {\n selectedOptions: string[];\n otherText: string;\n filePath?: string;\n fileName?: string;\n}\n\nexport const ClarifyFeedback: React.FC<ElementProps> = ({\n data,\n interactive = true,\n}) => {\n const { questions } = (data ?? {}) as ClarifyData;\n const threadContext = useOptionalAgentThreadContext();\n const sendMessage = threadContext?.sendMessage;\n const assistantId = threadContext?.state.assistantId;\n const threadId = threadContext?.state.threadId;\n const tenantId = threadContext?.state.tenantId;\n const { config } = useLatticeChatShellContext();\n const clarifyInterrupt = useContext(ClarifyInterruptContext);\n const workspaceContext = useContext(WorkspaceContext);\n const workspaceId = workspaceContext?.workspaceId ?? null;\n const projectId = workspaceContext?.projectId ?? null;\n\n const uploadURL = config?.baseURL\n ? (workspaceId && projectId\n ? `${config.baseURL}/api/workspaces/${workspaceId}/projects/${projectId}/uploadfile`\n : `${config.baseURL}/api/assistants/${assistantId}/threads/${threadId}/sandbox/uploadfile`)\n : \"\";\n\n const [currentStep, setCurrentStep] = useState(0);\n const [answers, setAnswers] = useState<Record<number, Answer>>({});\n const [submitted, setSubmitted] = useState(false);\n\n const currentQuestion = questions?.[currentStep];\n const totalQuestions = questions?.length || 0;\n\n const handleOptionChange = (selected: string[]) => {\n setAnswers((prev) => ({\n ...prev,\n [currentStep]: {\n ...prev[currentStep],\n selectedOptions: selected,\n },\n }));\n };\n\n const handleOtherTextChange = (text: string) => {\n setAnswers((prev) => ({\n ...prev,\n [currentStep]: {\n ...prev[currentStep],\n otherText: text,\n },\n }));\n };\n\n const handleFileUpload: UploadProps[\"onChange\"] = (info) => {\n if (info.file.status === \"done\") {\n const response = info.file.response;\n const filePath = response?.data?.path || info.file.name;\n setAnswers((prev) => ({\n ...prev,\n [currentStep]: {\n ...prev[currentStep],\n filePath: filePath,\n fileName: info.file.name,\n },\n }));\n } else if (info.file.status === \"error\") {\n setAnswers((prev) => ({\n ...prev,\n [currentStep]: {\n ...prev[currentStep],\n filePath: undefined,\n fileName: undefined,\n },\n }));\n }\n };\n\n const canProceed = () => {\n const answer = answers[currentStep];\n if (!currentQuestion) return false;\n\n if (!currentQuestion.required) return true;\n\n if (currentQuestion.type === \"file_upload\") {\n return !!(answer?.filePath && answer.filePath.trim() !== \"\");\n }\n\n if (currentQuestion.type === \"input\") {\n return !!(answer?.otherText && answer.otherText.trim() !== \"\");\n }\n\n const hasSelection = answer?.selectedOptions?.length > 0;\n const hasOtherText = answer?.otherText?.trim() !== \"\";\n\n return hasSelection || hasOtherText;\n };\n\n const handleNext = () => {\n if (currentStep < totalQuestions - 1) {\n setCurrentStep((prev) => prev + 1);\n } else {\n handleSubmit();\n }\n };\n\n const handleSubmit = () => {\n const formattedAnswers = Object.entries(answers)\n .filter(\n ([_, answer]) =>\n (answer.selectedOptions?.length ?? 0) > 0 ||\n (answer.otherText && answer.otherText.trim() !== \"\") ||\n (answer.filePath && answer.filePath.trim() !== \"\")\n )\n .map(([index, answer]) => ({\n questionIndex: parseInt(index),\n selectedOptions: answer.selectedOptions,\n otherText: answer.otherText,\n filePath: answer.filePath,\n }));\n\n setSubmitted(true);\n if (clarifyInterrupt !== null) {\n void clarifyInterrupt.resolve(formattedAnswers).catch(() => setSubmitted(false));\n return;\n }\n sendMessage?.({\n command: {\n resume: {\n action: \"submit\",\n data: {\n answers: formattedAnswers,\n },\n message: \"Clarification answers submitted\",\n },\n },\n });\n };\n\n const handleSkip = () => {\n if (currentStep < totalQuestions - 1) {\n setCurrentStep((prev) => prev + 1);\n } else {\n handleSubmit();\n }\n };\n\n const handlePrevious = () => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n };\n\n if (!currentQuestion || submitted) {\n return (\n <div style={{ width: \"100%\" }}>\n <Text type=\"secondary\" style={{ fontSize: 14 }}>\n {submitted ? \"Answers submitted\" : \"No questions available\"}\n </Text>\n </div>\n );\n }\n\n const currentAnswer = answers[currentStep] || {\n selectedOptions: [],\n otherText: \"\",\n filePath: undefined,\n fileName: undefined,\n };\n\n return (\n <div style={{ width: \"100%\" }}>\n <Space direction=\"vertical\" style={{ width: \"100%\" }} size=\"small\">\n <div>\n <Text type=\"secondary\" style={{ fontSize: 14 }}>\n Question {currentStep + 1} of {totalQuestions}\n {currentQuestion.required && (\n <span style={{ color: \"#ff4d4f\" }}> *</span>\n )}\n </Text>\n <QuestionTitle question={currentQuestion.question} />\n </div>\n\n <Space direction=\"vertical\" style={{ width: \"100%\" }} size={4}>\n {currentQuestion.type === \"file_upload\" ? (\n <Dragger\n name=\"file\"\n multiple={false}\n action={uploadURL}\n headers={{\n \"x-tenant-id\": tenantId || \"\",\n \"x-assistant-id\": assistantId || \"\",\n \"x-thread-id\": threadId || \"\",\n }}\n onChange={handleFileUpload}\n disabled={!interactive || submitted}\n showUploadList={{\n showPreviewIcon: false,\n showRemoveIcon: !submitted && interactive,\n }}\n style={{ padding: \"16px 0\" }}\n >\n <p className=\"ant-upload-drag-icon\">\n <InboxOutlined />\n </p>\n <p className=\"ant-upload-text\" style={{ fontSize: 14 }}>\n Click or drag file to this area to upload\n </p>\n <p className=\"ant-upload-hint\" style={{ fontSize: 12 }}>\n {currentAnswer.filePath\n ? `Uploaded: ${currentAnswer.fileName || currentAnswer.filePath}`\n : \"File will be uploaded to the sandbox\"}\n </p>\n </Dragger>\n ) : currentQuestion.type === \"single\" ? (\n <>\n <List\n dataSource={currentQuestion.options}\n renderItem={(option) => (\n <List.Item\n onClick={() => !submitted && handleOptionChange([option])}\n style={{\n cursor: submitted ? \"not-allowed\" : \"pointer\",\n padding: \"8px 12px\",\n borderRadius: 8,\n backgroundColor: currentAnswer.selectedOptions[0] === option ? \"#e6f4ff\" : \"transparent\",\n border: `1px solid ${currentAnswer.selectedOptions[0] === option ? \"#1890ff\" : \"#d9d9d9\"}`,\n marginBottom: 8,\n transition: \"all 0.2s\",\n }}\n >\n <span style={{ fontSize: 14 }}>{option}</span>\n {currentAnswer.selectedOptions[0] === option && (\n <span style={{ marginLeft: \"auto\", color: \"#1890ff\" }}>✓</span>\n )}\n </List.Item>\n )}\n />\n {currentQuestion.allowOther && (\n <List.Item\n onClick={() => !submitted && handleOptionChange([\"__other__\"])}\n style={{\n cursor: submitted ? \"not-allowed\" : \"pointer\",\n padding: \"8px 12px\",\n borderRadius: 8,\n backgroundColor: currentAnswer.selectedOptions[0] === \"__other__\" ? \"#e6f4ff\" : \"transparent\",\n border: `1px solid ${currentAnswer.selectedOptions[0] === \"__other__\" ? \"#1890ff\" : \"#d9d9d9\"}`,\n marginBottom: 8,\n transition: \"all 0.2s\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n }}\n >\n <div style={{ display: \"flex\", width: \"100%\", alignItems: \"center\" }}>\n <span style={{ fontSize: 14 }}>Other (please specify)</span>\n {currentAnswer.selectedOptions[0] === \"__other__\" && (\n <span style={{ marginLeft: \"auto\", color: \"#1890ff\" }}>✓</span>\n )}\n </div>\n {currentAnswer.selectedOptions[0] === \"__other__\" && (\n <Input\n size=\"small\"\n placeholder=\"Enter your answer...\"\n value={currentAnswer.otherText}\n onChange={(e) => handleOtherTextChange(e.target.value)}\n disabled={!interactive || submitted}\n style={{ fontSize: 14, marginTop: 8, width: \"100%\" }}\n onClick={(e) => e.stopPropagation()}\n />\n )}\n </List.Item>\n )}\n </>\n ) : currentQuestion.type === \"input\" ? (\n <Input\n placeholder=\"Enter your answer...\"\n value={currentAnswer.otherText}\n onChange={(e) => handleOtherTextChange(e.target.value)}\n disabled={!interactive || submitted}\n style={{ fontSize: 14 }}\n />\n ) : (\n <>\n <Checkbox.Group\n value={currentAnswer.selectedOptions}\n onChange={(values) => handleOptionChange(values as string[])}\n disabled={!interactive || submitted}\n style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}\n >\n {currentQuestion.options.map((option) => (\n <Checkbox key={option} value={option} style={{ fontSize: 14 }}>\n {option}\n </Checkbox>\n ))}\n </Checkbox.Group>\n {currentQuestion.allowOther && (\n <div style={{ marginTop: 8 }}>\n <Checkbox\n checked={currentAnswer.selectedOptions.includes(\"__other__\")}\n onChange={(e) => {\n const current = currentAnswer.selectedOptions || [];\n if (e.target.checked) {\n handleOptionChange([...current, \"__other__\"]);\n } else {\n handleOptionChange(current.filter((o) => o !== \"__other__\"));\n handleOtherTextChange(\"\");\n }\n }}\n disabled={!interactive || submitted}\n style={{ fontSize: 14 }}\n >\n Other (please specify)\n </Checkbox>\n {currentAnswer.selectedOptions.includes(\"__other__\") && (\n <Input\n size=\"small\"\n placeholder=\"Enter your answer...\"\n value={currentAnswer.otherText}\n onChange={(e) => handleOtherTextChange(e.target.value)}\n disabled={!interactive || submitted}\n style={{ fontSize: 14, marginTop: 8, marginLeft: 24, width: \"calc(100% - 24px)\" }}\n />\n )}\n </div>\n )}\n </>\n )}\n\n </Space>\n\n <Space\n style={{\n justifyContent: \"flex-end\",\n width: \"100%\",\n marginTop: 8,\n }}\n size=\"small\"\n >\n <Button\n size=\"small\"\n onClick={handlePrevious}\n disabled={!interactive || submitted || currentStep === 0}\n >\n Previous\n </Button>\n {!currentQuestion.required && (\n <Button\n size=\"small\"\n onClick={handleSkip}\n disabled={!interactive || submitted}\n >\n Skip\n </Button>\n )}\n <Button\n size=\"small\"\n type=\"primary\"\n onClick={handleNext}\n disabled={!interactive || submitted || !canProceed()}\n >\n {currentStep < totalQuestions - 1 ? \"Next\" : \"Submit\"}\n </Button>\n </Space>\n </Space>\n </div>\n );\n};\n","import { createContext } from \"react\";\n\n/** One answer collected by a clarify card, matching the core clarify resume payload. */\nexport interface ClarifyAnswer {\n questionIndex: number;\n selectedOptions?: string[];\n otherText?: string;\n filePath?: string;\n}\n\n/** Host-provided override that resolves a pending clarify interrupt outside chat. */\nexport interface ClarifyInterruptHandler {\n /** Stable id of the entity whose interrupt is being resolved (e.g. a room bot membership). */\n membershipId: string;\n resolve: (answers: ClarifyAnswer[]) => Promise<void>;\n}\n\n/**\n * Provided around a rendered clarify card by hosts that resolve the interrupt\n * over a REST surface (Project Room) instead of the chat command path.\n */\nexport const ClarifyInterruptContext = createContext<ClarifyInterruptHandler | null>(null);\n","import { Button, Space, Typography, Input } from \"antd\";\nimport { ElementProps } from \"../types\";\nimport React from \"react\";\nimport { MDResponse } from \"../MDResponse\";\nimport { useAgentChat } from \"@hooks/useAgentChat\";\nimport { useReviewDecision } from \"../../shared/useReviewDecision\";\n\nconst { Text, Title } = Typography;\n\ninterface TaskReviewData {\n taskId: string;\n title: string;\n description?: string;\n result?: string;\n}\n\nconst HistoricalTaskReview: React.FC<{ data: TaskReviewData }> = ({ data }) => {\n const { title, description, result } = data;\n return (\n <Space direction=\"vertical\" style={{ width: \"100%\" }} size=\"small\">\n <Title level={5} style={{ marginTop: 0, marginBottom: 0 }}>Legacy task review</Title>\n <Text strong>{title}</Text>\n {description ? <MDResponse content={description} /> : null}\n {result ? (\n <div>\n <Text strong>Result:</Text>\n <MDResponse content={result} />\n </div>\n ) : null}\n <Text type=\"secondary\">Open the associated agent conversation to continue if a thread is available.</Text>\n </Space>\n );\n};\n\nconst InteractiveTaskReview: React.FC<{ data: TaskReviewData }> = ({ data }) => {\n const { taskId, title, result } = data;\n const { sendMessage } = useAgentChat();\n const review = useReviewDecision(async (decision, note) => {\n const resume = decision === \"approve\"\n ? { action: \"approve\" as const, data: { taskId }, message: \"Task approved\" }\n : { action: \"reject\" as const, data: { taskId, note }, message: `Changes requested: ${note}` };\n await Promise.resolve(sendMessage({ throwOnError: true, command: { resume } }));\n });\n\n const handleApprove = () => {\n void review.submit(\"approve\");\n };\n\n const handleReject = () => {\n if (!review.feedback.trim()) return;\n void review.submit(\"reject\");\n };\n\n return (\n <Space direction=\"vertical\" style={{ width: \"100%\" }} size=\"small\">\n <Title level={5} style={{ marginTop: 0, marginBottom: 0 }}>\n Task Ready for Review\n </Title>\n\n <div>\n <Text strong>{title}</Text>\n </div>\n\n {result ? (\n <div>\n <Text strong>Result:</Text>\n <MDResponse content={result} />\n </div>\n ) : null}\n\n {review.submitted ? (\n <Text type=\"secondary\">\n Review submitted. Waiting for agent to process...\n </Text>\n ) : (\n <>\n <div>\n <Text strong style={{ fontSize: 14 }}>Request Changes — Feedback:</Text>\n <Input.TextArea\n placeholder=\"Describe what needs to be changed...\"\n value={review.feedback}\n onChange={(e) => review.setFeedback(e.target.value)}\n disabled={review.pending !== null}\n rows={3}\n style={{ fontSize: 14, marginTop: 4 }}\n />\n </div>\n {review.error ? (\n <Text type=\"danger\" role=\"alert\">\n Review could not be submitted. Please try again.\n </Text>\n ) : null}\n <Space\n style={{\n justifyContent: \"flex-end\",\n width: \"100%\",\n marginTop: 8,\n }}\n size=\"small\"\n >\n <Button\n type=\"primary\"\n danger\n disabled={review.pending !== null || !review.feedback.trim()}\n loading={review.pending === \"reject\"}\n onClick={handleReject}\n >\n Request Changes\n </Button>\n <Button\n type=\"primary\"\n disabled={review.pending !== null}\n loading={review.pending === \"approve\"}\n onClick={handleApprove}\n >\n Approve\n </Button>\n </Space>\n </>\n )}\n </Space>\n );\n};\n\nexport const TaskReview: React.FC<ElementProps> = ({\n data,\n interactive = true,\n}) => {\n const reviewData = (data ?? {}) as TaskReviewData;\n if (!interactive) return <HistoricalTaskReview data={reviewData} />;\n return <InteractiveTaskReview data={reviewData} />;\n};\n","import { GenericDataTable } from \"./generic_data_table\";\nimport { ElementProps } from \"../types\";\n\nexport const GenericDataTableSideApp: React.FC<ElementProps> = (props) => {\n return <GenericDataTable {...props} default_open_in_side_app={false} />;\n};\n\n","import React, { useMemo } from \"react\";\nimport { ElementProps, ToolCallData } from \"../types\";\nimport { Collapse, Typography, Space, Flex } from \"antd\";\n\nconst CollapsePanel = Collapse.Panel;\n\nimport { MDResponse } from \"../MDResponse\";\nimport { ToolCard } from \"./ToolCard\";\nimport { getElement } from \".\";\nimport { getStatusIcon } from \"./getStatusIcon\";\nimport { formatToolName } from \"./formatToolName\";\n\nexport const ToolCall: React.FC<ElementProps> = ({ data }) => {\n const toolCallData = data as ToolCallData;\n\n // 构建标题,包含工具名称、ID和参数摘要\n const formatArgsPreview = (args: Record<string, any>) => {\n try {\n // 将参数转换为字符串,只显示值不显示键\n const argsStr = Object.values(args)\n .map((value) => {\n const valueStr =\n typeof value === \"object\"\n ? JSON.stringify(value).substring(0, 50) +\n (JSON.stringify(value).length > 50 ? \"...\" : \"\")\n : String(value).substring(0, 50) +\n (String(value).length > 50 ? \"...\" : \"\");\n return valueStr;\n })\n .join(\" \");\n const result =\n argsStr.length > 100 ? argsStr.substring(0, 100) + \"...\" : argsStr;\n\n return result.replaceAll(\"\\n\", \" \");\n } catch (e) {\n return \"Error parsing args\";\n }\n };\n\n const header = (\n <Flex align=\"center\" wrap=\"wrap\">\n <Typography.Text strong>\n {formatToolName(toolCallData.name)}\n </Typography.Text>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: \"12px\", marginLeft: \"8px\" }}\n >\n {formatArgsPreview(toolCallData.args)}\n </Typography.Text>\n </Flex>\n );\n\n // Use ToolCard to display parameters\n const toolCardData = {\n name: toolCallData.name,\n parameters: toolCallData.args,\n type: \"tool_call\",\n };\n\n // 准备内容\n const content = (\n <div style={{ marginTop: \"8px\" }}>\n {/* Use ToolCard for parameter display */}\n <ToolCard\n data={toolCardData}\n component_key={`${toolCallData.id}-params`}\n interactive={false}\n />\n {toolCallData.response && (\n <div style={{ marginTop: \"12px\" }}>\n <Typography.Text\n strong\n style={{ fontSize: \"12px\", marginBottom: \"8px\", display: \"block\" }}\n >\n Response:\n </Typography.Text>\n <MDResponse content={toolCallData.response} />\n </div>\n )}\n </div>\n );\n\n // 创建自定义展开图标\n const expandIcon = ({ isActive }: { isActive?: boolean }) => {\n return getStatusIcon(toolCallData.status);\n };\n\n let toolCallName = toolCallData.name.toLowerCase();\n if (toolCallName.startsWith(\"browser_\")) {\n toolCallName = \"browser_viewer\";\n }\n const toolCallElement = getElement(toolCallName);\n\n\n\n\n if (toolCallElement) {\n // Render as a component — calling card_view() directly breaks the Rules\n // of Hooks for elements that use hooks (invalid hook call).\n const CardView = toolCallElement.card_view;\n return <CardView data={toolCallData} component_key={toolCallData.id} />;\n }\n\n return (\n <Collapse\n size=\"small\"\n bordered={false}\n defaultActiveKey={[]}\n expandIcon={expandIcon}\n >\n <CollapsePanel\n key={toolCallData.id}\n header={header}\n style={{ minWidth: 400 }}\n >\n {content}\n </CollapsePanel>\n </Collapse>\n );\n};\n","import React from \"react\";\nimport { Card, Typography, Space, Tag, Divider } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { ToolOutlined, CodeOutlined } from \"@ant-design/icons\";\nimport { ElementProps } from \"../types\";\n\nconst { Text, Title } = Typography;\n\nconst useStyle = createStyles(({ token, css }) => ({\n card: css`\n max-width: 500px;\n background: linear-gradient(\n 135deg,\n rgba(24, 144, 255, 0.05) 0%,\n rgba(135, 208, 104, 0.05) 100%\n );\n border: 1px solid ${token.colorBorderSecondary};\n border-radius: 12px;\n transition: all 0.3s ease;\n &:hover {\n border-color: ${token.colorPrimary};\n box-shadow: 0 4px 12px rgba(24, 144, 255, 0.15);\n transform: translateY(-2px);\n }\n `,\n header: css`\n border-bottom: 1px solid ${token.colorBorderSecondary};\n margin-bottom: 12px;\n padding-bottom: 8px;\n `,\n toolName: css`\n color: ${token.colorPrimary};\n font-weight: 600;\n font-size: 16px;\n `,\n parameterGrid: css`\n display: grid;\n gap: 8px;\n margin-top: 8px;\n `,\n parameterItem: css`\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorBorderSecondary};\n border-radius: 6px;\n padding: 8px 12px;\n transition: background-color 0.2s ease;\n &:hover {\n background: ${token.colorBgTextHover};\n }\n `,\n parameterName: css`\n color: ${token.colorTextSecondary};\n font-size: 12px;\n font-weight: 500;\n margin-bottom: 4px;\n `,\n parameterValue: css`\n color: ${token.colorText};\n font-family: \"SF Mono\", \"Monaco\", \"Inconsolata\", \"Roboto Mono\", monospace;\n font-size: 13px;\n word-break: break-all;\n line-height: 1.4;\n `,\n typeTag: css`\n font-size: 10px;\n border-radius: 4px;\n margin-left: 8px;\n `,\n}));\n\ninterface ToolCardData {\n name: string;\n description?: string;\n parameters?: Record<string, any>;\n type?: string;\n}\n\nexport const ToolCard: React.FC<ElementProps<ToolCardData>> = ({\n data,\n component_key,\n interactive = true,\n}) => {\n const { styles } = useStyle();\n\n if (!data || !data.name) {\n return (\n <Card size=\"small\" className={styles.card} bordered={false}>\n <Text type=\"secondary\">Invalid tool data</Text>\n </Card>\n );\n }\n\n // Format tool name: handle snake_case and camelCase\n const formatToolName = (name: string) => {\n return name\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // Handle camelCase\n .split(/[_-]/) // Handle snake_case and kebab-case\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n };\n\n // Format parameter value for display\n const formatParameterValue = (value: any): string => {\n if (value === null || value === undefined) {\n return \"null\";\n }\n if (typeof value === \"object\") {\n try {\n const jsonStr = JSON.stringify(value, null, 2);\n return jsonStr.length > 100 ? JSON.stringify(value) : jsonStr;\n } catch {\n return String(value);\n }\n }\n if (typeof value === \"string\" && value.length > 150) {\n return value.substring(0, 150) + \"...\";\n }\n return String(value);\n };\n\n // Get type color for parameter tags\n const getTypeColor = (value: any): string => {\n const type = typeof value;\n switch (type) {\n case \"string\":\n return \"blue\";\n case \"number\":\n return \"green\";\n case \"boolean\":\n return \"orange\";\n case \"object\":\n return value === null ? \"default\" : \"purple\";\n default:\n return \"default\";\n }\n };\n\n // Get type label\n const getTypeLabel = (value: any): string => {\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"array\";\n return typeof value;\n };\n\n const hasParameters =\n data.parameters && Object.keys(data.parameters).length > 0;\n\n return (\n <Card\n size=\"small\"\n className={styles.card}\n bordered={false}\n styles={{ body: { padding: \"16px\" } }}\n >\n {/* Header */}\n <div className={styles.header}>\n <Space align=\"center\">\n <ToolOutlined style={{ color: \"#1890ff\", fontSize: \"18px\" }} />\n <Title level={5} className={styles.toolName} style={{ margin: 0 }}>\n {formatToolName(data.name)}\n </Title>\n {data.type && (\n <Tag color=\"blue\" className={styles.typeTag}>\n {data.type}\n </Tag>\n )}\n </Space>\n {data.description && (\n <Text\n type=\"secondary\"\n style={{ fontSize: \"13px\", marginTop: \"4px\", display: \"block\" }}\n >\n {data.description}\n </Text>\n )}\n </div>\n\n {/* Parameters */}\n {hasParameters ? (\n <div>\n <Space align=\"center\" style={{ marginBottom: \"12px\" }}>\n <CodeOutlined style={{ color: \"#52c41a\", fontSize: \"14px\" }} />\n <Text strong style={{ fontSize: \"14px\" }}>\n Parameters ({Object.keys(data.parameters!).length})\n </Text>\n </Space>\n <div className={styles.parameterGrid}>\n {Object.entries(data.parameters!).map(([key, value], index) => (\n <div key={index} className={styles.parameterItem}>\n <div className={styles.parameterName}>\n <Space align=\"center\">\n <span>{key}</span>\n <Tag\n color={getTypeColor(value)}\n style={{ fontSize: \"10px\", marginLeft: \"auto\" }}\n >\n {getTypeLabel(value)}\n </Tag>\n </Space>\n </div>\n <div className={styles.parameterValue}>\n {formatParameterValue(value)}\n </div>\n </div>\n ))}\n </div>\n </div>\n ) : (\n <Space align=\"center\">\n <CodeOutlined style={{ color: \"#d9d9d9\", fontSize: \"14px\" }} />\n <Text type=\"secondary\" style={{ fontSize: \"13px\" }}>\n No parameters\n </Text>\n </Space>\n )}\n </Card>\n );\n};\n","import { CheckCircleOutlined, InfoCircleOutlined, LoadingOutlined } from \"@ant-design/icons\";\n\nexport function getStatusIcon(status: string | undefined) {\n switch (status) {\n case \"success\":\n return <CheckCircleOutlined style={{ color: \"#52c41a\" }} />;\n case \"error\":\n return <InfoCircleOutlined style={{ color: \"#ff4d4f\" }} />;\n default:\n return <LoadingOutlined style={{ color: \"#1890ff\" }} />;\n }\n}\n","export function formatToolName(name: string): string {\n if (!name) {\n return \"\";\n }\n return name\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .split(/[_-]/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n","import React, { useMemo } from \"react\";\nimport { Typography } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { FlaskConical, TestTube2, FileText, Trash2 } from \"lucide-react\";\nimport { ElementProps, ToolCallData } from \"../types\";\nimport { useEvalSuites } from \"../../../hooks/eval/useEvalSuites\";\nimport { useEvalRuns } from \"../../../hooks/eval/useEvalRuns\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\nimport { EntityCard } from \"../../EntityList/EntityCard\";\n\n/**\n * Parsed result of a manage_eval tool response JSON string.\n */\nexport interface ManageEvalResult {\n success: boolean;\n error?: string;\n data?: any;\n}\n\n/**\n * Parses the JSON response string returned by the manage_eval tool.\n * Non-JSON or missing responses degrade to a successful no-data result.\n */\nexport function parseManageEvalResponse(response?: string): ManageEvalResult {\n if (!response) return { success: true, data: undefined };\n try {\n const parsed = JSON.parse(response);\n if (parsed && typeof parsed === \"object\" && \"success\" in parsed) {\n return parsed as ManageEvalResult;\n }\n return { success: true, data: parsed };\n } catch {\n return { success: true, data: undefined };\n }\n}\n\nexport const ErrorCard: React.FC<{ message: string }> = ({ message }) => {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"10px 14px\",\n borderRadius: 12,\n background: \"rgba(255, 77, 79, 0.08)\",\n border: \"1px solid rgba(255, 77, 79, 0.35)\",\n color: \"#ef4444\",\n fontSize: 13,\n }}\n >\n <span>✕</span>\n <span>{message}</span>\n </div>\n );\n};\n\nconst { Text } = Typography;\n\nconst useStyles = createStyles(({ css }) => ({\n liveCard: css`\n display: inline-block;\n max-width: 100%;\n min-height: 120px;\n\n .lattice-stat-label {\n opacity: 0;\n transition: opacity 0.25s ease;\n }\n &:hover .lattice-stat-label {\n opacity: 1;\n }\n `,\n}));\n\nconst truncate = (s: string, max = 120) =>\n s.length > max ? s.slice(0, max) + \"...\" : s;\n\nconst actionTitleStyle: React.CSSProperties = {\n fontSize: 11,\n textTransform: \"uppercase\",\n letterSpacing: 0.5,\n};\n\nconst metaStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"rgba(0, 0, 0, 0.45)\",\n fontSize: 12,\n};\n\nexport const StatCell = ({ value, label }: { value: React.ReactNode; label: string }) => (\n <div style={{ textAlign: \"center\" }}>\n <div style={{ fontSize: 16, fontWeight: 700, lineHeight: 1.2 }}>{value}</div>\n <div className=\"lattice-stat-label\" style={metaStyle}>{label}</div>\n </div>\n);\n\nconst actionVerb = (action: string) =>\n action.startsWith(\"update_\") ? \"Update\" : \"Create\";\n\nexport const ProjectLiveCard: React.FC<{\n data: ToolCallData;\n result: ManageEvalResult;\n}> = ({ data, result }) => {\n const openSideApp = useSideAppOpener();\n const { styles } = useStyles();\n const args = data?.args ?? {};\n const projectId = (args.projectId as string) ?? (result.data as any)?.id ?? \"\";\n const projectName = (args.name as string) ?? (result.data as any)?.name ?? \"Eval Project\";\n const verb = actionVerb((args.action as string) ?? \"\");\n const { suites } = useEvalSuites(projectId);\n const { runs } = useEvalRuns(projectId);\n\n const stats = useMemo(() => {\n const totalCases = suites.reduce((s: number, x: any) => s + (x.caseCount ?? 0), 0);\n const latest = runs[0] as any;\n const passRate = latest?.totalCases > 0\n ? Math.round((latest.passedCases / latest.totalCases) * 100)\n : null;\n return { totalCases, passRate, suiteCount: suites.length, runCount: runs.length };\n }, [suites, runs]);\n\n const handleClick = () => {\n openSideApp({\n component_key: \"manage_eval\",\n data: { initial: { projectId, page: \"dashboard\" } },\n });\n };\n\n return (\n <EntityCard\n item={data}\n className={styles.liveCard}\n onClick={handleClick}\n renderIcon={() => <FlaskConical size={20} />}\n renderPrimary={() => (\n <>\n <Text strong style={actionTitleStyle}>{verb} Evaluation Project</Text>\n <div>\n <Text strong style={{ fontSize: 14 }}>{projectName}</Text>\n </div>\n </>\n )}\n renderHeaderActions={() => (\n <div style={{ display: \"flex\", gap: 14 }}>\n <StatCell value={stats.totalCases} label=\"cases\" />\n <StatCell value={stats.suiteCount} label=\"suites\" />\n <StatCell value={stats.runCount} label=\"runs\" />\n <StatCell value={stats.passRate !== null ? `${stats.passRate}%` : \"—\"} label=\"pass rate\" />\n </div>\n )}\n />\n );\n};\n\nexport const SuiteLiveCard: React.FC<{\n data: ToolCallData;\n result: ManageEvalResult;\n}> = ({ data, result }) => {\n const openSideApp = useSideAppOpener();\n const { styles } = useStyles();\n const args = data?.args ?? {};\n const projectId = (args.projectId as string) ?? (result.data as any)?.projectId ?? \"\";\n const suiteId = (args.suiteId as string) ?? (result.data as any)?.id ?? \"\";\n const suiteName = (args.name as string) ?? (result.data as any)?.name ?? \"Eval Suite\";\n const verb = actionVerb((args.action as string) ?? \"\");\n const { suites } = useEvalSuites(projectId);\n const { runs } = useEvalRuns(projectId);\n\n const found = suites.find((s: any) => s.id === suiteId) as any;\n const caseCount = found?.caseCount ?? (result.data as any)?.caseCount ?? 0;\n const latest = runs[0] as any;\n const passRate = latest?.totalCases > 0\n ? Math.round((latest.passedCases / latest.totalCases) * 100)\n : null;\n\n const handleClick = () => {\n openSideApp({\n component_key: \"manage_eval\",\n data: { initial: { projectId, page: \"suite\", suiteId } },\n });\n };\n\n return (\n <EntityCard\n item={data}\n className={styles.liveCard}\n onClick={handleClick}\n renderIcon={() => <TestTube2 size={20} />}\n renderPrimary={() => (\n <>\n <Text strong style={actionTitleStyle}>{verb} Test Suite</Text>\n <div>\n <Text strong style={{ fontSize: 14 }}>{suiteName}</Text>\n </div>\n </>\n )}\n renderHeaderActions={() => (\n <div style={{ display: \"flex\", gap: 14 }}>\n <StatCell value={caseCount} label=\"cases\" />\n <StatCell value={passRate !== null ? `${passRate}%` : \"—\"} label=\"latest pass\" />\n <StatCell\n value={\n <span\n style={{\n color: latest?.status === \"completed\"\n ? \"#22c55e\"\n : latest?.status === \"running\"\n ? \"#3b82f6\"\n : undefined,\n }}\n >\n {latest ? latest.status : \"—\"}\n </span>\n }\n label=\"latest run\"\n />\n </div>\n )}\n />\n );\n};\n\nexport const CaseLiveCard: React.FC<{\n data: ToolCallData;\n result: ManageEvalResult;\n}> = ({ data, result }) => {\n const openSideApp = useSideAppOpener();\n const { styles } = useStyles();\n const args = data?.args ?? {};\n const suiteId = (args.suiteId as string) ?? (result.data as any)?.suiteId ?? \"\";\n const inputMessage = truncate((args.inputMessage as string) ?? \"\", 120);\n const contentAssertion = truncate((args.contentAssertion as string) ?? \"\", 120);\n const steps = Array.isArray(args.steps) ? (args.steps as Array<{ agent_id: string }>) : [];\n const rubrics = Array.isArray(args.rubrics) ? args.rubrics.length : 0;\n const verb = actionVerb((args.action as string) ?? \"\");\n\n const handleClick = () => {\n openSideApp({\n component_key: \"manage_eval\",\n data: { initial: { suiteId, page: \"suite\" } },\n });\n };\n\n return (\n <EntityCard\n item={data}\n className={styles.liveCard}\n onClick={handleClick}\n renderIcon={() => <FileText size={20} />}\n renderPrimary={() => (\n <Text strong style={actionTitleStyle}>{verb} Test Case</Text>\n )}\n renderHeaderActions={() => (\n <div style={{ display: \"flex\", gap: 12 }}>\n <span style={metaStyle}>{steps.length} step{steps.length === 1 ? \"\" : \"s\"}</span>\n <span style={metaStyle}>{rubrics} rubric{rubrics === 1 ? \"\" : \"s\"}</span>\n </div>\n )}\n renderDetails={() => (\n <>\n <Text style={{ fontSize: 13 }}>{inputMessage}</Text>\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>{contentAssertion}</Text>\n </div>\n </>\n )}\n />\n );\n};\n\nexport const DeleteResultCard: React.FC<{\n data: ToolCallData;\n}> = ({ data }) => {\n const openSideApp = useSideAppOpener();\n const { styles } = useStyles();\n const args = data?.args ?? {};\n const action = (args.action as string) ?? \"\";\n const entityType = action.replace(\"delete_\", \"\");\n const name = (args.name as string) ?? \"\";\n const projectId = (args.projectId as string) ?? \"\";\n const suiteId = (args.suiteId as string) ?? \"\";\n\n const initial = entityType === \"case\"\n ? { suiteId, page: \"suite\" as const }\n : entityType === \"suite\"\n ? { suiteId, page: \"suites\" as const }\n : { projectId: projectId || undefined, page: \"dashboard\" as const };\n\n const handleClick = () => {\n openSideApp({\n component_key: \"manage_eval\",\n data: { initial },\n });\n };\n\n const label = entityType === \"case\" ? \"test case\" : entityType === \"suite\" ? \"test suite\" : \"evaluation project\";\n\n return (\n <EntityCard\n item={data}\n className={styles.liveCard}\n onClick={handleClick}\n renderIcon={() => <Trash2 size={20} />}\n renderPrimary={() => (\n <>\n <Text strong style={actionTitleStyle}>\n <span style={{ color: \"#ef4444\" }}>✓</span> Deleted {label}\n </Text>\n {name && (\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>{name}</Text>\n </div>\n )}\n </>\n )}\n />\n );\n};\n\n/**\n * Card view for manage_eval tool calls in the chat stream.\n *\n * Dispatches on data.args.action to a per-action live card showing only\n * key information; clicking a card opens the EvalPanel deep-link side app.\n */\nexport const EvalManageCard: React.FC<Pick<ElementProps<ToolCallData>, \"data\">> = ({ data }) => {\n const args = data?.args ?? {};\n const action = typeof args.action === \"string\" ? args.action : \"\";\n const result = parseManageEvalResponse(data?.response);\n\n if (!result.success) {\n return <ErrorCard message={result.error ?? \"manage_eval failed\"} />;\n }\n if (action.startsWith(\"delete_\")) {\n return <DeleteResultCard data={data} />;\n }\n switch (action) {\n case \"create_project\":\n case \"update_project\":\n return <ProjectLiveCard data={data} result={result} />;\n case \"create_suite\":\n case \"update_suite\":\n return <SuiteLiveCard data={data} result={result} />;\n case \"create_case\":\n case \"update_case\":\n return <CaseLiveCard data={data} result={result} />;\n default:\n return null;\n }\n};\n","import React, { useState, useCallback } from \"react\";\nimport { Tooltip } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { EntityActions, ActionsStyle, isEntityActionDisabled } from \"./types\";\n\ninterface EntityCardProps<T> {\n item: T;\n onClick?: (item: T) => void;\n /** Compact layout: smaller padding and element gaps. */\n dense?: boolean;\n renderIcon?: (item: T) => React.ReactNode;\n renderPrimary: (item: T) => React.ReactNode;\n renderSecondary?: (item: T) => React.ReactNode;\n renderFooter?: (item: T) => React.ReactNode;\n renderHeaderActions?: (item: T) => React.ReactNode;\n renderDetails?: (item: T) => React.ReactNode;\n actions?: EntityActions<T>;\n actionsPosition?: \"hover\" | \"always\";\n actionsStyle?: ActionsStyle;\n className?: string;\n}\n\nconst useStyles = createStyles(({ css, token }) => {\n const card = css`\n position: relative;\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorBorder};\n border-radius: ${token.borderRadiusLG}px;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n cursor: default;\n overflow: hidden;\n\n .lattice-stat-label {\n opacity: 0;\n transition: opacity 0.25s ease;\n }\n\n &:hover .lattice-stat-label {\n opacity: 1;\n }\n\n &::before {\n content: '';\n position: absolute;\n inset: 0;\n background: radial-gradient(\n 600px circle at var(--spotlight-x, 50%) var(--spotlight-y, 50%),\n var(--spotlight-color, color-mix(in srgb, ${token.colorPrimary} 15%, transparent)),\n transparent 40%\n );\n opacity: var(--spotlight-opacity, 0);\n transition: opacity 0.3s ease;\n pointer-events: none;\n z-index: 0;\n }\n\n &:hover {\n border-color: ${token.colorPrimary};\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n\n .lattice-hover-actions {\n opacity: 1;\n }\n }\n\n &.clickable {\n cursor: pointer;\n }\n `;\n\n return {\n card,\n body: css`\n position: relative;\n z-index: 1;\n padding: 20px;\n `,\n denseBody: css`\n position: relative;\n z-index: 1;\n padding: 8px 12px;\n `,\n content: css`\n display: flex;\n flex-direction: column;\n gap: 16px;\n `,\n denseContent: css`\n display: flex;\n flex-direction: column;\n gap: 8px;\n `,\n headerRow: css`\n display: flex;\n align-items: flex-start;\n gap: 16px;\n min-height: 48px;\n `,\n iconWrapper: css`\n width: 48px;\n height: 48px;\n border-radius: ${token.borderRadius}px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${token.colorPrimaryBg};\n flex-shrink: 0;\n `,\n headerRight: css`\n margin-left: auto;\n flex-shrink: 0;\n `,\n footerContent: css`\n flex-shrink: 0;\n `,\n info: css`\n display: flex;\n flex-direction: column;\n gap: 4px;\n `,\n primary: css`\n font-size: 16px;\n font-weight: 600;\n color: ${token.colorText};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n secondary: css`\n font-size: 13px;\n color: ${token.colorTextSecondary};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n details: css`\n font-size: 13px;\n color: ${token.colorTextSecondary};\n line-height: 1.5;\n\n & > * + * {\n margin-top: 8px;\n }\n `,\n iconActions: css`\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.15s ease;\n\n &.always {\n opacity: 1;\n }\n `,\n iconActionBtn: css`\n width: 28px;\n height: 28px;\n border-radius: ${token.borderRadiusSM}px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: ${token.colorTextTertiary};\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n background: ${token.colorBgTextHover};\n color: ${token.colorText};\n }\n\n &.danger:hover {\n background: ${token.colorErrorBg};\n color: ${token.colorError};\n }\n `,\n buttonActions: css`\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n `,\n buttonActionBtn: css`\n height: 32px;\n padding: 0 12px;\n border-radius: ${token.borderRadius}px;\n display: flex;\n align-items: center;\n gap: 6px;\n border: 1px solid ${token.colorBorder};\n background: ${token.colorBgContainer};\n color: ${token.colorText};\n font-size: 13px;\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n border-color: ${token.colorPrimary};\n color: ${token.colorPrimary};\n }\n\n &.danger {\n color: ${token.colorError};\n border-color: ${token.colorErrorBorder};\n\n &:hover {\n background: ${token.colorErrorBg};\n }\n }\n `,\n };\n});\n\nexport const EntityCard = <T,>({\n item,\n onClick,\n dense = false,\n renderIcon,\n renderPrimary,\n renderSecondary,\n renderHeaderActions,\n renderDetails,\n renderFooter,\n actions,\n actionsPosition = \"hover\",\n actionsStyle = \"icon\",\n className,\n}: EntityCardProps<T>): React.ReactElement => {\n const { styles } = useStyles();\n\n const [mousePos, setMousePos] = useState<{ x: number; y: number } | null>(null);\n\n const handleMouseMove = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n setMousePos({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n });\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setMousePos(null);\n }, []);\n\n const handleClick = () => {\n onClick?.(item);\n };\n\n const resolvedActions = typeof actions === \"function\" ? actions(item) : actions;\n\n const actionsContent =\n resolvedActions && resolvedActions.length > 0 ? (\n actionsStyle === \"button\" ? (\n <div className={styles.buttonActions} onClick={(event) => {\n if ((event.target as Element).closest(\"button:disabled\")) event.stopPropagation();\n }}>\n {resolvedActions.map((action) => {\n const disabled = isEntityActionDisabled(action, item);\n return <button\n key={action.key}\n type=\"button\"\n disabled={disabled}\n className={`${styles.buttonActionBtn} ${action.danger ? \"danger\" : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) action.onClick(item);\n }}\n >\n {React.createElement(action.icon, { size: 14 })}\n {action.label}\n </button>;\n })}\n </div>\n ) : (\n <div className={`${styles.iconActions} lattice-hover-actions ${actionsPosition === \"always\" ? \"always\" : \"\"}`} onClick={(event) => {\n if ((event.target as Element).closest(\"button:disabled\")) event.stopPropagation();\n }}>\n {resolvedActions.map((action) => {\n const disabled = isEntityActionDisabled(action, item);\n return <Tooltip key={action.key} title={action.label}>\n <button\n type=\"button\"\n disabled={disabled}\n className={`${styles.iconActionBtn} ${action.danger ? \"danger\" : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) action.onClick(item);\n }}\n aria-label={action.label || action.key}\n >\n <action.icon size={14} />\n </button>\n </Tooltip>;\n })}\n </div>\n )\n ) : null;\n\n return (\n <div\n className={`${styles.card} ${onClick ? \"clickable\" : \"\"} ${className || \"\"}`}\n style={\n mousePos\n ? ({\n \"--spotlight-x\": `${mousePos.x}px`,\n \"--spotlight-y\": `${mousePos.y}px`,\n \"--spotlight-opacity\": \"1\",\n } as React.CSSProperties)\n : ({ \"--spotlight-opacity\": \"0\" } as React.CSSProperties)\n }\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n onClick={handleClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={\n onClick\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick();\n }\n }\n : undefined\n }\n >\n <div className={dense ? styles.denseBody : styles.body}>\n <div className={dense ? styles.denseContent : styles.content} data-testid=\"entity-card-content\">\n {(renderIcon || actionsContent || renderHeaderActions) && (\n <div className={styles.headerRow} data-testid=\"entity-card-header-row\">\n {renderIcon && (\n <div className={styles.iconWrapper} data-testid=\"entity-card-icon\">\n {renderIcon(item)}\n </div>\n )}\n {(actionsContent || renderHeaderActions) && (\n <div className={styles.headerRight}>\n {renderHeaderActions?.(item)}\n {actionsContent}\n </div>\n )}\n </div>\n )}\n\n <div className={styles.info}>\n <div className={styles.primary}>{renderPrimary(item)}</div>\n {renderSecondary && <div className={styles.secondary}>{renderSecondary(item)}</div>}\n </div>\n\n {renderDetails && <div className={styles.details}>{renderDetails(item)}</div>}\n\n {renderFooter && (\n <div className={styles.footerContent}>{renderFooter(item)}</div>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import React from \"react\";\n\nexport interface EntityAction<T> {\n key: string;\n icon: React.ComponentType<{ size?: number | string }>;\n label?: string;\n onClick: (item: T) => void;\n danger?: boolean;\n disabled?: boolean | ((item: T) => boolean);\n}\n\nexport const isEntityActionDisabled = <T,>(action: EntityAction<T>, item: T): boolean =>\n typeof action.disabled === \"function\" ? action.disabled(item) : action.disabled ?? false;\n\nexport type EntityActions<T> = EntityAction<T>[] | ((item: T) => EntityAction<T>[]);\n\nexport type ViewMode = \"grid\" | \"list\";\n\nexport type ActionsStyle = \"icon\" | \"button\";\n\nexport interface ViewModeExtension {\n mode: string;\n icon: React.ComponentType<{ size?: number | string }>;\n label?: string;\n render: () => React.ReactNode;\n}\n","import React, { useEffect, useState } from \"react\";\nimport { ElementProps } from \"../types\";\nimport { EvalPanel, EvalPanelProps } from \"../../Eval/EvalPanel\";\nimport { useApi } from \"../../../hooks/useApi\";\n\n/**\n * Side-app view for the manage_eval live card.\n *\n * Renders EvalPanel deep-linked to the entity the agent just acted on.\n * When only suiteId is available (case actions), resolves the owning\n * projectId by scanning projects' suites.\n */\nexport const EvalDetailSideApp: React.FC<Pick<ElementProps, \"data\">> = ({ data }) => {\n const rawInitial = (data?.initial ?? {}) as EvalPanelProps[\"initial\"];\n const [resolved, setResolved] = useState<EvalPanelProps[\"initial\"]>(rawInitial);\n const { get } = useApi();\n\n useEffect(() => {\n if (rawInitial?.projectId || !rawInitial?.suiteId) {\n setResolved(rawInitial);\n return;\n }\n let cancelled = false;\n (async () => {\n try {\n const res = await get<{ success: boolean; data?: { records?: Array<{ id: string }> } }>(\n \"/api/eval/projects\"\n );\n for (const p of res.data?.records ?? []) {\n const sr = await get<{\n success: boolean;\n data?: { suites?: Array<{ id: string }> };\n }>(`/api/eval/projects/${p.id}`);\n if (sr.data?.suites?.some((s) => s.id === rawInitial.suiteId)) {\n if (!cancelled) setResolved({ ...rawInitial, projectId: p.id });\n return;\n }\n }\n if (!cancelled) setResolved(rawInitial);\n } catch {\n if (!cancelled) setResolved(rawInitial);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [rawInitial?.projectId, rawInitial?.suiteId, get]);\n\n return <EvalPanel initial={resolved} />;\n};\n","import React, { useState, useMemo } from \"react\";\nimport { createStyles } from \"antd-style\";\nimport { Button, Card, Typography, Row, Col, Tag, theme, Dropdown, Popconfirm, message, Modal } from \"antd\";\nimport { Play, FlaskConical, TestTube2, TrendingUp, CheckCircle, XCircle, ArrowRight, Server, ChevronDown, Settings, Trash2, Clock, FolderGit2 } from \"lucide-react\";\nimport { EvalSuiteCardList } from \"./EvalSuiteCardList\";\nimport { EvalSuiteDetail } from \"./EvalSuiteDetail\";\nimport { EvalRunResults } from \"./EvalRunResults\";\nimport { RunEnvModal } from \"./RunEnvModal\";\nimport { useEvalProjects } from \"../../hooks/eval/useEvalProjects\";\nimport { useEvalSuites } from \"../../hooks/eval/useEvalSuites\";\nimport { useEvalRuns } from \"../../hooks/eval/useEvalRuns\";\nimport { ProjectSelector } from \"../ProjectSelector\";\nimport { useWorkspaceContext } from \"../../context/WorkspaceContext\";\n\nconst { Text, Title, Paragraph } = Typography;\n\nconst useStyle = createStyles(({ token, css }) => ({\n shell: css`\n display: flex;\n flex-direction: column;\n height: 100%;\n background: ${token.colorBgLayout};\n `,\n topBar: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 28px;\n background: ${token.colorBgContainer};\n border-bottom: 1px solid ${token.colorBorderSecondary};\n flex-shrink: 0;\n `,\n topLeft: css`\n display: flex;\n align-items: center;\n gap: 12px;\n `,\n topRight: css`\n display: flex;\n align-items: center;\n gap: 8px;\n `,\n projectBtn: css`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n border-radius: ${token.borderRadius}px;\n border: 1px solid ${token.colorBorderSecondary};\n background: ${token.colorBgContainer};\n cursor: pointer;\n font-size: 13px;\n color: ${token.colorText};\n transition: all 0.15s;\n &:hover {\n border-color: ${token.colorPrimaryBorder};\n }\n `,\n projectDot: css`\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: ${token.colorSuccess};\n `,\n pageIcon: css`\n width: 36px;\n height: 36px;\n border-radius: 10px;\n background: linear-gradient(135deg, ${token.colorPrimary}18, ${token.colorPrimary}08);\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n pageTitle: css`\n font-size: 17px;\n font-weight: 600;\n color: ${token.colorText};\n `,\n breadcrumb: css`\n font-size: 14px;\n color: ${token.colorTextTertiary};\n cursor: pointer;\n background: none;\n border: none;\n padding: 0;\n &:hover {\n color: ${token.colorPrimary};\n }\n `,\n breadcrumbSep: css`\n color: ${token.colorTextQuaternary};\n margin: 0 4px;\n `,\n body: css`\n flex: 1;\n overflow: auto;\n padding: 28px;\n `,\n statRow: css`\n margin-bottom: 32px;\n `,\n statCard: css`\n border-radius: ${token.borderRadiusLG}px;\n border: 1px solid ${token.colorBorderSecondary};\n background: ${token.colorBgContainer};\n transition: all 0.2s;\n &:hover {\n border-color: ${token.colorPrimaryBorder};\n }\n `,\n statInner: css`\n display: flex;\n align-items: center;\n padding: 18px 20px;\n gap: 16px;\n `,\n statIcon: css`\n width: 44px;\n height: 44px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n `,\n statValue: css`\n font-size: 28px;\n font-weight: 700;\n color: ${token.colorText};\n line-height: 1;\n `,\n statLabel: css`\n font-size: 13px;\n color: ${token.colorTextSecondary};\n margin-top: 4px;\n `,\n section: css`\n margin-bottom: 32px;\n `,\n sectionHead: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n `,\n sectionTitle: css`\n font-size: 15px;\n font-weight: 600;\n color: ${token.colorText};\n display: flex;\n align-items: center;\n gap: 8px;\n `,\n runRow: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 20px;\n cursor: pointer;\n border-radius: ${token.borderRadius}px;\n transition: background 0.15s;\n &:hover {\n background: ${token.colorFillTertiary};\n }\n `,\n runRowLeft: css`\n display: flex;\n align-items: center;\n gap: 12px;\n `,\n runRowRight: css`\n display: flex;\n align-items: center;\n gap: 16px;\n `,\n}));\n\nconst statusMeta: Record<string, { color: string; label: string }> = {\n running: { color: \"processing\", label: \"Running\" },\n completed: { color: \"success\", label: \"Completed\" },\n failed: { color: \"error\", label: \"Failed\" },\n aborted: { color: \"warning\", label: \"Aborted\" },\n};\n\ntype Page = \"dashboard\" | \"suites\" | \"suite\" | \"run\";\n\nexport interface EvalPanelProps {\n /**\n * Optional deep-link target applied on mount and when its fields change.\n * Overrides the default \"select first project / dashboard\" behavior.\n */\n initial?: {\n projectId?: string;\n page?: Page;\n suiteId?: string;\n runId?: string;\n };\n}\n\n/**\n * Top-level evaluation panel component.\n *\n * Provides a multi-page interface for managing agent evaluation:\n * - **Dashboard**: Overview of test suites, cases, and recent runs with stats cards.\n * - **Suites**: List of test suites with options to create, view, and run all.\n * - **Suite Detail**: View and manage test cases within a single suite.\n * - **Run Results**: View detailed results of a specific evaluation run.\n *\n * Automatically selects the first project when projects load. Uses a\n * lightweight page-based navigation model (`dashboard -> suites -> suite -> run`).\n *\n * @example\n * ```tsx\n * import { EvalPanel } from \"@axiom-lattice/react-sdk\";\n *\n * function App() {\n * return (\n * <AxiomLatticeProvider config={config}>\n * <EvalPanel />\n * </AxiomLatticeProvider>\n * );\n * }\n * ```\n */\nexport const EvalPanel: React.FC<EvalPanelProps> = ({ initial }) => {\n const { styles, cx } = useStyle();\n const { token } = theme.useToken();\n const { projects } = useEvalProjects();\n const [projectId, setProjectId] = useState<string>(initial?.projectId ?? \"\");\n const [page, setPage] = useState<Page>(initial?.page ?? \"dashboard\");\n const [suiteId, setSuiteId] = useState<string>(initial?.suiteId ?? \"\");\n const [runId, setRunId] = useState<string>(initial?.runId ?? \"\");\n\n React.useEffect(() => {\n if (!projectId && projects.length > 0) {\n setProjectId((projects[0] as any).id);\n }\n }, [projects, projectId]);\n\n const { suites } = useEvalSuites(projectId);\n const { runs, start, remove } = useEvalRuns(projectId);\n // Run environment (workspace-project) from the page-level workspace context.\n const { workspaceId, projectId: envProjectId } = useWorkspaceContext();\n const [runEnvOpen, setRunEnvOpen] = useState(false);\n const [pendingRun, setPendingRun] = useState<{ suiteIds?: string[] } | null>(null);\n\n const buildRunConfig = (pid?: string | null) => ({\n workspaceId: workspaceId || undefined,\n projectId: pid || envProjectId || undefined,\n });\n\n const handleRunAll = () => setRunEnvOpen(true);\n\n const stats = useMemo(() => {\n const totalCases = suites.reduce((s: number, x: any) => s + (x.caseCount ?? 0), 0);\n const latest = runs[0] as any;\n const passRate = latest?.totalCases > 0\n ? Math.round((latest.passedCases / latest.totalCases) * 100) : null;\n return { totalCases, passRate, suiteCount: suites.length, runCount: runs.length };\n }, [suites, runs]);\n\n const navTo = (p: Page, sid?: string, rid?: string) => {\n setPage(p);\n if (sid !== undefined) setSuiteId(sid);\n if (rid !== undefined) setRunId(rid);\n };\n\n React.useEffect(() => {\n if (!initial) return;\n if (initial.projectId !== undefined) setProjectId(initial.projectId);\n if (initial.page !== undefined) setPage(initial.page);\n if (initial.suiteId !== undefined) setSuiteId(initial.suiteId);\n if (initial.runId !== undefined) setRunId(initial.runId);\n }, [initial?.projectId, initial?.page, initial?.suiteId, initial?.runId]);\n\n const effectivePage: Page =\n (page === \"suite\" && !suiteId) || (page === \"run\" && !runId) ? \"dashboard\" : page;\n\n const StatBox = ({ icon, bg, label, value }: { icon: React.ReactNode; bg: string; label: string; value: string | number }) => (\n <Card className={styles.statCard} styles={{ body: { padding: 0 } }} size=\"small\">\n <div className={styles.statInner}>\n <div className={styles.statIcon} style={{ background: bg }}>{icon}</div>\n <div>\n <div className={styles.statValue}>{value}</div>\n <div className={styles.statLabel}>{label}</div>\n </div>\n </div>\n </Card>\n );\n\n // ── Dashboard ──\n if (effectivePage === \"dashboard\") {\n return (\n <div className={styles.shell}>\n <div className={styles.topBar}>\n <div className={styles.topLeft}>\n <div className={styles.pageIcon}>\n <FlaskConical size={20} color={token.colorPrimary} />\n </div>\n <span className={styles.pageTitle}>Evaluation Dashboard</span>\n </div>\n <div className={styles.topRight}>\n <Dropdown\n menu={{\n items: projects.map((p: any) => ({\n key: p.id,\n label: (\n <div>\n <div>{p.name}</div>\n <Text type=\"secondary\" style={{ fontSize: 11 }}>{p.targetServerConfig?.base_url || \"—\"}</Text>\n </div>\n ),\n onClick: () => setProjectId(p.id),\n })),\n }}\n >\n <div className={styles.projectBtn}>\n <div className={styles.projectDot} />\n <div style={{ textAlign: \"left\" }}>\n <div style={{ lineHeight: 1.3 }}>{(projects.find((p: any) => p.id === projectId) as any)?.name || \"Select Project\"}</div>\n <Text type=\"secondary\" style={{ fontSize: 11 }}>{(projects.find((p: any) => p.id === projectId) as any)?.targetServerConfig?.base_url || \"\"}</Text>\n </div>\n <ChevronDown size={14} />\n </div>\n </Dropdown>\n <Button type=\"primary\" icon={<Play size={16} />} onClick={() => navTo(\"suites\")}>\n Go to Suites\n </Button>\n </div>\n </div>\n <div className={styles.body}>\n <Row gutter={[16, 16]} className={styles.statRow}>\n <Col span={6}>\n <StatBox icon={<FlaskConical size={22} color={token.colorPrimary} />} bg={`${token.colorPrimary}14`}\n label=\"Test Suites\" value={stats.suiteCount} />\n </Col>\n <Col span={6}>\n <StatBox icon={<TestTube2 size={22} color={token.colorSuccess} />} bg={`${token.colorSuccess}14`}\n label=\"Test Cases\" value={stats.totalCases} />\n </Col>\n <Col span={6}>\n <StatBox icon={<TrendingUp size={22} color={token.colorInfo} />} bg={`${token.colorInfo}14`}\n label=\"Total Runs\" value={stats.runCount} />\n </Col>\n <Col span={6}>\n <StatBox\n icon={stats.passRate !== null && stats.passRate >= 80\n ? <CheckCircle size={22} color={token.colorSuccess} />\n : <XCircle size={22} color={token.colorWarning} />}\n bg={stats.passRate !== null ? `${token.colorSuccess}14` : `${token.colorFill}`}\n label=\"Latest Pass Rate\" value={stats.passRate !== null ? `${stats.passRate}%` : \"N/A\"} />\n </Col>\n </Row>\n\n <div className={styles.section}>\n <div className={styles.sectionHead}>\n <h3 className={styles.sectionTitle}><FlaskConical size={16} />Evaluation Suites</h3>\n <Button size=\"small\" type=\"text\" onClick={() => navTo(\"suites\")}>\n View All <ArrowRight size={14} style={{ marginLeft: 4 }} />\n </Button>\n </div>\n <EvalSuiteCardList projectId={projectId} onSelectSuite={(_, sid) => navTo(\"suite\", sid)} />\n </div>\n\n <div className={styles.section}>\n <div className={styles.sectionHead}>\n <h3 className={styles.sectionTitle}><TrendingUp size={16} />Recent Runs</h3>\n </div>\n <Card styles={{ body: { padding: 0 } }} size=\"small\">\n {runs.length === 0 ? (\n <div style={{ padding: 40, textAlign: \"center\" }}>\n <Text type=\"secondary\">No runs yet. Go to Suites to run your first evaluation.</Text>\n </div>\n ) : (\n runs.slice(0, 5).map((r: any) => {\n const meta = statusMeta[r.status] || { color: \"default\", label: r.status };\n const createdAt = r.createdAt ? new Date(r.createdAt) : null;\n const completedAt = r.completedAt ? new Date(r.completedAt) : null;\n const durationMs = createdAt && completedAt ? completedAt.getTime() - createdAt.getTime() : null;\n const passRate = r.totalCases > 0 ? Math.round((r.passedCases / r.totalCases) * 100) : null;\n\n const fmtDate = (d: Date) => {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;\n };\n const fmtDuration = (ms: number) => {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${Math.floor(ms / 60000)}m ${Math.round((ms % 60000) / 1000)}s`;\n };\n const shortId = r.id?.slice(0, 8);\n\n return (\n <div key={r.id} className={styles.runRow} onClick={() => navTo(\"run\", undefined, r.id)}>\n <div className={styles.runRowLeft}>\n <Text code style={{ fontSize: 12, marginRight: 8 }}>{shortId}</Text>\n {createdAt && (\n <Text type=\"secondary\" style={{ fontSize: 12, minWidth: 120 }}>\n <Clock size={11} style={{ marginRight: 3, verticalAlign: \"middle\" }} />\n {fmtDate(createdAt)}\n </Text>\n )}\n <Text style={{ fontSize: 13 }}>\n <Text type=\"success\">{r.passedCases}</Text>\n <Text type=\"secondary\"> passed </Text>\n <Text type=\"danger\">{r.failedCases}</Text>\n <Text type=\"secondary\"> failed</Text>\n </Text>\n {passRate !== null && (\n <Tag color={passRate >= 80 ? \"success\" : passRate >= 50 ? \"warning\" : \"error\"}>\n {passRate}%\n </Tag>\n )}\n {r.envProjectId && (\n <Tag icon={<FolderGit2 size={11} />} color=\"blue\" style={{ marginRight: 0 }}>\n {r.envProjectId}\n </Tag>\n )}\n </div>\n <div className={styles.runRowRight} style={{ gap: 16 }}>\n {durationMs !== null && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>{fmtDuration(durationMs)}</Text>\n )}\n <Tag color={meta.color} style={{ margin: 0 }}>{meta.label}</Tag>\n <Text strong style={{ fontSize: 15, minWidth: 40, textAlign: \"right\" }}>\n {typeof r.avgScore === \"number\" ? r.avgScore.toFixed(1) : \"—\"}\n </Text>\n <Popconfirm\n title=\"Delete this run?\"\n description=\"Run results will be permanently deleted.\"\n onConfirm={async (e) => {\n e?.stopPropagation();\n await remove(r.id);\n message.success(\"Run deleted\");\n }}\n onCancel={(e) => e?.stopPropagation()}\n okText=\"Delete\"\n okButtonProps={{ danger: true }}\n >\n <Button\n type=\"text\"\n size=\"small\"\n danger\n icon={<Trash2 size={14} />}\n onClick={(e) => e.stopPropagation()}\n />\n </Popconfirm>\n </div>\n </div>\n );\n })\n )}\n </Card>\n </div>\n </div>\n </div>\n );\n }\n\n // ── Suite List ──\n const SuiteListPage = () => {\n const [showAdd, setShowAdd] = useState(false);\n const [name, setName] = useState(\"\");\n const { create } = useEvalSuites(projectId);\n\n const handleAdd = async () => {\n if (!name.trim()) return;\n await create(projectId, { name: name.trim() });\n setName(\"\"); setShowAdd(false);\n };\n\n return (\n <div className={styles.shell}>\n <div className={styles.topBar}>\n <div className={styles.topLeft}>\n <button className={styles.breadcrumb} onClick={() => navTo(\"dashboard\")}>Dashboard</button>\n <span className={styles.breadcrumbSep}>/</span>\n <span className={styles.pageTitle}>Test Suites</span>\n </div>\n <div className={styles.topRight}>\n <Button icon={<Play size={16} />} onClick={() => setShowAdd(!showAdd)}>New Suite</Button>\n <Button type=\"primary\" icon={<Play size={16} />} onClick={handleRunAll}>Run All</Button>\n </div>\n </div>\n {showAdd && (\n <div style={{ padding: \"12px 28px\", borderBottom: `1px solid ${token.colorBorderSecondary}`, display: \"flex\", gap: 8 }}>\n <input\n type=\"text\"\n placeholder=\"Suite name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleAdd()}\n autoFocus\n style={{\n width: 260,\n padding: \"6px 12px\",\n border: `1px solid ${token.colorBorder}`,\n borderRadius: token.borderRadius,\n fontSize: 14,\n outline: \"none\",\n }}\n />\n <Button type=\"primary\" size=\"small\" onClick={handleAdd}>Create</Button>\n <Button size=\"small\" onClick={() => setShowAdd(false)}>Cancel</Button>\n </div>\n )}\n <div className={styles.body}>\n <EvalSuiteCardList projectId={projectId} onSelectSuite={(_, sid) => navTo(\"suite\", sid)} />\n </div>\n <RunEnvModal\n open={runEnvOpen}\n onClose={() => setRunEnvOpen(false)}\n onRun={async (rc) => {\n const r = await start(projectId, rc);\n if (r?.run_id) navTo(\"run\", undefined, r.run_id);\n }}\n />\n </div>\n );\n };\n\n if (effectivePage === \"suites\") return <SuiteListPage />;\n\n // ── Suite Detail ──\n if (effectivePage === \"suite\" && suiteId) {\n return (\n <EvalSuiteDetail\n projectId={projectId}\n suiteId={suiteId}\n onBack={() => navTo(\"suites\")}\n onRun={(rid) => navTo(\"run\", undefined, rid)}\n />\n );\n }\n\n // ── Run Results ──\n if (effectivePage === \"run\" && runId) {\n return <EvalRunResults runId={runId} onBack={() => navTo(\"dashboard\")} />;\n }\n\n return null;\n};\n","import React from \"react\";\nimport { createStyles } from \"antd-style\";\nimport { Card, Typography, Row, Col, Empty, Popconfirm, Spin } from \"antd\";\nimport { Trash2, TestTube2 } from \"lucide-react\";\nimport { useEvalSuites } from \"../../hooks/eval/useEvalSuites\";\n\nconst { Text } = Typography;\n\nconst useStyle = createStyles(({ token, css }) => ({\n card: css`\n border-radius: ${token.borderRadiusLG}px;\n border: 1px solid ${token.colorBorderSecondary};\n background: ${token.colorBgContainer};\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n &:hover {\n border-color: ${token.colorPrimaryBorder};\n box-shadow: 0 4px 16px ${token.colorPrimary}14;\n }\n `,\n inner: css`\n padding: 20px;\n `,\n header: css`\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n `,\n icon: css`\n width: 40px;\n height: 40px;\n border-radius: 10px;\n background: ${token.colorPrimary}0f;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 16px;\n `,\n title: css`\n font-size: 15px;\n font-weight: 600;\n color: ${token.colorText};\n display: block;\n margin-bottom: 4px;\n `,\n subtitle: css`\n font-size: 13px;\n color: ${token.colorTextSecondary};\n margin-bottom: 12px;\n `,\n meta: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-top: 12px;\n border-top: 1px solid ${token.colorBorderSecondary};\n `,\n metaItem: css`\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: ${token.colorTextSecondary};\n `,\n}));\n\n/**\n * Props for {@link EvalSuiteCardList}.\n */\ninterface Props {\n /** The evaluation project ID to load suites from */\n projectId: string;\n /** Callback invoked when the user selects a suite card */\n onSelectSuite: (projectId: string, suiteId: string) => void;\n /** Notifies the owner after a suite mutation has refreshed this list. */\n onEvalInvalidated?: () => void | Promise<void>;\n}\n\n/**\n * Displays evaluation test suites as a grid of cards.\n *\n * Each card shows the suite name, case count, and a delete action.\n * Handles loading, empty, and populated states.\n *\n * @example\n * ```tsx\n * <EvalSuiteCardList\n * projectId=\"proj-123\"\n * onSelectSuite={(pid, sid) => navigate(`/suites/${sid}`)}\n * />\n * ```\n */\nexport const EvalSuiteCardList: React.FC<Props> = ({ projectId, onSelectSuite, onEvalInvalidated }) => {\n const { styles } = useStyle();\n const { suites, loading, remove } = useEvalSuites(projectId);\n\n if (loading) {\n return <div style={{ display: \"flex\", justifyContent: \"center\", padding: 48 }}><Spin /></div>;\n }\n\n if (suites.length === 0) {\n return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={<Text type=\"secondary\">No test suites yet</Text>} />;\n }\n\n return (\n <Row gutter={[16, 16]}>\n {suites.map((s: { id: string; name: string; caseCount?: number }) => (\n <Col key={s.id} xs={24} sm={12} md={8} xl={6}>\n <Card className={styles.card} styles={{ body: { padding: 0 } }} size=\"small\"\n onClick={() => onSelectSuite(projectId, s.id)}>\n <div className={styles.inner}>\n <div className={styles.icon}>\n <TestTube2 size={20} color=\"#6366f1\" />\n </div>\n <div className={styles.header}>\n <div>\n <Text className={styles.title}>{s.name}</Text>\n <div className={styles.subtitle}>Server-side agent testing</div>\n </div>\n <Popconfirm\n title=\"Delete this suite?\"\n onConfirm={(e) => {\n e?.stopPropagation();\n void remove(projectId, s.id).then(() => onEvalInvalidated?.());\n }}\n onCancel={(e) => e?.stopPropagation()}\n >\n <div onClick={(e) => e.stopPropagation()} style={{ cursor: \"pointer\" }}>\n <Trash2 size={14} color=\"#999\" />\n </div>\n </Popconfirm>\n </div>\n <div className={styles.meta}>\n <div className={styles.metaItem}>\n <TestTube2 size={14} />\n <span>{s.caseCount ?? 0} test cases</span>\n </div>\n </div>\n </div>\n </Card>\n </Col>\n ))}\n </Row>\n );\n};\n","import React, { useState, useEffect } from \"react\";\nimport { createStyles } from \"antd-style\";\nimport { Button, Typography, Modal, Form, Input, Select, message } from \"antd\";\nimport { Play, Trash2, Bot, FlaskConical } from \"lucide-react\";\nimport { EntityListView } from \"../EntityList/EntityListView\";\nimport type { EntityAction } from \"../EntityList/types\";\nimport { useEvalSuites } from \"../../hooks/eval/useEvalSuites\";\nimport { useEvalCases } from \"../../hooks/eval/useEvalCases\";\nimport { useEvalRuns } from \"../../hooks/eval/useEvalRuns\";\nimport { useClient } from \"../../context\";\nimport type { Assistant } from \"@axiom-lattice/client-sdk\";\nimport { RunEnvModal } from \"./RunEnvModal\";\n\nconst { Text } = Typography;\nconst { TextArea } = Input;\n\ninterface EvalCaseView {\n id: string;\n inputMessage?: string;\n steps?: Array<{ agent_id: string }>;\n outputType?: \"file_content\" | \"message_content\";\n contentAssertion?: string;\n rubrics?: Array<{ name: string; weight: number; description: string }>;\n}\n\ninterface EvalCaseFormValues {\n inputMessage: string;\n agentId: string;\n outputType?: \"file_content\" | \"message_content\";\n contentAssertion?: string;\n}\n\nconst useStyle = createStyles(({ token, css }) => ({\n shell: css`\n display: flex;\n flex-direction: column;\n height: 100%;\n background: ${token.colorBgLayout};\n `,\n topBar: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 28px;\n background: ${token.colorBgContainer};\n border-bottom: 1px solid ${token.colorBorderSecondary};\n flex-shrink: 0;\n `,\n topLeft: css`\n display: flex;\n align-items: center;\n gap: 12px;\n `,\n topRight: css`\n display: flex;\n align-items: center;\n gap: 8px;\n `,\n breadcrumb: css`\n font-size: 14px;\n color: ${token.colorTextTertiary};\n cursor: pointer;\n background: none;\n border: none;\n padding: 0;\n &:hover { color: ${token.colorPrimary}; }\n `,\n breadcrumbSep: css`\n color: ${token.colorTextQuaternary};\n margin: 0 4px;\n `,\n pageTitle: css`\n font-size: 17px;\n font-weight: 600;\n color: ${token.colorText};\n `,\n body: css`\n flex: 1;\n overflow: auto;\n padding: 28px;\n `,\n}));\n\n/**\n * Props for {@link EvalSuiteDetail}.\n */\nexport interface EvalSuiteDetailProps {\n /** The evaluation project ID */\n projectId: string;\n /** The suite ID to display */\n suiteId: string;\n /** Callback to navigate back to the suite list */\n onBack: () => void;\n /** Callback invoked when a run is started, receiving the run ID */\n onRun: (runId: string) => void;\n /** Notifies the owning inventory after case create, update, or delete settles. */\n onEvalInvalidated?: () => void | Promise<void>;\n}\n\n/**\n * Detail view for a single evaluation suite.\n *\n * Displays a breadcrumb header, a grid/list of test cases with input messages,\n * agent references, rubric counts, and delete actions. Includes a modal form\n * for adding new test cases with agent selection, output type, and expected\n * content assertion.\n *\n * @example\n * ```tsx\n * <EvalSuiteDetail\n * projectId=\"proj-123\"\n * suiteId=\"suite-456\"\n * onBack={() => setPage(\"suites\")}\n * onRun={(runId) => setRunId(runId)}\n * />\n * ```\n */\nexport const EvalSuiteDetail: React.FC<EvalSuiteDetailProps> = ({ projectId, suiteId, onBack, onRun, onEvalInvalidated }) => {\n const { styles } = useStyle();\n const client = useClient(\"__GLOBAL__\");\n const { suites } = useEvalSuites(projectId);\n const { cases, create: createCase, update: updateCase, remove: removeCase } = useEvalCases(projectId, suiteId);\n const { start } = useEvalRuns(projectId);\n const [runEnvOpen, setRunEnvOpen] = useState(false);\n const [modalOpen, setModalOpen] = useState(false);\n const [editingCase, setEditingCase] = useState<EvalCaseView | null>(null);\n const [deleteTarget, setDeleteTarget] = useState<EvalCaseView | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [form] = Form.useForm();\n const [agents, setAgents] = useState<Assistant[]>([]);\n const [agentsLoading, setAgentsLoading] = useState(false);\n\n const suite = suites.find((candidate) => candidate.id === suiteId);\n const visibleCases = cases as EvalCaseView[];\n\n const isEditing = !!editingCase;\n\n const loadAgents = async (): Promise<void> => {\n setAgents([]);\n setAgentsLoading(true);\n try {\n setAgents(await client.assistants.list());\n } catch {\n message.error(\"Failed to load agents\");\n } finally {\n setAgentsLoading(false);\n }\n };\n\n const openCreateModal = () => {\n setEditingCase(null);\n form.resetFields();\n form.setFieldsValue({ outputType: \"message_content\" });\n setModalOpen(true);\n void loadAgents();\n };\n\n const openEditModal = (c: EvalCaseView) => {\n setEditingCase(c);\n void loadAgents();\n setModalOpen(true);\n };\n\n useEffect(() => {\n if (modalOpen && editingCase) {\n const agentId = editingCase.steps?.[0]?.agent_id;\n form.setFieldsValue({\n inputMessage: editingCase.inputMessage || \"\",\n agentId: agentId,\n outputType: editingCase.outputType || \"message_content\",\n contentAssertion: editingCase.contentAssertion || \"\",\n });\n }\n }, [modalOpen, editingCase, form]);\n\n const handleSubmit = async (values: EvalCaseFormValues) => {\n if (isEditing) {\n await updateCase(projectId, suiteId, editingCase.id, {\n inputMessage: values.inputMessage,\n steps: [{ agent_id: values.agentId }],\n outputType: values.outputType || \"message_content\",\n contentAssertion: values.contentAssertion || \"Response should be relevant and accurate\",\n });\n message.success(\"Case updated\");\n } else {\n await createCase(projectId, suiteId, {\n inputMessage: values.inputMessage,\n steps: [{ agent_id: values.agentId }],\n outputType: values.outputType || \"message_content\",\n contentAssertion: values.contentAssertion || \"Response should be relevant and accurate\",\n rubrics: [{ name: \"quality\", weight: 100, description: \"Overall quality\" }],\n });\n message.success(\"Case created\");\n }\n await onEvalInvalidated?.();\n form.resetFields();\n setEditingCase(null);\n setModalOpen(false);\n };\n\n const handleDeleteCase = (c: EvalCaseView) => {\n setDeleteTarget(c);\n };\n\n const handleConfirmDelete = async () => {\n if (!deleteTarget) return;\n setDeleting(true);\n try {\n await removeCase(projectId, suiteId, deleteTarget.id);\n message.success(\"Case deleted\");\n await onEvalInvalidated?.();\n setDeleteTarget(null);\n } finally {\n setDeleting(false);\n }\n };\n\n const caseActions: EntityAction<EvalCaseView>[] = [\n {\n key: \"delete\",\n icon: Trash2,\n label: \"Delete\",\n danger: true,\n onClick: handleDeleteCase,\n },\n ];\n\n return (\n <div className={styles.shell}>\n <div className={styles.topBar}>\n <div className={styles.topLeft}>\n <button className={styles.breadcrumb} onClick={onBack}>Suites</button>\n <span className={styles.breadcrumbSep}>/</span>\n <span className={styles.pageTitle}>{suite?.name || \"Suite\"}</span>\n </div>\n <div className={styles.topRight}>\n <Button type=\"primary\" icon={<Play size={16} />} onClick={() => setRunEnvOpen(true)}>Run All Cases</Button>\n </div>\n </div>\n <div className={styles.body}>\n <EntityListView<EvalCaseView>\n title=\"Test Cases\"\n itemName=\"case\"\n items={visibleCases}\n loading={false}\n keyExtractor={(c) => c.id}\n defaultViewMode=\"grid\"\n showViewToggle\n renderIcon={() => (\n <FlaskConical size={20} color=\"#6366f1\" />\n )}\n renderPrimary={(c) => (\n <Text strong style={{ fontSize: 14 }}>{c.contentAssertion || \"Untitled case\"}</Text>\n )}\n renderSecondary={(c) => (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 12, flexWrap: \"wrap\" }}>\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 4 }}>\n <Bot size={11} />\n <Text type=\"secondary\" style={{ fontSize: 12 }} ellipsis>\n {c.steps?.map((step) => step.agent_id).join(\", \") || \"—\"}\n </Text>\n </span>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>·</Text>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {c.rubrics?.length || 1} rubric{(c.rubrics?.length || 1) > 1 ? \"s\" : \"\"}\n </Text>\n </span>\n )}\n renderDetails={(c) => (\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12, marginBottom: 4, display: \"block\" }}>\n Input Message\n </Text>\n <div style={{ fontSize: 13, whiteSpace: \"pre-wrap\", wordBreak: \"break-word\" }}>\n {c.inputMessage || \"—\"}\n </div>\n </div>\n )}\n itemActions={caseActions}\n actionsPosition=\"hover\"\n onItemClick={openEditModal}\n createLabel=\"Add Case\"\n onCreateClick={openCreateModal}\n emptyTitle=\"No test cases\"\n emptyDescription=\"Add your first test case to get started\"\n />\n\n <Modal\n title={isEditing ? \"Edit Test Case\" : \"Add Test Case\"}\n open={modalOpen}\n onCancel={() => { form.resetFields(); setEditingCase(null); setModalOpen(false); }}\n footer={null}\n width={540}\n >\n <Form form={form} layout=\"vertical\" onFinish={handleSubmit}>\n <Form.Item name=\"inputMessage\" label=\"Input Message\" rules={[{ required: true }]}>\n <TextArea rows={2} placeholder=\"What to send to the agent\" />\n </Form.Item>\n <Form.Item name=\"agentId\" label=\"Agent\" rules={[{ required: true }]}>\n <Select\n placeholder=\"Select agent\"\n showSearch\n loading={agentsLoading}\n optionFilterProp=\"label\"\n options={agents.map((a) => ({\n value: a.id,\n label: `${a.name} (${a.id})`,\n }))}\n />\n </Form.Item>\n <Form.Item name=\"outputType\" label=\"Output Type\" initialValue=\"message_content\">\n <Select options={[\n { value: \"message_content\", label: \"Message Content\" },\n { value: \"file_content\", label: \"File Content\" },\n ]} />\n </Form.Item>\n <Form.Item name=\"contentAssertion\" label=\"Expected Output\">\n <TextArea rows={2} placeholder=\"Describe expected output\" />\n </Form.Item>\n <div style={{ textAlign: \"right\" }}>\n <Button onClick={() => { form.resetFields(); setEditingCase(null); setModalOpen(false); }} style={{ marginRight: 8 }}>\n Cancel\n </Button>\n <Button type=\"primary\" htmlType=\"submit\">{isEditing ? \"Save\" : \"Add Case\"}</Button>\n </div>\n </Form>\n </Modal>\n <RunEnvModal\n open={runEnvOpen}\n onClose={() => setRunEnvOpen(false)}\n onRun={async (rc) => {\n const r = await start(projectId, rc);\n if (r?.run_id) onRun(r.run_id);\n }}\n />\n <Modal\n title=\"Delete test case?\"\n open={deleteTarget !== null}\n onCancel={() => setDeleteTarget(null)}\n onOk={handleConfirmDelete}\n okText=\"Delete\"\n okButtonProps={{ danger: true, loading: deleting }}\n cancelText=\"Cancel\"\n >\n <p>This action cannot be undone.</p>\n </Modal>\n </div>\n </div>\n );\n};\n","import React, { useState, useMemo } from \"react\";\nimport { createStyles } from \"antd-style\";\nimport { Plus } from \"lucide-react\";\nimport { EntityCard } from \"./EntityCard\";\nimport { EntityRow } from \"./EntityRow\";\nimport { EntityCreateTrigger } from \"./EntityCreateTrigger\";\nimport { EntityListShell } from \"./EntityListShell\";\nimport { ViewToggle } from \"./ViewToggle\";\nimport { EntityActions, ViewMode, ActionsStyle, ViewModeExtension } from \"./types\";\n\ninterface EntityListViewProps<T> {\n items: T[];\n loading: boolean;\n keyExtractor: (item: T) => string;\n\n title: string;\n itemName?: string;\n\n /** Content rendered before the title in the left section. */\n titleBefore?: React.ReactNode;\n\n /** Content rendered after the title in the left section. */\n titleAfter?: React.ReactNode;\n\n renderIcon?: (item: T) => React.ReactNode;\n renderPrimary: (item: T) => React.ReactNode;\n renderSecondary?: (item: T) => React.ReactNode;\n renderFooter?: (item: T) => React.ReactNode;\n renderHeaderActions?: (item: T) => React.ReactNode;\n renderDetails?: (item: T) => React.ReactNode;\n\n onItemClick?: (item: T) => void;\n itemActions?: EntityActions<T>;\n actionsPosition?: \"hover\" | \"always\";\n actionsStyle?: ActionsStyle;\n\n createLabel?: string;\n onCreateClick?: () => void;\n\n headerLeft?: React.ReactNode;\n headerRight?: React.ReactNode;\n\n defaultViewMode?: ViewMode;\n showViewToggle?: boolean;\n\n emptyIcon?: React.ReactNode;\n emptyTitle?: string;\n emptyDescription?: string;\n renderEmpty?: () => React.ReactNode;\n\n renderGridItem?: (item: T) => React.ReactNode;\n renderListItem?: (item: T) => React.ReactNode;\n\n /**\n * Minimum column width for the grid layout (default 260).\n * Larger cards (e.g. middleware capability cards) can pass a higher value.\n */\n gridMinWidth?: number;\n\n /**\n * Extensions that appear as extra toggle buttons in the ViewToggle.\n * Each defines a mode key, icon, and what to render when selected.\n */\n viewModeExtensions?: ViewModeExtension[];\n\n className?: string;\n\n /**\n * Optional tab filter rendered in the header (below title).\n * Use for categorizing list items (e.g., All / Connections / Tools).\n */\n tabs?: Array<{ key: string; label: React.ReactNode }>;\n activeTab?: string;\n onTabChange?: (key: string) => void;\n}\n\nconst useStyles = createStyles(({ css, token }, props: { gridMinWidth: number }) => ({\n grid: css`\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(${props.gridMinWidth}px, 1fr));\n gap: 16px;\n `,\n list: css`\n display: flex;\n flex-direction: column;\n gap: 12px;\n `,\n createButton: css`\n height: 36px;\n padding: 0 16px;\n background: ${token.colorPrimary};\n color: white;\n border: none;\n border-radius: ${token.borderRadius}px;\n font-weight: 500;\n font-size: 14px;\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n background: ${token.colorPrimaryHover};\n }\n `,\n}));\n\nexport const EntityListView = <T,>({\n items,\n loading,\n keyExtractor,\n title,\n itemName,\n titleBefore,\n titleAfter,\n renderIcon,\n renderPrimary,\n renderSecondary,\n renderFooter,\n renderHeaderActions,\n renderDetails,\n onItemClick,\n itemActions,\n actionsPosition,\n actionsStyle,\n createLabel,\n onCreateClick,\n headerLeft,\n headerRight,\n defaultViewMode = \"grid\",\n showViewToggle = true,\n emptyIcon,\n emptyTitle,\n emptyDescription,\n renderEmpty,\n renderGridItem,\n renderListItem,\n viewModeExtensions,\n gridMinWidth = 260,\n className,\n tabs,\n activeTab,\n onTabChange,\n}: EntityListViewProps<T>): React.ReactElement => {\n const [viewMode, setViewMode] = useState<string>(defaultViewMode);\n const { styles } = useStyles({ gridMinWidth });\n\n const hasCreate = !!(createLabel && onCreateClick);\n\n const extensionMap = useMemo(() => {\n if (!viewModeExtensions) return new Map<string, ViewModeExtension>();\n return new Map(viewModeExtensions.map((ext) => [ext.mode, ext]));\n }, [viewModeExtensions]);\n\n const extensionExtraOptions = useMemo(() => {\n if (!viewModeExtensions) return undefined;\n return viewModeExtensions.map(({ mode, icon, label }) => ({ mode, icon, label }));\n }, [viewModeExtensions]);\n\n const activeExtension = extensionMap.get(viewMode);\n\n const headerRightContent = (\n <>\n {showViewToggle && <ViewToggle value={viewMode} onChange={setViewMode} extraOptions={extensionExtraOptions} />}\n {hasCreate && !activeExtension && (\n <button className={styles.createButton} onClick={onCreateClick}>\n <Plus size={16} />\n {createLabel}\n </button>\n )}\n {headerRight}\n </>\n );\n\n const itemKeyExtractor = keyExtractor;\n\n const isCustomMode = !!activeExtension;\n\n if (items.length === 0 && !loading && !isCustomMode) {\n return (\n <EntityListShell\n title={title}\n loading={false}\n isEmpty={true}\n emptyIcon={emptyIcon}\n emptyTitle={emptyTitle}\n emptyDescription={emptyDescription}\n renderEmpty={renderEmpty}\n titleBefore={titleBefore}\n titleAfter={titleAfter}\n headerLeft={headerLeft}\n headerRight={headerRightContent}\n tabs={tabs}\n activeTab={activeTab}\n onTabChange={onTabChange}\n >\n {null}\n </EntityListShell>\n );\n }\n\n if (isCustomMode) {\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", height: \"100%\", background: \"#fafafa\" }}>\n <div style={{\n display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\",\n padding: \"16px 24px\", flexShrink: 0,\n }}>\n <h1 style={{ margin: 0, fontSize: 24, fontWeight: 600 }}>{title}</h1>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n {showViewToggle && <ViewToggle value={viewMode} onChange={setViewMode} extraOptions={extensionExtraOptions} />}\n {hasCreate && (\n <button className={styles.createButton} onClick={onCreateClick}>\n <Plus size={16} />\n {createLabel}\n </button>\n )}\n {headerRight}\n </div>\n </div>\n <div style={{ flex: 1, minHeight: 0 }}>\n {activeExtension!.render()}\n </div>\n </div>\n );\n }\n\n return (\n <EntityListShell\n title={title}\n itemCount={items.length}\n itemName={itemName}\n loading={loading}\n isEmpty={false}\n titleBefore={titleBefore}\n titleAfter={titleAfter}\n headerLeft={headerLeft}\n headerRight={headerRightContent}\n className={className}\n tabs={tabs}\n activeTab={activeTab}\n onTabChange={onTabChange}\n >\n {viewMode === \"grid\" ? (\n <div className={styles.grid}>\n {hasCreate && (\n <EntityCreateTrigger viewMode=\"grid\" label={createLabel!} onClick={onCreateClick!} />\n )}\n {items.map((item) => {\n if (renderGridItem) {\n return <React.Fragment key={itemKeyExtractor(item)}>{renderGridItem(item)}</React.Fragment>;\n }\n return (\n <EntityCard<T>\n key={itemKeyExtractor(item)}\n item={item}\n renderPrimary={renderPrimary}\n renderSecondary={renderSecondary}\n renderIcon={renderIcon}\n renderFooter={renderFooter}\n renderHeaderActions={renderHeaderActions}\n renderDetails={renderDetails}\n onClick={onItemClick}\n actions={itemActions}\n actionsPosition={actionsPosition}\n actionsStyle={actionsStyle}\n />\n );\n })}\n </div>\n ) : (\n <div className={styles.list}>\n {hasCreate && (\n <EntityCreateTrigger viewMode=\"list\" label={createLabel!} onClick={onCreateClick!} />\n )}\n {items.map((item) => {\n if (renderListItem) {\n return <React.Fragment key={itemKeyExtractor(item)}>{renderListItem(item)}</React.Fragment>;\n }\n return (\n <EntityRow<T>\n key={itemKeyExtractor(item)}\n item={item}\n renderPrimary={renderPrimary}\n renderSecondary={renderSecondary}\n renderIcon={renderIcon}\n renderFooter={renderFooter}\n renderHeaderActions={renderHeaderActions}\n renderDetails={renderDetails}\n onClick={onItemClick}\n actions={itemActions}\n actionsPosition={actionsPosition}\n actionsStyle={actionsStyle}\n />\n );\n })}\n </div>\n )}\n </EntityListShell>\n );\n};\n","import React from \"react\";\nimport { Tooltip } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { EntityActions, ActionsStyle, isEntityActionDisabled } from \"./types\";\n\ninterface EntityRowProps<T> {\n item: T;\n onClick?: (item: T) => void;\n renderIcon?: (item: T) => React.ReactNode;\n renderPrimary: (item: T) => React.ReactNode;\n renderSecondary?: (item: T) => React.ReactNode;\n renderFooter?: (item: T) => React.ReactNode;\n renderHeaderActions?: (item: T) => React.ReactNode;\n renderDetails?: (item: T) => React.ReactNode;\n actions?: EntityActions<T>;\n actionsPosition?: \"hover\" | \"always\";\n actionsStyle?: ActionsStyle;\n className?: string;\n}\n\nconst useStyles = createStyles(({ css, token }) => {\n const row = css`\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding: 16px;\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorBorder};\n border-radius: ${token.borderRadius}px;\n transition: all 0.15s ease;\n cursor: default;\n\n &:hover {\n border-color: ${token.colorPrimary};\n\n .lattice-hover-actions {\n opacity: 1;\n }\n }\n\n &.clickable {\n cursor: pointer;\n }\n `;\n\n return {\n row,\n iconWrapper: css`\n width: 40px;\n height: 40px;\n border-radius: ${token.borderRadiusSM}px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${token.colorPrimaryBg};\n flex-shrink: 0;\n `,\n content: css`\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n `,\n headerRow: css`\n display: flex;\n align-items: baseline;\n gap: 8px;\n `,\n primary: css`\n font-size: 15px;\n font-weight: 500;\n color: ${token.colorText};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex: 1;\n min-width: 0;\n `,\n headerRight: css`\n flex-shrink: 0;\n `,\n secondary: css`\n font-size: 13px;\n color: ${token.colorTextSecondary};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n details: css`\n font-size: 13px;\n color: ${token.colorTextSecondary};\n line-height: 1.5;\n\n & > * + * {\n margin-top: 6px;\n }\n `,\n iconActions: css`\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n align-self: center;\n opacity: 0;\n transition: opacity 0.15s ease;\n\n &.always {\n opacity: 1;\n }\n `,\n iconActionBtn: css`\n width: 28px;\n height: 28px;\n border-radius: ${token.borderRadiusSM}px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: ${token.colorTextTertiary};\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n background: ${token.colorBgTextHover};\n color: ${token.colorText};\n }\n\n &.danger:hover {\n background: ${token.colorErrorBg};\n color: ${token.colorError};\n }\n `,\n buttonActions: css`\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n `,\n buttonActionBtn: css`\n height: 32px;\n padding: 0 12px;\n border-radius: ${token.borderRadius}px;\n display: flex;\n align-items: center;\n gap: 6px;\n border: 1px solid ${token.colorBorder};\n background: ${token.colorBgContainer};\n color: ${token.colorText};\n font-size: 13px;\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n border-color: ${token.colorPrimary};\n color: ${token.colorPrimary};\n }\n\n &.danger {\n color: ${token.colorError};\n border-color: ${token.colorErrorBorder};\n\n &:hover {\n background: ${token.colorErrorBg};\n }\n }\n `,\n };\n});\n\nexport const EntityRow = <T,>({\n item,\n onClick,\n renderIcon,\n renderPrimary,\n renderSecondary,\n renderFooter,\n renderHeaderActions,\n renderDetails,\n actions,\n actionsPosition = \"hover\",\n actionsStyle = \"icon\",\n className,\n}: EntityRowProps<T>): React.ReactElement => {\n const { styles } = useStyles();\n const resolvedActions = typeof actions === \"function\" ? actions(item) : actions;\n\n const handleClick = () => {\n onClick?.(item);\n };\n\n return (\n <div\n className={`${styles.row} ${onClick ? \"clickable\" : \"\"} ${className || \"\"}`}\n onClick={handleClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={\n onClick\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick();\n }\n }\n : undefined\n }\n >\n {renderIcon && <div className={styles.iconWrapper}>{renderIcon(item)}</div>}\n <div className={styles.content}>\n <div className={styles.headerRow}>\n <div className={styles.primary}>{renderPrimary(item)}</div>\n {(resolvedActions && resolvedActions.length > 0 && actionsStyle === \"icon\") || renderHeaderActions ? (\n <div className={styles.headerRight}>\n {renderHeaderActions?.(item)}\n {resolvedActions && resolvedActions.length > 0 && actionsStyle === \"icon\" && (\n <div className={`${styles.iconActions} lattice-hover-actions ${actionsPosition === \"always\" ? \"always\" : \"\"}`} onClick={(event) => {\n if ((event.target as Element).closest(\"button:disabled\")) event.stopPropagation();\n }}>\n {resolvedActions.map((action) => {\n const disabled = isEntityActionDisabled(action, item);\n return <Tooltip key={action.key} title={action.label}>\n <button\n type=\"button\"\n disabled={disabled}\n className={`${styles.iconActionBtn} ${action.danger ? \"danger\" : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) action.onClick(item);\n }}\n aria-label={action.label || action.key}\n >\n <action.icon size={14} />\n </button>\n </Tooltip>;\n })}\n </div>\n )}\n </div>\n ) : null}\n </div>\n {renderSecondary && <div className={styles.secondary}>{renderSecondary(item)}</div>}\n {renderDetails && <div className={styles.details}>{renderDetails(item)}</div>}\n {resolvedActions && resolvedActions.length > 0 && actionsStyle === \"button\" && (\n <div className={styles.buttonActions} onClick={(event) => {\n if ((event.target as Element).closest(\"button:disabled\")) event.stopPropagation();\n }}>\n {resolvedActions.map((action) => {\n const disabled = isEntityActionDisabled(action, item);\n return <button\n key={action.key}\n type=\"button\"\n disabled={disabled}\n className={`${styles.buttonActionBtn} ${action.danger ? \"danger\" : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) action.onClick(item);\n }}\n >\n {React.createElement(action.icon, { size: 14 })}\n {action.label}\n </button>;\n })}\n </div>\n )}\n {renderFooter && (\n <div className={styles.headerRight}>{renderFooter(item)}</div>\n )}\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport { createStyles } from \"antd-style\";\nimport { Plus } from \"lucide-react\";\nimport { ViewMode } from \"./types\";\n\ninterface EntityCreateTriggerProps {\n viewMode: ViewMode;\n label: string;\n icon?: React.ComponentType<{ size?: number | string }>;\n onClick: () => void;\n}\n\nconst useStyles = createStyles(({ css, token }) => ({\n createGrid: css`\n background: ${token.colorBgContainer};\n border: 1px dashed ${token.colorBorderSecondary};\n border-radius: ${token.borderRadiusLG}px;\n transition: all 0.15s ease;\n cursor: pointer;\n min-height: 140px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n\n &:hover {\n border-color: ${token.colorPrimary};\n border-style: solid;\n background: ${token.colorPrimaryBgHover};\n }\n `,\n createList: css`\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 16px;\n background: ${token.colorBgContainer};\n border: 1px dashed ${token.colorBorderSecondary};\n border-radius: ${token.borderRadius}px;\n transition: all 0.15s ease;\n cursor: pointer;\n\n &:hover {\n border-color: ${token.colorPrimary};\n border-style: solid;\n background: ${token.colorPrimaryBgHover};\n }\n `,\n iconWrapper: css`\n width: 48px;\n height: 48px;\n border-radius: ${token.borderRadius}px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${token.colorBgTextHover};\n flex-shrink: 0;\n `,\n iconWrapperSmall: css`\n width: 40px;\n height: 40px;\n border-radius: ${token.borderRadiusSM}px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${token.colorBgTextHover};\n flex-shrink: 0;\n `,\n label: css`\n font-size: 15px;\n font-weight: 500;\n color: ${token.colorTextSecondary};\n `,\n}));\n\nexport const EntityCreateTrigger: React.FC<EntityCreateTriggerProps> = ({\n viewMode,\n label,\n icon: IconComponent = Plus,\n onClick,\n}) => {\n const { styles } = useStyles();\n\n if (viewMode === \"grid\") {\n return (\n <div className={styles.createGrid} onClick={onClick} role=\"button\" tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick();\n }\n }}>\n <div className={styles.iconWrapper}>\n <IconComponent size={24} />\n </div>\n <span className={styles.label}>{label}</span>\n </div>\n );\n }\n\n return (\n <div className={styles.createList} onClick={onClick} role=\"button\" tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick();\n }\n }}>\n <div className={styles.iconWrapperSmall}>\n <IconComponent size={20} />\n </div>\n <span className={styles.label}>{label}</span>\n </div>\n );\n};\n","import React from \"react\";\nimport { createStyles } from \"antd-style\";\nimport { Spin, Tabs } from \"antd\";\nimport { FolderOpen } from \"lucide-react\";\nimport { theme } from \"antd\";\n\ninterface EntityListShellTab {\n key: string;\n label: React.ReactNode;\n}\n\ninterface EntityListShellProps {\n title: string;\n subtitle?: React.ReactNode;\n\n /** Content rendered before the title in the left section. */\n titleBefore?: React.ReactNode;\n\n /** Content rendered after the title in the left section. */\n titleAfter?: React.ReactNode;\n\n headerLeft?: React.ReactNode;\n headerRight?: React.ReactNode;\n\n loading: boolean;\n isEmpty: boolean;\n\n renderLoading?: () => React.ReactNode;\n renderEmpty?: () => React.ReactNode;\n\n emptyIcon?: React.ReactNode;\n emptyTitle?: string;\n emptyDescription?: string;\n\n children: React.ReactNode;\n\n itemCount?: number;\n itemName?: string;\n\n className?: string;\n\n /**\n * Optional tab filter rendered below the title in the header.\n * Use for categorizing list items (e.g., All / Connections / Tools).\n * Each tab needs `key` (value) and `label` (display).\n */\n tabs?: EntityListShellTab[];\n activeTab?: string;\n onTabChange?: (key: string) => void;\n}\n\nconst useStyles = createStyles(({ css, token }) => ({\n container: css`\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 32px;\n `,\n header: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 24px;\n `,\n headerLeft: css`\n display: flex;\n flex-direction: column;\n gap: 4px;\n `,\n titleRow: css`\n display: flex;\n align-items: center;\n gap: 8px;\n `,\n tabs: css`\n margin-top: 12px;\n\n .ant-tabs-nav {\n margin-bottom: 0;\n\n &::before {\n border-bottom: none;\n }\n }\n\n .ant-tabs-tab {\n padding: 4px 10px;\n margin: 0 2px 0 0;\n border-radius: 9999px;\n transition: background-color 0.15s ease;\n font-size: 13px;\n\n &:hover {\n background-color: ${token.colorFillTertiary};\n }\n\n .ant-tabs-tab-btn {\n font-size: 13px;\n }\n }\n\n .ant-tabs-tab + .ant-tabs-tab {\n margin-left: 2px;\n }\n\n .ant-tabs-tab-active {\n background-color: ${token.colorFillSecondary};\n\n .ant-tabs-tab-btn {\n color: ${token.colorText};\n font-weight: 500;\n }\n }\n\n .ant-tabs-ink-bar {\n display: none;\n }\n `,\n title: css`\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: ${token.colorText};\n `,\n subtitle: css`\n font-size: 14px;\n color: ${token.colorTextSecondary};\n `,\n headerRight: css`\n display: flex;\n align-items: center;\n gap: 12px;\n `,\n content: css`\n flex: 1;\n overflow: auto;\n `,\n center: css`\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n emptyIcon: css`\n width: 80px;\n height: 80px;\n border-radius: 20px;\n background: ${token.colorBgTextHover};\n border: 1px solid ${token.colorBorder};\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 20px;\n `,\n emptyTitle: css`\n font-size: 16px;\n font-weight: 500;\n color: ${token.colorText};\n margin-bottom: 4px;\n text-align: center;\n `,\n emptyDescription: css`\n font-size: 14px;\n color: ${token.colorTextSecondary};\n text-align: center;\n `,\n}));\n\nexport const EntityListShell: React.FC<EntityListShellProps> = ({\n title,\n subtitle,\n titleBefore,\n titleAfter,\n headerLeft,\n headerRight,\n loading,\n isEmpty,\n renderLoading,\n renderEmpty,\n emptyIcon,\n emptyTitle,\n emptyDescription,\n children,\n itemCount,\n itemName,\n className,\n tabs,\n activeTab,\n onTabChange,\n}) => {\n const { styles } = useStyles();\n const { token } = theme.useToken();\n\n const resolvedSubtitle =\n subtitle ??\n (itemCount !== undefined && itemName\n ? `${itemCount} ${itemName}${itemCount !== 1 ? \"s\" : \"\"}`\n : undefined);\n\n return (\n <div className={`${styles.container} ${className || \"\"}`}>\n <div className={styles.header}>\n <div className={styles.headerLeft}>\n <div className={styles.titleRow}>\n {titleBefore}\n <h1 className={styles.title}>{title}</h1>\n {titleAfter}\n </div>\n {resolvedSubtitle && <span className={styles.subtitle}>{resolvedSubtitle}</span>}\n {tabs && tabs.length > 0 && (\n <div className={styles.tabs}>\n <Tabs\n type=\"line\"\n activeKey={activeTab}\n onChange={(key) => onTabChange?.(key)}\n items={tabs.map((t) => ({ key: t.key, label: t.label }))}\n />\n </div>\n )}\n </div>\n {(headerLeft || headerRight) && (\n <div className={styles.headerRight}>\n {headerLeft}\n {headerRight}\n </div>\n )}\n </div>\n\n {loading ? (\n renderLoading ? (\n renderLoading()\n ) : (\n <div className={styles.center}>\n <Spin size=\"large\" />\n </div>\n )\n ) : isEmpty ? (\n renderEmpty ? (\n renderEmpty()\n ) : (\n <div className={styles.center}>\n <div>\n {emptyIcon ? (\n emptyIcon\n ) : (\n <div className={styles.emptyIcon}>\n <FolderOpen size={32} style={{ color: token.colorTextTertiary }} />\n </div>\n )}\n {emptyTitle && <div className={styles.emptyTitle}>{emptyTitle}</div>}\n {emptyDescription && <div className={styles.emptyDescription}>{emptyDescription}</div>}\n </div>\n </div>\n )\n ) : (\n <div className={styles.content}>{children}</div>\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport { createStyles } from \"antd-style\";\nimport { LayoutGrid, List } from \"lucide-react\";\n\ninterface ViewToggleOption {\n mode: string;\n icon: React.ComponentType<{ size?: number | string }>;\n label?: string;\n}\n\ninterface ViewToggleProps {\n value: string;\n onChange: (mode: string) => void;\n options?: ViewToggleOption[];\n extraOptions?: ViewToggleOption[];\n}\n\nconst DEFAULT_OPTIONS: ViewToggleOption[] = [\n { mode: \"grid\", icon: LayoutGrid },\n { mode: \"list\", icon: List },\n];\n\nconst useStyles = createStyles(({ css, token }) => ({\n container: css`\n display: flex;\n background: ${token.colorBgContainer};\n border-radius: ${token.borderRadius}px;\n padding: 4px;\n border: 1px solid ${token.colorBorder};\n `,\n button: css`\n width: 32px;\n height: 32px;\n border-radius: ${token.borderRadiusSM}px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n cursor: pointer;\n border: none;\n background: transparent;\n color: ${token.colorTextTertiary};\n\n &:hover {\n color: ${token.colorTextSecondary};\n }\n\n &.active {\n background: ${token.colorBgTextHover};\n color: ${token.colorText};\n }\n `,\n}));\n\nexport const ViewToggle: React.FC<ViewToggleProps> = ({\n value,\n onChange,\n options,\n extraOptions,\n}) => {\n const { styles } = useStyles();\n const allOptions = options ?? [...DEFAULT_OPTIONS, ...(extraOptions ?? [])];\n\n return (\n <div className={styles.container}>\n {allOptions.map((opt) => {\n const Icon = opt.icon;\n const isActive = value === opt.mode;\n return (\n <button\n key={opt.mode}\n type=\"button\"\n className={`${styles.button} ${isActive ? \"active\" : \"\"}`}\n onClick={() => {\n if (!isActive) onChange(opt.mode);\n }}\n aria-label={opt.label || opt.mode}\n aria-pressed={isActive}\n >\n <Icon size={16} />\n </button>\n );\n })}\n </div>\n );\n};\n","/**\n * RunEnvModal\n *\n * Modal shown when running an eval — lets the user pick the workspace\n * project (test environment) the run executes in. The selection is local\n * to this modal; on confirm it calls `onRun(runConfig)` with the chosen\n * environment. Selecting an environment here does NOT navigate the page\n * (page-level workspace context keeps it isolated).\n */\n\nimport React, { useState } from \"react\";\nimport { Modal, Typography, message } from \"antd\";\nimport { ProjectSelector } from \"../ProjectSelector\";\nimport { useWorkspaceContext } from \"../../context/WorkspaceContext\";\n\nconst { Text } = Typography;\n\nexport interface RunEnvModalProps {\n open: boolean;\n onClose: () => void;\n /** Called with the chosen run environment. */\n onRun: (runConfig: { workspaceId?: string; projectId?: string }) => void;\n}\n\nexport const RunEnvModal: React.FC<RunEnvModalProps> = ({ open, onClose, onRun }) => {\n const { projectId } = useWorkspaceContext();\n // Local selection; defaults to current workspace project. Does NOT call\n // the global setProject — choosing here must not navigate the page.\n const [envProjectId, setEnvProjectId] = useState<string | null>(projectId);\n const [running, setRunning] = useState(false);\n\n const handleOk = async () => {\n if (!envProjectId) {\n message.warning(\"请先选择测试环境\");\n return;\n }\n setRunning(true);\n try {\n await onRun({ workspaceId: undefined, projectId: envProjectId });\n onClose();\n } finally {\n setRunning(false);\n }\n };\n\n return (\n <Modal\n title=\"选择测试环境\"\n open={open}\n onCancel={onClose}\n onOk={handleOk}\n okText=\"运行\"\n cancelText=\"取消\"\n confirmLoading={running}\n destroyOnClose\n >\n <div style={{ margin: \"8px 0 16px\" }}>\n <Text type=\"secondary\" style={{ display: \"block\", marginBottom: 8 }}>\n 选择本次评估运行的工作区项目环境\n </Text>\n <ProjectSelector\n value={envProjectId}\n onChange={setEnvProjectId}\n placeholder=\"选择项目\"\n style={{ width: \"100%\" }}\n />\n </div>\n </Modal>\n );\n};\n\nexport default RunEnvModal;\n","/**\n * ProjectSelector\n *\n * Project (data context) selector, styled like the Tasks project filter\n * ({@link FilterSelect}). Two modes:\n * - Controlled: pass `value` + `onChange` — selection is reported via\n * onChange and does NOT touch the workspace context (e.g. RunEnvModal,\n * where choosing must not navigate the page).\n * - Uncontrolled: omit value/onChange — selection calls the workspace\n * context's setProject; when no project is selected yet, the first\n * available project is auto-selected (data-context usage — no \"All\"\n * option, no workspace navigation).\n *\n * Renders nothing when no workspace is selected (nothing to choose from).\n */\n\nimport React, { useEffect } from \"react\";\nimport { FilterSelect } from \"./EntityList/FilterSelect\";\nimport { useWorkspaceContext } from \"../context/WorkspaceContext\";\nimport type { ProjectKind } from \"@axiom-lattice/client-sdk\";\n\nexport interface ProjectSelectorProps {\n /** Controlled value (project id). When provided, onChange is required. */\n value?: string | null;\n /** Controlled change handler — called instead of the context setProject. */\n onChange?: (projectId: string | null) => void;\n /** Optional inline style for the Select. */\n style?: React.CSSProperties;\n /** Placeholder text. Default: \"项目\". */\n placeholder?: string;\n /** Project kind to choose from. Defaults to business projects. */\n kind?: ProjectKind;\n}\n\nexport const ProjectSelector: React.FC<ProjectSelectorProps> = ({\n value,\n onChange,\n style,\n placeholder = \"项目\",\n kind = \"business\",\n}) => {\n const {\n workspaceId,\n projectId,\n projects,\n trainingProjects,\n personalProjects,\n setProject,\n loading,\n } = useWorkspaceContext();\n\n const selectableProjects =\n kind === \"training\" ? trainingProjects\n : kind === \"personal\" ? personalProjects\n : projects;\n\n // Uncontrolled mode: auto-select the first project so the data context\n // always has a concrete project (no null/\"All\" state to clear into).\n useEffect(() => {\n if (\n kind === \"business\" &&\n value === undefined &&\n !projectId &&\n selectableProjects.length > 0\n ) {\n setProject(selectableProjects[0].id);\n }\n }, [kind, value, projectId, selectableProjects, setProject]);\n\n // Controlled mode: value/onChange provided → use them; uncontrolled →\n // use the workspace context selection.\n const selected = value !== undefined ? value : projectId;\n const handleChange = (id: string | null) => {\n if (onChange) {\n onChange(id);\n } else {\n setProject(id);\n }\n };\n\n // Render guard AFTER hooks — conditional returns before hooks break the\n // Rules of Hooks when the workspace id arrives asynchronously.\n if (!workspaceId) return null;\n\n return (\n <FilterSelect\n value={selected}\n onChange={handleChange}\n loading={loading}\n placeholder={placeholder}\n borderless\n options={selectableProjects.map((p) => ({ label: p.name, value: p.id }))}\n style={{ minWidth: 140, ...style }}\n />\n );\n};\n","import React from \"react\";\nimport { Select } from \"antd\";\nimport { createStyles } from \"antd-style\";\n\n/**\n * FilterSelect — reusable pill-styled Select.\n *\n * The standard \"filter\" look used across the SDK (Tasks project filter,\n * ProjectSelector): 32px pill (9999px radius), subtle border, searchable.\n * Optionally prepends an \"All\" option that maps to `null`.\n */\nexport interface FilterSelectProps {\n value: string | null;\n onChange: (value: string | null) => void;\n options: { value: string; label: string }[];\n placeholder?: string;\n /** Label for the \"All\" option; omit (or pass \"\") to hide it. */\n allLabel?: string;\n allValue?: string;\n loading?: boolean;\n /** Remove the border entirely (true borderless pill). Default: false. */\n borderless?: boolean;\n style?: React.CSSProperties;\n}\n\nconst useStyles = createStyles(({ token, css }) => ({\n select: css`\n &.ant-select {\n height: 32px !important;\n }\n\n .ant-select-selector {\n height: 32px !important;\n border-radius: 9999px !important;\n padding: 0 10px !important;\n font-size: 13px;\n border: 1px solid ${token.colorBorderSecondary} !important;\n transition: border-color 0.2s ease, background 0.2s ease;\n }\n\n &:hover .ant-select-selector {\n background: ${token.colorFillTertiary} !important;\n }\n `,\n borderless: css`\n .ant-select-selector {\n border: none !important;\n }\n `,\n dropdown: css`\n .ant-select-item-option {\n font-size: 13px !important;\n padding: 4px 12px !important;\n line-height: 1.5 !important;\n min-height: auto !important;\n }\n `,\n}));\n\nexport const FilterSelect: React.FC<FilterSelectProps> = ({\n value,\n onChange,\n options,\n placeholder,\n allLabel,\n allValue = \"__all__\",\n loading,\n borderless = false,\n style,\n}) => {\n const { styles } = useStyles();\n const dropdownClassName = styles.dropdown;\n\n const allOptions = [\n ...(allLabel ? [{ value: allValue, label: allLabel }] : []),\n ...options,\n ];\n\n return (\n <Select\n className={borderless ? `${styles.select} ${styles.borderless}` : styles.select}\n dropdownClassName={dropdownClassName}\n variant=\"borderless\"\n style={style}\n value={allLabel ? (value ?? allValue) : (value ?? undefined)}\n onChange={(v) => onChange(allLabel ? (v === allValue ? null : v) : v)}\n options={allOptions}\n showSearch\n loading={loading}\n optionFilterProp=\"label\"\n popupMatchSelectWidth={false}\n placeholder={placeholder}\n />\n );\n};\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { createStyles } from \"antd-style\";\nimport { Alert, App, Button, Typography, Progress, Tag, Popconfirm } from \"antd\";\nimport { CheckCircle, XCircle, Trash2, FolderGit2 } from \"lucide-react\";\nimport { EntityListView } from \"../EntityList/EntityListView\";\nimport type { EvalRunResultRecord } from \"../../hooks/eval/evalTypes\";\nimport { useEvalRunDetail } from \"../../hooks/eval/useEvalRunDetail\";\nimport { useEvalRunStream } from \"../../hooks/eval/useEvalRunStream\";\nimport { useApi } from \"../../hooks/useApi\";\n\nconst { Text } = Typography;\n\nconst useStyle = createStyles(({ token, css }) => ({\n shell: css`\n display: flex;\n flex-direction: column;\n height: 100%;\n background: ${token.colorBgLayout};\n `,\n topBar: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 28px;\n background: ${token.colorBgContainer};\n border-bottom: 1px solid ${token.colorBorderSecondary};\n flex-shrink: 0;\n `,\n topLeft: css`\n display: flex;\n align-items: center;\n gap: 12px;\n `,\n breadcrumb: css`\n font-size: 14px;\n color: ${token.colorTextTertiary};\n cursor: pointer;\n background: none;\n border: none;\n padding: 0;\n &:hover { color: ${token.colorPrimary}; }\n `,\n pageTitle: css`\n font-size: 17px;\n font-weight: 600;\n color: ${token.colorText};\n `,\n body: css`\n flex: 1;\n overflow: auto;\n padding: 28px;\n `,\n summaryCard: css`\n border-radius: ${token.borderRadiusLG}px;\n border: 1px solid ${token.colorBorderSecondary};\n background: ${token.colorBgContainer};\n padding: 24px;\n margin-bottom: 24px;\n `,\n summaryRow: css`\n display: flex;\n gap: 40px;\n align-items: center;\n `,\n summaryItem: css`\n text-align: center;\n min-width: 80px;\n `,\n summaryValue: css`\n font-size: 24px;\n font-weight: 700;\n color: ${token.colorText};\n `,\n summaryLabel: css`\n font-size: 12px;\n color: ${token.colorTextSecondary};\n margin-top: 4px;\n `,\n progressWrap: css`\n margin-bottom: 24px;\n `,\n detailBlock: css`\n margin-bottom: 8px;\n `,\n dimensionRow: css`\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n `,\n}));\n\n/**\n * Props for {@link EvalRunResults}.\n */\nexport interface EvalRunResultsProps {\n /** The run ID whose results to display */\n runId: string;\n /** Callback to navigate back to the previous page */\n onBack: () => void;\n /** Invalidates parent run inventory after terminal persisted detail is authoritative. */\n onRunSettled?: () => void | Promise<void>;\n}\n\n/**\n * Displays detailed results for a single evaluation run.\n *\n * Shows a summary card with total/passed/failed counts, average score,\n * and pass rate. Renders a grid/list of per-case results including\n * pass/fail status, suite name, input message, judge summary, dimension\n * scores with progress bars, and overall score.\n *\n * Supports live streaming progress during active runs and a delete action.\n *\n * @example\n * ```tsx\n * <EvalRunResults\n * runId=\"run-789\"\n * onBack={() => setPage(\"dashboard\")}\n * />\n * ```\n */\nexport const EvalRunResults: React.FC<EvalRunResultsProps> = ({ runId, onBack, onRunSettled }) => {\n const { styles } = useStyle();\n const { message } = App.useApp();\n const { del } = useApi();\n const { run, loading, error: detailError, refresh } = useEvalRunDetail(runId);\n const {\n status: streamingStatus,\n progress,\n completedCases,\n terminal,\n reconnect,\n } = useEvalRunStream(runId);\n const refreshRef = useRef(refresh);\n const onRunSettledRef = useRef(onRunSettled);\n const refreshedTerminalRef = useRef<string | null>(null);\n const refreshGenerationRef = useRef(0);\n const [finalizingKey, setFinalizingKey] = useState<string | null>(null);\n const [deleting, setDeleting] = useState(false);\n refreshRef.current = refresh;\n onRunSettledRef.current = onRunSettled;\n\n useEffect(() => {\n refreshedTerminalRef.current = null;\n refreshGenerationRef.current += 1;\n setFinalizingKey(null);\n return () => {\n refreshGenerationRef.current += 1;\n };\n }, [runId]);\n\n const ownedTerminal = terminal?.runId === runId ? terminal : null;\n const terminalKey = ownedTerminal ? `${ownedTerminal.runId}:${ownedTerminal.generation}` : null;\n useEffect(() => {\n if (!terminalKey || refreshedTerminalRef.current === terminalKey) return;\n\n refreshedTerminalRef.current = terminalKey;\n const generation = refreshGenerationRef.current;\n setFinalizingKey(terminalKey);\n void refreshRef.current().then((persistedRun) => {\n if (!persistedRun || ![\"completed\", \"failed\", \"aborted\"].includes(persistedRun.status)) return;\n return onRunSettledRef.current?.();\n }).catch(() => undefined).finally(() => {\n if (refreshGenerationRef.current !== generation) return;\n setFinalizingKey((current) => current === terminalKey ? null : current);\n });\n }, [terminalKey]);\n\n const handleDelete = async (): Promise<void> => {\n if (deleting || run?.status === \"running\") return;\n setDeleting(true);\n try {\n const response = await del<{ success: boolean; error?: string }>(`/api/eval/runs/${runId}`);\n if (!response.success) {\n message.error(response.error ?? \"Failed to delete run\");\n return;\n }\n message.success(\"Run deleted\");\n await onRunSettledRef.current?.();\n onBack();\n } catch (deleteError) {\n message.error(deleteError instanceof Error ? deleteError.message : \"Failed to delete run\");\n } finally {\n setDeleting(false);\n }\n };\n\n const topBar = (\n <div className={styles.topBar}>\n <div className={styles.topLeft}>\n <button className={styles.breadcrumb} onClick={onBack}>← Back</button>\n </div>\n </div>\n );\n\n if (!run) {\n return (\n <div className={styles.shell}>\n {topBar}\n <div style={{ display: \"flex\", justifyContent: \"center\", padding: 60 }}>\n {loading ? (\n <Text role=\"status\" aria-live=\"polite\" type=\"secondary\">Loading validation results…</Text>\n ) : (\n <Alert\n role=\"alert\"\n type=\"error\"\n showIcon\n message={detailError?.message ?? \"Evaluation run not found\"}\n action={<Button size=\"small\" onClick={() => void refresh()}>Retry</Button>}\n />\n )}\n </div>\n </div>\n );\n }\n\n const isRunning = run.status === \"running\";\n const streamCanReportProgress = streamingStatus === \"running\" || streamingStatus === \"disconnected\";\n const useLiveCounters = isRunning\n && streamCanReportProgress\n && (progress.total > 0 || progress.completed > 0 || progress.passed > 0 || progress.failed > 0);\n const effectiveCounters = useLiveCounters\n ? progress\n : {\n completed: run.passedCases + run.failedCases,\n total: run.totalCases,\n passed: run.passedCases,\n failed: run.failedCases,\n };\n const pct = Math.min(100, Math.max(0, effectiveCounters.total > 0\n ? Math.round((effectiveCounters.completed / effectiveCounters.total) * 100)\n : 0));\n const passRate = Math.min(100, Math.max(0, effectiveCounters.total > 0\n ? Math.round((effectiveCounters.passed / effectiveCounters.total) * 100)\n : 0));\n const isDisconnected = isRunning && streamingStatus === \"disconnected\";\n const persistedCaseIds = new Set(run.results.map((result) => result.caseId).filter(Boolean));\n type DisplayResult = Pick<EvalRunResultRecord, \"id\" | \"runId\" | \"suiteName\" | \"pass\" | \"score\">\n & Partial<Pick<EvalRunResultRecord, \"caseId\" | \"summary\" | \"dimensionResults\" | \"messages\" | \"error\" | \"interrupted\">>;\n const displayedResults: DisplayResult[] = isRunning\n ? [\n ...run.results,\n ...completedCases\n .filter((result) => !persistedCaseIds.has(result.caseId))\n .map((result) => ({ ...result, id: `stream:${result.caseId}`, runId })),\n ]\n : run.results;\n\n return (\n <div className={styles.shell}>\n <div className={styles.topBar}>\n <div className={styles.topLeft}>\n <button className={styles.breadcrumb} onClick={onBack}>← Back</button>\n <span className={styles.pageTitle}>Run Results</span>\n <Tag color={\n run.status === \"completed\" ? \"success\" :\n run.status === \"running\" ? \"processing\" :\n run.status === \"failed\" ? \"error\" : \"warning\"\n }>\n {run.status}\n </Tag>\n {run.envProjectId && (\n <Tag icon={<FolderGit2 size={11} />} color=\"blue\">env: {run.envProjectId}</Tag>\n )}\n </div>\n {!isRunning && (\n <Popconfirm\n title=\"Delete this run?\"\n description=\"Run results will be permanently deleted.\"\n onConfirm={handleDelete}\n okText=\"Delete\"\n okButtonProps={{ danger: true, loading: deleting, disabled: deleting }}\n >\n <Button danger icon={<Trash2 size={16} />}>Delete Run</Button>\n </Popconfirm>\n )}\n </div>\n <div className={styles.body}>\n {finalizingKey && (\n <Text role=\"status\" aria-live=\"polite\" type=\"secondary\" style={{ display: \"block\", marginBottom: 16 }}>\n Finalizing validation results…\n </Text>\n )}\n {detailError && (\n <Alert\n role=\"alert\"\n type=\"warning\"\n showIcon\n message=\"Validation results could not be refreshed\"\n description={detailError.message}\n action={<Button size=\"small\" onClick={() => void refresh()}>Retry</Button>}\n style={{ marginBottom: 16 }}\n />\n )}\n {isDisconnected && (\n <Alert\n role=\"alert\"\n type=\"warning\"\n showIcon\n message=\"Live updates disconnected\"\n description=\"Validation may still be running. Persisted results remain visible while live updates are unavailable.\"\n action={<Button size=\"small\" onClick={reconnect}>Reconnect</Button>}\n style={{ marginBottom: 16 }}\n />\n )}\n {isRunning && (\n <div className={styles.progressWrap}>\n <Progress percent={pct} status=\"active\" strokeColor=\"#6366f1\" />\n <div style={{ display: \"flex\", justifyContent: \"center\", gap: 24, marginTop: 8 }}>\n <Text type=\"secondary\" style={{ fontSize: 13 }}>\n {effectiveCounters.completed} / {effectiveCounters.total} cases\n </Text>\n <Text type=\"success\" style={{ fontSize: 13 }}>{effectiveCounters.passed} passed</Text>\n <Text type=\"danger\" style={{ fontSize: 13 }}>{effectiveCounters.failed} failed</Text>\n </div>\n </div>\n )}\n\n <div className={styles.summaryCard}>\n <div className={styles.summaryRow}>\n <div className={styles.summaryItem}>\n <Text style={{ color: \"#6366f1\", fontSize: 24, fontWeight: 700 }}>{effectiveCounters.total}</Text>\n <div className={styles.summaryLabel}>Total Cases</div>\n </div>\n <div className={styles.summaryItem}>\n <Text style={{ color: \"#22c55e\", fontSize: 24, fontWeight: 700 }}>{effectiveCounters.passed}</Text>\n <div className={styles.summaryLabel}>Passed</div>\n </div>\n <div className={styles.summaryItem}>\n <Text style={{ color: \"#ef4444\", fontSize: 24, fontWeight: 700 }}>{effectiveCounters.failed}</Text>\n <div className={styles.summaryLabel}>Failed</div>\n </div>\n <div className={styles.summaryItem}>\n <Text style={{ color: \"#3b82f6\", fontSize: 24, fontWeight: 700 }}>\n {isRunning ? \"—\" : typeof run.avgScore === \"number\" ? run.avgScore.toFixed(1) : \"—\"}\n </Text>\n <div className={styles.summaryLabel}>Avg Score</div>\n </div>\n <div className={styles.summaryItem}>\n <Text style={{ color: \"#f59e0b\", fontSize: 24, fontWeight: 700 }}>\n {passRate}%\n </Text>\n <div className={styles.summaryLabel}>Pass Rate</div>\n </div>\n </div>\n {run.error && (\n <Text type=\"danger\" style={{ display: \"block\", marginTop: 16, fontSize: 13 }}>\n Error: {run.error}\n </Text>\n )}\n </div>\n\n <EntityListView<DisplayResult>\n title=\"Case Results\"\n itemName=\"case\"\n items={displayedResults}\n loading={false}\n keyExtractor={(r) => r.id}\n defaultViewMode=\"list\"\n showViewToggle\n emptyDescription=\"No results yet\"\n renderIcon={(r) =>\n r.pass\n ? <CheckCircle size={20} color=\"#22c55e\" />\n : <XCircle size={20} color=\"#ef4444\" />\n }\n renderPrimary={(r) => (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <Text strong style={{ fontSize: 14 }}>{r.suiteName}</Text>\n {r.caseId && <Text code style={{ fontSize: 12 }}>{r.caseId}</Text>}\n <Tag color={r.pass ? \"success\" : \"error\"}>{r.pass ? \"Passed\" : \"Failed\"}</Tag>\n {r.interrupted && <Tag color=\"warning\">Interrupted</Tag>}\n <Tag color={r.score >= 80 ? \"success\" : \"error\"}>\n {typeof r.score === \"number\" ? r.score.toFixed(1) : \"—\"}\n </Tag>\n {(r.dimensionResults?.length ?? 0) > 0 && (\n <Tag>{r.dimensionResults?.length} rubric{(r.dimensionResults?.length ?? 0) > 1 ? \"s\" : \"\"}</Tag>\n )}\n </span>\n )}\n renderSecondary={(r) => {\n const humanMsg = r.messages?.find((messageRecord) => messageRecord.role === \"human\");\n const text = humanMsg?.content || \"—\";\n return <Text type=\"secondary\" style={{ fontSize: 13 }} ellipsis={{ tooltip: text }}>{text}</Text>;\n }}\n renderFooter={(r) => {\n if (r.error) return <Text type=\"danger\" style={{ fontSize: 12 }} ellipsis={{ tooltip: r.error }}>{r.error}</Text>;\n return null;\n }}\n renderDetails={(r) => {\n const dimensions = r.dimensionResults ?? [];\n return (\n <div>\n {r.summary && (\n <div className={styles.detailBlock}>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>Judge Summary</Text>\n <div style={{ fontSize: 13, marginTop: 4 }}>{r.summary}</div>\n </div>\n )}\n {dimensions.length > 0 && (\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12, marginBottom: 6, display: \"block\" }}>\n Dimension Scores ({dimensions.length} rubric{dimensions.length > 1 ? \"s\" : \"\"})\n </Text>\n {dimensions.map((dimension, index) => (\n <div\n key={dimensions.some((candidate, candidateIndex) => (\n candidateIndex !== index && candidate.name === dimension.name\n )) ? `${dimension.name}:${index}` : dimension.name}\n className={styles.dimensionRow}\n >\n <Text style={{ fontSize: 13, width: 120 }}>{dimension.name}</Text>\n <Progress percent={dimension.score} size=\"small\" style={{ flex: 1, maxWidth: 400, margin: 0 }}\n strokeColor={dimension.score >= 80 ? \"#22c55e\" : dimension.score >= 60 ? \"#f59e0b\" : \"#ef4444\"} />\n <Text style={{ fontSize: 13, width: 40, textAlign: \"right\" }}>{dimension.score}</Text>\n </div>\n ))}\n </div>\n )}\n {!r.summary && dimensions.length === 0 && (\n <Text type=\"secondary\" style={{ fontSize: 13 }}>No detail available</Text>\n )}\n </div>\n );\n }}\n />\n </div>\n </div>\n );\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useApi } from \"../useApi\";\nimport type { EvalRunDetailRecord } from \"./evalTypes\";\nimport { parseEvalRunDetail } from \"./evalGuards\";\n\n/** State and actions for a persisted evaluation run detail request. */\nexport interface UseEvalRunDetailResult {\n run: EvalRunDetailRecord | null;\n loading: boolean;\n refreshing: boolean;\n error: Error | null;\n refresh: () => Promise<EvalRunDetailRecord | null>;\n}\n\nfunction normalizeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\n/**\n * Fetches persisted run details, accepting only the requested ID with array results.\n * Stale requests are isolated from current state.\n */\nexport function useEvalRunDetail(runId: string | null): UseEvalRunDetailResult {\n const { get } = useApi();\n const [run, setRun] = useState<EvalRunDetailRecord | null>(null);\n const [loading, setLoading] = useState(false);\n const [refreshing, setRefreshing] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const runIdRef = useRef(runId);\n const runRef = useRef<EvalRunDetailRecord | null>(null);\n const requestTokenRef = useRef(0);\n const mountedRef = useRef(true);\n runIdRef.current = runId;\n\n const refresh = useCallback(async (): Promise<EvalRunDetailRecord | null> => {\n const currentRunId = runIdRef.current;\n if (!currentRunId) return null;\n\n const requestToken = ++requestTokenRef.current;\n const hasRun = runRef.current !== null;\n if (mountedRef.current) {\n setError(null);\n setLoading(!hasRun);\n setRefreshing(hasRun);\n }\n\n try {\n const response = await get<{\n success: boolean;\n error?: string;\n data?: EvalRunDetailRecord;\n }>(\n `/api/eval/runs/${encodeURIComponent(currentRunId)}`\n );\n if (response.success !== true) {\n throw new Error(response.error || \"Failed to fetch evaluation run detail\");\n }\n const detail = parseEvalRunDetail(response.data, currentRunId);\n if (!detail) {\n throw new Error(\"Evaluation run detail response is missing or malformed\");\n }\n\n if (mountedRef.current && requestToken === requestTokenRef.current) {\n runRef.current = detail;\n setRun(detail);\n setError(null);\n }\n return detail;\n } catch (requestError) {\n const normalizedError = normalizeError(requestError);\n if (mountedRef.current && requestToken === requestTokenRef.current) {\n setError(normalizedError);\n }\n return null;\n } finally {\n if (mountedRef.current && requestToken === requestTokenRef.current) {\n setLoading(false);\n setRefreshing(false);\n }\n }\n }, [get]);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n requestTokenRef.current += 1;\n };\n }, []);\n\n useEffect(() => {\n requestTokenRef.current += 1;\n runRef.current = null;\n setRun(null);\n setLoading(false);\n setRefreshing(false);\n setError(null);\n if (runId) void refresh();\n }, [refresh, runId]);\n\n return { run, loading, refreshing, error, refresh };\n}\n","import React from \"react\";\nimport { Typography, Progress } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { Play, Ban, RefreshCw, Link2 } from \"lucide-react\";\nimport { ElementProps, ToolCallData } from \"../types\";\nimport { useEvalRunStream } from \"../../../hooks/eval/useEvalRunStream\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\nimport { parseManageEvalResponse, ManageEvalResult, ErrorCard, StatCell } from \"./eval_manage_card\";\nimport { EntityCard } from \"../../EntityList/EntityCard\";\n\nconst { Text } = Typography;\n\nconst useStyles = createStyles(({ css }) => ({\n liveCard: css`\n display: inline-block;\n max-width: 100%;\n min-height: 120px;\n\n .lattice-stat-label {\n opacity: 0;\n transition: opacity 0.25s ease;\n }\n &:hover .lattice-stat-label {\n opacity: 1;\n }\n `,\n compactLiveCard: css`\n display: inline-block;\n max-width: 100%;\n `,\n}));\nconst actionTitleStyle: React.CSSProperties = {\n fontSize: 11,\n textTransform: \"uppercase\",\n letterSpacing: 0.5,\n};\n\nconst runTitle = (action: string) =>\n action === \"resume\" ? \"RESUME TEST RUN\" : action === \"status\" ? \"CHECK TEST STATUS\" : \"START TEST RUN\";\n\nconst runIcon = (action: string, size = 20) => {\n if (action === \"resume\") return <Link2 size={size} />;\n if (action === \"status\") return <RefreshCw size={size} />;\n return <Play size={size} />;\n};\n\nconst TERMINAL_STATUSES = [\"completed\", \"failed\", \"aborted\"];\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst nonemptyString = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.trim().length > 0 ? value : undefined;\n\nconst runStatus = (value: unknown): string | undefined =>\n typeof value === \"string\" && [\"pending\", \"running\", \"completed\", \"failed\", \"aborted\"].includes(value)\n ? value\n : undefined;\n\nconst nonnegativeNumber = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : undefined;\n\nexport const RunLiveCard: React.FC<{\n data: ToolCallData;\n result: ManageEvalResult;\n compact?: boolean;\n}> = ({ data, result, compact = false }) => {\n const openSideApp = useSideAppOpener();\n const { styles } = useStyles();\n const args = data?.args ?? {};\n const resultData = isRecord(result.data) ? result.data : {};\n const action = (args.action as string) ?? \"\";\n const runId = nonemptyString(args.runId) ?? nonemptyString(resultData.runId) ?? nonemptyString(resultData.id) ?? \"\";\n const initialStatus = runStatus(resultData.status);\n const terminal = initialStatus ? TERMINAL_STATUSES.includes(initialStatus) : false;\n\n const { status, progress } = useEvalRunStream(terminal ? null : runId || null);\n\n const effectiveStatus = terminal ? initialStatus : status;\n const done = terminal || effectiveStatus === \"completed\";\n const total = terminal ? nonnegativeNumber(resultData.totalCases) ?? 0 : progress.total;\n const passed = terminal ? nonnegativeNumber(resultData.passedCases) ?? 0 : progress.passed;\n const failed = terminal ? nonnegativeNumber(resultData.failedCases) ?? 0 : progress.failed;\n const completed = terminal ? total : progress.completed;\n const avgScore = terminal ? nonnegativeNumber(resultData.avgScore) : undefined;\n const passRate = total > 0 ? Math.round((passed / total) * 100) : null;\n\n const statusColor =\n effectiveStatus === \"completed\" ? \"#22c55e\"\n : effectiveStatus === \"failed\" || effectiveStatus === \"error\" ? \"#ef4444\"\n : effectiveStatus === \"aborted\" || effectiveStatus === \"disconnected\" ? \"#f59e0b\"\n : \"#3b82f6\";\n\n const handleClick = () => {\n if (!runId) return;\n openSideApp({\n component_key: \"run_eval\",\n data: { initial: { page: \"run\", runId } },\n });\n };\n\n if (compact) {\n return (\n <EntityCard\n item={data}\n dense\n className={styles.compactLiveCard}\n onClick={handleClick}\n renderPrimary={() => (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, flexWrap: \"wrap\" }}>\n {runIcon(action, 14)}\n <Text strong style={actionTitleStyle}>{runTitle(action)}</Text>\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: statusColor,\n display: \"inline-block\",\n flexShrink: 0,\n }}\n />\n {action === \"start\" ? (\n <Text style={{ fontSize: 12 }}>{terminal ? \"Sync call\" : \"Async task\"}</Text>\n ) : (\n <>\n <Text style={{ fontSize: 12 }}>{passRate !== null ? `${passRate}%` : \"—\"} pass</Text>\n <Text style={{ fontSize: 12, color: \"#22c55e\" }}>{passed} passed</Text>\n <Text style={{ fontSize: 12, color: \"#ef4444\" }}>{failed} failed</Text>\n {done && avgScore !== undefined && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>avg {avgScore}</Text>\n )}\n {!done && total > 0 && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>{completed}/{total} cases</Text>\n )}\n </>\n )}\n </div>\n )}\n />\n );\n }\n\n return (\n <EntityCard\n item={data}\n className={styles.liveCard}\n onClick={handleClick}\n renderIcon={() => runIcon(action)}\n renderPrimary={() => (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <Text strong style={actionTitleStyle}>{runTitle(action)}</Text>\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 4 }}>\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: statusColor,\n display: \"inline-block\",\n flexShrink: 0,\n }}\n />\n <span className=\"lattice-stat-label\" style={{ fontSize: 12, color: \"rgba(0, 0, 0, 0.65)\" }}>\n {effectiveStatus}\n </span>\n </span>\n </div>\n )}\n renderHeaderActions={() => (\n <div style={{ display: \"flex\", gap: 14 }}>\n <StatCell value={passRate !== null ? `${passRate}%` : \"—\"} label=\"pass rate\" />\n <StatCell value={<span style={{ color: \"#22c55e\" }}>{passed}</span>} label=\"passed\" />\n <StatCell value={<span style={{ color: \"#ef4444\" }}>{failed}</span>} label=\"failed\" />\n </div>\n )}\n renderDetails={() =>\n done ? (\n avgScore !== undefined ? (\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: 8 }}>\n <Text strong style={{ fontSize: 24, lineHeight: 1.2, color: statusColor }}>{avgScore}</Text>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>avg score</Text>\n </div>\n ) : null\n ) : (\n <>\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: 8 }}>\n <Text style={{ fontSize: 13, color: statusColor }}>{effectiveStatus}</Text>\n {!done && <Text type=\"secondary\" style={{ fontSize: 12 }}>{completed}/{total} cases</Text>}\n </div>\n {effectiveStatus === \"running\" && total > 0 && (\n <Progress\n percent={Math.round((completed / total) * 100)}\n size=\"small\"\n status=\"active\"\n />\n )}\n </>\n )\n }\n />\n );\n};\n\nexport const AbortResultCard: React.FC<{\n data: ToolCallData;\n result: ManageEvalResult;\n}> = ({ data, result }) => {\n const openSideApp = useSideAppOpener();\n const { styles } = useStyles();\n const args = data?.args ?? {};\n const resultData = isRecord(result.data) ? result.data : {};\n const runId = nonemptyString(args.runId) ?? \"\";\n const aborted = resultData.aborted === true;\n\n const handleClick = () => {\n if (!runId) return;\n openSideApp({\n component_key: \"run_eval\",\n data: { initial: { page: \"run\", runId } },\n });\n };\n\n return (\n <EntityCard\n item={data}\n className={styles.liveCard}\n onClick={handleClick}\n renderIcon={() => <Ban size={20} />}\n renderPrimary={() => (\n <>\n <Text strong style={actionTitleStyle}>ABORT TEST RUN</Text>\n <div>\n <Text strong style={{ fontSize: 14 }}>\n {aborted ? \"✓ Run aborted\" : \"✗ Abort failed\"}\n </Text>\n </div>\n </>\n )}\n />\n );\n};\n\n/**\n * Card view for run_eval tool calls in the chat stream.\n *\n * Dispatches on data.args.action: start/status/resume render a live run\n * card (SSE progress via useEvalRunStream); abort renders a static result.\n */\nexport const RunEvalCard: React.FC<Pick<ElementProps<ToolCallData>, \"data\">> = ({ data }) => {\n const args = data?.args ?? {};\n const action = typeof args.action === \"string\" ? args.action : \"\";\n const result = parseManageEvalResponse(data?.response);\n\n if (!result.success) {\n return <ErrorCard message={result.error ?? \"run_eval failed\"} />;\n }\n if (action === \"abort\") {\n return <AbortResultCard data={data} result={result} />;\n }\n switch (action) {\n case \"start\":\n case \"status\":\n return <RunLiveCard data={data} result={result} compact />;\n case \"resume\":\n return <RunLiveCard data={data} result={result} />;\n default:\n return null;\n }\n};\n","import React, { useMemo } from \"react\";\nimport { Collapse, Tooltip, Typography } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { ClipboardList } from \"lucide-react\";\nimport { ElementProps, ToolCallData } from \"../types\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\nimport { parseManageEvalResponse, ManageEvalResult, ErrorCard, StatCell } from \"./eval_manage_card\";\nimport { EntityCard } from \"../../EntityList/EntityCard\";\n\nconst { Text } = Typography;\n\nconst useStyles = createStyles(({ css }) => ({\n liveCard: css`\n display: inline-block;\n max-width: 100%;\n min-height: 120px;\n\n .lattice-stat-label {\n opacity: 0;\n transition: opacity 0.25s ease;\n }\n &:hover .lattice-stat-label {\n opacity: 1;\n }\n `,\n}));\n\nconst actionTitleStyle: React.CSSProperties = {\n fontSize: 11,\n textTransform: \"uppercase\",\n letterSpacing: 0.5,\n};\n\nconst metaStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"rgba(0, 0, 0, 0.45)\",\n fontSize: 12,\n};\n\ninterface ResultRow {\n id: string;\n suiteName?: string;\n pass: boolean;\n score: number;\n interrupted?: boolean;\n summary?: string;\n dimensionResults?: Array<{ name: string; score: number; reason?: string }>;\n}\n\ninterface SuiteAgg {\n suiteName: string;\n passed: number;\n failed: number;\n interrupted: number;\n total: number;\n passRate: number | null;\n failedSummaries: string[];\n}\n\nconst aggregateBySuite = (rows: ResultRow[]): SuiteAgg[] => {\n const bySuite = new Map<string, SuiteAgg>();\n for (const r of rows) {\n const name = r.suiteName || \"Unknown\";\n const agg = bySuite.get(name) ?? {\n suiteName: name, passed: 0, failed: 0, interrupted: 0, total: 0, passRate: null, failedSummaries: [],\n };\n agg.total += 1;\n if (r.interrupted) agg.interrupted += 1;\n else if (r.pass) agg.passed += 1;\n else {\n agg.failed += 1;\n if (r.summary) agg.failedSummaries.push(r.summary);\n }\n bySuite.set(name, agg);\n }\n const suites = [...bySuite.values()];\n for (const s of suites) {\n const judged = s.passed + s.failed;\n s.passRate = judged > 0 ? Math.round((s.passed / judged) * 100) : null;\n }\n return suites.sort((a, b) => b.failed - a.failed || b.total - a.total);\n};\n\ninterface DimensionAgg {\n name: string;\n score: number;\n}\n\nconst aggregateDimensions = (rows: ResultRow[]): DimensionAgg[] => {\n const byName = new Map<string, { total: number; count: number }>();\n for (const r of rows) {\n for (const d of r.dimensionResults ?? []) {\n const acc = byName.get(d.name) ?? { total: 0, count: 0 };\n acc.total += d.score;\n acc.count += 1;\n byName.set(d.name, acc);\n }\n }\n return [...byName.entries()]\n .map(([name, acc]) => ({ name, score: acc.count > 0 ? acc.total / acc.count : 0 }))\n .sort((a, b) => a.score - b.score);\n};\n\nexport const RunResultsCard: React.FC<{\n data: ToolCallData;\n result: ManageEvalResult;\n}> = ({ data, result }) => {\n const openSideApp = useSideAppOpener();\n const { styles } = useStyles();\n const args = data?.args ?? {};\n const runId = (args.runId as string) ?? \"\";\n const raw = result.data;\n\n const holdout = !Array.isArray(raw) && raw?.holdout === true;\n const rows = Array.isArray(raw) ? (raw as ResultRow[]) : [];\n\n const stats = useMemo(() => {\n const passed = rows.filter((r) => r.pass && !r.interrupted).length;\n const failed = rows.filter((r) => !r.pass && !r.interrupted).length;\n const interrupted = rows.filter((r) => r.interrupted).length;\n const judged = passed + failed;\n return {\n passed,\n failed,\n interrupted,\n total: rows.length,\n passRate: judged > 0 ? Math.round((passed / judged) * 100) : null,\n };\n }, [rows]);\n\n const suites = useMemo(() => aggregateBySuite(rows), [rows]);\n\n const dimensions = useMemo(() => aggregateDimensions(rows), [rows]);\n\n const avgScore = rows.length > 0\n ? rows.reduce((s, r) => s + r.score, 0) / rows.length\n : null;\n\n const handleClick = () => {\n if (!runId) return;\n openSideApp({\n component_key: \"read_eval\",\n data: { initial: { page: \"run\", runId } },\n });\n };\n\n return (\n <EntityCard\n item={data}\n className={styles.liveCard}\n onClick={handleClick}\n renderIcon={() => <ClipboardList size={20} />}\n renderPrimary={() => (\n <Text strong style={actionTitleStyle}>TEST REPORT</Text>\n )}\n renderHeaderActions={() => (\n <div style={{ display: \"flex\", gap: 14 }}>\n <StatCell\n value={holdout ? `${Math.round((raw.passRate ?? 0) * 100)}%` : stats.passRate !== null ? `${stats.passRate}%` : \"—\"}\n label=\"pass rate\"\n />\n <StatCell\n value={<span style={{ color: \"#22c55e\" }}>{holdout ? raw.passedCases : stats.passed}</span>}\n label=\"passed\"\n />\n <StatCell\n value={<span style={{ color: \"#ef4444\" }}>{holdout ? raw.failedCases : stats.failed}</span>}\n label=\"failed\"\n />\n <StatCell\n value={holdout || avgScore === null ? \"—\" : avgScore.toFixed(1)}\n label=\"avg score\"\n />\n </div>\n )}\n renderDetails={() =>\n holdout ? (\n <>\n <Text type=\"secondary\" style={{ fontSize: 12, display: \"block\" }}>\n Hold-out run — per-case results withheld. Aggregates only.\n </Text>\n {raw.interruptedCases > 0 && (\n <Text type=\"secondary\" style={{ fontSize: 12, display: \"block\" }}>\n {raw.interruptedCases} interrupted\n </Text>\n )}\n </>\n ) : suites.length === 0 ? (\n <Text type=\"secondary\" style={{ fontSize: 13 }}>No results yet</Text>\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n {suites.map((s) => {\n const row = (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: s.failed > 0 ? \"#ef4444\" : s.interrupted > 0 ? \"#f59e0b\" : \"#22c55e\",\n display: \"inline-block\",\n flexShrink: 0,\n }}\n />\n <Text style={{ fontSize: 13, flex: 1 }}>{s.suiteName}</Text>\n <Text style={{ fontSize: 13, color: s.failed > 0 ? \"#ef4444\" : \"rgba(0, 0, 0, 0.65)\" }}>\n {s.passRate !== null ? `${s.passRate}%` : \"—\"} ({s.passed}/{s.total})\n </Text>\n {s.interrupted > 0 && (\n <span style={metaStyle}>{s.interrupted} interrupted</span>\n )}\n </div>\n );\n return s.failedSummaries.length > 0 ? (\n <Tooltip\n key={s.suiteName}\n title={s.failedSummaries.slice(0, 3).join(\"\\n\")}\n overlayStyle={{ maxWidth: 320 }}\n >\n {row}\n </Tooltip>\n ) : (\n <div key={s.suiteName}>{row}</div>\n );\n })}\n </div>\n {dimensions.length > 0 && (\n <div style={{ borderTop: \"1px solid rgba(0, 0, 0, 0.06)\", paddingTop: 8 }}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: \"6px 16px\" }}>\n {dimensions.map((d) => {\n const raw = d.score <= 1 ? d.score * 100 : d.score;\n const score = Math.round(raw);\n return (\n <div key={d.name} style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: score >= 80 ? \"#22c55e\" : score >= 60 ? \"#f59e0b\" : \"#ef4444\",\n display: \"inline-block\",\n flexShrink: 0,\n }}\n />\n <Text style={{ fontSize: 13, flex: 1, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>{d.name}</Text>\n <Text strong style={{ fontSize: 13, color: score >= 80 ? \"rgba(0, 0, 0, 0.65)\" : score >= 60 ? \"#f59e0b\" : \"#ef4444\" }}>\n {score}\n </Text>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n )\n }\n />\n );\n};\n\nconst GenericEvalCard: React.FC<{ data: ToolCallData }> = ({ data }) => {\n return (\n <Collapse\n size=\"small\"\n bordered={false}\n expandIconPosition=\"end\"\n items={[\n {\n key: data.id,\n label: <Text strong style={{ fontSize: 12 }}>{data.name} · {data.args?.action}</Text>,\n children: <pre style={{ fontSize: 12, whiteSpace: \"pre-wrap\", margin: 0 }}>{data.response}</pre>,\n },\n ]}\n />\n );\n};\n\n/**\n * Card view for read_eval tool calls in the chat stream.\n *\n * get_run_results renders a results analysis card (suite aggregation +\n * metrics); other read actions fall back to a generic collapsible card.\n */\nexport const ReadEvalCard: React.FC<Pick<ElementProps<ToolCallData>, \"data\">> = ({ data }) => {\n const args = data?.args ?? {};\n const action = typeof args.action === \"string\" ? args.action : \"\";\n const result = parseManageEvalResponse(data?.response);\n\n if (!result.success) {\n return <ErrorCard message={result.error ?? \"read_eval failed\"} />;\n }\n if (action === \"get_run_results\") {\n return <RunResultsCard data={data} result={result} />;\n }\n return <GenericEvalCard data={data} />;\n};\n","import React from \"react\";\nimport { Typography } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { ListTodo, ListChecks } from \"lucide-react\";\nimport { ElementProps, ToolCallData } from \"../types\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\nimport { parseManageEvalResponse, ManageEvalResult, StatCell } from \"./eval_manage_card\";\nimport { EntityCard } from \"../../EntityList/EntityCard\";\n\nconst { Text } = Typography;\n\nconst useStyles = createStyles(({ css }) => ({\n liveCard: css`\n display: inline-block;\n max-width: 100%;\n min-height: 120px;\n\n .lattice-stat-label {\n opacity: 0;\n transition: opacity 0.25s ease;\n }\n &:hover .lattice-stat-label {\n opacity: 1;\n }\n `,\n compactLiveCard: css`\n display: inline-block;\n max-width: 100%;\n `,\n}));\n\nconst actionTitleStyle: React.CSSProperties = {\n fontSize: 11,\n textTransform: \"uppercase\",\n letterSpacing: 0.5,\n};\n\nconst truncate = (s: string, max = 120) =>\n s.length > max ? s.slice(0, max) + \"...\" : s;\n\nconst statusColor: Record<string, string> = {\n pending: \"#9ca3af\",\n in_progress: \"#3b82f6\",\n review: \"#8b5cf6\",\n completed: \"#22c55e\",\n failed: \"#ef4444\",\n interrupted: \"#f59e0b\",\n cancelled: \"#9ca3af\",\n};\n\nconst priorityColor: Record<string, string> = {\n high: \"#ef4444\",\n medium: \"#f59e0b\",\n low: \"#9ca3af\",\n};\n\nconst openTaskSideApp = (openSideApp: (card: { component_key: string; data: Record<string, unknown> }) => void) => {\n openSideApp({ component_key: \"manage_task\", data: {} });\n};\n\nexport const TaskLiveCard: React.FC<{\n data: ToolCallData;\n result: ManageEvalResult;\n}> = ({ data, result }) => {\n const openSideApp = useSideAppOpener();\n const { styles } = useStyles();\n const args = data?.args ?? {};\n const action = (args.action as string) ?? \"\";\n const item = (result.data as any) ?? {};\n const verb =\n action === \"create\" ? \"CREATE TASK\"\n : action === \"set_status\" ? \"SET STATUS\"\n : \"UPDATE TASK\";\n const title = (item.title as string) ?? (args.title as string) ?? \"\";\n const description = (item.description as string) ?? \"\";\n const status = (item.status as string) ?? \"pending\";\n const priority = (item.priority as string) ?? \"medium\";\n const dependencies = Array.isArray(item.dependencies) ? item.dependencies : [];\n const reviewerAction = (result as any).reviewerAction as string | undefined;\n\n const handleClick = () => {\n if (item.id) {\n openSideApp({ component_key: \"manage_task\", data: { task: item } });\n return;\n }\n openTaskSideApp(openSideApp);\n };\n\n return (\n <EntityCard\n item={data}\n className={styles.liveCard}\n onClick={handleClick}\n renderIcon={() => <ListTodo size={20} />}\n renderPrimary={() => (\n <>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <Text strong style={actionTitleStyle}>{verb}</Text>\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: statusColor[status] ?? \"#9ca3af\",\n display: \"inline-block\",\n flexShrink: 0,\n }}\n />\n </div>\n <div>\n <Text strong style={{ fontSize: 14 }}>{title}</Text>\n </div>\n </>\n )}\n renderHeaderActions={() => (\n <div style={{ display: \"flex\", gap: 14 }}>\n <StatCell value={<span style={{ color: priorityColor[priority] ?? undefined }}>{priority}</span>} label=\"priority\" />\n <StatCell value={status} label=\"status\" />\n {dependencies.length > 0 && (\n <StatCell value={dependencies.length} label=\"deps\" />\n )}\n </div>\n )}\n renderDetails={() => (\n <>\n {description && (\n <Text style={{ fontSize: 13 }}>{truncate(description)}</Text>\n )}\n {reviewerAction && (\n <div style={{ marginTop: 6 }}>\n <Text style={{ fontSize: 12, color: reviewerAction === \"approved\" ? \"#22c55e\" : \"#ef4444\" }}>\n Review {reviewerAction}\n </Text>\n </div>\n )}\n </>\n )}\n />\n );\n};\n\nexport const TaskListCard: React.FC<{\n data: ToolCallData;\n result: ManageEvalResult;\n}> = ({ data, result }) => {\n const openSideApp = useSideAppOpener();\n const { styles } = useStyles();\n const items = Array.isArray(result.data) ? (result.data as any[]) : [];\n const count = (result as any).count ?? items.length;\n\n const inProgress = items.filter((t) => t.status === \"in_progress\").length;\n const completed = items.filter((t) => t.status === \"completed\").length;\n\n const handleClick = () => openTaskSideApp(openSideApp);\n\n return (\n <EntityCard\n item={data}\n className={styles.liveCard}\n onClick={handleClick}\n renderIcon={() => <ListChecks size={20} />}\n renderPrimary={() => (\n <Text strong style={actionTitleStyle}>TASK LIST</Text>\n )}\n renderHeaderActions={() => (\n <div style={{ display: \"flex\", gap: 14 }}>\n <StatCell value={count} label=\"tasks\" />\n <StatCell value={<span style={{ color: \"#3b82f6\" }}>{inProgress}</span>} label=\"in progress\" />\n <StatCell value={<span style={{ color: \"#22c55e\" }}>{completed}</span>} label=\"completed\" />\n </div>\n )}\n renderDetails={() => (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n {items.slice(0, 3).map((t) => (\n <div\n key={t.id}\n style={{ display: \"flex\", alignItems: \"center\", gap: 8, cursor: t.id ? \"pointer\" : undefined }}\n onClick={(e) => {\n if (!t.id) return;\n e.stopPropagation();\n openSideApp({ component_key: \"manage_task\", data: { task: t } });\n }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: statusColor[t.status] ?? \"#9ca3af\",\n display: \"inline-block\",\n flexShrink: 0,\n }}\n />\n <Text style={{ fontSize: 13, flex: 1, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {t.title}\n </Text>\n <Text style={{ fontSize: 12, color: priorityColor[t.priority] ?? undefined }}>{t.priority}</Text>\n </div>\n ))}\n {items.length > 3 && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>+{items.length - 3} more</Text>\n )}\n </div>\n )}\n />\n );\n};\n\nexport const TaskDeleteCard: React.FC<{\n data: ToolCallData;\n}> = ({ data }) => {\n const openSideApp = useSideAppOpener();\n const { styles } = useStyles();\n const args = data?.args ?? {};\n const title = (args.title as string) ?? \"\";\n\n const handleClick = () => openTaskSideApp(openSideApp);\n\n return (\n <EntityCard\n item={data}\n dense\n className={styles.compactLiveCard}\n onClick={handleClick}\n renderPrimary={() => (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <Text strong style={actionTitleStyle}>\n <span style={{ color: \"#ef4444\" }}>✓</span> Deleted task\n </Text>\n {title && <Text type=\"secondary\" style={{ fontSize: 12 }}>{title}</Text>}\n </div>\n )}\n />\n );\n};\n\nconst failureActionLabel: Record<string, string> = {\n create: \"CREATE TASK\",\n update: \"UPDATE TASK\",\n set_status: \"SET STATUS\",\n list: \"LIST TASKS\",\n delete: \"DELETE TASK\",\n};\n\nconst TaskFailureCard: React.FC<{ action: string; message: string }> = ({ action, message }) => {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"10px 14px\",\n borderRadius: 12,\n background: \"rgba(156, 163, 175, 0.08)\",\n border: \"1px solid rgba(156, 163, 175, 0.35)\",\n color: \"#9ca3af\",\n fontSize: 13,\n }}\n >\n <span>✕</span>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2, minWidth: 0 }}>\n <Text strong style={actionTitleStyle}>\n {failureActionLabel[action] ?? \"MANAGE TASK\"}\n </Text>\n <span>{truncate(message)}</span>\n </div>\n </div>\n );\n};\n\n/**\n * Card view for manage_task tool calls in the chat stream.\n *\n * Dispatches on data.args.action: create/update/set_status render a task\n * live card, list renders a task list card, delete renders a compact result card.\n */\nexport const TaskManageCard: React.FC<Pick<ElementProps<ToolCallData>, \"data\">> = ({ data }) => {\n const args = data?.args ?? {};\n const action = typeof args.action === \"string\" ? args.action : \"\";\n const result = parseManageEvalResponse(data?.response);\n\n if (!result.success) {\n return <TaskFailureCard action={action} message={result.error ?? \"manage_task failed\"} />;\n }\n switch (action) {\n case \"create\":\n case \"update\":\n case \"set_status\":\n return <TaskLiveCard data={data} result={result} />;\n case \"list\":\n return <TaskListCard data={data} result={result} />;\n case \"delete\":\n return <TaskDeleteCard data={data} />;\n default:\n return null;\n }\n};\n","import { ConfirmFeedback } from \"./confirm_feedback\";\nimport { ClarifyFeedback } from \"./clarify_feedback\";\nimport { TaskReview } from \"./task_review\";\nimport { GenericDataTable } from \"./generic_data_table\";\nimport { GenericDataTableSideApp } from \"./generic_data_table_side_app\";\nimport { ToolCall } from \"./ToolCall\";\nimport { ToolCard } from \"./ToolCard\";\nimport { EvalManageCard } from \"./eval_manage_card\";\nimport { EvalDetailSideApp } from \"./eval_detail_side_app\";\nimport { RunEvalCard } from \"./run_eval_card\";\nimport { ReadEvalCard } from \"./read_eval_card\";\nimport { TaskManageCard } from \"./task_manage_card\";\nimport { lazy, Suspense } from \"react\";\nimport { Spin } from \"antd\";\nimport { Todo } from \"./Todo\";\nimport { WriteTodos } from \"./WriteTodos\";\nimport { FileExplorer } from \"../FileExplorer\";\nimport { AttachmentsCard } from \"./attachments_card\";\nimport AttachmentsViewerSideApp from \"./attachments_viewer_side_app\";\nimport { ElementMeta } from \"../types\";\nimport type { TaskItem } from \"@axiom-lattice/protocols\";\nimport { WriteFile } from \"./WriteFile\";\nimport { FileContentDiffView } from \"./file_content_diff_view\";\nimport { EditFile } from \"./EditFile\";\nimport { TaskCard } from \"./task_card\";\nimport { TaskDetail } from \"./task_detail\";\nimport { InternetSearchCard } from \"./internet_search_card\";\nimport { ScheduleViewer } from \"./schedule_viewer\";\nimport { BrowserViewer } from \"./browser_view_card\";\nimport { ExecuteCode } from \"./execute_code\";\nimport TeamGraph from \"./TeamGraph\";\nimport { TaskBoard } from \"./TaskBoard\";\nimport { TeamChat } from \"./Mailbox\";\nimport { MailboxPanel } from \"./MailboxPanel\";\nimport { ShowWidget } from \"./ShowWidget\";\nimport { ShowWidgetApp } from \"./ShowWidgetApp\";\nimport { SearchCollectionResult } from \"./search_collection_result\";\n\n// Lazy: TasksSideApp pulls the @xyflow/react + dagre graph stack (via\n// TaskDependencyGraph), and TeamWorkspace pulls @xyflow/react (via\n// TeamOrgCanvas). This registry is statically reachable from the embed page,\n// so static imports here would put those graph stacks into the embed's\n// initial closure. Each module loads when its side app first opens.\nconst TasksSideApp = lazy(() =>\n import(\"../../Tasks/TasksSideApp\").then((m) => ({ default: m.TasksSideApp }))\n);\nconst TeamWorkspace = lazy(() =>\n import(\"./TeamWorkspace\").then((m) => ({ default: m.TeamWorkspace }))\n);\n\nexport const elements: Record<string, ElementMeta> = {\n action_show_attachments_uploader: {\n card_view: () => null,\n action: (data: any) => {\n console.log(data);\n },\n },\n generic_data_table: {\n card_view: GenericDataTable,\n side_app_view: GenericDataTableSideApp,\n },\n confirm: {\n card_view: ConfirmFeedback,\n },\n clarify: {\n card_view: ClarifyFeedback,\n },\n task_review: {\n card_view: TaskReview,\n },\n tool_call: {\n card_view: ToolCall,\n },\n manage_eval: {\n card_view: EvalManageCard,\n side_app_view: EvalDetailSideApp,\n },\n run_eval: {\n card_view: RunEvalCard,\n side_app_view: EvalDetailSideApp,\n },\n read_eval: {\n card_view: ReadEvalCard,\n side_app_view: EvalDetailSideApp,\n },\n manage_task: {\n card_view: TaskManageCard,\n side_app_view: ({ data }) => (\n <Suspense fallback={<Spin style={{ display: \"block\", margin: \"auto\" }} />}>\n <TasksSideApp initialTask={data?.task as TaskItem | undefined} />\n </Suspense>\n ),\n },\n tool_card: {\n card_view: ToolCard,\n },\n todo_list: {\n card_view: Todo,\n },\n write_todos: {\n card_view: WriteTodos,\n },\n internet_search: {\n card_view: InternetSearchCard,\n },\n write_file: {\n card_view: WriteFile,\n },\n edit_file: {\n card_view: EditFile,\n },\n file_explorer: {\n card_view: () => null,\n side_app_view: FileExplorer,\n },\n attachments: {\n card_view: AttachmentsCard,\n side_app_view: AttachmentsViewerSideApp,\n },\n file_content_diff_view: {\n card_view: FileContentDiffView,\n side_app_view: FileContentDiffView,\n },\n task: {\n card_view: TaskCard,\n side_app_view: TaskDetail,\n },\n schedule_viewer: {\n card_view: () => null,\n side_app_view: ScheduleViewer,\n },\n browser_viewer: {\n card_view: BrowserViewer,\n side_app_view: AttachmentsViewerSideApp,\n },\n execute_code: {\n card_view: ExecuteCode,\n },\n create_team: {\n card_view: TeamGraph,\n },\n team_workspace: {\n card_view: () => null,\n side_app_view: (props) => (\n <Suspense fallback={<Spin style={{ display: \"block\", margin: \"auto\" }} />}>\n <TeamWorkspace {...props} />\n </Suspense>\n ),\n },\n task_board: {\n card_view: TaskBoard,\n side_app_view: TaskBoard,\n },\n mailbox: {\n card_view: TeamChat,\n side_app_view: MailboxPanel,\n },\n show_widget: {\n card_view: ShowWidget,\n side_app_view: ShowWidgetApp\n },\n search_collection_result: {\n card_view: SearchCollectionResult,\n },\n};\n","import { Card, Tag, List, Typography, Space, Button } from \"antd\";\nimport { ElementProps } from \"../types\";\nimport { createStyles } from \"antd-style\";\nimport {\n ArrowRightOutlined,\n CheckCircleOutlined,\n ClockCircleOutlined,\n SyncOutlined,\n DownOutlined,\n UpOutlined,\n} from \"@ant-design/icons\";\nimport { useState, useEffect } from \"react\";\n\nconst { Text } = Typography;\n\nconst useStyle = createStyles(({ token, css }) => ({\n card: css`\n max-width: 1200px;\n background: linear-gradient(\n 919deg,\n rgb(67 81 232 / 8%),\n rgb(249 249 249 / 28%) 43%\n );\n `,\n todoItem: css`\n padding: 8px 0;\n border-bottom: 1px solid ${token.colorBorderSecondary};\n &:last-child {\n border-bottom: none;\n }\n `,\n completed: css`\n opacity: 0.7;\n `,\n inProgress: css`\n font-weight: 500;\n `,\n pending: css`\n opacity: 0.8;\n `,\n}));\n\nexport interface TodoItem {\n content: string;\n status: \"completed\" | \"in_progress\" | \"pending\";\n}\n\nexport interface TodoProps extends ElementProps<TodoItem[]> {\n focusMode?: boolean;\n smartCollapse?: boolean;\n}\n\nexport const Todo: React.FC<TodoProps> = ({\n data,\n component_key,\n interactive = true,\n focusMode = false,\n smartCollapse = true,\n}) => {\n const { styles } = useStyle();\n\n /**\n * Calculate default expanded state based on smartCollapse mode\n * - All pending (initial state): expanded\n * - All completed (done state): expanded\n * - Has in_progress tasks: collapsed\n */\n const getDefaultExpanded = (): boolean => {\n if (!data || !Array.isArray(data) || data.length <= 3) {\n return true;\n }\n\n const allPending = data.every((item) => item.status === \"pending\");\n const allCompleted = data.every((item) => item.status === \"completed\");\n\n // Expand when all pending (initial) or all completed (done)\n // Collapse when there are in-progress tasks\n return allPending || allCompleted;\n };\n\n const [isExpanded, setIsExpanded] = useState(() =>\n smartCollapse ? getDefaultExpanded() : false\n );\n\n // Update expanded state when data changes in smartCollapse mode\n useEffect(() => {\n if (smartCollapse) {\n setIsExpanded(getDefaultExpanded());\n }\n }, [data, smartCollapse]);\n\n const getStatusIcon = (status: string) => {\n switch (status) {\n case \"completed\":\n return <CheckCircleOutlined style={{ color: \"#52c41a\" }} />;\n case \"in_progress\":\n return <ArrowRightOutlined style={{ fontWeight: \"500\" }} />;\n case \"pending\":\n return <ClockCircleOutlined style={{ color: \"gray\" }} />;\n default:\n return null;\n }\n };\n\n const getStatusColor = (status: string) => {\n switch (status) {\n case \"completed\":\n return \"success\";\n case \"in_progress\":\n return \"processing\";\n case \"pending\":\n return \"warning\";\n default:\n return \"default\";\n }\n };\n\n const getStatusText = (status: string) => {\n switch (status) {\n case \"completed\":\n return \"Completed\";\n case \"in_progress\":\n return \"In Progress\";\n case \"pending\":\n return \"Pending\";\n default:\n return status;\n }\n };\n\n const getItemClassName = (status: string) => {\n switch (status) {\n case \"completed\":\n return styles.completed;\n case \"in_progress\":\n return styles.inProgress;\n case \"pending\":\n return styles.pending;\n default:\n return \"\";\n }\n };\n\n /**\n * Filter todo items based on focusMode rules\n * - If focusMode is false or data.length <= 3, return all items\n * - If focusMode is true and data.length > 3:\n * - If there are in-progress tasks, start from the first in-progress task\n * - If all tasks are pending, start from the first task\n * - If all tasks are completed, show the last 3 tasks\n */\n const getFilteredData = (): TodoItem[] => {\n if (!data || !Array.isArray(data)) {\n return [];\n }\n\n // If focusMode is disabled or data has 3 or fewer items, return all\n if (!focusMode || data.length <= 3) {\n return data;\n }\n\n // Find the first in-progress task index\n const firstInProgressIndex = data.findIndex(\n (item) => item.status === \"in_progress\"\n );\n\n // If there are in-progress tasks, start from the first one\n if (firstInProgressIndex !== -1) {\n return data.slice(firstInProgressIndex, firstInProgressIndex + 3);\n }\n\n // Check if all tasks are completed\n const allCompleted = data.every((item) => item.status === \"completed\");\n\n // If all are completed, show the last 3\n if (allCompleted) {\n return data.slice(-3);\n }\n\n // Otherwise, all are pending (not started), show the first 3\n return data.slice(0, 3);\n };\n\n if (!data || !Array.isArray(data)) {\n return (\n <Card\n size=\"small\"\n className={`shadow-sm ${styles.card}`}\n bordered={false}\n >\n <Text type=\"secondary\">No todo items available</Text>\n </Card>\n );\n }\n\n const filteredData = getFilteredData();\n const hasMoreItems = filteredData.length < data.length;\n const displayData = isExpanded ? data : filteredData;\n\n return (\n <Card size=\"small\" className={`shadow-sm ${styles.card}`} bordered={false}>\n <Space direction=\"vertical\" style={{ width: \"100%\" }}>\n <List\n size=\"small\"\n dataSource={displayData}\n renderItem={(item: TodoItem, index: number) => (\n <List.Item\n className={`${styles.todoItem} ${getItemClassName(item.status)}`}\n >\n <Space align=\"center\" style={{ width: \"100%\" }}>\n {getStatusIcon(item.status)}\n <Text style={{ flex: 1 }}>{item.content}</Text>\n </Space>\n </List.Item>\n )}\n />\n\n {hasMoreItems && (\n <Button\n type=\"link\"\n size=\"small\"\n icon={isExpanded ? <UpOutlined /> : <DownOutlined />}\n onClick={() => setIsExpanded(!isExpanded)}\n style={{ padding: 0, height: \"auto\" }}\n >\n {isExpanded\n ? \"Collapse\"\n : `Show all ${data.length} items (${\n data.length - filteredData.length\n } hidden)`}\n </Button>\n )}\n\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n Total items: {data.length} | Completed:{\" \"}\n {data.filter((item) => item.status === \"completed\").length} | In\n Progress:{\" \"}\n {data.filter((item) => item.status === \"in_progress\").length} |\n Pending: {data.filter((item) => item.status === \"pending\").length}\n </Text>\n </Space>\n </Card>\n );\n};\n","import React from \"react\";\nimport { Space, Collapse, Typography } from \"antd\";\nimport { ElementProps, ToolCallData } from \"../types\";\nimport { CheckSquareOutlined, UnorderedListOutlined } from \"@ant-design/icons\";\nimport { Todo, TodoItem } from \"./Todo\";\nimport { ContentPreviewCollapse } from \"./ContentPreviewCollapse\";\n\nconst { Text } = Typography;\nconst { Panel: CollapsePanel } = Collapse;\n\nexport const WriteTodos: React.FC<ElementProps<ToolCallData>> = ({\n data,\n component_key,\n interactive = true,\n}) => {\n // Safely extract todos from ToolCallData\n const toolCallData = data;\n const todos: TodoItem[] = toolCallData?.args?.todos || [];\n\n // Calculate statistics\n const totalCount = todos.length;\n const completedCount = todos.filter(\n (item) => item.status === \"completed\"\n ).length;\n\n const expandIcon = () => {\n return <UnorderedListOutlined />;\n };\n\n const header = (\n <Space>\n <Text strong>TODOs</Text>\n <Text style={{ fontSize: 12 }} type=\"secondary\">\n {completedCount}/{totalCount} Done\n </Text>\n </Space>\n );\n\n if (!toolCallData) {\n return null;\n }\n\n return (\n <Collapse\n size=\"small\"\n bordered={false}\n defaultActiveKey={[toolCallData.id]}\n expandIcon={expandIcon}\n >\n <CollapsePanel\n key={toolCallData.id}\n header={header}\n style={{ minWidth: 400 }}\n >\n <Todo\n data={data.args.todos}\n component_key={component_key}\n interactive={interactive}\n focusMode={true}\n />\n </CollapsePanel>\n </Collapse>\n );\n};\n","import React, { useState, useEffect, useMemo } from \"react\";\nimport { Splitter, Tree, Empty, Button, Tooltip, message } from \"antd\";\nimport {\n FileOutlined,\n FileTextOutlined,\n FileMarkdownOutlined,\n FileImageOutlined,\n CodeOutlined,\n Html5Outlined,\n FileUnknownOutlined,\n FolderOutlined,\n FolderOpenOutlined,\n DownOutlined,\n RightOutlined,\n} from \"@ant-design/icons\";\nimport { createStyles } from \"antd-style\";\nimport type { TreeDataNode } from \"antd\";\nimport { MarkdownViewer } from \"./MarkdownViewer\";\nimport { ElementProps } from \"./types\";\nimport { getFileIcon } from \"./elements/getFileIcon\";\n\nexport interface ExplorerFile {\n name: string;\n content: string[];\n language?: string;\n created_at?: string;\n modified_at?: string;\n}\n\nexport interface FileExplorerProps {\n files?: Record<string, ExplorerFile>;\n className?: string;\n style?: React.CSSProperties;\n title?: string;\n}\n\nconst useStyles = createStyles(({ token, css }) => ({\n container: css`\n height: 100%;\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorBorder};\n border-radius: ${token.borderRadiusLG}px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n `,\n splitter: css`\n height: 100%;\n .ant-splitter-bar-dragger {\n background: transparent !important;\n &:hover {\n background: ${token.colorPrimary} !important;\n }\n }\n `,\n leftPanel: css`\n height: 100%;\n overflow: auto;\n padding: 0;\n background: ${token.colorBgContainer};\n border-right: 1px solid ${token.colorBorderSecondary};\n\n /* Custom scrollbar for tree */\n &::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n &::-webkit-scrollbar-thumb {\n background: ${token.colorBorder};\n border-radius: 3px;\n }\n `,\n rightPanel: css`\n height: 100%;\n overflow: auto;\n padding: 0;\n background: ${token.colorBgLayout};\n position: relative;\n `,\n\n emptyState: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: ${token.colorTextQuaternary};\n `,\n fileTree: css`\n background: transparent;\n font-size: 13px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto,\n \"Helvetica Neue\", Arial, sans-serif;\n\n .ant-tree-treenode {\n padding-bottom: 0 !important;\n width: 100%;\n &:hover {\n background-color: ${token.colorFillQuaternary};\n }\n }\n\n .ant-tree-node-content-wrapper {\n padding: 0 4px;\n border-radius: 0;\n transition: none;\n line-height: 24px;\n min-height: 24px;\n\n &:hover {\n background-color: transparent;\n }\n\n &.ant-tree-node-selected {\n background-color: ${token.controlItemBgActive} !important;\n color: ${token.colorText};\n font-weight: 500;\n }\n }\n\n .ant-tree-indent-unit {\n width: 16px;\n }\n\n .ant-tree-switcher {\n width: 20px;\n line-height: 24px;\n\n .anticon {\n font-size: 10px;\n color: ${token.colorTextSecondary};\n }\n }\n\n .ant-tree-title {\n display: inline-block;\n margin-left: 4px;\n }\n `,\n}));\n\nconst getFolderIcon = (expanded: boolean) => {\n const iconStyle = {\n fontSize: 14,\n marginRight: 4,\n color: \"#dcb67a\",\n verticalAlign: \"middle\",\n };\n return expanded ? (\n <FolderOpenOutlined style={iconStyle} />\n ) : (\n <FolderOutlined style={iconStyle} />\n );\n};\n\nfunction getLanguageFromFileName(filename: string): string {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n switch (ext) {\n case \"ts\":\n case \"tsx\":\n return \"typescript\";\n case \"js\":\n case \"jsx\":\n return \"javascript\";\n case \"py\":\n return \"python\";\n case \"md\":\n return \"markdown\";\n case \"json\":\n return \"json\";\n case \"html\":\n return \"html\";\n case \"css\":\n return \"css\";\n case \"java\":\n return \"java\";\n case \"go\":\n return \"go\";\n case \"rs\":\n return \"rust\";\n case \"c\":\n return \"c\";\n case \"cpp\":\n return \"cpp\";\n case \"yaml\":\n case \"yml\":\n return \"yaml\";\n case \"sql\":\n return \"sql\";\n case \"sh\":\n case \"bash\":\n return \"bash\";\n default:\n return \"text\";\n }\n}\n\n// Helper to sort tree nodes: folders first, then files, alphabetical\nconst sortTreeNodes = (nodes: TreeDataNode[]): TreeDataNode[] => {\n return nodes\n .sort((a, b) => {\n if (!!a.isLeaf === !!b.isLeaf) {\n return (a.title as string).localeCompare(b.title as string);\n }\n return a.isLeaf ? 1 : -1; // folders first\n })\n .map((node) => {\n if (node.children) {\n return { ...node, children: sortTreeNodes(node.children) };\n }\n return node;\n });\n};\n\nconst buildTreeData = (\n files: ExplorerFile[],\n expandedKeys: React.Key[]\n): TreeDataNode[] => {\n const root: TreeDataNode[] = [];\n\n files.forEach((file) => {\n const parts = file.name.split(\"/\");\n let currentLevel = root;\n\n parts.forEach((part, index) => {\n const isFile = index === parts.length - 1;\n // Key must be the full path for easy lookup\n const key = parts.slice(0, index + 1).join(\"/\");\n\n let existingNode = currentLevel.find((node) => node.key === key);\n\n if (!existingNode) {\n const title =\n part === \"\" && index === 0 ? (\n <span\n style={{\n color: \"rgba(0, 0, 0, 0.45)\",\n fontStyle: \"italic\",\n fontSize: 12,\n }}\n >\n <root>\n </span>\n ) : (\n part\n );\n\n const newNode: TreeDataNode = {\n title: title,\n key: key,\n isLeaf: isFile,\n icon: isFile\n ? getFileIcon(part)\n : getFolderIcon(expandedKeys.includes(key)),\n children: isFile ? undefined : [],\n };\n currentLevel.push(newNode);\n existingNode = newNode;\n }\n\n if (!isFile && existingNode.children) {\n currentLevel = existingNode.children;\n }\n });\n });\n\n return sortTreeNodes(root);\n};\n\nexport const FileExplorer: React.FC<ElementProps> = ({\n data,\n interactive = true,\n default_open_in_side_app = true,\n}) => {\n const { files } = data ?? {};\n const { styles, cx } = useStyles();\n const [fileList, setFileList] = useState<ExplorerFile[]>([]);\n const [selectedKey, setSelectedKey] = useState<string>(\"\");\n const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);\n\n\n\n useEffect(() => {\n let list: ExplorerFile[] = [];\n if (Array.isArray(files)) {\n list = files;\n } else {\n list = Object.keys(files).map((key) => ({\n ...files[key],\n name: key,\n }));\n }\n setFileList(list);\n\n // Auto select first file if available and no selection\n if (list.length > 0 && !selectedKey) {\n const firstFile = list[0];\n setSelectedKey(list[0].name);\n }\n }, [files]);\n\n const treeData = useMemo(\n () => buildTreeData(fileList, expandedKeys),\n [fileList, expandedKeys]\n );\n\n // Expand all folders by default on initial load\n useEffect(() => {\n if (treeData.length > 0 && expandedKeys.length === 0) {\n const getAllKeys = (nodes: TreeDataNode[]): React.Key[] => {\n let keys: React.Key[] = [];\n nodes.forEach((node) => {\n if (!node.isLeaf) {\n keys.push(node.key);\n if (node.children) {\n keys = keys.concat(getAllKeys(node.children));\n }\n }\n });\n return keys;\n };\n setExpandedKeys(getAllKeys(treeData));\n }\n }, [treeData.length]); // Dependencies changed to avoid loop, though checking length might not be enough if data changes.\n // But for init expand it's fine.\n\n const selectedFile = useMemo(() => {\n return fileList.find((f) => f.name === selectedKey);\n }, [fileList, selectedKey]);\n\n const renderContent = () => {\n if (!selectedFile) {\n return (\n <div className={styles.emptyState}>\n <Empty\n description=\"Select a file to preview\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n </div>\n );\n }\n\n const content = Array.isArray(selectedFile.content)\n ? selectedFile.content.join(\"\\n\")\n : selectedFile.content;\n\n return (\n <MarkdownViewer\n content={content}\n fileName={selectedFile.name}\n />\n );\n };\n\n return (\n <div className={styles.container}>\n <Splitter className={styles.splitter}>\n <Splitter.Panel defaultSize=\"25%\" min=\"15%\" max=\"40%\">\n <div className={styles.leftPanel}>\n <Tree\n showIcon\n blockNode\n // switcherIcon={({ expanded }) =>\n // expanded ? <DownOutlined /> : <RightOutlined />\n // }\n showLine\n className={styles.fileTree}\n treeData={treeData}\n selectedKeys={selectedKey ? [selectedKey] : []}\n expandedKeys={expandedKeys}\n onExpand={setExpandedKeys}\n onSelect={(keys, info) => {\n if (keys.length > 0) {\n const key = keys[0] as string;\n const file = fileList.find((f) => f.name === key);\n\n if (file) {\n setSelectedKey(key);\n } else {\n // It's a folder, toggle expansion\n if (expandedKeys.includes(key)) {\n setExpandedKeys(expandedKeys.filter((k) => k !== key));\n } else {\n setExpandedKeys([...expandedKeys, key]);\n }\n }\n } else if (info.node.key) {\n // Clicking on a selected node deselection handling or re-selection\n const key = info.node.key as string;\n const file = fileList.find((f) => f.name === key);\n if (!file) {\n // Folder click\n if (expandedKeys.includes(key)) {\n setExpandedKeys(expandedKeys.filter((k) => k !== key));\n } else {\n setExpandedKeys([...expandedKeys, key]);\n }\n }\n }\n }}\n />\n </div>\n </Splitter.Panel>\n <Splitter.Panel>\n <div className={styles.rightPanel}>{renderContent()}</div>\n </Splitter.Panel>\n </Splitter>\n </div>\n );\n};\n","import React, { useState, useEffect, useRef } from \"react\";\nimport { Button, Tooltip, message } from \"antd\";\nimport {\n CopyOutlined,\n DownloadOutlined,\n CheckOutlined,\n FilePdfOutlined,\n PictureOutlined,\n} from \"@ant-design/icons\";\nimport { jsPDF } from \"jspdf\";\nimport html2canvas from \"html2canvas\";\nimport { createStyles } from \"antd-style\";\nimport { MDResponse } from \"./MDResponse\";\nimport { getLanguageFromFileName } from \"../../utils/fileUtils\";\n\nconst useStyles = createStyles(({ token, css }) => ({\n container: css`\n min-height: 100%;\n display: flex;\n flex-direction: column;\n `,\n header: css`\n display: flex;\n justify-content: flex-end;\n padding: 8px 16px;\n background: ${token.colorBgContainer + \"30\"};\n gap: 8px;\n position: sticky;\n top: 0;\n z-index: 10;\n `,\n contentBody: css`\n padding: 24px;\n min-height: 100%;\n\n pre {\n margin: 0 !important;\n border-radius: ${token.borderRadius}px !important;\n }\n `,\n}));\n\ninterface MarkdownViewerProps {\n content: string;\n fileName: string;\n downloadUrl?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const MarkdownViewer: React.FC<MarkdownViewerProps> = ({\n content,\n fileName,\n downloadUrl,\n className,\n style,\n}) => {\n const { styles, cx } = useStyles();\n const [copied, setCopied] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const downloadFileName = fileName.split(\"/\").pop() || fileName;\n\n useEffect(() => {\n if (copied) {\n const timer = setTimeout(() => setCopied(false), 2000);\n return () => clearTimeout(timer);\n }\n }, [copied]);\n\n const handleCopy = () => {\n navigator.clipboard.writeText(content).then(() => {\n setCopied(true);\n message.success(\"Copied to clipboard\");\n });\n };\n\n const handleDownload = () => {\n const blob = new Blob([content], { type: \"text/plain\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = downloadFileName;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n // 获取内容元素(MDResponse 渲染的内容,跳过高限制的容器)\n const getContentElement = (): HTMLElement | null => {\n if (!contentRef.current) return null;\n // contentRef.current 是 contentBody,它的 firstElementChild 是实际内容\n return contentRef.current.firstElementChild as HTMLElement;\n };\n\n // 处理文件名,支持 URL 格式路径\n const processFileName = (name: string): string => {\n // 如果是 URL 格式(如 downloadfile?path=xxx),提取 path 参数\n if (name.includes('?')) {\n try {\n const url = new URL(name, window.location.origin);\n const pathParam = url.searchParams.get('path');\n if (pathParam) {\n // URL decode 并提取文件名\n const decodedPath = decodeURIComponent(pathParam);\n name = decodedPath.split('/').pop() || decodedPath;\n } else {\n // 没有 path 参数,使用 pathname\n name = url.pathname.split('/').pop() || name;\n }\n } catch {\n // URL 解析失败,尝试简单分割\n name = name.split('/').pop() || name;\n }\n } else {\n // 普通路径,直接取最后一段\n name = name.split('/').pop() || name;\n }\n \n // 移除已有的扩展名\n return name.replace(/\\.[^/.]+$/, \"\");\n };\n\n const handleExportImage = async () => {\n const contentElement = getContentElement();\n if (!contentElement) return;\n\n try {\n message.loading({ content: \"Generating image...\", key: \"image\" });\n\n const margin = 24; // 24px margin\n const canvas = await html2canvas(contentElement, {\n scale: 2,\n useCORS: true,\n logging: false,\n backgroundColor: \"#ffffff\",\n });\n\n // 创建带 margin 的新 canvas\n const newCanvas = document.createElement('canvas');\n const ctx = newCanvas.getContext('2d');\n if (!ctx) throw new Error(\"Failed to get canvas context\");\n\n newCanvas.width = canvas.width + margin * 2 * 2; // scale 2\n newCanvas.height = canvas.height + margin * 2 * 2;\n\n // 填充白色背景\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, newCanvas.width, newCanvas.height);\n\n // 绘制原图\n ctx.drawImage(canvas, margin * 2, margin * 2);\n\n const imgData = newCanvas.toDataURL(\"image/png\");\n\n const link = document.createElement(\"a\");\n link.href = imgData;\n const imageFileName = (processFileName(fileName) || \"export\") + \".png\";\n link.download = imageFileName;\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n message.success({ content: \"Image exported successfully\", key: \"image\" });\n } catch (error) {\n console.error(\"Error generating image:\", error);\n message.error({ content: \"Failed to generate image\", key: \"image\" });\n }\n };\n\n const handleExportPDF = async () => {\n const contentElement = getContentElement();\n if (!contentElement) return;\n\n try {\n message.loading({ content: \"Generating PDF...\", key: \"pdf\" });\n\n const scale = 2;\n const canvas = await html2canvas(contentElement, {\n scale: scale,\n useCORS: true,\n logging: false,\n backgroundColor: \"#ffffff\",\n });\n\n // 添加 margin\n const margin = 24; // 24px margin\n const imgWidth = canvas.width / scale;\n const imgHeight = canvas.height / scale;\n const pdfWidth = imgWidth + margin * 2;\n const pdfHeight = imgHeight + margin * 2;\n\n const pdf = new jsPDF({\n orientation: pdfWidth > pdfHeight ? \"landscape\" : \"portrait\",\n unit: \"px\",\n format: [pdfWidth, pdfHeight],\n });\n\n const imgData = canvas.toDataURL(\"image/jpeg\", 0.95);\n pdf.addImage(imgData, \"JPEG\", margin, margin, imgWidth, imgHeight);\n\n const pdfFileName = (processFileName(fileName) || \"export\") + \".pdf\";\n pdf.save(pdfFileName);\n\n message.success({\n content: \"PDF exported successfully\",\n key: \"pdf\",\n });\n } catch (error) {\n console.error(\"Error generating PDF:\", error);\n message.error({ content: \"Failed to generate PDF\", key: \"pdf\" });\n }\n };\n\n // 对代码文件自动包裹 markdown 代码块,启用语法高亮\n const displayContent = React.useMemo(() => {\n const lang = getLanguageFromFileName(fileName);\n if (lang && lang !== \"markdown\" && lang !== \"text\") {\n return `\\`\\`\\`${lang}\\n${content}\\n\\`\\`\\``;\n }\n return content;\n }, [content, fileName]);\n\n return (\n <div className={cx(styles.container, className)} style={style}>\n <div className={styles.header}>\n <Tooltip title=\"Copy Content\">\n <Button\n type=\"text\"\n icon={copied ? <CheckOutlined /> : <CopyOutlined />}\n onClick={handleCopy}\n size=\"small\"\n />\n </Tooltip>\n <Tooltip title=\"Download File\">\n <Button\n type=\"text\"\n icon={<DownloadOutlined />}\n aria-label=\"Download File\"\n href={downloadUrl}\n download={downloadUrl ? downloadFileName : undefined}\n onClick={downloadUrl ? undefined : handleDownload}\n size=\"small\"\n />\n </Tooltip>\n <Tooltip title=\"Export as PDF\">\n <Button\n type=\"text\"\n icon={<FilePdfOutlined />}\n onClick={handleExportPDF}\n size=\"small\"\n />\n </Tooltip>\n <Tooltip title=\"Export as Image\">\n <Button\n type=\"text\"\n icon={<PictureOutlined />}\n onClick={handleExportImage}\n size=\"small\"\n />\n </Tooltip>\n </div>\n <div className={styles.contentBody} ref={contentRef}>\n <MDResponse content={displayContent} />\n </div>\n </div>\n );\n};\n\nexport default MarkdownViewer;\n","/**\n * File utility functions for extracting file names and determining file types.\n * All functions handle both file paths and URLs with query parameters.\n */\n\n/**\n * Extracts the file name from a path or URL.\n * Handles URLs with query parameters (e.g., \"path/to/file.md?param=value\").\n * \n * @param pathOrUrl - File path or URL\n * @returns The file name, or empty string if input is empty\n * \n * @example\n * extractFileName(\"/tmp/business-landscape-summary.md\") // \"business-landscape-summary.md\"\n * extractFileName(\"path/to/file.md?tenantId=xxx\") // \"file.md\"\n * extractFileName(\"https://example.com/file.pdf\") // \"file.pdf\"\n */\nexport function extractFileName(pathOrUrl: string): string {\n if (!pathOrUrl) return \"\";\n \n // Remove query parameters if present\n const withoutQuery = pathOrUrl.split(\"?\")[0];\n \n // Get the last part of the path\n return withoutQuery.split(\"/\").pop() || pathOrUrl;\n}\n\n/**\n * Gets the file extension from a file name, path, or URL.\n * Returns lowercase extension without the dot.\n * \n * @param pathOrUrl - File path, name, or URL\n * @returns The file extension (lowercase), or empty string if none found\n * \n * @example\n * getFileExtension(\"file.md\") // \"md\"\n * getFileExtension(\"/path/to/File.PDF\") // \"pdf\"\n * getFileExtension(\"file.md?param=value\") // \"md\"\n */\nexport function getFileExtension(pathOrUrl: string): string {\n const fileName = extractFileName(pathOrUrl);\n if (!fileName) return \"\";\n \n const extension = fileName.split(\".\").pop()?.toLowerCase();\n return extension || \"\";\n}\n\n/**\n * File category type for rendering decisions.\n */\nexport type FileCategory = \n | \"markdown\" \n | \"text\" \n | \"image\" \n | \"pdf\" \n | \"audio\" \n | \"video\" \n | \"iframe\" \n | \"unknown\";\n\n/**\n * Determines the file category based on file extension.\n * Used to decide how to render or preview a file.\n * \n * @param pathOrUrl - File path, name, or URL\n * @returns The file category\n * \n * @example\n * getFileCategory(\"file.md\") // \"markdown\"\n * getFileCategory(\"image.png\") // \"image\"\n * getFileCategory(\"/path/to/doc.pdf?token=xxx\") // \"pdf\"\n */\nexport function getFileCategory(pathOrUrl: string): FileCategory {\n const extension = getFileExtension(pathOrUrl);\n \n if (!extension) return \"unknown\";\n\n // Markdown files\n if ([\"md\", \"markdown\", \"mdx\"].includes(extension)) return \"markdown\";\n \n // Text files (including common code files)\n if ([\n \"txt\", \"json\", \"csv\", \"xml\", \"yaml\", \"yml\", \"ini\", \"conf\", \"sh\", \"bat\", \"cmd\",\n \"ts\", \"tsx\", \"js\", \"jsx\", \"mjs\", \"cjs\", \"py\", \"rb\", \"go\", \"rs\", \"java\", \"kt\",\n \"swift\", \"c\", \"cpp\", \"h\", \"hpp\", \"cs\", \"php\", \"vue\", \"svelte\", \"sql\", \"css\",\n \"less\", \"scss\", \"bash\", \"zsh\", \"toml\",\n ].includes(extension)) {\n return \"text\";\n }\n\n // Image files\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"svg\", \"bmp\", \"webp\", \"ico\", \"tiff\", \"tif\"].includes(extension)) {\n return \"image\";\n }\n\n // PDF\n if (extension === \"pdf\") return \"pdf\";\n\n // Audio files\n if ([\"mp3\", \"wav\", \"ogg\", \"flac\", \"aac\", \"m4a\", \"wma\"].includes(extension)) return \"audio\";\n\n // Video files\n if ([\"mp4\", \"webm\", \"ogv\", \"mov\", \"avi\", \"mkv\", \"flv\"].includes(extension)) return \"video\";\n\n // Web pages that can be previewed in iframe\n if ([\"html\", \"htm\"].includes(extension)) return \"iframe\";\n\n return \"unknown\";\n}\n\n/**\n * Determines the programming language from a file name for syntax highlighting.\n *\n * @param pathOrUrl - File path, name, or URL\n * @returns The language identifier (e.g., \"typescript\", \"python\")\n *\n * @example\n * getLanguageFromFileName(\"file.ts\") // \"typescript\"\n * getLanguageFromFileName(\"script.py\") // \"python\"\n */\nexport function getLanguageFromFileName(pathOrUrl: string): string {\n const ext = getFileExtension(pathOrUrl);\n switch (ext) {\n case \"ts\":\n case \"tsx\":\n return \"typescript\";\n case \"js\":\n case \"jsx\":\n case \"mjs\":\n case \"cjs\":\n return \"javascript\";\n case \"py\":\n return \"python\";\n case \"rb\":\n return \"ruby\";\n case \"go\":\n return \"go\";\n case \"md\":\n case \"markdown\":\n case \"mdx\":\n return \"markdown\";\n case \"json\":\n return \"json\";\n case \"html\":\n case \"htm\":\n return \"html\";\n case \"css\":\n return \"css\";\n case \"less\":\n return \"less\";\n case \"scss\":\n return \"scss\";\n case \"java\":\n return \"java\";\n case \"kt\":\n return \"kotlin\";\n case \"swift\":\n return \"swift\";\n case \"rs\":\n return \"rust\";\n case \"c\":\n case \"h\":\n return \"c\";\n case \"cpp\":\n case \"hpp\":\n return \"cpp\";\n case \"cs\":\n return \"csharp\";\n case \"php\":\n return \"php\";\n case \"vue\":\n return \"vue\";\n case \"svelte\":\n return \"svelte\";\n case \"yaml\":\n case \"yml\":\n return \"yaml\";\n case \"sql\":\n return \"sql\";\n case \"sh\":\n case \"bash\":\n case \"zsh\":\n return \"bash\";\n case \"toml\":\n return \"toml\";\n case \"xml\":\n return \"xml\";\n case \"ini\":\n case \"conf\":\n return \"ini\";\n default:\n return \"text\";\n }\n}\n\n/**\n * Checks if a file can be previewed inline (in iframe or as text/markdown).\n *\n * @param pathOrUrl - File path, name, or URL\n * @returns True if the file can be previewed inline\n */\nexport function canPreviewInline(pathOrUrl: string): boolean {\n const category = getFileCategory(pathOrUrl);\n return category !== \"unknown\";\n}\n\n/**\n * Checks if a file is a text-based file (markdown or plain text).\n * \n * @param pathOrUrl - File path, name, or URL\n * @returns True if the file is text-based\n */\nexport function isTextFile(pathOrUrl: string): boolean {\n const category = getFileCategory(pathOrUrl);\n return category === \"markdown\" || category === \"text\";\n}\n\n/**\n * Common file extensions set for quick lookup.\n * Includes code, config, docs, and media files.\n */\nexport const COMMON_FILE_EXTENSIONS = new Set([\n // Code\n \"ts\", \"tsx\", \"js\", \"jsx\", \"mjs\", \"cjs\", \"html\", \"htm\", \"css\", \"less\", \"scss\",\n \"md\", \"txt\", \"mdx\", \"json\", \"yaml\", \"yml\", \"py\", \"rb\", \"go\", \"rs\", \"java\",\n \"kt\", \"swift\", \"c\", \"cpp\", \"h\", \"hpp\", \"cs\", \"php\", \"vue\", \"svelte\", \"sql\",\n \"sh\", \"bash\", \"zsh\", \"toml\", \"xml\",\n // Media\n \"png\", \"jpg\", \"jpeg\", \"gif\", \"svg\", \"webp\", \"ico\", \"mp4\", \"webm\", \"mp3\", \"wav\", \"pdf\",\n // Office\n \"ppt\", \"pptx\", \"doc\", \"docx\", \"xls\", \"xlsx\", \"odt\", \"ods\", \"odp\", \"rtf\", \"csv\",\n \"key\", \"numbers\", \"pages\",\n]);\n\n/**\n * Checks if a string looks like a file name (has a known extension).\n * \n * @param value - String to check\n * @returns True if the string has a known file extension\n */\nexport function isFileName(value?: string): boolean {\n if (!value || typeof value !== \"string\" || !value.trim()) return false;\n const ext = getFileExtension(value);\n return ext ? COMMON_FILE_EXTENSIONS.has(ext) : false;\n}\n","import {\n CodeOutlined,\n FileImageOutlined,\n FileMarkdownOutlined,\n FileOutlined,\n FilePdfOutlined,\n FileTextOutlined,\n FileUnknownOutlined,\n FileExcelOutlined,\n FileWordOutlined,\n FilePptOutlined,\n FileZipOutlined,\n Html5Outlined,\n} from \"@ant-design/icons\";\n\nexport const getFileIcon = (filename: string) => {\n const ext = filename?.split(\".\")?.pop()?.toLowerCase();\n const iconStyle = { fontSize: 14, marginRight: 4, verticalAlign: \"middle\" };\n\n switch (ext) {\n // Code files\n case \"ts\":\n case \"tsx\":\n return <CodeOutlined style={{ ...iconStyle, color: \"#3178c6\" }} />;\n case \"js\":\n case \"jsx\":\n return <CodeOutlined style={{ ...iconStyle, color: \"#f7df1e\" }} />;\n case \"html\":\n return <Html5Outlined style={{ ...iconStyle, color: \"#e34c26\" }} />;\n case \"css\":\n case \"less\":\n case \"scss\":\n case \"sass\":\n return <FileUnknownOutlined style={{ ...iconStyle, color: \"#563d7c\" }} />;\n case \"py\":\n case \"python\":\n return <CodeOutlined style={{ ...iconStyle, color: \"#3776ab\" }} />;\n case \"java\":\n return <CodeOutlined style={{ ...iconStyle, color: \"#007396\" }} />;\n case \"go\":\n return <CodeOutlined style={{ ...iconStyle, color: \"#00add8\" }} />;\n case \"rs\":\n case \"rust\":\n return <CodeOutlined style={{ ...iconStyle, color: \"#dea584\" }} />;\n case \"cpp\":\n case \"c\":\n case \"h\":\n return <CodeOutlined style={{ ...iconStyle, color: \"#555555\" }} />;\n\n // Document files\n case \"md\":\n case \"markdown\":\n return <FileMarkdownOutlined style={{ ...iconStyle, color: \"#083fa1\" }} />;\n case \"txt\":\n return <FileTextOutlined style={{ ...iconStyle, color: \"#9e9e9e\" }} />;\n case \"rtf\":\n return <FileTextOutlined style={{ ...iconStyle, color: \"#6d6d6d\" }} />;\n\n // Microsoft Office files\n case \"doc\":\n case \"docx\":\n return <FileWordOutlined style={{ ...iconStyle, color: \"#2b579a\" }} />;\n case \"xls\":\n case \"xlsx\":\n case \"csv\":\n return <FileExcelOutlined style={{ ...iconStyle, color: \"#217346\" }} />;\n case \"ppt\":\n case \"pptx\":\n return <FilePptOutlined style={{ ...iconStyle, color: \"#d24726\" }} />;\n\n // PDF files\n case \"pdf\":\n return <FilePdfOutlined style={{ ...iconStyle, color: \"#ff3b30\" }} />;\n\n // Archive files\n case \"zip\":\n case \"rar\":\n case \"7z\":\n case \"tar\":\n case \"gz\":\n case \"bz2\":\n return <FileZipOutlined style={{ ...iconStyle, color: \"#f4a460\" }} />;\n\n // Image files\n case \"png\":\n case \"jpg\":\n case \"jpeg\":\n case \"gif\":\n case \"svg\":\n case \"webp\":\n case \"bmp\":\n case \"ico\":\n case \"tiff\":\n return <FileImageOutlined style={{ ...iconStyle, color: \"#4caf50\" }} />;\n\n // Data/Config files\n case \"json\":\n return <FileTextOutlined style={{ ...iconStyle, color: \"#fbc02d\" }} />;\n case \"xml\":\n case \"yaml\":\n case \"yml\":\n return <FileTextOutlined style={{ ...iconStyle, color: \"#ff7043\" }} />;\n case \"sql\":\n return <FileTextOutlined style={{ ...iconStyle, color: \"#00796b\" }} />;\n\n // Default\n default:\n return <FileOutlined style={{ ...iconStyle, color: \"#9e9e9e\" }} />;\n }\n};\n","import { FileCard } from \"@ant-design/x\";\nimport { ElementProps } from \"../types\";\nimport {\n Card,\n Flex,\n Space,\n Typography,\n Row,\n Col,\n Collapse,\n Button,\n} from \"antd\";\nimport React, { CSSProperties, useContext, useState } from \"react\";\nimport dayjs from \"dayjs\";\nimport { ExclamationCircleOutlined } from \"@ant-design/icons\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\nimport { useLatticeChatShellContext } from \"@components/Chat/LatticeChatShellContext\";\nimport { useOptionalConversationContext } from \"@components/Chat/ConversationContext\";\nimport { WorkspaceContext } from \"../../../context/WorkspaceContext\";\nimport { getFileCategory } from \"../../../utils/fileUtils\";\n\ninterface AttachmentItem {\n id: string;\n name: string;\n size?: number;\n created_at?: string;\n module?: string;\n category?: string;\n files?: AttachmentItem[];\n is_failure?: boolean;\n task_id?: string;\n}\n\n// Export the interface for use in other components\nexport type { AttachmentItem };\n\nexport const AttachmentsCard: React.FC<\n ElementProps<AttachmentItem[]> & {\n size?: \"small\" | \"medium\" | \"large\";\n columns?: number;\n is_failure?: boolean;\n showDownloadButton?: boolean;\n }\n> = ({\n data,\n component_key,\n size = \"medium\",\n columns = 1,\n showDownloadButton = false,\n}) => {\n const { threadId, assistantId } = useOptionalConversationContext() ?? {};\n const { config } = useLatticeChatShellContext();\n const workspaceCtx = useContext(WorkspaceContext);\n const baseURL = config.baseURL;\n\n const getSandboxFileUrl = (filePath: string): string => {\n const params = new URLSearchParams({ path: filePath });\n return `${baseURL}/api/assistants/${assistantId}/threads/${threadId}/sandbox/downloadfile?${params.toString()}`;\n };\n\n const getFileUrl = (item: AttachmentItem): string => {\n if (typeof item.id === \"string\" && /^https?:\\/\\//i.test(item.id)) {\n return item.id;\n }\n if (workspaceCtx?.workspaceId && workspaceCtx?.projectId) {\n return workspaceCtx.getFileViewUrl(item.id, assistantId || undefined);\n }\n return getSandboxFileUrl(item.id);\n };\n\n const getFileDownloadUrl = (item: AttachmentItem): string => {\n if (typeof item.id === \"string\" && /^https?:\\/\\//i.test(item.id)) {\n return item.id;\n }\n if (workspaceCtx?.workspaceId && workspaceCtx?.projectId) {\n return workspaceCtx.getFileDownloadUrl(item.id, assistantId || undefined);\n }\n return getSandboxFileUrl(item.id);\n };\n\n const { Text } = Typography;\n const [showAll, setShowAll] = useState(false);\n const openSideApp = useSideAppOpener();\n // 根据尺寸设置样式\n const getStyles = () => {\n switch (size) {\n case \"small\":\n return {\n padding: \"0px\",\n fontSize: \"10px\",\n cardSize: \"small\" as const,\n };\n case \"large\":\n return {\n padding: \"16px\",\n fontSize: \"16px\",\n cardSize: \"default\" as const,\n };\n default: // medium\n return {\n padding: \"8px\",\n fontSize: \"14px\",\n cardSize: \"small\" as const,\n };\n }\n };\n\n const styles = getStyles();\n\n // 处理文件点击事件(图片由 FileCard 自带预览,不走 sideApp)\n const handleItemClick = (item: AttachmentItem) => {\n if (typeof item.id === \"string\" && /^https?:\\/\\//i.test(item.id)) {\n window.open(item.id, \"_blank\", \"noopener\");\n return;\n }\n if (getFileCategory(item.name) === \"image\") return;\n openSideApp({\n component_key: \"attachments\",\n data: {\n file_id: item.id,\n message: \"Preview: \" + item.name,\n full_url: getFileUrl(item),\n download_url: getFileDownloadUrl(item),\n },\n message: \"Preview: \" + item.name,\n });\n };\n\n // 获取文件卡片样式,添加错误状态的样式\n const getCardStyle = (item: AttachmentItem) => {\n if (item.is_failure && columns > 1) {\n return {\n padding: 0,\n };\n }\n return { padding: 0, cursor: \"pointer\" };\n };\n\n // 获取文件卡片内容样式,添加错误状态的样式\n const getFileCardStyle = (item: AttachmentItem): CSSProperties => {\n const baseStyle: CSSProperties = {\n width: \"100%\",\n backgroundColor: \"transparent\",\n fontSize: styles.fontSize,\n padding: styles.padding,\n position: \"relative\",\n };\n\n if (item.is_failure && columns > 1) {\n return {\n ...baseStyle,\n color: \"gray\",\n };\n }\n\n return baseStyle;\n };\n\n // 创建一个单独的下载按钮组件\n const DownloadButton = ({ item }: { item: AttachmentItem }) => {\n if (!showDownloadButton) return null;\n\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n right: 8,\n transform: \"translateY(-50%)\",\n zIndex: 10,\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n {/* <DownloadFileButton\n fileId={item.id}\n mode=\"icon\"\n buttonProps={{\n size: size === \"small\" ? \"small\" : \"middle\",\n }}\n /> */}\n </div>\n );\n };\n\n // 渲染文件描述,包括错误标记\n const renderFileDescription = (item: AttachmentItem) => (\n <Space direction=\"vertical\" size={size === \"small\" ? 2 : 4}>\n <Space>\n <Text\n type=\"secondary\"\n style={{\n fontSize: size === \"small\" ? \"10px\" : undefined,\n }}\n >\n {item.created_at &&\n dayjs(item.created_at).format(\"YYYY-MM-DD HH:mm:ss\")}\n </Text>\n </Space>\n </Space>\n );\n\n // 判断是否使用栅格布局\n if (columns > 1) {\n const displayData = data || [];\n const shouldShowViewMore = displayData.length > 4;\n const visibleData = showAll ? displayData : displayData.slice(0, 4);\n\n return (\n <Flex vertical gap=\"small\">\n <Row gutter={[8, 8]}>\n {visibleData.map((item) => (\n <Col key={item.id} span={24 / columns}>\n <div\n onClick={(evt) => {\n evt.stopPropagation();\n handleItemClick(item);\n }}\n >\n <Card size={styles.cardSize} style={getCardStyle(item)}>\n <DownloadButton item={item} />\n <FileCard\n style={getFileCardStyle(item)}\n name={item.name}\n byte={item.size}\n src={getFileUrl(item)}\n description={renderFileDescription(item)}\n />\n {item.files && (\n <AttachmentsCard\n data={item.files}\n component_key={`${component_key}_${item.id}`}\n size={\"small\"}\n columns={2}\n showDownloadButton={showDownloadButton}\n />\n )}\n </Card>\n </div>\n </Col>\n ))}\n </Row>\n {shouldShowViewMore && (\n <Button\n type=\"link\"\n onClick={() => setShowAll(!showAll)}\n style={{ alignSelf: \"center\" }}\n >\n {showAll ? \"Show Less\" : `Show More (${displayData.length - 4})`}\n </Button>\n )}\n </Flex>\n );\n }\n\n // 原来的垂直布局也需要添加显示更多/更少功能\n const displayData = data || [];\n const shouldShowViewMore = displayData.length > 4;\n const visibleData = showAll ? displayData : displayData.slice(0, 4);\n\n return (\n <Flex vertical gap={size === \"small\" ? \"small\" : \"middle\"}>\n {visibleData.map((item) => (\n <div key={item.id} onClick={() => handleItemClick(item)}>\n <Card size={styles.cardSize} style={getCardStyle(item)}>\n <DownloadButton item={item} />\n <FileCard\n style={getFileCardStyle(item)}\n name={item.name}\n byte={item.size}\n src={getFileUrl(item)}\n description={renderFileDescription(item)}\n />\n {item.files && (\n <div style={{ paddingLeft: \"12px\" }}>\n <Text type=\"secondary\" style={{ fontSize: \"12px\" }}>\n Contains {item.files.length} file(s)\n </Text>\n <AttachmentsCard\n data={item.files}\n component_key={`${component_key}_${item.id}`}\n size={\"small\"}\n columns={2}\n showDownloadButton={showDownloadButton}\n />\n </div>\n )}\n </Card>\n </div>\n ))}\n {shouldShowViewMore && (\n <Button\n type=\"link\"\n size=\"small\"\n onClick={(evt) => {\n evt.stopPropagation();\n setShowAll(!showAll);\n }}\n style={{ alignSelf: \"center\" }}\n >\n {showAll ? \"Show Less\" : `Show More (${displayData.length - 4})`}\n </Button>\n )}\n </Flex>\n );\n };\n","\"use client\";\nimport { Attachments } from \"@ant-design/x\";\nimport { ElementProps } from \"../types\";\nimport { Button, Empty, Flex, Skeleton, Space } from \"antd\";\nimport React, { useEffect, useState } from \"react\";\nimport { useConversationContext } from \"@components/Chat/ConversationContext\";\nimport { useLatticeChatShellContext } from \"@components/Chat/LatticeChatShellContext\";\nimport { RenderMDFromURL } from \"../RenderMDFromURL\";\nimport {\n extractFileName,\n getFileCategory,\n isTextFile,\n canPreviewInline\n} from \"../../../utils/fileUtils\";\nimport { LinkOutlined, DownloadOutlined } from \"@ant-design/icons\";\nimport { ShareModal } from \"../ShareModal\";\n\nexport default function AttachmentsViewerSideApp({\n data,\n component_key,\n}: ElementProps) {\n const [loading, setLoading] = useState(false);\n const [shareOpen, setShareOpen] = useState(false);\n const { file_id, url, full_url, download_url } = data ?? {};\n\n const [fileUri, setFileUri] = useState<{ url: string; fileName: string }>({\n url: full_url || \"\",\n fileName: extractFileName(file_id || \"\"),\n });\n\n // Update fileUri when data changes\n useEffect(() => {\n setFileUri({\n url: full_url || \"\",\n fileName: extractFileName(file_id || \"\"),\n });\n }, [file_id, full_url]);\n\n if (loading) {\n return <Skeleton active />;\n }\n\n const fileUrl = fileUri?.url || url;\n const downloadUrl = download_url || fileUrl || \"\";\n const fileName = fileUri?.fileName || \"\";\n const isText = isTextFile(fileName);\n const isPreviewable = canPreviewInline(fileName);\n // Directory paths have no extension → render as HTML app in iframe\n const isDir = !!fileName && !fileName.includes(\".\");\n\n let content: React.ReactNode;\n\n // 文本文件(包括 markdown 和 txt)使用 RenderMDFromURL 渲染\n if (isText && fileUrl) {\n content = (\n <RenderMDFromURL\n url={fileUrl}\n file_id={file_id}\n downloadUrl={downloadUrl}\n />\n );\n } else if (isPreviewable || url || isDir) {\n // 其他可预览文件使用 iframe\n content = (\n <iframe\n style={{ width: \"100%\", height: \"100%\", border: 0 }}\n src={fileUrl}\n ></iframe>\n );\n } else {\n // 不可预览的文件显示下载按钮\n content = (\n <Empty\n description={\n <>\n <div>Preview not supported. Please download to view.</div>\n {downloadUrl ? (\n <Button type=\"link\" href={downloadUrl} download={fileName}>\n Download {fileName}\n </Button>\n ) : null}\n </>\n }\n image={Empty.PRESENTED_IMAGE_DEFAULT}\n />\n );\n }\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n <Space style={{ padding: \"8px 12px\", borderBottom: \"1px solid #f0f0f0\", width: \"100%\" }}>\n {downloadUrl ? (\n <Button type=\"text\" size=\"small\" icon={<DownloadOutlined />}\n href={downloadUrl} download={fileName}>Download</Button>\n ) : null}\n <Button type=\"text\" size=\"small\" icon={<LinkOutlined />}\n onClick={() => setShareOpen(true)}>Share</Button>\n </Space>\n {content}\n {shareOpen && (\n <ShareModal\n open={shareOpen}\n filePath={file_id ?? \"\"}\n fileName={fileName}\n onClose={() => setShareOpen(false)}\n />\n )}\n </div>\n );\n}\n","import React, { useEffect, useState, useMemo } from \"react\";\nimport { Spin, Alert, Button } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { MarkdownViewer } from \"./MarkdownViewer\";\nimport { FileImageOutlined, FilePdfOutlined, FileTextOutlined, FileUnknownOutlined } from \"@ant-design/icons\";\nimport { getFileCategory, FileCategory } from \"../../utils/fileUtils\";\n\nconst useStyles = createStyles(({ token, css }) => ({\n container: css`\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n `,\n loading: css`\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n `,\n error: css`\n padding: 24px;\n `,\n imageContainer: css`\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n flex: 1;\n overflow: auto;\n `,\n image: css`\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n `,\n mediaContainer: css`\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n flex: 1;\n `,\n media: css`\n max-width: 100%;\n max-height: 100%;\n `,\n pdfContainer: css`\n flex: 1;\n min-height: 0;\n `,\n pdfIframe: css`\n width: 100%;\n height: 100%;\n border: none;\n `,\n\n downloadContainer: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n gap: 16px;\n `,\n fileIcon: css`\n font-size: 48px;\n color: ${token.colorPrimary};\n `,\n fileName: css`\n font-size: 16px;\n font-weight: 500;\n color: ${token.colorTextHeading};\n text-align: center;\n word-break: break-all;\n max-width: 80%;\n `,\n\n contentWrapper: css`\n flex: 1;\n overflow: auto;\n min-height: 0;\n background: ${token.colorBgContainer};\n `,\n}));\n\n// 获取文件图标\nexport function getFileIconComponent(fileName: string) {\n const category = getFileCategory(fileName);\n switch (category) {\n case \"image\":\n return <FileImageOutlined />;\n case \"pdf\":\n return <FilePdfOutlined />;\n case \"text\":\n case \"markdown\":\n return <FileTextOutlined />;\n default:\n return <FileUnknownOutlined />;\n }\n}\n\ninterface FileRendererProps {\n fileUrl: string;\n fileName?: string;\n downloadUrl?: string;\n showHeader?: boolean;\n}\n\nexport const FileRenderer: React.FC<FileRendererProps> = ({\n fileUrl,\n fileName = \"\",\n downloadUrl,\n showHeader = true,\n}) => {\n const { styles } = useStyles();\n const [content, setContent] = useState<string>(\"\");\n const [loading, setLoading] = useState<boolean>(true);\n const [error, setError] = useState<string | null>(null);\n\n const category = useMemo(() => getFileCategory(fileName), [fileName]);\n\n useEffect(() => {\n // 只有文本、Markdown 类型需要 fetch 内容\n if (category === \"markdown\" || category === \"text\") {\n setLoading(true);\n setError(null);\n fetch(fileUrl)\n .then((res) => {\n if (!res.ok) throw new Error(`Failed: ${res.status}`);\n return res.text();\n })\n .then((text) => {\n setContent(text);\n setLoading(false);\n })\n .catch((err) => {\n setError(err.message);\n setLoading(false);\n });\n } else {\n setLoading(false);\n }\n }, [fileUrl, category]);\n\n if (loading) {\n return (\n <div className={styles.loading}>\n <Spin size=\"large\" tip=\"Loading...\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={styles.error}>\n <Alert message=\"Failed to load file\" description={error} type=\"error\" showIcon />\n </div>\n );\n }\n\n // 根据文件类型渲染不同内容\n switch (category) {\n case \"markdown\":\n case \"text\":\n return (\n <div className={styles.container}>\n <MarkdownViewer\n content={content}\n fileName={fileName}\n downloadUrl={downloadUrl}\n />\n </div>\n );\n\n case \"image\":\n return (\n <div className={styles.container}>\n <div className={styles.contentWrapper}>\n <div className={styles.imageContainer}>\n <img src={fileUrl} alt={fileName} className={styles.image} />\n </div>\n </div>\n </div>\n );\n\n case \"pdf\":\n case \"iframe\":\n return (\n <div className={styles.container}>\n <div className={styles.pdfContainer}>\n <iframe\n src={fileUrl}\n title={fileName}\n className={styles.pdfIframe}\n />\n </div>\n </div>\n );\n\n case \"audio\":\n return (\n <div className={styles.container}>\n <div className={styles.mediaContainer}>\n <audio controls className={styles.media}>\n <source src={fileUrl} />\n Your browser does not support the audio element.\n </audio>\n </div>\n </div>\n );\n\n case \"video\":\n return (\n <div className={styles.container}>\n <div className={styles.mediaContainer}>\n <video controls className={styles.media}>\n <source src={fileUrl} />\n Your browser does not support the video element.\n </video>\n </div>\n </div>\n );\n\n default:\n // 未知/不支持预览的文件,显示下载按钮\n return (\n <div className={styles.container}>\n <div className={styles.downloadContainer}>\n <FileUnknownOutlined className={styles.fileIcon} />\n <span className={styles.fileName}>{fileName || \"Unknown file\"}</span>\n <Button type=\"primary\" href={downloadUrl || fileUrl} download={fileName}>\n Download File\n </Button>\n </div>\n </div>\n );\n }\n};\n\n// 默认导出\nexport default FileRenderer;\n","import React from \"react\";\nimport { FileRenderer } from \"./FileRenderer\";\n\ninterface RenderMDFromURLProps {\n url: string;\n file_id: string;\n downloadUrl?: string;\n}\n\nexport const RenderMDFromURL: React.FC<RenderMDFromURLProps> = ({\n url,\n file_id,\n downloadUrl,\n}) => {\n // 从 URL 中提取文件名(支持查询参数)\n\n return (\n <FileRenderer\n fileUrl={url}\n fileName={file_id}\n downloadUrl={downloadUrl}\n showHeader={true}\n />\n );\n};\n\nexport default RenderMDFromURL;\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport { Modal, Input, Select, InputNumber, Button, Space, Typography, message, List, Tag, Popconfirm } from \"antd\";\nimport { CopyOutlined, LinkOutlined, StopOutlined, PlusOutlined } from \"@ant-design/icons\";\nimport { useWorkspaceContext } from \"../../context/WorkspaceContext\";\n// Direct-file import (not the root barrel): this component is statically\n// reachable from the embed page graph, and a barrel import here would re-pin\n// the barrel's unused re-exports (SkillFlow, workbench panels, ...) into the\n// embed's static closure.\nimport { useLatticeChatShellContext } from \"../Chat/LatticeChatShellContext\";\nimport type { ShareRecord } from \"@axiom-lattice/protocols\";\n\nconst { Text, Title } = Typography;\n\ninterface ShareModalProps {\n open: boolean;\n filePath: string;\n assistantId?: string;\n fileName?: string;\n onClose: () => void;\n}\n\ntype ViewState = \"list\" | \"create\" | \"result\" | \"error\";\n\nconst EXPIRY_OPTIONS = [\n { label: \"Never\", value: undefined },\n { label: \"1 hour\", value: \"1h\" },\n { label: \"24 hours\", value: \"24h\" },\n { label: \"7 days\", value: \"7d\" },\n { label: \"30 days\", value: \"30d\" },\n];\n\nfunction expiryToDate(option: string | undefined): string | undefined {\n if (!option) return undefined;\n const now = Date.now();\n const map: Record<string, number> = {\n \"1h\": 3600_000, \"24h\": 86400_000, \"7d\": 604800_000, \"30d\": 2592000_000,\n };\n const ms = map[option] ?? 0;\n return ms ? new Date(now + ms).toISOString() : undefined;\n}\n\nfunction formatExpiry(d: string | null): string {\n if (!d) return \"Never\";\n return new Date(d).toLocaleDateString();\n}\n\n/** Filter shares matching this filePath */\nfunction filePathMatch(record: ShareRecord, filePath: string): boolean {\n const normalizedPath = filePath.replace(/^\\/?project\\//, \"\");\n return record.address.resourcePath === normalizedPath;\n}\n\nexport const ShareModal: React.FC<ShareModalProps> = ({\n open, filePath, assistantId, fileName, onClose,\n}) => {\n const { shareFile, listShares, unshareFile } = useWorkspaceContext();\n const { config: shellConfig } = useLatticeChatShellContext();\n const baseURL = (shellConfig?.baseURL ?? \"\").replace(/\\/$/, \"\");\n\n const [view, setView] = useState<ViewState>(\"list\");\n const [shares, setShares] = useState<ShareRecord[]>([]);\n const [loading, setLoading] = useState(false);\n\n // Create form state\n const [title, setTitle] = useState(fileName ?? \"\");\n const [visibility, setVisibility] = useState<\"public\" | \"password\">(\"public\");\n const [password, setPassword] = useState(\"\");\n const [expiry, setExpiry] = useState<string | undefined>(undefined);\n const [maxAccess, setMaxAccess] = useState<number | undefined>(undefined);\n const [error, setError] = useState(\"\");\n\n // Result state\n const [resultUrl, setResultUrl] = useState(\"\");\n const [resultPwd, setResultPwd] = useState(\"\");\n\n const loadShares = useCallback(async () => {\n setLoading(true);\n try {\n const all = await listShares();\n setShares(all.filter((r: ShareRecord) => filePathMatch(r, filePath) && !r.revoked));\n } catch { /* non-critical */ }\n setLoading(false);\n }, [listShares, filePath]);\n\n useEffect(() => {\n if (open) {\n setView(\"list\");\n loadShares();\n }\n }, [open, loadShares]);\n\n const handleCreate = useCallback(async () => {\n setView(\"create\");\n setTitle(fileName ?? \"\");\n setVisibility(\"public\");\n setPassword(\"\");\n setExpiry(undefined);\n setMaxAccess(undefined);\n setError(\"\");\n }, [fileName]);\n\n const handleShare = useCallback(async () => {\n setError(\"\");\n try {\n const result = await shareFile(filePath, assistantId, {\n title: title || undefined,\n visibility,\n password: visibility === \"password\" ? password : undefined,\n expiresAt: expiryToDate(expiry),\n maxAccess: maxAccess ?? undefined,\n });\n setResultUrl(`${baseURL}${result.url}`);\n setResultPwd(password);\n setView(\"result\");\n loadShares();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to create share\");\n setView(\"error\");\n }\n }, [filePath, assistantId, title, visibility, password, expiry, maxAccess, shareFile, baseURL, loadShares]);\n\n const handleCopy = useCallback((fullUrl: string, shareTitle?: string, pwd?: string, isProtected?: boolean) => {\n const titleText = shareTitle ? `${shareTitle}\\n` : \"\";\n const pwdText = pwd ? `Password: ${pwd}\\n` : (isProtected ? \"Password protected\\n\" : \"\");\n navigator.clipboard.writeText(`${titleText}${fullUrl}\\n${pwdText}`.trim());\n message.success(\"Copied\");\n }, []);\n\n const handleRevoke = useCallback(async (token: string) => {\n try {\n await unshareFile(token);\n message.success(\"Share revoked\");\n loadShares();\n } catch { message.error(\"Failed to revoke\"); }\n }, [unshareFile, loadShares]);\n\n const handleOpen = useCallback((fullUrl: string) => {\n window.open(fullUrl, \"_blank\");\n }, []);\n\n return (\n <Modal\n title=\"Share Resource\"\n open={open}\n onCancel={onClose}\n footer={null}\n width={480}\n >\n {view === \"list\" && (\n <Space direction=\"vertical\" style={{ width: \"100%\" }} size=\"middle\">\n {shares.length > 0 ? (\n <List\n loading={loading}\n dataSource={shares}\n renderItem={(r) => {\n const fullUrl = `${baseURL}/s/${r.token}`;\n return (\n <List.Item\n actions={[\n <Button key=\"copy\" type=\"text\" size=\"small\" icon={<CopyOutlined />}\n onClick={() => handleCopy(fullUrl, r.title ?? undefined, undefined, r.visibility === \"password\")} />,\n <Button key=\"open\" type=\"text\" size=\"small\" icon={<LinkOutlined />}\n onClick={() => handleOpen(fullUrl)} />,\n <Popconfirm key=\"revoke\" title=\"Revoke this share?\" onConfirm={() => handleRevoke(r.token)}>\n <Button type=\"text\" size=\"small\" danger icon={<StopOutlined />} />\n </Popconfirm>,\n ]}\n >\n <List.Item.Meta\n title={r.title || fileName || r.address.resourcePath.split(\"/\").pop()}\n description={\n <Space size=\"small\">\n <Tag color={r.visibility === \"password\" ? \"orange\" : \"green\"}>\n {r.visibility === \"password\" ? \"Password\" : \"Public\"}\n </Tag>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n Expires: {formatExpiry(r.expiresAt as any)}\n </Text>\n </Space>\n }\n />\n </List.Item>\n );\n }}\n />\n ) : (\n <div style={{ textAlign: \"center\", padding: \"16px 0\" }}>\n <Text type=\"secondary\">No active shares yet</Text>\n </div>\n )}\n <Button type=\"primary\" block icon={<PlusOutlined />} onClick={handleCreate}>\n Create New Share\n </Button>\n </Space>\n )}\n\n {view === \"create\" && (\n <Space direction=\"vertical\" style={{ width: \"100%\" }} size=\"middle\">\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>Title</Text>\n <Input value={title} onChange={(e) => setTitle(e.target.value)} />\n </div>\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>Visibility</Text>\n <Select value={visibility} onChange={setVisibility} style={{ width: \"100%\" }}>\n <Select.Option value=\"public\">Public</Select.Option>\n <Select.Option value=\"password\">Password</Select.Option>\n </Select>\n </div>\n {visibility === \"password\" && (\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>Password</Text>\n <Input.Password value={password} onChange={(e) => setPassword(e.target.value)} />\n </div>\n )}\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>Expires</Text>\n <Select value={expiry} onChange={setExpiry} style={{ width: \"100%\" }}>\n {EXPIRY_OPTIONS.map((opt) => (\n <Select.Option key={opt.label} value={opt.value}>{opt.label}</Select.Option>\n ))}\n </Select>\n </div>\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>Max accesses (empty = unlimited)</Text>\n <InputNumber value={maxAccess} onChange={(v) => setMaxAccess(v ?? undefined)} style={{ width: \"100%\" }} min={1} />\n </div>\n <div style={{ display: \"flex\", gap: 8 }}>\n <Button block onClick={() => setView(\"list\")}>Back</Button>\n <Button type=\"primary\" block onClick={handleShare}>Create Share</Button>\n </div>\n </Space>\n )}\n\n {view === \"result\" && (\n <Space direction=\"vertical\" style={{ width: \"100%\" }} size=\"middle\">\n <Input value={resultUrl} readOnly style={{ fontFamily: \"monospace\" }} />\n <div style={{ textAlign: \"center\" }}>\n <Space>\n <Button icon={<CopyOutlined />} onClick={() => handleCopy(resultUrl, title, resultPwd)}>Copy</Button>\n <Button type=\"primary\" icon={<LinkOutlined />} onClick={() => handleOpen(resultUrl)}>Open</Button>\n </Space>\n </div>\n <Button block onClick={() => setView(\"list\")}>Back to shares</Button>\n </Space>\n )}\n\n {view === \"error\" && (\n <div style={{ textAlign: \"center\", padding: \"24px 0\" }}>\n <Text type=\"danger\">{error}</Text>\n <br />\n <Button onClick={handleShare} style={{ marginTop: 16 }}>Retry</Button>\n </div>\n )}\n </Modal>\n );\n};\n","import React from \"react\";\nimport { Button, Space, Typography } from \"antd\";\nimport { ElementProps, ToolCallData } from \"../types\";\nimport { getFileIcon } from \"./getFileIcon\";\nimport { MDResponse } from \"../MDResponse\";\nimport { ContentPreviewCollapse } from \"./ContentPreviewCollapse\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\n\nconst { Text } = Typography;\n\nexport const WriteFile: React.FC<ElementProps<ToolCallData>> = ({\n data,\n component_key,\n interactive = true,\n}) => {\n const toolCallData = data;\n const { file_path, content } = toolCallData?.args || {};\n const openSideApp = useSideAppOpener();\n if (!toolCallData) {\n return null;\n }\n\n const expandIcon = () => getFileIcon(file_path);\n\n const header = (\n <Space>\n <Text strong>New</Text>\n\n <Text title={file_path}>{file_path?.split(\"/\")?.pop() || \"\"}</Text>\n </Space>\n );\n const handleItemClick = (toolCallData: ToolCallData) => {\n openSideApp({\n component_key: \"file_content_diff_view\",\n message: file_path,\n data: {\n old_code: \"\",\n new_code: content,\n },\n });\n };\n return (\n <ContentPreviewCollapse\n panelKey={toolCallData.id}\n header={header}\n expandIcon={expandIcon}\n extra={\n <Button\n type=\"link\"\n size=\"small\"\n onClick={(evt) => {\n // evt.preventDefault();\n evt.stopPropagation();\n handleItemClick(toolCallData);\n }}\n >\n Diff View\n </Button>\n }\n >\n <MDResponse content={content} />\n </ContentPreviewCollapse>\n );\n};\n","import React, { useRef, useState, useEffect, useCallback } from \"react\";\nimport { Collapse } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { DownOutlined, UpOutlined } from \"@ant-design/icons\";\n\nconst { Panel: CollapsePanel } = Collapse;\n\nconst DEFAULT_COLLAPSED_MAX_HEIGHT = 180;\nconst DEFAULT_EXPANDED_MAX_HEIGHT = 500;\n\ninterface ContentPreviewCollapseProps {\n /** Unique key for the collapse panel */\n panelKey: string;\n /** Header content for the collapse panel */\n header: React.ReactNode;\n /** Extra content on the right side of the header */\n extra?: React.ReactNode;\n /** Custom expand icon render function */\n expandIcon?: () => React.ReactNode;\n /** Content to render inside the panel */\n children: React.ReactNode;\n /** Max height when collapsed, default 180px */\n collapsedMaxHeight?: number;\n /** Max height when expanded, default 500px */\n expandedMaxHeight?: number;\n /** Whether the panel is expanded by default */\n defaultExpanded?: boolean;\n /** Minimum width of the panel */\n minWidth?: number;\n /** Text for \"Show all\" button */\n showAllText?: string;\n /** Text for \"Show less\" button */\n showLessText?: string;\n}\n\nconst useStyle = createStyles(\n ({ css }, { showShadow }: { showShadow: boolean }) => ({\n collapse: css`\n .ant-collapse-header {\n position: relative;\n z-index: 1;\n transition: box-shadow 0.2s ease;\n box-shadow: ${showShadow\n ? \"0 4px 8px -2px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\"\n : \"none\"};\n }\n\n .ant-collapse-content-box {\n padding-top: 0 !important;\n }\n `,\n contentContainer: css`\n position: relative;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n\n &.expanded {\n overflow: auto;\n display: block;\n }\n `,\n content: css`\n flex-shrink: 0;\n `,\n toggleButton: css`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 8px 0;\n margin-top: 8px;\n border-top: 1px solid rgba(0, 0, 0, 0.06);\n cursor: pointer;\n color: #1890ff;\n font-size: 12px;\n user-select: none;\n transition: color 0.2s;\n\n &:hover {\n color: #40a9ff;\n }\n `,\n })\n);\n\nexport const ContentPreviewCollapse: React.FC<ContentPreviewCollapseProps> = ({\n panelKey,\n header,\n extra,\n expandIcon,\n children,\n collapsedMaxHeight = DEFAULT_COLLAPSED_MAX_HEIGHT,\n expandedMaxHeight = DEFAULT_EXPANDED_MAX_HEIGHT,\n defaultExpanded = true,\n minWidth = 400,\n showAllText = \"Show all content\",\n showLessText = \"Show less\",\n}) => {\n const [showFullContent, setShowFullContent] = useState(false);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n\n const showShadow = isOverflowing && !showFullContent;\n const { styles, cx } = useStyle({ showShadow });\n\n // Check if content overflows\n const checkOverflow = useCallback(() => {\n if (contentRef.current) {\n const scrollHeight = contentRef.current.scrollHeight;\n setIsOverflowing(scrollHeight > collapsedMaxHeight);\n }\n }, [collapsedMaxHeight]);\n\n // Use ResizeObserver to detect content size changes\n useEffect(() => {\n const element = contentRef.current;\n if (!element) return;\n\n // Initial check\n checkOverflow();\n\n // Observe size changes\n const resizeObserver = new ResizeObserver(() => {\n checkOverflow();\n });\n resizeObserver.observe(element);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [children, checkOverflow]);\n\n const handleToggleContent = (e: React.MouseEvent) => {\n e.stopPropagation();\n setShowFullContent(!showFullContent);\n };\n\n return (\n <Collapse\n className={styles.collapse}\n size=\"small\"\n bordered={false}\n defaultActiveKey={defaultExpanded ? [panelKey] : []}\n expandIcon={expandIcon}\n >\n <CollapsePanel\n key={panelKey}\n header={header}\n extra={extra}\n style={{ minWidth }}\n >\n <div\n className={cx(styles.contentContainer, showFullContent && \"expanded\")}\n style={{\n maxHeight: showFullContent ? expandedMaxHeight : collapsedMaxHeight,\n }}\n >\n <div ref={contentRef} className={styles.content}>\n {children}\n </div>\n </div>\n {isOverflowing && (\n <div className={styles.toggleButton} onClick={handleToggleContent}>\n {showFullContent ? (\n <>\n <UpOutlined style={{ fontSize: 10 }} />\n <span>{showLessText}</span>\n </>\n ) : (\n <>\n <DownOutlined style={{ fontSize: 10 }} />\n <span>{showAllText}</span>\n </>\n )}\n </div>\n )}\n </CollapsePanel>\n </Collapse>\n );\n};\n","var __create = Object.create;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __toESM = (mod, isNodeMode, target) => {\n target = mod != null ? __create(__getProtoOf(mod)) : {};\n const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target;\n for (let key of __getOwnPropNames(mod))\n if (!__hasOwnProp.call(to, key))\n __defProp(to, key, {\n get: () => mod[key],\n enumerable: true\n });\n return to;\n};\nvar __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);\n\n// node_modules/classnames/index.js\nvar require_classnames = __commonJS((exports, module) => {\n /*!\n Copyright (c) 2017 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n */\n (function() {\n var hasOwn = {}.hasOwnProperty;\n function classNames() {\n var classes = [];\n for (var i = 0;i < arguments.length; i++) {\n var arg = arguments[i];\n if (!arg)\n continue;\n var argType = typeof arg;\n if (argType === \"string\" || argType === \"number\") {\n classes.push(arg);\n } else if (Array.isArray(arg) && arg.length) {\n var inner = classNames.apply(null, arg);\n if (inner) {\n classes.push(inner);\n }\n } else if (argType === \"object\") {\n for (var key in arg) {\n if (hasOwn.call(arg, key) && arg[key]) {\n classes.push(key);\n }\n }\n }\n }\n return classes.join(\" \");\n }\n if (typeof module !== \"undefined\" && module.exports) {\n classNames.default = classNames;\n module.exports = classNames;\n } else if (typeof define === \"function\" && typeof define.amd === \"object\" && define.amd) {\n define(\"classnames\", [], function() {\n return classNames;\n });\n } else {\n window.classNames = classNames;\n }\n })();\n});\n\n// node_modules/diff/lib/diff/base.js\nvar require_base = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = Diff;\n function Diff() {}\n Diff.prototype = {\n diff: function diff(oldString, newString) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var callback = options.callback;\n if (typeof options === \"function\") {\n callback = options;\n options = {};\n }\n this.options = options;\n var self = this;\n function done(value) {\n if (callback) {\n setTimeout(function() {\n callback(undefined, value);\n }, 0);\n return true;\n } else {\n return value;\n }\n }\n oldString = this.castInput(oldString);\n newString = this.castInput(newString);\n oldString = this.removeEmpty(this.tokenize(oldString));\n newString = this.removeEmpty(this.tokenize(newString));\n var newLen = newString.length, oldLen = oldString.length;\n var editLength = 1;\n var maxEditLength = newLen + oldLen;\n var bestPath = [{\n newPos: -1,\n components: []\n }];\n var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);\n if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {\n return done([{\n value: this.join(newString),\n count: newString.length\n }]);\n }\n function execEditLength() {\n for (var diagonalPath = -1 * editLength;diagonalPath <= editLength; diagonalPath += 2) {\n var basePath = undefined;\n var addPath = bestPath[diagonalPath - 1], removePath = bestPath[diagonalPath + 1], _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;\n if (addPath) {\n bestPath[diagonalPath - 1] = undefined;\n }\n var canAdd = addPath && addPath.newPos + 1 < newLen, canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen;\n if (!canAdd && !canRemove) {\n bestPath[diagonalPath] = undefined;\n continue;\n }\n if (!canAdd || canRemove && addPath.newPos < removePath.newPos) {\n basePath = clonePath(removePath);\n self.pushComponent(basePath.components, undefined, true);\n } else {\n basePath = addPath;\n basePath.newPos++;\n self.pushComponent(basePath.components, true, undefined);\n }\n _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath);\n if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) {\n return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken));\n } else {\n bestPath[diagonalPath] = basePath;\n }\n }\n editLength++;\n }\n if (callback) {\n (function exec() {\n setTimeout(function() {\n if (editLength > maxEditLength) {\n return callback();\n }\n if (!execEditLength()) {\n exec();\n }\n }, 0);\n })();\n } else {\n while (editLength <= maxEditLength) {\n var ret = execEditLength();\n if (ret) {\n return ret;\n }\n }\n }\n },\n pushComponent: function pushComponent(components, added, removed) {\n var last = components[components.length - 1];\n if (last && last.added === added && last.removed === removed) {\n components[components.length - 1] = {\n count: last.count + 1,\n added,\n removed\n };\n } else {\n components.push({\n count: 1,\n added,\n removed\n });\n }\n },\n extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) {\n var newLen = newString.length, oldLen = oldString.length, newPos = basePath.newPos, oldPos = newPos - diagonalPath, commonCount = 0;\n while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {\n newPos++;\n oldPos++;\n commonCount++;\n }\n if (commonCount) {\n basePath.components.push({\n count: commonCount\n });\n }\n basePath.newPos = newPos;\n return oldPos;\n },\n equals: function equals(left, right) {\n if (this.options.comparator) {\n return this.options.comparator(left, right);\n } else {\n return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase();\n }\n },\n removeEmpty: function removeEmpty(array) {\n var ret = [];\n for (var i = 0;i < array.length; i++) {\n if (array[i]) {\n ret.push(array[i]);\n }\n }\n return ret;\n },\n castInput: function castInput(value) {\n return value;\n },\n tokenize: function tokenize(value) {\n return value.split(\"\");\n },\n join: function join(chars) {\n return chars.join(\"\");\n }\n };\n function buildValues(diff, components, newString, oldString, useLongestToken) {\n var componentPos = 0, componentLen = components.length, newPos = 0, oldPos = 0;\n for (;componentPos < componentLen; componentPos++) {\n var component = components[componentPos];\n if (!component.removed) {\n if (!component.added && useLongestToken) {\n var value = newString.slice(newPos, newPos + component.count);\n value = value.map(function(value2, i) {\n var oldValue = oldString[oldPos + i];\n return oldValue.length > value2.length ? oldValue : value2;\n });\n component.value = diff.join(value);\n } else {\n component.value = diff.join(newString.slice(newPos, newPos + component.count));\n }\n newPos += component.count;\n if (!component.added) {\n oldPos += component.count;\n }\n } else {\n component.value = diff.join(oldString.slice(oldPos, oldPos + component.count));\n oldPos += component.count;\n if (componentPos && components[componentPos - 1].added) {\n var tmp = components[componentPos - 1];\n components[componentPos - 1] = components[componentPos];\n components[componentPos] = tmp;\n }\n }\n }\n var lastComponent = components[componentLen - 1];\n if (componentLen > 1 && typeof lastComponent.value === \"string\" && (lastComponent.added || lastComponent.removed) && diff.equals(\"\", lastComponent.value)) {\n components[componentLen - 2].value += lastComponent.value;\n components.pop();\n }\n return components;\n }\n function clonePath(path) {\n return {\n newPos: path.newPos,\n components: path.components.slice(0)\n };\n }\n});\n\n// node_modules/diff/lib/diff/character.js\nvar require_character = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.diffChars = diffChars;\n exports.characterDiff = undefined;\n var _base = _interopRequireDefault(require_base());\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n var characterDiff = new _base.default;\n exports.characterDiff = characterDiff;\n function diffChars(oldStr, newStr, options) {\n return characterDiff.diff(oldStr, newStr, options);\n }\n});\n\n// node_modules/diff/lib/util/params.js\nvar require_params = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.generateOptions = generateOptions;\n function generateOptions(options, defaults) {\n if (typeof options === \"function\") {\n defaults.callback = options;\n } else if (options) {\n for (var name in options) {\n if (options.hasOwnProperty(name)) {\n defaults[name] = options[name];\n }\n }\n }\n return defaults;\n }\n});\n\n// node_modules/diff/lib/diff/word.js\nvar require_word = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.diffWords = diffWords;\n exports.diffWordsWithSpace = diffWordsWithSpace;\n exports.wordDiff = undefined;\n var _base = _interopRequireDefault(require_base());\n var _params = require_params();\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n var extendedWordChars = /^[A-Za-z\\xC0-\\u02C6\\u02C8-\\u02D7\\u02DE-\\u02FF\\u1E00-\\u1EFF]+$/;\n var reWhitespace = /\\S/;\n var wordDiff = new _base.default;\n exports.wordDiff = wordDiff;\n wordDiff.equals = function(left, right) {\n if (this.options.ignoreCase) {\n left = left.toLowerCase();\n right = right.toLowerCase();\n }\n return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right);\n };\n wordDiff.tokenize = function(value) {\n var tokens = value.split(/(\\s+|[()[\\]{}'\"]|\\b)/);\n for (var i = 0;i < tokens.length - 1; i++) {\n if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) {\n tokens[i] += tokens[i + 2];\n tokens.splice(i + 1, 2);\n i--;\n }\n }\n return tokens;\n };\n function diffWords(oldStr, newStr, options) {\n options = (0, _params.generateOptions)(options, {\n ignoreWhitespace: true\n });\n return wordDiff.diff(oldStr, newStr, options);\n }\n function diffWordsWithSpace(oldStr, newStr, options) {\n return wordDiff.diff(oldStr, newStr, options);\n }\n});\n\n// node_modules/diff/lib/diff/line.js\nvar require_line = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.diffLines = diffLines;\n exports.diffTrimmedLines = diffTrimmedLines;\n exports.lineDiff = undefined;\n var _base = _interopRequireDefault(require_base());\n var _params = require_params();\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n var lineDiff = new _base.default;\n exports.lineDiff = lineDiff;\n lineDiff.tokenize = function(value) {\n var retLines = [], linesAndNewlines = value.split(/(\\n|\\r\\n)/);\n if (!linesAndNewlines[linesAndNewlines.length - 1]) {\n linesAndNewlines.pop();\n }\n for (var i = 0;i < linesAndNewlines.length; i++) {\n var line = linesAndNewlines[i];\n if (i % 2 && !this.options.newlineIsToken) {\n retLines[retLines.length - 1] += line;\n } else {\n if (this.options.ignoreWhitespace) {\n line = line.trim();\n }\n retLines.push(line);\n }\n }\n return retLines;\n };\n function diffLines(oldStr, newStr, callback) {\n return lineDiff.diff(oldStr, newStr, callback);\n }\n function diffTrimmedLines(oldStr, newStr, callback) {\n var options = (0, _params.generateOptions)(callback, {\n ignoreWhitespace: true\n });\n return lineDiff.diff(oldStr, newStr, options);\n }\n});\n\n// node_modules/diff/lib/diff/sentence.js\nvar require_sentence = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.diffSentences = diffSentences;\n exports.sentenceDiff = undefined;\n var _base = _interopRequireDefault(require_base());\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n var sentenceDiff = new _base.default;\n exports.sentenceDiff = sentenceDiff;\n sentenceDiff.tokenize = function(value) {\n return value.split(/(\\S.+?[.!?])(?=\\s+|$)/);\n };\n function diffSentences(oldStr, newStr, callback) {\n return sentenceDiff.diff(oldStr, newStr, callback);\n }\n});\n\n// node_modules/diff/lib/diff/css.js\nvar require_css = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.diffCss = diffCss;\n exports.cssDiff = undefined;\n var _base = _interopRequireDefault(require_base());\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n var cssDiff = new _base.default;\n exports.cssDiff = cssDiff;\n cssDiff.tokenize = function(value) {\n return value.split(/([{}:;,]|\\s+)/);\n };\n function diffCss(oldStr, newStr, callback) {\n return cssDiff.diff(oldStr, newStr, callback);\n }\n});\n\n// node_modules/diff/lib/diff/json.js\nvar require_json = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.diffJson = diffJson;\n exports.canonicalize = canonicalize;\n exports.jsonDiff = undefined;\n var _base = _interopRequireDefault(require_base());\n var _line = require_line();\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n function _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj2) {\n return typeof obj2;\n };\n } else {\n _typeof = function _typeof(obj2) {\n return obj2 && typeof Symbol === \"function\" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? \"symbol\" : typeof obj2;\n };\n }\n return _typeof(obj);\n }\n var objectPrototypeToString = Object.prototype.toString;\n var jsonDiff = new _base.default;\n exports.jsonDiff = jsonDiff;\n jsonDiff.useLongestToken = true;\n jsonDiff.tokenize = _line.lineDiff.tokenize;\n jsonDiff.castInput = function(value) {\n var _this$options = this.options, undefinedReplacement = _this$options.undefinedReplacement, _this$options$stringi = _this$options.stringifyReplacer, stringifyReplacer = _this$options$stringi === undefined ? function(k, v) {\n return typeof v === \"undefined\" ? undefinedReplacement : v;\n } : _this$options$stringi;\n return typeof value === \"string\" ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, \" \");\n };\n jsonDiff.equals = function(left, right) {\n return _base.default.prototype.equals.call(jsonDiff, left.replace(/,([\\r\\n])/g, \"$1\"), right.replace(/,([\\r\\n])/g, \"$1\"));\n };\n function diffJson(oldObj, newObj, options) {\n return jsonDiff.diff(oldObj, newObj, options);\n }\n function canonicalize(obj, stack, replacementStack, replacer, key) {\n stack = stack || [];\n replacementStack = replacementStack || [];\n if (replacer) {\n obj = replacer(key, obj);\n }\n var i;\n for (i = 0;i < stack.length; i += 1) {\n if (stack[i] === obj) {\n return replacementStack[i];\n }\n }\n var canonicalizedObj;\n if (objectPrototypeToString.call(obj) === \"[object Array]\") {\n stack.push(obj);\n canonicalizedObj = new Array(obj.length);\n replacementStack.push(canonicalizedObj);\n for (i = 0;i < obj.length; i += 1) {\n canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key);\n }\n stack.pop();\n replacementStack.pop();\n return canonicalizedObj;\n }\n if (obj && obj.toJSON) {\n obj = obj.toJSON();\n }\n if (_typeof(obj) === \"object\" && obj !== null) {\n stack.push(obj);\n canonicalizedObj = {};\n replacementStack.push(canonicalizedObj);\n var sortedKeys = [], _key;\n for (_key in obj) {\n if (obj.hasOwnProperty(_key)) {\n sortedKeys.push(_key);\n }\n }\n sortedKeys.sort();\n for (i = 0;i < sortedKeys.length; i += 1) {\n _key = sortedKeys[i];\n canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key);\n }\n stack.pop();\n replacementStack.pop();\n } else {\n canonicalizedObj = obj;\n }\n return canonicalizedObj;\n }\n});\n\n// node_modules/diff/lib/diff/array.js\nvar require_array = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.diffArrays = diffArrays;\n exports.arrayDiff = undefined;\n var _base = _interopRequireDefault(require_base());\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n var arrayDiff = new _base.default;\n exports.arrayDiff = arrayDiff;\n arrayDiff.tokenize = function(value) {\n return value.slice();\n };\n arrayDiff.join = arrayDiff.removeEmpty = function(value) {\n return value;\n };\n function diffArrays(oldArr, newArr, callback) {\n return arrayDiff.diff(oldArr, newArr, callback);\n }\n});\n\n// node_modules/diff/lib/patch/parse.js\nvar require_parse = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.parsePatch = parsePatch;\n function parsePatch(uniDiff) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var diffstr = uniDiff.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/), delimiters = uniDiff.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [], list = [], i = 0;\n function parseIndex() {\n var index = {};\n list.push(index);\n while (i < diffstr.length) {\n var line = diffstr[i];\n if (/^(\\-\\-\\-|\\+\\+\\+|@@)\\s/.test(line)) {\n break;\n }\n var header = /^(?:Index:|diff(?: -r \\w+)+)\\s+(.+?)\\s*$/.exec(line);\n if (header) {\n index.index = header[1];\n }\n i++;\n }\n parseFileHeader(index);\n parseFileHeader(index);\n index.hunks = [];\n while (i < diffstr.length) {\n var _line = diffstr[i];\n if (/^(Index:|diff|\\-\\-\\-|\\+\\+\\+)\\s/.test(_line)) {\n break;\n } else if (/^@@/.test(_line)) {\n index.hunks.push(parseHunk());\n } else if (_line && options.strict) {\n throw new Error(\"Unknown line \" + (i + 1) + \" \" + JSON.stringify(_line));\n } else {\n i++;\n }\n }\n }\n function parseFileHeader(index) {\n var fileHeader = /^(---|\\+\\+\\+)\\s+(.*)$/.exec(diffstr[i]);\n if (fileHeader) {\n var keyPrefix = fileHeader[1] === \"---\" ? \"old\" : \"new\";\n var data = fileHeader[2].split(\"\\t\", 2);\n var fileName = data[0].replace(/\\\\\\\\/g, \"\\\\\");\n if (/^\".*\"$/.test(fileName)) {\n fileName = fileName.substr(1, fileName.length - 2);\n }\n index[keyPrefix + \"FileName\"] = fileName;\n index[keyPrefix + \"Header\"] = (data[1] || \"\").trim();\n i++;\n }\n }\n function parseHunk() {\n var chunkHeaderIndex = i, chunkHeaderLine = diffstr[i++], chunkHeader = chunkHeaderLine.split(/@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n var hunk = {\n oldStart: +chunkHeader[1],\n oldLines: +chunkHeader[2] || 1,\n newStart: +chunkHeader[3],\n newLines: +chunkHeader[4] || 1,\n lines: [],\n linedelimiters: []\n };\n var addCount = 0, removeCount = 0;\n for (;i < diffstr.length; i++) {\n if (diffstr[i].indexOf(\"--- \") === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf(\"+++ \") === 0 && diffstr[i + 2].indexOf(\"@@\") === 0) {\n break;\n }\n var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? \" \" : diffstr[i][0];\n if (operation === \"+\" || operation === \"-\" || operation === \" \" || operation === \"\\\\\") {\n hunk.lines.push(diffstr[i]);\n hunk.linedelimiters.push(delimiters[i] || `\n`);\n if (operation === \"+\") {\n addCount++;\n } else if (operation === \"-\") {\n removeCount++;\n } else if (operation === \" \") {\n addCount++;\n removeCount++;\n }\n } else {\n break;\n }\n }\n if (!addCount && hunk.newLines === 1) {\n hunk.newLines = 0;\n }\n if (!removeCount && hunk.oldLines === 1) {\n hunk.oldLines = 0;\n }\n if (options.strict) {\n if (addCount !== hunk.newLines) {\n throw new Error(\"Added line count did not match for hunk at line \" + (chunkHeaderIndex + 1));\n }\n if (removeCount !== hunk.oldLines) {\n throw new Error(\"Removed line count did not match for hunk at line \" + (chunkHeaderIndex + 1));\n }\n }\n return hunk;\n }\n while (i < diffstr.length) {\n parseIndex();\n }\n return list;\n }\n});\n\n// node_modules/diff/lib/util/distance-iterator.js\nvar require_distance_iterator = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = _default;\n function _default(start, minLine, maxLine) {\n var wantForward = true, backwardExhausted = false, forwardExhausted = false, localOffset = 1;\n return function iterator() {\n if (wantForward && !forwardExhausted) {\n if (backwardExhausted) {\n localOffset++;\n } else {\n wantForward = false;\n }\n if (start + localOffset <= maxLine) {\n return localOffset;\n }\n forwardExhausted = true;\n }\n if (!backwardExhausted) {\n if (!forwardExhausted) {\n wantForward = true;\n }\n if (minLine <= start - localOffset) {\n return -localOffset++;\n }\n backwardExhausted = true;\n return iterator();\n }\n };\n }\n});\n\n// node_modules/diff/lib/patch/apply.js\nvar require_apply = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.applyPatch = applyPatch;\n exports.applyPatches = applyPatches;\n var _parse = require_parse();\n var _distanceIterator = _interopRequireDefault(require_distance_iterator());\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n function applyPatch(source, uniDiff) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n if (typeof uniDiff === \"string\") {\n uniDiff = (0, _parse.parsePatch)(uniDiff);\n }\n if (Array.isArray(uniDiff)) {\n if (uniDiff.length > 1) {\n throw new Error(\"applyPatch only works with a single input.\");\n }\n uniDiff = uniDiff[0];\n }\n var lines = source.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/), delimiters = source.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [], hunks = uniDiff.hunks, compareLine = options.compareLine || function(lineNumber, line2, operation2, patchContent) {\n return line2 === patchContent;\n }, errorCount = 0, fuzzFactor = options.fuzzFactor || 0, minLine = 0, offset = 0, removeEOFNL, addEOFNL;\n function hunkFits(hunk2, toPos2) {\n for (var j2 = 0;j2 < hunk2.lines.length; j2++) {\n var line2 = hunk2.lines[j2], operation2 = line2.length > 0 ? line2[0] : \" \", content2 = line2.length > 0 ? line2.substr(1) : line2;\n if (operation2 === \" \" || operation2 === \"-\") {\n if (!compareLine(toPos2 + 1, lines[toPos2], operation2, content2)) {\n errorCount++;\n if (errorCount > fuzzFactor) {\n return false;\n }\n }\n toPos2++;\n }\n }\n return true;\n }\n for (var i = 0;i < hunks.length; i++) {\n var hunk = hunks[i], maxLine = lines.length - hunk.oldLines, localOffset = 0, toPos = offset + hunk.oldStart - 1;\n var iterator = (0, _distanceIterator.default)(toPos, minLine, maxLine);\n for (;localOffset !== undefined; localOffset = iterator()) {\n if (hunkFits(hunk, toPos + localOffset)) {\n hunk.offset = offset += localOffset;\n break;\n }\n }\n if (localOffset === undefined) {\n return false;\n }\n minLine = hunk.offset + hunk.oldStart + hunk.oldLines;\n }\n var diffOffset = 0;\n for (var _i = 0;_i < hunks.length; _i++) {\n var _hunk = hunks[_i], _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1;\n diffOffset += _hunk.newLines - _hunk.oldLines;\n if (_toPos < 0) {\n _toPos = 0;\n }\n for (var j = 0;j < _hunk.lines.length; j++) {\n var line = _hunk.lines[j], operation = line.length > 0 ? line[0] : \" \", content = line.length > 0 ? line.substr(1) : line, delimiter = _hunk.linedelimiters[j];\n if (operation === \" \") {\n _toPos++;\n } else if (operation === \"-\") {\n lines.splice(_toPos, 1);\n delimiters.splice(_toPos, 1);\n } else if (operation === \"+\") {\n lines.splice(_toPos, 0, content);\n delimiters.splice(_toPos, 0, delimiter);\n _toPos++;\n } else if (operation === \"\\\\\") {\n var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null;\n if (previousOperation === \"+\") {\n removeEOFNL = true;\n } else if (previousOperation === \"-\") {\n addEOFNL = true;\n }\n }\n }\n }\n if (removeEOFNL) {\n while (!lines[lines.length - 1]) {\n lines.pop();\n delimiters.pop();\n }\n } else if (addEOFNL) {\n lines.push(\"\");\n delimiters.push(`\n`);\n }\n for (var _k = 0;_k < lines.length - 1; _k++) {\n lines[_k] = lines[_k] + delimiters[_k];\n }\n return lines.join(\"\");\n }\n function applyPatches(uniDiff, options) {\n if (typeof uniDiff === \"string\") {\n uniDiff = (0, _parse.parsePatch)(uniDiff);\n }\n var currentIndex = 0;\n function processIndex() {\n var index = uniDiff[currentIndex++];\n if (!index) {\n return options.complete();\n }\n options.loadFile(index, function(err, data) {\n if (err) {\n return options.complete(err);\n }\n var updatedContent = applyPatch(data, index, options);\n options.patched(index, updatedContent, function(err2) {\n if (err2) {\n return options.complete(err2);\n }\n processIndex();\n });\n });\n }\n processIndex();\n }\n});\n\n// node_modules/diff/lib/patch/create.js\nvar require_create = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.structuredPatch = structuredPatch;\n exports.createTwoFilesPatch = createTwoFilesPatch;\n exports.createPatch = createPatch;\n var _line = require_line();\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n }\n function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n }\n function _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\")\n return Array.from(iter);\n }\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length);i < arr.length; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n }\n }\n function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n if (!options) {\n options = {};\n }\n if (typeof options.context === \"undefined\") {\n options.context = 4;\n }\n var diff = (0, _line.diffLines)(oldStr, newStr, options);\n diff.push({\n value: \"\",\n lines: []\n });\n function contextLines(lines) {\n return lines.map(function(entry) {\n return \" \" + entry;\n });\n }\n var hunks = [];\n var oldRangeStart = 0, newRangeStart = 0, curRange = [], oldLine = 1, newLine = 1;\n var _loop = function _loop(i2) {\n var current = diff[i2], lines = current.lines || current.value.replace(/\\n$/, \"\").split(`\n`);\n current.lines = lines;\n if (current.added || current.removed) {\n var _curRange;\n if (!oldRangeStart) {\n var prev = diff[i2 - 1];\n oldRangeStart = oldLine;\n newRangeStart = newLine;\n if (prev) {\n curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : [];\n oldRangeStart -= curRange.length;\n newRangeStart -= curRange.length;\n }\n }\n (_curRange = curRange).push.apply(_curRange, _toConsumableArray(lines.map(function(entry) {\n return (current.added ? \"+\" : \"-\") + entry;\n })));\n if (current.added) {\n newLine += lines.length;\n } else {\n oldLine += lines.length;\n }\n } else {\n if (oldRangeStart) {\n if (lines.length <= options.context * 2 && i2 < diff.length - 2) {\n var _curRange2;\n (_curRange2 = curRange).push.apply(_curRange2, _toConsumableArray(contextLines(lines)));\n } else {\n var _curRange3;\n var contextSize = Math.min(lines.length, options.context);\n (_curRange3 = curRange).push.apply(_curRange3, _toConsumableArray(contextLines(lines.slice(0, contextSize))));\n var hunk = {\n oldStart: oldRangeStart,\n oldLines: oldLine - oldRangeStart + contextSize,\n newStart: newRangeStart,\n newLines: newLine - newRangeStart + contextSize,\n lines: curRange\n };\n if (i2 >= diff.length - 2 && lines.length <= options.context) {\n var oldEOFNewline = /\\n$/.test(oldStr);\n var newEOFNewline = /\\n$/.test(newStr);\n var noNlBeforeAdds = lines.length == 0 && curRange.length > hunk.oldLines;\n if (!oldEOFNewline && noNlBeforeAdds) {\n curRange.splice(hunk.oldLines, 0, \"\\\\");\n }\n if (!oldEOFNewline && !noNlBeforeAdds || !newEOFNewline) {\n curRange.push(\"\\\\");\n }\n }\n hunks.push(hunk);\n oldRangeStart = 0;\n newRangeStart = 0;\n curRange = [];\n }\n }\n oldLine += lines.length;\n newLine += lines.length;\n }\n };\n for (var i = 0;i < diff.length; i++) {\n _loop(i);\n }\n return {\n oldFileName,\n newFileName,\n oldHeader,\n newHeader,\n hunks\n };\n }\n function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n var diff = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options);\n var ret = [];\n if (oldFileName == newFileName) {\n ret.push(\"Index: \" + oldFileName);\n }\n ret.push(\"===================================================================\");\n ret.push(\"--- \" + diff.oldFileName + (typeof diff.oldHeader === \"undefined\" ? \"\" : \"\\t\" + diff.oldHeader));\n ret.push(\"+++ \" + diff.newFileName + (typeof diff.newHeader === \"undefined\" ? \"\" : \"\\t\" + diff.newHeader));\n for (var i = 0;i < diff.hunks.length; i++) {\n var hunk = diff.hunks[i];\n ret.push(\"@@ -\" + hunk.oldStart + \",\" + hunk.oldLines + \" +\" + hunk.newStart + \",\" + hunk.newLines + \" @@\");\n ret.push.apply(ret, hunk.lines);\n }\n return ret.join(`\n`) + `\n`;\n }\n function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) {\n return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options);\n }\n});\n\n// node_modules/diff/lib/util/array.js\nvar require_array2 = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.arrayEqual = arrayEqual;\n exports.arrayStartsWith = arrayStartsWith;\n function arrayEqual(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n return arrayStartsWith(a, b);\n }\n function arrayStartsWith(array, start) {\n if (start.length > array.length) {\n return false;\n }\n for (var i = 0;i < start.length; i++) {\n if (start[i] !== array[i]) {\n return false;\n }\n }\n return true;\n }\n});\n\n// node_modules/diff/lib/patch/merge.js\nvar require_merge = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.calcLineCount = calcLineCount;\n exports.merge = merge;\n var _create = require_create();\n var _parse = require_parse();\n var _array = require_array2();\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n }\n function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n }\n function _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\")\n return Array.from(iter);\n }\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length);i < arr.length; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n }\n }\n function calcLineCount(hunk) {\n var _calcOldNewLineCount = calcOldNewLineCount(hunk.lines), oldLines = _calcOldNewLineCount.oldLines, newLines = _calcOldNewLineCount.newLines;\n if (oldLines !== undefined) {\n hunk.oldLines = oldLines;\n } else {\n delete hunk.oldLines;\n }\n if (newLines !== undefined) {\n hunk.newLines = newLines;\n } else {\n delete hunk.newLines;\n }\n }\n function merge(mine, theirs, base) {\n mine = loadPatch(mine, base);\n theirs = loadPatch(theirs, base);\n var ret = {};\n if (mine.index || theirs.index) {\n ret.index = mine.index || theirs.index;\n }\n if (mine.newFileName || theirs.newFileName) {\n if (!fileNameChanged(mine)) {\n ret.oldFileName = theirs.oldFileName || mine.oldFileName;\n ret.newFileName = theirs.newFileName || mine.newFileName;\n ret.oldHeader = theirs.oldHeader || mine.oldHeader;\n ret.newHeader = theirs.newHeader || mine.newHeader;\n } else if (!fileNameChanged(theirs)) {\n ret.oldFileName = mine.oldFileName;\n ret.newFileName = mine.newFileName;\n ret.oldHeader = mine.oldHeader;\n ret.newHeader = mine.newHeader;\n } else {\n ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName);\n ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName);\n ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader);\n ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader);\n }\n }\n ret.hunks = [];\n var mineIndex = 0, theirsIndex = 0, mineOffset = 0, theirsOffset = 0;\n while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) {\n var mineCurrent = mine.hunks[mineIndex] || {\n oldStart: Infinity\n }, theirsCurrent = theirs.hunks[theirsIndex] || {\n oldStart: Infinity\n };\n if (hunkBefore(mineCurrent, theirsCurrent)) {\n ret.hunks.push(cloneHunk(mineCurrent, mineOffset));\n mineIndex++;\n theirsOffset += mineCurrent.newLines - mineCurrent.oldLines;\n } else if (hunkBefore(theirsCurrent, mineCurrent)) {\n ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset));\n theirsIndex++;\n mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines;\n } else {\n var mergedHunk = {\n oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart),\n oldLines: 0,\n newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset),\n newLines: 0,\n lines: []\n };\n mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines);\n theirsIndex++;\n mineIndex++;\n ret.hunks.push(mergedHunk);\n }\n }\n return ret;\n }\n function loadPatch(param, base) {\n if (typeof param === \"string\") {\n if (/^@@/m.test(param) || /^Index:/m.test(param)) {\n return (0, _parse.parsePatch)(param)[0];\n }\n if (!base) {\n throw new Error(\"Must provide a base reference or pass in a patch\");\n }\n return (0, _create.structuredPatch)(undefined, undefined, base, param);\n }\n return param;\n }\n function fileNameChanged(patch) {\n return patch.newFileName && patch.newFileName !== patch.oldFileName;\n }\n function selectField(index, mine, theirs) {\n if (mine === theirs) {\n return mine;\n } else {\n index.conflict = true;\n return {\n mine,\n theirs\n };\n }\n }\n function hunkBefore(test, check) {\n return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart;\n }\n function cloneHunk(hunk, offset) {\n return {\n oldStart: hunk.oldStart,\n oldLines: hunk.oldLines,\n newStart: hunk.newStart + offset,\n newLines: hunk.newLines,\n lines: hunk.lines\n };\n }\n function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) {\n var mine = {\n offset: mineOffset,\n lines: mineLines,\n index: 0\n }, their = {\n offset: theirOffset,\n lines: theirLines,\n index: 0\n };\n insertLeading(hunk, mine, their);\n insertLeading(hunk, their, mine);\n while (mine.index < mine.lines.length && their.index < their.lines.length) {\n var mineCurrent = mine.lines[mine.index], theirCurrent = their.lines[their.index];\n if ((mineCurrent[0] === \"-\" || mineCurrent[0] === \"+\") && (theirCurrent[0] === \"-\" || theirCurrent[0] === \"+\")) {\n mutualChange(hunk, mine, their);\n } else if (mineCurrent[0] === \"+\" && theirCurrent[0] === \" \") {\n var _hunk$lines;\n (_hunk$lines = hunk.lines).push.apply(_hunk$lines, _toConsumableArray(collectChange(mine)));\n } else if (theirCurrent[0] === \"+\" && mineCurrent[0] === \" \") {\n var _hunk$lines2;\n (_hunk$lines2 = hunk.lines).push.apply(_hunk$lines2, _toConsumableArray(collectChange(their)));\n } else if (mineCurrent[0] === \"-\" && theirCurrent[0] === \" \") {\n removal(hunk, mine, their);\n } else if (theirCurrent[0] === \"-\" && mineCurrent[0] === \" \") {\n removal(hunk, their, mine, true);\n } else if (mineCurrent === theirCurrent) {\n hunk.lines.push(mineCurrent);\n mine.index++;\n their.index++;\n } else {\n conflict(hunk, collectChange(mine), collectChange(their));\n }\n }\n insertTrailing(hunk, mine);\n insertTrailing(hunk, their);\n calcLineCount(hunk);\n }\n function mutualChange(hunk, mine, their) {\n var myChanges = collectChange(mine), theirChanges = collectChange(their);\n if (allRemoves(myChanges) && allRemoves(theirChanges)) {\n if ((0, _array.arrayStartsWith)(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) {\n var _hunk$lines3;\n (_hunk$lines3 = hunk.lines).push.apply(_hunk$lines3, _toConsumableArray(myChanges));\n return;\n } else if ((0, _array.arrayStartsWith)(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) {\n var _hunk$lines4;\n (_hunk$lines4 = hunk.lines).push.apply(_hunk$lines4, _toConsumableArray(theirChanges));\n return;\n }\n } else if ((0, _array.arrayEqual)(myChanges, theirChanges)) {\n var _hunk$lines5;\n (_hunk$lines5 = hunk.lines).push.apply(_hunk$lines5, _toConsumableArray(myChanges));\n return;\n }\n conflict(hunk, myChanges, theirChanges);\n }\n function removal(hunk, mine, their, swap) {\n var myChanges = collectChange(mine), theirChanges = collectContext(their, myChanges);\n if (theirChanges.merged) {\n var _hunk$lines6;\n (_hunk$lines6 = hunk.lines).push.apply(_hunk$lines6, _toConsumableArray(theirChanges.merged));\n } else {\n conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges);\n }\n }\n function conflict(hunk, mine, their) {\n hunk.conflict = true;\n hunk.lines.push({\n conflict: true,\n mine,\n theirs: their\n });\n }\n function insertLeading(hunk, insert, their) {\n while (insert.offset < their.offset && insert.index < insert.lines.length) {\n var line = insert.lines[insert.index++];\n hunk.lines.push(line);\n insert.offset++;\n }\n }\n function insertTrailing(hunk, insert) {\n while (insert.index < insert.lines.length) {\n var line = insert.lines[insert.index++];\n hunk.lines.push(line);\n }\n }\n function collectChange(state) {\n var ret = [], operation = state.lines[state.index][0];\n while (state.index < state.lines.length) {\n var line = state.lines[state.index];\n if (operation === \"-\" && line[0] === \"+\") {\n operation = \"+\";\n }\n if (operation === line[0]) {\n ret.push(line);\n state.index++;\n } else {\n break;\n }\n }\n return ret;\n }\n function collectContext(state, matchChanges) {\n var changes = [], merged = [], matchIndex = 0, contextChanges = false, conflicted = false;\n while (matchIndex < matchChanges.length && state.index < state.lines.length) {\n var change = state.lines[state.index], match = matchChanges[matchIndex];\n if (match[0] === \"+\") {\n break;\n }\n contextChanges = contextChanges || change[0] !== \" \";\n merged.push(match);\n matchIndex++;\n if (change[0] === \"+\") {\n conflicted = true;\n while (change[0] === \"+\") {\n changes.push(change);\n change = state.lines[++state.index];\n }\n }\n if (match.substr(1) === change.substr(1)) {\n changes.push(change);\n state.index++;\n } else {\n conflicted = true;\n }\n }\n if ((matchChanges[matchIndex] || \"\")[0] === \"+\" && contextChanges) {\n conflicted = true;\n }\n if (conflicted) {\n return changes;\n }\n while (matchIndex < matchChanges.length) {\n merged.push(matchChanges[matchIndex++]);\n }\n return {\n merged,\n changes\n };\n }\n function allRemoves(changes) {\n return changes.reduce(function(prev, change) {\n return prev && change[0] === \"-\";\n }, true);\n }\n function skipRemoveSuperset(state, removeChanges, delta) {\n for (var i = 0;i < delta; i++) {\n var changeContent = removeChanges[removeChanges.length - delta + i].substr(1);\n if (state.lines[state.index + i] !== \" \" + changeContent) {\n return false;\n }\n }\n state.index += delta;\n return true;\n }\n function calcOldNewLineCount(lines) {\n var oldLines = 0;\n var newLines = 0;\n lines.forEach(function(line) {\n if (typeof line !== \"string\") {\n var myCount = calcOldNewLineCount(line.mine);\n var theirCount = calcOldNewLineCount(line.theirs);\n if (oldLines !== undefined) {\n if (myCount.oldLines === theirCount.oldLines) {\n oldLines += myCount.oldLines;\n } else {\n oldLines = undefined;\n }\n }\n if (newLines !== undefined) {\n if (myCount.newLines === theirCount.newLines) {\n newLines += myCount.newLines;\n } else {\n newLines = undefined;\n }\n }\n } else {\n if (newLines !== undefined && (line[0] === \"+\" || line[0] === \" \")) {\n newLines++;\n }\n if (oldLines !== undefined && (line[0] === \"-\" || line[0] === \" \")) {\n oldLines++;\n }\n }\n });\n return {\n oldLines,\n newLines\n };\n }\n});\n\n// node_modules/diff/lib/convert/dmp.js\nvar require_dmp = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.convertChangesToDMP = convertChangesToDMP;\n function convertChangesToDMP(changes) {\n var ret = [], change, operation;\n for (var i = 0;i < changes.length; i++) {\n change = changes[i];\n if (change.added) {\n operation = 1;\n } else if (change.removed) {\n operation = -1;\n } else {\n operation = 0;\n }\n ret.push([operation, change.value]);\n }\n return ret;\n }\n});\n\n// node_modules/diff/lib/convert/xml.js\nvar require_xml = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.convertChangesToXML = convertChangesToXML;\n function convertChangesToXML(changes) {\n var ret = [];\n for (var i = 0;i < changes.length; i++) {\n var change = changes[i];\n if (change.added) {\n ret.push(\"<ins>\");\n } else if (change.removed) {\n ret.push(\"<del>\");\n }\n ret.push(escapeHTML(change.value));\n if (change.added) {\n ret.push(\"</ins>\");\n } else if (change.removed) {\n ret.push(\"</del>\");\n }\n }\n return ret.join(\"\");\n }\n function escapeHTML(s) {\n var n = s;\n n = n.replace(/&/g, \"&\");\n n = n.replace(/</g, \"<\");\n n = n.replace(/>/g, \">\");\n n = n.replace(/\"/g, \""\");\n return n;\n }\n});\n\n// node_modules/diff/lib/index.js\nvar require_lib = __commonJS((exports) => {\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(exports, \"Diff\", {\n enumerable: true,\n get: function get() {\n return _base.default;\n }\n });\n Object.defineProperty(exports, \"diffChars\", {\n enumerable: true,\n get: function get() {\n return _character.diffChars;\n }\n });\n Object.defineProperty(exports, \"diffWords\", {\n enumerable: true,\n get: function get() {\n return _word.diffWords;\n }\n });\n Object.defineProperty(exports, \"diffWordsWithSpace\", {\n enumerable: true,\n get: function get() {\n return _word.diffWordsWithSpace;\n }\n });\n Object.defineProperty(exports, \"diffLines\", {\n enumerable: true,\n get: function get() {\n return _line.diffLines;\n }\n });\n Object.defineProperty(exports, \"diffTrimmedLines\", {\n enumerable: true,\n get: function get() {\n return _line.diffTrimmedLines;\n }\n });\n Object.defineProperty(exports, \"diffSentences\", {\n enumerable: true,\n get: function get() {\n return _sentence.diffSentences;\n }\n });\n Object.defineProperty(exports, \"diffCss\", {\n enumerable: true,\n get: function get() {\n return _css.diffCss;\n }\n });\n Object.defineProperty(exports, \"diffJson\", {\n enumerable: true,\n get: function get() {\n return _json.diffJson;\n }\n });\n Object.defineProperty(exports, \"canonicalize\", {\n enumerable: true,\n get: function get() {\n return _json.canonicalize;\n }\n });\n Object.defineProperty(exports, \"diffArrays\", {\n enumerable: true,\n get: function get() {\n return _array.diffArrays;\n }\n });\n Object.defineProperty(exports, \"applyPatch\", {\n enumerable: true,\n get: function get() {\n return _apply.applyPatch;\n }\n });\n Object.defineProperty(exports, \"applyPatches\", {\n enumerable: true,\n get: function get() {\n return _apply.applyPatches;\n }\n });\n Object.defineProperty(exports, \"parsePatch\", {\n enumerable: true,\n get: function get() {\n return _parse.parsePatch;\n }\n });\n Object.defineProperty(exports, \"merge\", {\n enumerable: true,\n get: function get() {\n return _merge.merge;\n }\n });\n Object.defineProperty(exports, \"structuredPatch\", {\n enumerable: true,\n get: function get() {\n return _create.structuredPatch;\n }\n });\n Object.defineProperty(exports, \"createTwoFilesPatch\", {\n enumerable: true,\n get: function get() {\n return _create.createTwoFilesPatch;\n }\n });\n Object.defineProperty(exports, \"createPatch\", {\n enumerable: true,\n get: function get() {\n return _create.createPatch;\n }\n });\n Object.defineProperty(exports, \"convertChangesToDMP\", {\n enumerable: true,\n get: function get() {\n return _dmp.convertChangesToDMP;\n }\n });\n Object.defineProperty(exports, \"convertChangesToXML\", {\n enumerable: true,\n get: function get() {\n return _xml.convertChangesToXML;\n }\n });\n var _base = _interopRequireDefault(require_base());\n var _character = require_character();\n var _word = require_word();\n var _line = require_line();\n var _sentence = require_sentence();\n var _css = require_css();\n var _json = require_json();\n var _array = require_array();\n var _apply = require_apply();\n var _parse = require_parse();\n var _merge = require_merge();\n var _create = require_create();\n var _dmp = require_dmp();\n var _xml = require_xml();\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n});\n\n// src/index.tsx\nvar import_classnames = __toESM(require_classnames(), 1);\nimport * as React from \"react\";\nimport { useState, useCallback } from \"react\";\n\n// src/compute-lines.ts\nvar diff = __toESM(require_lib(), 1);\nvar jsDiff = diff;\nvar DiffMethod;\n((DiffMethod2) => {\n DiffMethod2[\"CHARS\"] = \"diffChars\";\n DiffMethod2[\"WORDS\"] = \"diffWords\";\n DiffMethod2[\"WORDS_WITH_SPACE\"] = \"diffWordsWithSpace\";\n DiffMethod2[\"LINES\"] = \"diffLines\";\n DiffMethod2[\"TRIMMED_LINES\"] = \"diffTrimmedLines\";\n DiffMethod2[\"SENTENCES\"] = \"diffSentences\";\n DiffMethod2[\"CSS\"] = \"diffCss\";\n})(DiffMethod ||= {});\nvar constructLines = (value) => {\n const lines = value.split(`\n`);\n const isAllEmpty = lines.every((val) => !val);\n if (isAllEmpty) {\n if (lines.length === 2) {\n return [];\n }\n lines.pop();\n return lines;\n }\n const lastLine = lines[lines.length - 1];\n const firstLine = lines[0];\n if (!lastLine) {\n lines.pop();\n }\n if (!firstLine) {\n lines.shift();\n }\n return lines;\n};\nvar computeDiff = (oldValue, newValue, compareMethod = \"diffChars\" /* CHARS */) => {\n const diffArray = jsDiff[compareMethod](oldValue, newValue);\n const computedDiff = {\n left: [],\n right: []\n };\n diffArray.forEach(({ added, removed, value }) => {\n const diffInformation = {};\n if (added) {\n diffInformation.type = 1 /* ADDED */;\n diffInformation.value = value;\n computedDiff.right.push(diffInformation);\n }\n if (removed) {\n diffInformation.type = 2 /* REMOVED */;\n diffInformation.value = value;\n computedDiff.left.push(diffInformation);\n }\n if (!removed && !added) {\n diffInformation.type = 0 /* DEFAULT */;\n diffInformation.value = value;\n computedDiff.right.push(diffInformation);\n computedDiff.left.push(diffInformation);\n }\n return diffInformation;\n });\n return computedDiff;\n};\nvar computeLineInformation = (oldString, newString, disableWordDiff = false, compareMethod = \"diffChars\" /* CHARS */, linesOffset = 0) => {\n const diffArray = diff.diffLines(oldString.trimRight(), newString.trimRight(), {\n newlineIsToken: true,\n ignoreWhitespace: false,\n ignoreCase: false\n });\n let rightLineNumber = linesOffset;\n let leftLineNumber = linesOffset;\n let lineInformation = [];\n let counter = 0;\n const diffLines2 = [];\n const ignoreDiffIndexes = [];\n const getLineInformation = (value, diffIndex, added, removed, evaluateOnlyFirstLine) => {\n const lines = constructLines(value);\n return lines.map((line, lineIndex) => {\n const left = {};\n const right = {};\n if (ignoreDiffIndexes.includes(`${diffIndex}-${lineIndex}`) || evaluateOnlyFirstLine && lineIndex !== 0) {\n return;\n }\n if (added || removed) {\n if (!diffLines2.includes(counter)) {\n diffLines2.push(counter);\n }\n if (removed) {\n leftLineNumber += 1;\n left.lineNumber = leftLineNumber;\n left.type = 2 /* REMOVED */;\n left.value = line || \" \";\n const nextDiff = diffArray[diffIndex + 1];\n if (nextDiff && nextDiff.added) {\n const nextDiffLines = constructLines(nextDiff.value)[lineIndex];\n if (nextDiffLines) {\n const {\n value: rightValue,\n lineNumber,\n type\n } = getLineInformation(nextDiff.value, diffIndex, true, false, true)[0].right;\n ignoreDiffIndexes.push(`${diffIndex + 1}-${lineIndex}`);\n right.lineNumber = lineNumber;\n right.type = type;\n if (disableWordDiff) {\n right.value = rightValue;\n } else {\n const computedDiff = computeDiff(line, rightValue, compareMethod);\n right.value = computedDiff.right;\n left.value = computedDiff.left;\n }\n }\n }\n } else {\n rightLineNumber += 1;\n right.lineNumber = rightLineNumber;\n right.type = 1 /* ADDED */;\n right.value = line;\n }\n } else {\n leftLineNumber += 1;\n rightLineNumber += 1;\n left.lineNumber = leftLineNumber;\n left.type = 0 /* DEFAULT */;\n left.value = line;\n right.lineNumber = rightLineNumber;\n right.type = 0 /* DEFAULT */;\n right.value = line;\n }\n counter += 1;\n return { right, left };\n }).filter(Boolean);\n };\n diffArray.forEach(({ added, removed, value }, index) => {\n lineInformation = [\n ...lineInformation,\n ...getLineInformation(value, index, added, removed)\n ];\n });\n return {\n lineInformation,\n diffLines: diffLines2\n };\n};\n\n// src/index.tsx\nvar LineNumberPrefix;\n((LineNumberPrefix2) => {\n LineNumberPrefix2[\"LEFT\"] = \"L\";\n LineNumberPrefix2[\"RIGHT\"] = \"R\";\n})(LineNumberPrefix ||= {});\nvar DiffViewer = ({\n oldValue,\n newValue,\n splitView = true,\n linesOffset = 0,\n disableWordDiff = false,\n compareMethod = \"diffChars\" /* CHARS */,\n extraLinesSurroundingDiff = 3,\n hideLineNumbers = false,\n showDiffOnly = true,\n renderContent,\n codeFoldMessageRenderer,\n onLineNumberClick,\n highlightLines = [],\n useDarkTheme = false,\n leftTitle,\n rightTitle\n}) => {\n const [expandedBlocks, setExpandedBlocks] = useState([]);\n const onBlockExpand = useCallback((id) => {\n setExpandedBlocks((prevState) => [...prevState, id]);\n }, [setExpandedBlocks]);\n const onLineNumberClickProxy = useCallback((id) => (e) => {\n if (onLineNumberClick) {\n onLineNumberClick(id, e);\n }\n }, [onLineNumberClick]);\n const renderWordDiff = useCallback((diffArray, renderer) => {\n return diffArray.map((wordDiff, i) => {\n return /* @__PURE__ */ React.createElement(\"span\", {\n key: i,\n className: import_classnames.default(\"word-diff\", {\n \"word-added\": wordDiff.type === 1 /* ADDED */,\n \"word-removed\": wordDiff.type === 2 /* REMOVED */\n })\n }, renderer ? renderer(wordDiff.value) : `${wordDiff.value}`);\n });\n }, [renderContent]);\n const renderLine = useCallback((lineNumber, type, prefix, value, additionalLineNumber, additionalPrefix) => {\n const lineNumberTemplate = `${prefix}-${lineNumber}`;\n const additionalLineNumberTemplate = `${additionalPrefix}-${additionalLineNumber}`;\n const highlightLine = lineNumber !== null && highlightLines.includes(lineNumberTemplate) || additionalLineNumber !== null && highlightLines.includes(additionalLineNumberTemplate);\n const added = type === 1 /* ADDED */;\n const removed = type === 2 /* REMOVED */;\n let content;\n if (Array.isArray(value)) {\n content = renderWordDiff(value, renderContent);\n } else if (renderContent) {\n content = renderContent(value);\n } else {\n content = value;\n }\n content = content ?? /* @__PURE__ */ React.createElement(React.Fragment, null);\n return /* @__PURE__ */ React.createElement(React.Fragment, null, !hideLineNumbers && /* @__PURE__ */ React.createElement(\"td\", {\n onClick: lineNumber !== null ? onLineNumberClickProxy(lineNumberTemplate) : undefined,\n className: import_classnames.default(\"gutter\", {\n \"empty-gutter\": !lineNumber,\n \"diff-added\": added,\n \"diff-removed\": removed,\n \"highlighted-gutter\": highlightLine\n })\n }, /* @__PURE__ */ React.createElement(\"pre\", {\n className: \"line-number\"\n }, lineNumber)), !splitView && !hideLineNumbers && /* @__PURE__ */ React.createElement(\"td\", {\n onClick: additionalLineNumber !== null ? onLineNumberClickProxy(additionalLineNumberTemplate) : undefined,\n className: import_classnames.default(\"gutter\", {\n \"empty-gutter\": !additionalLineNumber,\n \"diff-added\": added,\n \"diff-removed\": removed,\n \"highlighted-gutter\": highlightLine\n })\n }, /* @__PURE__ */ React.createElement(\"pre\", {\n className: \"line-number\"\n }, additionalLineNumber)), /* @__PURE__ */ React.createElement(\"td\", {\n className: import_classnames.default(\"marker\", {\n \"empty-line\": !content,\n \"diff-added\": added,\n \"diff-removed\": removed,\n \"highlighted-line\": highlightLine\n })\n }, /* @__PURE__ */ React.createElement(\"pre\", null, added && \"+\", removed && \"-\")), /* @__PURE__ */ React.createElement(\"td\", {\n className: import_classnames.default(\"content\", {\n \"empty-line\": !content,\n \"diff-added\": added,\n \"diff-removed\": removed,\n \"highlighted-line\": highlightLine\n })\n }, /* @__PURE__ */ React.createElement(\"pre\", {\n className: \"content-text\"\n }, content)));\n }, [\n hideLineNumbers,\n splitView,\n highlightLines,\n renderWordDiff,\n renderContent,\n onLineNumberClickProxy\n ]);\n const renderSplitView = useCallback(({ left, right }, index) => {\n return /* @__PURE__ */ React.createElement(\"tr\", {\n key: index,\n className: \"line\"\n }, renderLine(left.lineNumber, left.type, \"L\" /* LEFT */, left.value), renderLine(right.lineNumber, right.type, \"R\" /* RIGHT */, right.value));\n }, [renderLine]);\n const renderInlineView = useCallback(({ left, right }, index) => {\n let content;\n if (left.type === 2 /* REMOVED */ && right.type === 1 /* ADDED */) {\n return /* @__PURE__ */ React.createElement(React.Fragment, {\n key: index\n }, /* @__PURE__ */ React.createElement(\"tr\", {\n className: \"line\"\n }, renderLine(left.lineNumber, left.type, \"L\" /* LEFT */, left.value, null)), /* @__PURE__ */ React.createElement(\"tr\", {\n className: \"line\"\n }, renderLine(null, right.type, \"R\" /* RIGHT */, right.value, right.lineNumber)));\n }\n if (left.type === 2 /* REMOVED */) {\n content = renderLine(left.lineNumber, left.type, \"L\" /* LEFT */, left.value, null);\n }\n if (left.type === 0 /* DEFAULT */) {\n content = renderLine(left.lineNumber, left.type, \"L\" /* LEFT */, left.value, right.lineNumber, \"R\" /* RIGHT */);\n }\n if (right.type === 1 /* ADDED */) {\n content = renderLine(null, right.type, \"R\" /* RIGHT */, right.value, right.lineNumber);\n }\n return /* @__PURE__ */ React.createElement(\"tr\", {\n key: index,\n className: \"line\"\n }, content);\n }, [renderLine]);\n const onBlockClickProxy = useCallback((id) => () => onBlockExpand(id), [onBlockExpand]);\n const renderSkippedLineIndicator = useCallback((num, blockNumber, leftBlockLineNumber, rightBlockLineNumber) => {\n const message = codeFoldMessageRenderer ? codeFoldMessageRenderer(num, leftBlockLineNumber, rightBlockLineNumber) : /* @__PURE__ */ React.createElement(\"pre\", {\n className: \"code-fold-content\"\n }, \"Expand \", num, \" lines ...\");\n const content = /* @__PURE__ */ React.createElement(\"td\", null, /* @__PURE__ */ React.createElement(\"a\", {\n onClick: onBlockClickProxy(blockNumber),\n tabIndex: 0\n }, message));\n const isUnifiedViewWithoutLineNumbers = !splitView && !hideLineNumbers;\n return /* @__PURE__ */ React.createElement(\"tr\", {\n key: `${leftBlockLineNumber}-${rightBlockLineNumber}`,\n className: \"code-fold\"\n }, !hideLineNumbers && /* @__PURE__ */ React.createElement(\"td\", {\n className: \"code-fold-gutter\"\n }), /* @__PURE__ */ React.createElement(\"td\", {\n className: import_classnames.default({\n \"code-fold-gutter\": isUnifiedViewWithoutLineNumbers\n })\n }), isUnifiedViewWithoutLineNumbers ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(\"td\", null), content) : /* @__PURE__ */ React.createElement(React.Fragment, null, content, /* @__PURE__ */ React.createElement(\"td\", null)), /* @__PURE__ */ React.createElement(\"td\", null), /* @__PURE__ */ React.createElement(\"td\", null));\n }, [\n hideLineNumbers,\n splitView,\n codeFoldMessageRenderer,\n onBlockClickProxy\n ]);\n const renderDiff = useCallback(() => {\n const { lineInformation, diffLines: diffLines2 } = computeLineInformation(oldValue, newValue, disableWordDiff, compareMethod, linesOffset);\n const remainingDiffLines = [...diffLines2];\n const validExtraLines = extraLinesSurroundingDiff < 0 ? 0 : extraLinesSurroundingDiff;\n let skippedLines = [];\n return lineInformation.map((line, i) => {\n const currentDiffBlockStart = remainingDiffLines[0];\n const currentPosition = currentDiffBlockStart - i;\n if (showDiffOnly) {\n const isSkipped = line.left.type === 0 /* DEFAULT */ && (currentPosition > validExtraLines || typeof currentDiffBlockStart === \"undefined\") && !expandedBlocks.includes(currentDiffBlockStart);\n if (isSkipped) {\n skippedLines.push(i);\n if (i === lineInformation.length - 1 && skippedLines.length > 0) {\n const firstSkippedIndex = skippedLines[0];\n const numSkipped = skippedLines.length;\n const leftNum = lineInformation[firstSkippedIndex].left.lineNumber;\n const rightNum = lineInformation[firstSkippedIndex].right.lineNumber;\n skippedLines = [];\n return renderSkippedLineIndicator(numSkipped, currentDiffBlockStart, leftNum, rightNum);\n }\n return null;\n } else {\n if (skippedLines.length > 0) {\n const firstSkippedIndex = skippedLines[0];\n const numSkipped = skippedLines.length;\n const leftNum = lineInformation[firstSkippedIndex].left.lineNumber;\n const rightNum = lineInformation[firstSkippedIndex].right.lineNumber;\n skippedLines = [];\n const indicator = renderSkippedLineIndicator(numSkipped, currentDiffBlockStart, leftNum, rightNum);\n const nodes = splitView ? renderSplitView(line, i) : renderInlineView(line, i);\n return /* @__PURE__ */ React.createElement(React.Fragment, {\n key: i\n }, indicator, nodes);\n }\n }\n if (currentPosition === -validExtraLines) {\n remainingDiffLines.shift();\n }\n }\n return splitView ? renderSplitView(line, i) : renderInlineView(line, i);\n });\n }, [\n oldValue,\n newValue,\n splitView,\n disableWordDiff,\n compareMethod,\n linesOffset,\n extraLinesSurroundingDiff,\n showDiffOnly,\n expandedBlocks,\n renderSkippedLineIndicator,\n renderSplitView,\n renderInlineView\n ]);\n const diffNodes = renderDiff();\n const title = (leftTitle || rightTitle) && /* @__PURE__ */ React.createElement(\"tr\", null, !hideLineNumbers && /* @__PURE__ */ React.createElement(\"td\", {\n className: \"title-block\"\n }), /* @__PURE__ */ React.createElement(\"td\", {\n colSpan: hideLineNumbers || !splitView ? 1 : 2,\n className: \"title-block\"\n }, /* @__PURE__ */ React.createElement(\"pre\", {\n className: \"content-text\"\n }, leftTitle)), splitView && /* @__PURE__ */ React.createElement(React.Fragment, null, !hideLineNumbers && /* @__PURE__ */ React.createElement(\"td\", {\n className: \"title-block\"\n }), /* @__PURE__ */ React.createElement(\"td\", {\n colSpan: hideLineNumbers ? 1 : 2,\n className: \"title-block\"\n }, /* @__PURE__ */ React.createElement(\"pre\", {\n className: \"content-text\"\n }, rightTitle))));\n return /* @__PURE__ */ React.createElement(\"table\", {\n className: import_classnames.default(\"diff-container\", {\n \"split-view\": splitView,\n \"light-theme\": !useDarkTheme,\n \"dark-theme\": useDarkTheme\n })\n }, title, /* @__PURE__ */ React.createElement(\"tbody\", null, diffNodes));\n};\nDiffViewer.defaultProps = {\n splitView: true,\n linesOffset: 0,\n disableWordDiff: false,\n compareMethod: \"diffChars\" /* CHARS */,\n extraLinesSurroundingDiff: 3,\n hideLineNumbers: false,\n showDiffOnly: true,\n highlightLines: [],\n useDarkTheme: false\n};\nvar src_default = DiffViewer;\nexport {\n src_default as default,\n LineNumberPrefix,\n DiffMethod\n};\n","import { ElementProps } from \"../types\";\nimport ReactDiffViewer from \"@alexbruf/react-diff-viewer\";\nimport \"@alexbruf/react-diff-viewer/index.css\";\n\nexport const FileContentDiffView: React.FC<\n ElementProps<{ old_code: string; new_code: string }>\n> = ({ data, interactive = true, default_open_in_side_app = true }) => {\n const { old_code, new_code } = data;\n return (\n <ReactDiffViewer\n oldValue={old_code}\n newValue={new_code}\n splitView={false}\n />\n );\n};\n","import React from \"react\";\nimport { Button, message, Space, Typography } from \"antd\";\nimport { ElementProps, ToolCallData } from \"../types\";\nimport { getFileIcon } from \"./getFileIcon\";\nimport { MDResponse } from \"../MDResponse\";\nimport { ContentPreviewCollapse } from \"./ContentPreviewCollapse\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\n\nconst { Text } = Typography;\n\nexport const EditFile: React.FC<ElementProps<ToolCallData>> = ({\n data,\n component_key,\n interactive = true,\n}) => {\n const toolCallData = data;\n const { file_path, new_string, old_string } = toolCallData?.args || {};\n const openSideApp = useSideAppOpener();\n if (!toolCallData) {\n return null;\n }\n\n const expandIcon = () => getFileIcon(file_path);\n\n const header = (\n <Space>\n <Text strong>Edit</Text>\n <Text title={file_path}>{file_path?.split(\"/\")?.pop() || \"\"}</Text>\n </Space>\n );\n const handleItemClick = (toolCallData: ToolCallData) => {\n openSideApp({\n component_key: \"file_content_diff_view\",\n message: file_path,\n data: {\n old_code: old_string,\n new_code: new_string,\n },\n });\n };\n return (\n <ContentPreviewCollapse\n panelKey={toolCallData.id}\n header={header}\n expandIcon={expandIcon}\n extra={\n <Button\n type=\"link\"\n size=\"small\"\n onClick={(evt) => {\n // evt.preventDefault();\n evt.stopPropagation();\n handleItemClick(toolCallData);\n }}\n >\n Diff View\n </Button>\n }\n >\n <MDResponse content={new_string} />\n </ContentPreviewCollapse>\n );\n};\n","import React from \"react\";\nimport { Card, Typography, Tag, Avatar } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { ElementProps, ToolCallData } from \"../types\";\nimport {\n CheckCircleOutlined,\n LoadingOutlined,\n CloseCircleOutlined,\n UserOutlined,\n FileTextOutlined,\n RightOutlined,\n CoffeeOutlined,\n CarryOutOutlined,\n} from \"@ant-design/icons\";\nimport { useAgentChat } from \"@hooks\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\nimport { MDResponse } from \"../MDResponse\";\n\nconst { Text } = Typography;\n\nconst useStyle = createStyles(({ token, css }) => ({\n card: css`\n background: rgba(0, 0, 0, 0.02);\n border: 1px solid ${token.colorBorderSecondary};\n border-radius: 16px;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n cursor: pointer;\n overflow: hidden;\n position: relative;\n &:hover {\n border-color: ${token.colorPrimary};\n box-shadow: 0 8px 24px rgba(24, 144, 255, 0.12);\n // transform: translateX(4px);\n }\n &::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n background: linear-gradient(\n 90deg,\n ${token.colorPrimary} 0%,\n ${token.colorPrimaryHover} 100%\n );\n opacity: 0;\n transition: opacity 0.3s ease;\n }\n &:hover::before {\n opacity: 1;\n }\n `,\n cardBody: css`\n padding: 20px !important;\n `,\n header: css`\n margin-bottom: 16px;\n `,\n titleSection: css`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n `,\n iconWrapper: css`\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(\n 135deg,\n rgba(24, 144, 255, 0.1) 0%,\n rgba(24, 144, 255, 0.05) 100%\n );\n flex-shrink: 0;\n `,\n titleContent: css`\n flex: 1;\n min-width: 0;\n `,\n taskType: css`\n font-size: 12px;\n font-weight: 500;\n color: ${token.colorPrimary};\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n `,\n description: css`\n color: ${token.colorText};\n font-size: 15px;\n line-height: 1.6;\n font-weight: 500;\n margin: 0;\n word-wrap: break-word;\n word-break: break-word;\n white-space: pre-wrap;\n `,\n footer: css`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-top: 16px;\n margin-top: 16px;\n border-top: 1px solid ${token.colorBorderSecondary};\n gap: 12px;\n `,\n footerLeft: css`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n `,\n assigneeContainer: css`\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\n background: ${token.colorFillAlter};\n border-radius: 20px;\n transition: all 0.2s ease;\n &:hover {\n background: ${token.colorFillTertiary};\n }\n `,\n assigneeAvatar: css`\n background: linear-gradient(\n 135deg,\n ${token.colorPrimary} 0%,\n ${token.colorPrimaryHover} 100%\n );\n `,\n assigneeName: css`\n color: ${token.colorText};\n font-size: 13px;\n font-weight: 500;\n `,\n actionIcon: css`\n color: ${token.colorTextTertiary};\n font-size: 14px;\n transition: all 0.2s ease;\n `,\n responseSection: css`\n margin-top: 16px;\n margin-bottom: 16px;\n padding-top: 16px;\n border-top: 1px solid ${token.colorBorderSecondary};\n `,\n responseHeader: css`\n font-size: 13px;\n font-weight: 600;\n color: ${token.colorTextSecondary};\n margin-bottom: 12px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n `,\n responseContent: css`\n padding: 12px;\n background: ${token.colorFillAlter};\n border-radius: 8px;\n border: 1px solid ${token.colorBorderSecondary};\n `,\n}));\n\nexport const TaskCard: React.FC<ElementProps<ToolCallData>> = ({\n data,\n component_key,\n interactive = true,\n}) => {\n const { styles } = useStyle();\n const toolCallData = data;\n const openSideApp = useSideAppOpener();\n if (!toolCallData) {\n return null;\n }\n\n const { description, subagent_type, assignee } = toolCallData?.args || {};\n const status = toolCallData.status || \"pending\";\n const response = toolCallData.response || null;\n const { threadId, assistantId } = useAgentChat();\n let new_assistant_id = subagent_type;\n if (subagent_type === \"general-purpose\") {\n new_assistant_id = assistantId + \"-general-purpose\";\n }\n const subagent_thread_id =\n (threadId || \"\") + \"____\" + new_assistant_id + \"_\" + toolCallData.id;\n const getStatusConfig = (status: string) => {\n switch (status) {\n case \"success\":\n return {\n icon: <CheckCircleOutlined style={{ fontSize: 16 }} />,\n color: \"success\",\n text: \"Completed\",\n bgColor: \"rgba(82, 196, 26, 0.1)\",\n };\n case \"error\":\n return {\n icon: <CloseCircleOutlined style={{ fontSize: 16 }} />,\n color: \"error\",\n text: \"Failed\",\n bgColor: \"rgba(255, 77, 79, 0.1)\",\n };\n case \"pending\":\n default:\n return {\n icon: <LoadingOutlined style={{ fontSize: 16 }} />,\n color: \"processing\",\n text: \"In Progress\",\n bgColor: \"rgba(24, 144, 255, 0.1)\",\n };\n }\n };\n\n const statusConfig = getStatusConfig(status);\n const showResponse = status === \"success\" && response;\n\n const handleCardClick = () => {\n openSideApp({\n component_key: \"task\",\n message: subagent_type,\n data: {\n thread_id: subagent_thread_id,\n description: description,\n subagent_type: new_assistant_id,\n },\n });\n };\n\n return (\n <Card\n size=\"small\"\n className={styles.card}\n bordered={false}\n onClick={handleCardClick}\n hoverable={interactive}\n bodyStyle={{ padding: 0 }}\n >\n <div className={styles.cardBody}>\n <div className={styles.header}>\n <div className={styles.titleSection}>\n <div className={styles.iconWrapper}>\n <CarryOutOutlined style={{ fontSize: 20, color: \"#1890ff\" }} />\n </div>\n <div className={styles.titleContent}>\n {subagent_type && (\n <div className={styles.taskType}>{subagent_type}</div>\n )}\n {description && (\n <Text className={styles.description}>{description}</Text>\n )}\n </div>\n </div>\n </div>\n\n <div className={styles.footer}>\n <div className={styles.footerLeft}>\n {assignee && (\n <div className={styles.assigneeContainer}>\n <Avatar\n size={24}\n icon={<UserOutlined />}\n className={styles.assigneeAvatar}\n />\n <Text className={styles.assigneeName}>{assignee}</Text>\n </div>\n )}\n <Tag\n icon={statusConfig.icon}\n color={statusConfig.color}\n style={{\n margin: 0,\n padding: \"4px 12px\",\n borderRadius: \"12px\",\n fontSize: \"12px\",\n fontWeight: 500,\n border: \"none\",\n background: statusConfig.bgColor,\n }}\n >\n {statusConfig.text}\n </Tag>\n </div>\n {interactive && <RightOutlined className={styles.actionIcon} />}\n </div>\n\n {showResponse && (\n <div\n className={styles.responseSection}\n onClick={(e) => e.stopPropagation()}\n >\n <Text className={styles.responseHeader}>Response</Text>\n <div className={styles.responseContent}>\n <MDResponse content={response} />\n </div>\n </div>\n )}\n </div>\n </Card>\n );\n};\n","import React from \"react\";\nimport { Typography } from \"antd\";\nimport { ElementProps } from \"../types\";\nimport { AgentThreadProvider } from \"@context/AgentThreadContext\";\nimport { Chating } from \"@components/Chat/Chating\";\n\nconst { Text } = Typography;\n\nexport const TaskDetail: React.FC<\n ElementProps<{\n description: string;\n subagent_type: string;\n thread_id: string;\n display_name?: string;\n }>\n> = ({ data, component_key, interactive = true }) => {\n const { description, subagent_type, thread_id, display_name } = data || {};\n const name = display_name ?? subagent_type;\n\n return (\n <AgentThreadProvider\n threadId={thread_id}\n assistantId={subagent_type}\n options={{\n streaming: true,\n enableReturnStateWhenStreamCompleted: true,\n enableResumeStream: true,\n }}\n >\n <div style={{ overflow: \"hidden\" }}>\n <Chating\n showRefreshButton={true}\n name={name}\n showHeader={true}\n showSender={false}\n showHITL={true}\n />\n </div>\n </AgentThreadProvider>\n );\n};\n","import {\n CloudUploadOutlined,\n PaperClipOutlined,\n ReloadOutlined,\n FileOutlined,\n FolderOutlined,\n FileImageOutlined,\n FileTextOutlined,\n FilePdfOutlined,\n FileMarkdownOutlined,\n FileZipOutlined,\n FileExcelOutlined,\n FilePptOutlined,\n FileWordOutlined,\n FileUnknownOutlined,\n DatabaseOutlined,\n StarOutlined,\n CloseOutlined,\n} from \"@ant-design/icons\";\nimport {\n Attachments,\n AttachmentsProps,\n Bubble,\n Prompts,\n Sender,\n Suggestion,\n} from \"@ant-design/x\";\nimport { regsiterElement } from \"../GenUI/elements\";\nimport { MessageViewPanel } from \"./MessageViewPanel\";\nimport { resolveTraceView } from \"./messageGraphUtils\";\nimport {\n Alert,\n Badge,\n Button,\n Divider,\n Flex,\n GetRef,\n message,\n Space,\n Typography,\n type GetProp,\n} from \"antd\";\nimport React, { useCallback, useContext, useDeferredValue, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { BrainCircuit } from \"lucide-react\";\nimport { HITLContainer } from \"@components/GenUI/HITLContainer\";\nimport { PendingMessagesContainer } from \"@components/GenUI/PendingMessagesContainer\";\nimport { AgentHeader } from \"./AgentHeader\";\nimport { useAgentChat } from \"@hooks/useAgentChat\";\nimport { useApi } from \"@hooks/useApi\";\nimport { useStyle } from \"./useStyle\";\nimport { ThreadManagementButtons } from \"./ThreadManagementButtons\";\nimport { useLatticeChatShellContext } from \"./LatticeChatShellContext\";\nimport { useOptionalConversationContext } from \"./ConversationContext\";\nimport { WorkspaceContext, type WorkspaceContextValue } from \"@context/WorkspaceContext\";\nimport { useAuthOptional } from \"@context/AuthContext\";\nimport { DatabasePicker } from \"./DatabasePicker\";\nimport { SkillPicker } from \"./SkillPicker\";\nimport { AgentPicker } from \"./AgentPicker\";\nimport { MetricsDataSourcePicker } from \"./MetricsDataSourcePicker\";\nimport { ModelSelector, type ModelConfig } from \"./ModelSelector\";\nimport { SkillCategoryPrompts } from \"./SkillCategoryPrompts\";\nimport { BusinessAnalysisPrompts } from \"./BusinessAnalysisPrompts\";\nimport { VoiceInputButton } from \"./VoiceInputButton\";\nimport type { QuickPromptItem } from \"./LatticeChatShellContext\";\nimport type { FileItem } from \"@axiom-lattice/client-sdk\";\nimport { collectAllWorkspaceFiles } from \"./workspaceFileCollector\";\nimport { filterFilesByQuery, truncateMatches } from \"./fileQueryFilter\";\nimport { buildReplaceChars, moveActiveIndex } from \"./suggestionNav\";\nimport { InitialMessageSubmitter, type InitialMessageRequest } from \"./InitialMessageSubmitter\";\nimport { EmbedChatBridge } from \"./EmbedChatBridge\";\nimport type { EmbedChatMessageHandler, EmbedChatReadyHandler } from \"./EmbedChatBridge\";\n/**\n * Props for the {@link Chating} component — the core chat interface.\n *\n * Controls appearance, sender behavior, empty-state customization, and\n * optional context injection for the agent.\n */\nexport interface ChatingProps {\n /** Agent display name shown in the header. */\n name?: string;\n /** Agent description shown in the header. */\n description?: string;\n /** Fallback message used when the user submits only attachments without text. */\n default_submit_message?: string;\n /** Avatar URL or component for the agent. */\n avatar?: string;\n /** Placeholder content rendered inside the attachment upload area. */\n attachment_placeholder?: React.ReactNode;\n /** Custom upload endpoint URL. Defaults to the workspace or thread sandbox upload endpoint. */\n uploadAction?: string;\n /** Quick prompt items displayed between messages. */\n senderPromptsItems?: GetProp<typeof Prompts, \"items\">;\n /** Extra content rendered in the header area. */\n extra?: React.ReactNode;\n /** Additional metadata items for the header. */\n extraMeta?: Array<{\n id: string;\n }>;\n /** Whether to show the agent header bar. Default: true. */\n showHeader?: boolean;\n /** Whether to show the message sender input. Default: true. */\n showSender?: boolean;\n /** Whether to show the Human-in-the-Loop (HITL) container. Default: true. */\n showHITL?: boolean;\n /** Whether to show a refresh button in the header. */\n showRefreshButton?: boolean;\n /**\n * Whether to show the model selector in the sender footer.\n * When provided, overrides the shell config's enableModelSelector.\n */\n showModelSelector?: boolean;\n /** Show database picker in sender footer. Overrides shell config enableDatabaseSlot. */\n showDatabaseSlot?: boolean;\n /** Show skill picker in sender footer. Overrides shell config enableSkillSlot. */\n showSkillSlot?: boolean;\n /** Show agent picker in sender footer. Overrides shell config enableAgentSlot. */\n showAgentSlot?: boolean;\n /** Show metrics data source picker in sender footer. Overrides shell config enableMetricsDataSourceSlot. */\n showMetricsDataSourceSlot?: boolean;\n /** Whether to show the greeting empty state when no messages exist. Default: true. */\n showEmptyState?: boolean;\n /** Whether to offer the execution-trace graph view toggle. Overrides shell config enableTraceView. */\n showTraceView?: boolean;\n /** Initial view when the trace toggle is shown. Default: \"chat\". */\n defaultViewMode?: \"chat\" | \"graph\";\n /** Custom greeting element displayed in the empty state. */\n emptyStateGreeting?: React.ReactNode;\n /** Empty state question line. Default: \"Ready to turn...\" */\n emptyStateQuestion?: string;\n /** Show skill category prompts in empty state. Default: true. */\n showSkillPrompts?: boolean;\n /** Show business analysis prompts in empty state. Default: true. */\n showQuickAnalysis?: boolean;\n /** Welcome prefix text (e.g., \"Hey\"). */\n welcomePrefix?: string;\n /** Context string injected before the first user message (e.g. workflow context). */\n systemContext?: string;\n /**\n * Called once the chat can accept programmatic sends (thread ready). The\n * returned handle stays valid across thread switches. Used by embed hosts.\n */\n onChatReady?: EmbedChatReadyHandler;\n /** Fired for each accepted human message and each completed AI reply. */\n onChatMessage?: EmbedChatMessageHandler;\n /** @deprecated Pass an InitialMessageRequest to a dedicated InitialMessageSubmitter instead. */\n initialMessage?: string | null;\n /** @deprecated Handle submission through InitialMessageSubmitter.onSubmitted instead. */\n onInitialMessageSent?: () => void;\n}\n\nconst slotConfig: any[] = [];\n\ninterface LegacyInitialMessageSubmitterProps {\n initialMessage?: string | null;\n onInitialMessageSent?: () => void;\n threadId?: string | null;\n}\n\ninterface LegacyInitialMessageOccurrence {\n content: string;\n request: InitialMessageRequest;\n threadId: string;\n}\n\nfunction LegacyInitialMessageSubmitter({\n initialMessage,\n onInitialMessageSent,\n threadId,\n}: LegacyInitialMessageSubmitterProps): React.ReactElement {\n const occurrenceRef = useRef(0);\n const [occurrence, setOccurrence] = useState<LegacyInitialMessageOccurrence | null>(null);\n const committedOccurrenceRef = useRef<LegacyInitialMessageOccurrence | null>(null);\n const onInitialMessageSentRef = useRef(onInitialMessageSent);\n\n useEffect(() => {\n onInitialMessageSentRef.current = onInitialMessageSent;\n }, [onInitialMessageSent]);\n\n useLayoutEffect(() => {\n if (!initialMessage || !threadId) {\n committedOccurrenceRef.current = null;\n setOccurrence(null);\n return;\n }\n\n const current = committedOccurrenceRef.current;\n if (current?.threadId === threadId && current.content === initialMessage) {\n return;\n }\n\n occurrenceRef.current += 1;\n const next = {\n content: initialMessage,\n threadId,\n request: {\n requestId: `legacy:${threadId}:${occurrenceRef.current}`,\n content: initialMessage,\n },\n };\n committedOccurrenceRef.current = next;\n setOccurrence(next);\n }, [initialMessage, threadId]);\n\n const request =\n occurrence &&\n occurrence.threadId === threadId &&\n occurrence.content === initialMessage\n ? occurrence.request\n : null;\n\n return (\n <InitialMessageSubmitter\n request={request}\n onSubmitted={(requestId) => {\n if (committedOccurrenceRef.current?.request.requestId === requestId) {\n onInitialMessageSentRef.current?.();\n }\n }}\n />\n );\n}\n\n/**\n * Core chat interface component — manages sender input, message display,\n * and agent-streaming state for a single assistant thread.\n *\n * Features:\n * - Empty state with greeting and skill/analysis prompt categories\n * - Message sender with file attachment, skill/agent/database pickers, and model selector\n * - Typing cursor animation during streaming\n * - HITL interrupt handling and pending-message display\n * - Injection of {@link ChatingProps.systemContext} into the first user message\n * - Transition animations between empty and active states\n *\n * @param props - See {@link ChatingProps}.\n * @returns The full chat UI for the active thread.\n *\n * @example\n * ```tsx\n * import { Chating } from \"@axiom-lattice/react-sdk\";\n *\n * <Chating\n * name=\"Data Analyst\"\n * showHeader\n * showSender\n * showModelSelector\n * emptyStateQuestion=\"What data would you like to analyze?\"\n * systemContext=\"You are analyzing sales data from Q4 2024.\"\n * />\n * ```\n *\n * @remarks\n * - Requires the following ancestor context providers: {@link AgentThreadProvider},\n * {@link ChatUIContextProvider}, {@link LatticeChatShellContextProvider},\n * {@link ConversationContextProvider}, {@link AssistantContextProvider}.\n * - Prop-level feature toggles (e.g. `showModelSelector`) take priority over\n * shell-config-level toggles.\n * - Uses {@link useAgentChat} for all agent communication.\n */\nexport const Chating: React.FC<ChatingProps> = ({\n avatar,\n name,\n description,\n default_submit_message,\n senderPromptsItems,\n extra,\n attachment_placeholder,\n extraMeta = [],\n uploadAction,\n showHeader = true,\n showSender = true,\n showHITL = true,\n showRefreshButton = false,\n showModelSelector,\n showDatabaseSlot,\n showSkillSlot,\n showAgentSlot,\n showMetricsDataSourceSlot,\n showEmptyState = true,\n showTraceView,\n defaultViewMode,\n emptyStateGreeting,\n emptyStateQuestion = \"Ready to turn data into insightful charts in seconds?\",\n showSkillPrompts = true,\n showQuickAnalysis = true,\n welcomePrefix = \"Hey\",\n systemContext,\n onChatReady,\n onChatMessage,\n initialMessage,\n onInitialMessageSent,\n}) => {\n // 聊天相关状态\n const [content, setContent] = useState(\"\");\n const contentRef = useRef(content);\n contentRef.current = content;\n const [attachedFiles, setAttachedFiles] = useState<\n GetProp<typeof Attachments, \"items\">\n >([]);\n const { styles } = useStyle();\n const [headerOpen, setHeaderOpen] = useState(false);\n const attachmentsRef = useRef<GetRef<typeof Attachments>>(null);\n const senderRef = React.useRef<GetRef<typeof Sender>>(null);\n\n const {\n assistantId,\n threadId,\n messages,\n sendMessage,\n stopStreaming,\n abortAgent,\n loadMessages,\n isLoading,\n error,\n stopReason,\n interrupts,\n tenantId,\n clearError,\n threadStatus,\n pendingMessages,\n customRunConfig,\n updateCustomRunConfig,\n } = useAgentChat();\n\n // Derived states for dual-state display\n const isStreaming = isLoading;\n const hasPendingMessages = pendingMessages?.length > 0;\n const isInputDisabled = interrupts && interrupts.length > 0;\n const isHitlPendingFeedback = showHITL && interrupts && interrupts.length > 0;\n\n // Typing cursor animation frames\n const typingFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n const [typingFrameIndex, setTypingFrameIndex] = useState(0);\n\n useEffect(() => {\n if (!isStreaming) return;\n const interval = setInterval(() => {\n setTypingFrameIndex((prev) => (prev + 1) % typingFrames.length);\n }, 80);\n return () => clearInterval(interval);\n }, [isStreaming]);\n\n // 获取 ConversationContext 用于线程管理(architect copilot 等场景可能无 provider)\n const conversationContext = useOptionalConversationContext();\n\n // systemContext injection tracking\n const systemContextSentRef = useRef(false);\n\n useEffect(() => {\n systemContextSentRef.current = false;\n }, [threadId]);\n\n // ModelSelector state - self-contained component\n const [modelConfig, setModelConfig] = useState<ModelConfig | null>(null);\n\n // Handle model selection - update both local state and customRunConfig\n const handleModelChange = useCallback((config: ModelConfig | null) => {\n setModelConfig(config);\n if (config) {\n updateCustomRunConfig({ modelConfig: config });\n }\n }, [updateCustomRunConfig]);\n\n // 空状态管理 - 当 messages 和 pendingMessages 都为空时显示空状态(可通过 showEmptyState 配置关闭)\n const [isEmptyState, setIsEmptyState] = useState(showEmptyState && messages.length === 0 && !pendingMessages?.length);\n const [isTransitioning, setIsTransitioning] = useState(false);\n\n // 监听消息变化,处理空状态切换\n useEffect(() => {\n // 如果禁用了空状态,始终设置为 false\n if (!showEmptyState) {\n setIsEmptyState(false);\n return;\n }\n\n const isEmpty = messages.length === 0 && !pendingMessages?.length;\n\n if (!isEmpty && isEmptyState) {\n // 从空状态切换到非空状态 - 触发动画\n setIsTransitioning(true);\n setTimeout(() => {\n setIsEmptyState(false);\n setIsTransitioning(false);\n }, 400);\n } else if (isEmpty && !isEmptyState) {\n // 切换到空状态,无动画\n setIsEmptyState(true);\n }\n }, [messages.length, pendingMessages?.length, isEmptyState, showEmptyState]);\n\n const { config } = useLatticeChatShellContext();\n const { baseURL } = config;\n const [viewMode, setViewMode] = useState<\"chat\" | \"graph\">(defaultViewMode ?? \"chat\");\n const effectiveShowTraceView = resolveTraceView(showTraceView, config.enableTraceView);\n\n // 获取用户信息(可选,当 AuthProvider 不存在时返回 null)\n const user = useAuthOptional()?.user;\n const displayUserName = user?.name || user?.email?.split('@')[0] || 'there';\n\n // Workspace context for file suggestions (optional - only available when enableWorkspace is true)\n const workspaceContext = useContext(WorkspaceContext);\n const listPath = workspaceContext?.listPath ?? (async () => []);\n const listPathByFolder = workspaceContext?.listPathByFolder ?? (async () => []);\n const workspaceId = workspaceContext?.workspaceId ?? null;\n const projectId = workspaceContext?.projectId ?? null;\n const [workspaceFiles, setWorkspaceFiles] = useState<FileItem[]>([]);\n const [suggestionsLoading, setSuggestionsLoading] = useState(false);\n const [suggestionsOpen, setSuggestionsOpen] = useState(false);\n\n // Get file icon based on file extension with colors\n const getFileIcon = (filename: string): React.ReactNode => {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n const iconStyle = { fontSize: 16 };\n switch (ext) {\n case \"png\":\n case \"jpg\":\n case \"jpeg\":\n case \"gif\":\n case \"svg\":\n case \"webp\":\n return <FileImageOutlined style={{ ...iconStyle, color: \"#52c41a\" }} />;\n case \"pdf\":\n return <FilePdfOutlined style={{ ...iconStyle, color: \"#ff4d4f\" }} />;\n case \"md\":\n case \"markdown\":\n return <FileMarkdownOutlined style={{ ...iconStyle, color: \"#722ed1\" }} />;\n case \"zip\":\n case \"rar\":\n case \"7z\":\n return <FileZipOutlined style={{ ...iconStyle, color: \"#faad14\" }} />;\n case \"xls\":\n case \"xlsx\":\n case \"csv\":\n return <FileExcelOutlined style={{ ...iconStyle, color: \"#52c41a\" }} />;\n case \"ppt\":\n case \"pptx\":\n return <FilePptOutlined style={{ ...iconStyle, color: \"#fa8c16\" }} />;\n case \"doc\":\n case \"docx\":\n return <FileWordOutlined style={{ ...iconStyle, color: \"#2f54eb\" }} />;\n case \"txt\":\n return <FileTextOutlined style={{ ...iconStyle, color: \"#8c8c8c\" }} />;\n default:\n return <FileUnknownOutlined style={{ ...iconStyle, color: \"#bfbfbf\" }} />;\n }\n };\n\n // Load workspace files for suggestions from all configured resource folders\n const loadWorkspaceFiles = async () => {\n if (workspaceFiles.length > 0) return; // 已加载则跳过\n setSuggestionsLoading(true);\n try {\n // Get resource folders from shell config, default to root if not configured\n const folders = config.resourceFolders?.length\n ? config.resourceFolders\n : [{ name: \"/\", displayName: \"Root Directory\", allowUpload: true }];\n\n // Load files from all configured folders, recursing into subdirectories\n const allFiles = await collectAllWorkspaceFiles(\n listPathByFolder,\n folders.map((folder) => folder.name),\n assistantId,\n );\n\n setWorkspaceFiles(allFiles);\n } catch (e) {\n console.error(\"Failed to load workspace files:\", e);\n setWorkspaceFiles([]);\n } finally {\n setSuggestionsLoading(false);\n }\n };\n\n useEffect(() => {\n regsiterElement(\"action_show_attachments_uploader\", {\n card_view: () => null,\n action: (data: any) => {\n console.log(data);\n setHeaderOpen(true);\n },\n });\n }, []);\n\n // 判断是否为压缩包文件\n const isArchiveFile = (file: any) => {\n const zipMimeTypes = [\"application/zip\"];\n const rarMimeTypes = [\n \"application/vnd.rar\",\n \"application/x-rar-compressed\",\n \"application/rar\",\n ];\n const archiveMimeTypes = [...zipMimeTypes, ...rarMimeTypes];\n\n return (\n archiveMimeTypes.includes(file.type) ||\n file.name.toLowerCase().endsWith(\".zip\") ||\n file.name.toLowerCase().endsWith(\".rar\")\n );\n };\n\n // 提交逻辑\n const onSubmit = (nextContent: string) => {\n if (!nextContent && attachedFiles.length === 0) return;\n if (attachedFiles.filter((f) => f.status !== \"done\").length > 0) {\n message.warning(\"Files are still uploading...\");\n return;\n }\n if (!nextContent && attachedFiles.length > 0) {\n nextContent = default_submit_message || \"\";\n }\n\n if (systemContext && !systemContextSentRef.current) {\n systemContextSentRef.current = true;\n nextContent = `${systemContext}\\n${nextContent}`;\n }\n\n const files = attachedFiles.map((file) =>\n isArchiveFile(file)\n ? {\n name: file.response.zipFileName || file.response.rarFileName,\n id: file.response.zipFileId || file.response.rarFileId,\n totalFiles: file.response.totalFiles,\n processedFiles: file.response.processedFiles,\n skippedFiles: file.response.skippedFiles,\n type: file.name.toLowerCase().endsWith(\".rar\")\n ? \"application/rar\"\n : \"application/zip\",\n files: file.response?.results?.map((r: any) => ({\n name: r.fileName,\n path: r.filePath,\n id: r.fileId,\n })),\n }\n : {\n name: file.name,\n id: file.response.id || file.response.data?.path,\n }\n );\n\n const files_md =\n files.length > 0\n ? [\n \"\",\n \" \",\n \"```attachments\",\n JSON.stringify(files),\n \"```\",\n ].join(\"\\n\")\n : \"\";\n\n // 如果是空状态,先触发动画再发送\n if (isEmptyState && !isTransitioning) {\n setIsTransitioning(true);\n setTimeout(() => {\n setIsEmptyState(false);\n setIsTransitioning(false);\n sendMessage({ input: { message: nextContent + files_md, files } });\n }, 300);\n } else {\n sendMessage({ input: { message: nextContent + files_md, files } });\n }\n\n setContent(\"\");\n senderRef.current?.clear?.();\n setAttachedFiles([]);\n setHeaderOpen(false);\n };\n\n // 提示词点击处理\n const onPromptsItemClick: GetProp<typeof Prompts, \"onItemClick\"> = (info) => {\n onSubmit(info.data.description as string);\n };\n\n // 文件上传处理\n const onChange: AttachmentsProps[\"onChange\"] = (info) => {\n if (!headerOpen) {\n setHeaderOpen(true);\n }\n if (info.file?.response?.error || info.file.status === \"error\") {\n message.error(\n `${info.file.name} file upload failed.${info.file?.response?.message}`\n );\n }\n setAttachedFiles(info.fileList);\n if (info.file.status === \"done\") {\n // 新文件已上传,失效 @ 建议列表缓存,下次触发时重新全量收集\n setWorkspaceFiles([]);\n }\n };\n\n const beforeUpload = (file: File) => {\n const isValidSize = file.size / 1024 / 1024 < 100;\n if (!isValidSize) {\n message.error(\n `File must be smaller than 100MB! ${file.name} is too large.`\n );\n return false;\n }\n // 截图等默认文件名加时间戳,避免重名\n if (/^(image|screenshot|clipboard)(\\s+\\d+)?\\.(png|jpg|jpeg|gif|webp)$/i.test(file.name)) {\n const ts = Date.now();\n const ext = file.name.split(\".\").pop();\n return new File([file], `image_${ts}.${ext}`, { type: file.type });\n }\n return true;\n };\n\n\n // 发送器头部\n const senderHeader = (\n <Sender.Header\n title=\"Attachments\"\n open={headerOpen}\n onOpenChange={setHeaderOpen}\n styles={{\n content: {\n padding: 0,\n },\n }}\n forceRender\n >\n <Attachments\n ref={attachmentsRef}\n items={attachedFiles}\n action={uploadAction ||\n (workspaceId && projectId\n ? `${baseURL}/api/workspaces/${workspaceId}/projects/${projectId}/uploadfile`\n : `${baseURL}/api/assistants/${assistantId}/threads/${threadId}/sandbox/uploadfile`)\n }\n headers={{\n \"x-tenant-id\": tenantId || \"\",\n \"x-assistant-id\": assistantId || \"\",\n \"x-thread-id\": threadId || \"\",\n }}\n getDropContainer={() => {\n const dropContainer = document.querySelector(\".fina_chat\");\n return dropContainer as HTMLElement;\n }}\n onDrop={(e) => {\n console.log(e);\n }}\n onChange={onChange}\n beforeUpload={beforeUpload}\n showUploadList={true}\n multiple={true}\n maxCount={10}\n placeholder={(type) => ({\n icon: <CloudUploadOutlined />,\n title: \"Upload File\",\n description: attachment_placeholder,\n })}\n />\n </Sender.Header>\n );\n\n // 发送器底部 - 数据库、技能、Agent 和 Metrics 数据源选择器(props 优先,否则 fallback 到 shell config)\n const effectiveShowDatabaseSlot = showDatabaseSlot !== undefined ? showDatabaseSlot : config.enableDatabaseSlot;\n const effectiveShowSkillSlot = showSkillSlot !== undefined ? showSkillSlot : config.enableSkillSlot;\n const effectiveShowAgentSlot = showAgentSlot !== undefined ? showAgentSlot : config.enableAgentSlot;\n const effectiveShowMetricsDataSourceSlot = showMetricsDataSourceSlot !== undefined ? showMetricsDataSourceSlot : config.enableMetricsDataSourceSlot;\n // Use prop if provided, otherwise fall back to shell config\n const shouldShowModelSelector = showModelSelector !== undefined ? showModelSelector : config.enableModelSelector;\n\n const senderFooter = (actionNode: React.ReactNode) => {\n const hasSlotButtons = effectiveShowAgentSlot || effectiveShowDatabaseSlot || effectiveShowSkillSlot || effectiveShowMetricsDataSourceSlot;\n\n return (\n <Flex justify=\"space-between\" align=\"center\" style={{ padding: \"8px 0\" }}>\n <Flex align=\"center\" gap={8}>\n <Badge dot={attachedFiles.length > 0 && !headerOpen}>\n <Button\n type=\"text\"\n icon={<PaperClipOutlined />}\n onClick={() => setHeaderOpen(!headerOpen)}\n />\n </Badge>\n <VoiceInputButton\n disabled={isInputDisabled}\n onTranscription={(text) => {\n const current = contentRef.current;\n const needsSpace = current.length > 0 && !/[。!?.!?\\s\\n]$/.test(current);\n const newText = (needsSpace ? \" \" : \"\") + text;\n senderRef.current?.insert?.([{ type: \"text\", value: newText }], \"end\");\n setContent(current + newText);\n }}\n />\n <Divider type=\"vertical\" style={{ margin: 0 }} />\n {hasSlotButtons && (\n <Flex align=\"center\" gap={8}>\n {effectiveShowAgentSlot && <AgentPicker senderRef={senderRef} iconOnly />}\n {effectiveShowDatabaseSlot && <DatabasePicker senderRef={senderRef} iconOnly />}\n {effectiveShowSkillSlot && <SkillPicker senderRef={senderRef} iconOnly />}\n {effectiveShowMetricsDataSourceSlot && <MetricsDataSourcePicker senderRef={senderRef} iconOnly />}\n </Flex>\n )}\n </Flex>\n <Flex align=\"center\" gap={8}>\n {shouldShowModelSelector && <ModelSelector value={modelConfig} onChange={handleModelChange} />}\n {isStreaming ? (\n <Button \n type=\"primary\" \n shape=\"circle\" \n icon={<CloseOutlined />} \n onClick={abortAgent}\n className={styles.rotatingBorderButton}\n />\n ) : (\n actionNode\n )}\n </Flex>\n </Flex>\n );\n };\n\n const refreshButton = (\n <Button\n type=\"text\"\n icon={<ReloadOutlined />}\n onClick={() => {\n loadMessages();\n }}\n />\n );\n\n const headerExtra = [\n ...(showRefreshButton ? [refreshButton] : []),\n <ThreadManagementButtons key=\"thread-buttons\" />,\n ];\n\n // Skills 数据状态\n const [skills, setSkills] = useState<Array<{ id: string; name: string; description: string }>>([]);\n const [skillsLoading, setSkillsLoading] = useState(false);\n const { get: apiGet } = useApi();\n\n // 加载 skills 数据\n const loadSkills = async () => {\n if (skills.length > 0) return; // 已加载则跳过\n setSkillsLoading(true);\n try {\n const data = await apiGet<{ success: boolean; data: { records: Array<{ id: string; name: string; description: string }> } }>(\"/api/skills\");\n if (data.success && data.data && Array.isArray(data.data.records)) {\n setSkills(data.data.records);\n }\n } catch (error) {\n console.error(\"Failed to fetch skills:\", error);\n } finally {\n setSkillsLoading(false);\n }\n };\n\n // 获取 placeholder 文本\n const getPlaceholder = (isEmpty: boolean, streaming: boolean, pending: boolean) => {\n if (!isEmpty) {\n if (streaming) return `${typingFrames[typingFrameIndex]} Thinking...`;\n if (pending) return `${pendingMessages.length} messages waiting...`;\n }\n return isEmpty ? \"Type / to see available skills, or @ to reference files\" : undefined;\n };\n\n // 渲染发送器组件\n const renderSender = (isEmpty: boolean) => {\n // 判断当前触发的是 @ 还是 /\n const [suggestionMode, setSuggestionMode] = useState<'files' | 'skills' | null>(null);\n\n // grep 式过滤:@ 后输入的文本按路径子串过滤全量文件列表\n const lastAtIndex = content.lastIndexOf('@');\n const fileQuery = lastAtIndex >= 0 ? content.slice(lastAtIndex + 1) : '';\n const deferredFileQuery = useDeferredValue(fileQuery);\n\n // useMemo 稳定 items 引用:无关重渲染(流式更新、悬停等)不会重建数组,\n // 避免 Suggestion 内部 useActive 因 items 引用变化把选中行重置回第一项\n const suggestionItems = useMemo(() => {\n if (suggestionMode === 'skills') {\n return skills.map((skill) => ({\n value: skill.name,\n icon: <BrainCircuit size={14} style={{ color: '#722ed1' }} />,\n label: skill.name,\n description: skill.description?.slice(0, 50) + (skill.description?.length > 50 ? '...' : ''),\n }));\n }\n // 截断渲染上限:Cascader 菜单无虚拟化,避免大列表 DOM 过多与超出屏幕\n const { visible, hiddenCount } = truncateMatches(\n filterFilesByQuery(workspaceFiles, deferredFileQuery),\n );\n const items: Array<{ value: string; icon?: React.ReactNode; label: React.ReactNode; disabled?: boolean }> = visible.map((file) => ({\n value: file.path,\n icon: getFileIcon(file.name || file.path),\n label: file.path,\n }));\n if (hiddenCount > 0) {\n items.push({\n value: '',\n disabled: true,\n label: `...and ${hiddenCount} more — keep typing to narrow`,\n });\n }\n return items;\n }, [suggestionMode, skills, workspaceFiles, deferredFileQuery]);\n\n // 库的 useActive 吞掉 Enter 但不执行选中(自定义触发器模式下 rc-select 的\n // 键盘选中链路不挂载),这里镜像方向键规则自跟踪高亮项,Enter 时选中它\n const activeIndexRef = useRef(0);\n useEffect(() => {\n activeIndexRef.current = 0;\n }, [suggestionItems]);\n\n const insertSuggestion = (itemVal: string) => {\n // 库的 replaceCharacters 是 endsWith 匹配:传完整的 \"@查询词\" 才能把\n // 触发词整体替换掉(只传 '@' 只能替换光标前紧邻的单个字符)\n if (suggestionMode === 'skills') {\n // Skills 模式:插入 skill tag\n senderRef.current?.insert?.([\n {\n type: 'tag',\n key: `skill_${itemVal}_${Date.now()}`,\n props: {\n label: (\n <Space size={1}>\n <BrainCircuit size={12} />\n <Typography.Text>{itemVal}</Typography.Text>\n </Space>\n ),\n value: `[Use Skill:${itemVal}]`,\n },\n },\n ], 'cursor', buildReplaceChars(content, '/'));\n } else {\n // Files 模式:插入文件 tag(前后带空格,与前后文本分隔,避免路径和后续输入粘连)\n senderRef.current?.insert?.([\n {\n type: 'tag',\n key: `${itemVal}_${Date.now()}`,\n props: {\n label: \"@\" + itemVal,\n value: \" \" + itemVal + \" \",\n },\n },\n ], 'cursor', buildReplaceChars(content, '@'));\n }\n };\n\n return (\n <Suggestion\n items={suggestionItems}\n dropdownMenuColumnStyle={{ maxHeight: 320, overflowY: 'auto' }}\n onSelect={(itemVal) => {\n if (!itemVal) return; // 截断提示项不可选中\n insertSuggestion(itemVal);\n }}\n >\n {({ onTrigger, onKeyDown }) => {\n // 镜像库内 offsetRow 的方向键移动 + Enter 选中(库的 useActive 只移动高亮不选中)\n const handleSuggestionKeyDown = (e: React.KeyboardEvent) => {\n if (suggestionMode !== null && suggestionItems.length > 0) {\n if (e.key === 'ArrowDown') {\n activeIndexRef.current = moveActiveIndex(activeIndexRef.current, 1, suggestionItems.length);\n return onKeyDown(e);\n }\n if (e.key === 'ArrowUp') {\n activeIndexRef.current = moveActiveIndex(activeIndexRef.current, -1, suggestionItems.length);\n return onKeyDown(e);\n }\n if (e.key === 'Enter') {\n const item: { value: string; disabled?: boolean } | undefined =\n suggestionItems[activeIndexRef.current];\n if (item && !item.disabled && item.value) {\n e.preventDefault();\n insertSuggestion(item.value);\n onTrigger(false); // 关闭建议菜单\n return false; // 阻止 Sender 提交\n }\n }\n }\n return onKeyDown(e);\n };\n return (\n <Sender\n slotConfig={slotConfig}\n disabled={isInputDisabled}\n ref={senderRef}\n value={content}\n header={senderHeader}\n onSubmit={onSubmit}\n placeholder={getPlaceholder(isEmpty, isStreaming, hasPendingMessages)}\n onChange={(val) => {\n const hasAtTrigger = /@([^\\s]*)$/.test(val);\n const hasSlashTrigger = /\\/([^\\s]*)$/.test(val);\n const lastAtIndex = val.lastIndexOf('@');\n const lastSlashIndex = val.lastIndexOf('/');\n const textAfterAt = lastAtIndex >= 0 ? val.slice(lastAtIndex + 1) : '';\n const textAfterSlash = lastSlashIndex >= 0 ? val.slice(lastSlashIndex + 1) : '';\n\n if (hasSlashTrigger && !textAfterSlash.includes(' ')) {\n // / 触发 skills\n setSuggestionMode('skills');\n loadSkills();\n onTrigger();\n } else if (hasAtTrigger && !textAfterAt.includes(' ')) {\n // @ 触发 files\n setSuggestionMode('files');\n loadWorkspaceFiles();\n onTrigger();\n } else {\n setSuggestionMode(null);\n onTrigger(false);\n }\n setContent(val);\n }}\n onKeyDown={handleSuggestionKeyDown}\n className={isEmpty ? styles.emptyStateSender : styles.sender}\n suffix={false}\n footer={senderFooter}\n onPasteFile={(files) => {\n Array.from(files).forEach((file) => {\n attachmentsRef.current?.upload(file);\n });\n setHeaderOpen(true);\n }}\n />\n );\n }}\n </Suggestion>\n );\n };\n\n return (\n <>\n {(onChatReady || onChatMessage) && (\n <EmbedChatBridge onReady={onChatReady} onMessage={onChatMessage} />\n )}\n <LegacyInitialMessageSubmitter\n initialMessage={initialMessage}\n onInitialMessageSent={onInitialMessageSent}\n threadId={threadId}\n />\n {/* 头部 - 空状态时隐藏 */}\n <div\n className={styles.fixedHeader}\n style={{\n opacity: isEmptyState ? 0 : 1,\n pointerEvents: isEmptyState ? 'none' : 'auto',\n transition: 'opacity 0.3s ease'\n }}\n >\n {showHeader && (\n <AgentHeader\n name={name}\n onNewThread={async () => {\n try {\n await conversationContext?.createThread();\n } catch (err) {\n console.error('Failed to create new thread:', err);\n message.error('Failed to create new thread');\n }\n }}\n onRefresh={() => {\n loadMessages();\n }}\n onViewHistory={() => {\n // 触发显示历史线程列表\n // 可以通过 LatticeChatShellContext 或其他方式打开侧边栏\n const event = new CustomEvent('lattice-chat:show-thread-sidebar');\n window.dispatchEvent(event);\n }}\n showTraceView={effectiveShowTraceView}\n viewMode={viewMode}\n onViewModeChange={setViewMode}\n />\n )}\n </div>\n\n {/* 空状态布局 */}\n {isEmptyState && (\n <div\n className={`${styles.emptyStateContainer} ${isTransitioning ? styles.exiting : ''}`}\n >\n {/* 欢迎语 */}\n <div className={styles.welcomeSection}>\n <div className={styles.greeting}>\n {emptyStateGreeting ? (\n emptyStateGreeting\n ) : (\n <>\n {welcomePrefix} <span className=\"user-name\">{displayUserName}</span>\n </>\n )}\n </div>\n <div className={styles.question}>\n {emptyStateQuestion}\n </div>\n </div>\n\n {/* SkillCategoryPrompts */}\n {showSkillPrompts && config.enableSkillSlot !== false && (\n <div className={styles.promptsWrapper}>\n <SkillCategoryPrompts senderRef={senderRef} visible={true} />\n </div>\n )}\n\n {/* HITL Pending Feedback */}\n {isHitlPendingFeedback && <HITLContainer />}\n\n {/* 输入框 */}\n {showSender && (\n <div\n className={`${styles.emptyStateSenderWrapper} ${isTransitioning ? styles.transitioning : ''}`}\n style={isHitlPendingFeedback ? { display: 'none' } : undefined}\n >\n {renderSender(true)}\n </div>\n )}\n\n {/* Business Analysis Prompts - shown below sender in empty state */}\n {showQuickAnalysis && showSender && !(interrupts && interrupts.length > 0) && (\n <div style={{ marginTop: 24 }}>\n <BusinessAnalysisPrompts\n visible={true}\n disabled={interrupts && interrupts.length > 0}\n onItemClick={(item: QuickPromptItem) => {\n senderRef.current?.insert(item.content, 'cursor');\n }}\n />\n </div>\n )}\n </div>\n )}\n\n {/* 普通状态布局 */}\n {!isEmptyState && (\n <>\n {viewMode === \"graph\" && effectiveShowTraceView ? (\n <div className={`${styles.messages} ${isTransitioning ? styles.entering : ''}`}>\n <MessageViewPanel\n messages={messages}\n isLoading={isLoading}\n viewMode=\"graph\"\n onJumpToMessage={() => setViewMode(\"chat\")}\n />\n </div>\n ) : (\n <MessageViewPanel\n messages={messages}\n isLoading={isLoading}\n viewMode=\"chat\"\n className={`${styles.messages} ${isTransitioning ? styles.entering : ''}`}\n />\n )}\n\n {/* Prompts */}\n {!isLoading && messages.length > 0 && (\n <Prompts items={senderPromptsItems} onItemClick={onPromptsItemClick} />\n )}\n\n {/* Error indicator */}\n {error && (\n <div style={{ padding: \"0 16px 8px\" }}>\n <Alert\n type=\"error\"\n banner\n closable\n onClose={() => clearError()}\n message={`${error.message}`}\n />\n </div>\n )}\n\n {/* Neutral stop notice — a user stop or a superseding message is\n not an error, so it must not look like one. */}\n {!error && stopReason && (\n <div style={{ padding: \"0 16px 8px\" }}>\n <Alert\n type=\"info\"\n banner\n closable\n onClose={() => clearError()}\n message={\n stopReason === \"superseded\"\n ? \"Response interrupted by a new message.\"\n : \"Response stopped.\"\n }\n />\n </div>\n )}\n\n {showHITL && <HITLContainer />}\n <PendingMessagesContainer />\n\n {/* 输入框 */}\n {showSender && (\n <div\n className={`${styles.senderContainer} ${isTransitioning ? styles.entering : ''}`}\n style={isHitlPendingFeedback ? { display: 'none' } : undefined}\n >\n {renderSender(false)}\n </div>\n )}\n </>\n )}\n </>\n );\n};\n","import React, { Suspense } from \"react\";\nimport { Spin } from \"antd\";\nimport type { Message } from \"@axiom-lattice/protocols\";\nimport { MessageList } from \"./MessageList\";\n\nconst MessageGraph = React.lazy(() =>\n import(\"./MessageGraph\").then((m) => ({ default: m.MessageGraph }))\n);\n\nexport interface MessageViewPanelProps {\n messages: Message[];\n isLoading?: boolean;\n viewMode: \"chat\" | \"graph\";\n className?: string;\n onJumpToMessage?: (messageId: string) => void;\n}\n\nexport const MessageViewPanel: React.FC<MessageViewPanelProps> = ({\n messages,\n isLoading,\n viewMode,\n className,\n onJumpToMessage,\n}) => {\n if (viewMode === \"graph\") {\n return (\n <Suspense\n fallback={\n <div\n style={{ flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}\n >\n <Spin />\n </div>\n }\n >\n <div style={{ height: \"100%\", minHeight: 0, width: \"100%\" }}>\n <MessageGraph\n messages={messages}\n isLoading={isLoading}\n onJumpToMessage={onJumpToMessage}\n />\n </div>\n </Suspense>\n );\n }\n\n return <MessageList messages={messages} isLoading={isLoading} className={className} />;\n};\n","import { Bubble } from \"@ant-design/x\";\nimport { Alert, Space, type GetProp } from \"antd\";\nimport React, {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useDeferredValue,\n} from \"react\";\nimport { MDResponse } from \"../GenUI/MDResponse\";\nimport { getElement } from \"../GenUI/elements\";\nimport { useSideAppOpener } from \"./SideAppBrowserContext\";\nimport { useStyle } from \"./useStyle\";\n\nconst { ErrorBoundary } = Alert;\n\ninterface MessageType {\n id: string;\n content: string;\n role: string;\n files?: any[];\n tool_calls?: any[];\n}\n\n/**\n * Props for the {@link MessageList} component.\n */\ninterface MessageListProps {\n /** Array of message objects to render. Each message should have `id`, `content`, and `role`. */\n messages: MessageType[] | any[];\n\n /** Optional CSS class applied to the bubble list container. */\n className?: string;\n\n /** Whether the agent is currently streaming. When true, message rendering\n * is deferred via useDeferredValue to prevent React #185. */\n isLoading?: boolean;\n}\n\n// Lazy loading component for message bubbles\nconst LazyBubble = ({\n message,\n renderContent,\n autoLoadRightPanel,\n}: {\n message: MessageType;\n renderContent: (message: MessageType) => React.ReactNode;\n autoLoadRightPanel?: () => void;\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const [isVisible, setIsVisible] = useState(false);\n const [wasEverVisible, setWasEverVisible] = useState(false);\n\n useEffect(() => {\n const observer = new IntersectionObserver(\n ([entry]) => {\n const visible = entry.isIntersecting;\n setIsVisible(visible);\n if (visible && !wasEverVisible) {\n setWasEverVisible(true);\n }\n },\n { threshold: 0.1 }\n );\n\n if (ref.current) {\n observer.observe(ref.current);\n }\n\n return () => {\n if (ref.current) {\n observer.unobserve(ref.current);\n }\n };\n }, [wasEverVisible]);\n\n useEffect(() => {\n autoLoadRightPanel?.();\n }, []);\n\n const getPlaceholder = () => {\n const toolCallHeight = (message.tool_calls?.length ?? 0) * 140;\n const estimatedHeight = message.content\n ? Math.min(100, message.content.length / 5) + toolCallHeight\n : 100 + toolCallHeight;\n return (\n <div style={{ height: `${estimatedHeight}px`, minHeight: \"50px\" }} />\n );\n };\n\n return (\n <ErrorBoundary>\n <div ref={ref} style={{ width: \"100%\" }}>\n {isVisible || wasEverVisible\n ? renderContent(message)\n : getPlaceholder()}\n </div>\n </ErrorBoundary>\n );\n};\n\n// Memoized Bubble.List component\nconst MemoizedBubbleList = memo(\n ({\n items,\n role,\n className,\n }: {\n items: GetProp<typeof Bubble.List, \"items\">;\n role: GetProp<typeof Bubble.List, \"role\">;\n className?: string;\n }) => (\n <Bubble.List\n key=\"messages\"\n autoScroll={true}\n items={items}\n role={role}\n className={className}\n />\n )\n);\n\nMemoizedBubbleList.displayName = \"MemoizedBubbleList\";\n\n/**\n * Renders a scrollable list of chat messages using Ant Design X `Bubble.List`.\n *\n * Each message is lazily rendered with an IntersectionObserver for performance.\n * AI messages are parsed for JSON actions and tool calls are rendered inline.\n * When a new AI message arrives containing a registered side-app component, the\n * right detail panel is automatically opened.\n *\n * @param messages - The array of message objects to display.\n * @param className - Optional CSS class for the bubble list.\n * @returns The rendered message list, or an empty flex div if there are no messages.\n *\n * @example\n * ```tsx\n * import { MessageList } from \"@axiom-lattice/react-sdk\";\n *\n * <MessageList\n * messages={[\n * { id: \"1\", role: \"human\", content: \"Hello\" },\n * { id: \"2\", role: \"ai\", content: \"Hi, how can I help?\" },\n * ]}\n * />\n * ```\n *\n * @remarks\n * - Uses `memo` on the inner `Bubble.List` to avoid unnecessary re-renders.\n * - AI messages with `content` matching the pattern ` ```type\\n{...}\\n``` ` trigger\n * the side-app panel via {@link useSideAppOpener}.\n */\nexport const MessageList: React.FC<MessageListProps> = ({\n messages,\n className,\n isLoading = false,\n}) => {\n const { styles } = useStyle();\n const openSideApp = useSideAppOpener();\n\n // Defer expensive message list rendering during high-frequency streaming\n // to prevent React #185 (max update depth). This is one half of a two-part\n // architecture — see AgentThreadContext.tsx for the matching startTransition.\n //\n // Each SSE chunk triggers handleStreamEvent → setState → MessageList render.\n // Without deferral, the expensive useMemo (messages.map + JSX creation for\n // every bubble) runs on every ~16ms frame. On slow machines this takes 30ms+,\n // causing renders to pile up and exceed React's 50-update limit.\n //\n // useDeferredValue tells React: \"the messages reference can lag 1-2 frames\n // behind the real data.\" During streaming the component re-renders quickly\n // (comparing old deferredMessages ref to new one — an O(1) check) and the\n // heavy useMemo only runs when React has free cycles, typically 2-3 times\n // across 60+ streaming updates instead of 60 times.\n //\n // Only active during streaming (isLoading=true). One-shot loads (initial\n // fetch, thread switch) use messages directly — no deferral needed.\n const rawDeferred = useDeferredValue(messages);\n const deferredMessages = isLoading ? rawDeferred : messages;\n\n // Track message length for detecting new messages\n const messageLengthRef = useRef(deferredMessages?.length ?? 0);\n useEffect(() => {\n if (deferredMessages?.length) {\n messageLengthRef.current = deferredMessages?.length;\n }\n }, [deferredMessages?.length]);\n\n // Render content for each message\n const renderContent = useCallback((message: MessageType) => {\n const { content } = message;\n\n try {\n const json = JSON.parse(content);\n if (json.action && json.message) {\n return <MDResponse content={json.message} />;\n }\n } catch (error) {\n // Not a JSON message, continue with normal rendering\n }\n const tool_calls_md =\n message.tool_calls?.map((tool_call) => {\n try {\n return `\\`\\`\\`tool_call\\n${JSON.stringify(tool_call, (_, v) =>\n typeof v === \"bigint\" ? v.toString() : v\n )}\\n\\`\\`\\``;\n } catch (err) {\n console.error(\"[MessageList] Failed to serialize tool_call:\", err, tool_call);\n return `\\`\\`\\`tool_call\\n[Unable to serialize tool call]\\n\\`\\`\\``;\n }\n }) || [];\n const content_md = [content, ...tool_calls_md].join(\"\\n\");\n return (\n <Space direction=\"vertical\" style={{ width: \"100%\" }}>\n <MDResponse content={content_md} />\n </Space>\n );\n }, []);\n\n // Generate items for Bubble.List\n const items: GetProp<typeof Bubble.List, \"items\"> = useMemo(\n () =>\n deferredMessages.map((message, index) => ({\n key: message.id,\n role: message.role,\n typing: false,\n content: (\n <LazyBubble\n message={message}\n renderContent={renderContent}\n autoLoadRightPanel={() => {\n const { content, role } = message;\n const isNewAddedMessage =\n messageLengthRef.current > 1 &&\n messageLengthRef.current + 1 === messages.length;\n if (\n index === messages.length - 1 &&\n isNewAddedMessage &&\n role === \"ai\"\n ) {\n try {\n const match = content?.match(\n /```([\\w_]*)\\n({.*?}|[^`]*)\\n```/m\n );\n const type = match?.[1];\n const data = match?.[2];\n const jsonData = data ? JSON.parse(data) : {};\n if (type) {\n const element = getElement(type);\n if (element?.side_app_view) {\n openSideApp({\n component_key: type,\n data: jsonData,\n });\n } else if (element?.action) {\n element.action(jsonData);\n }\n }\n } catch (error) {\n console.error(error);\n }\n }\n }}\n />\n ),\n })),\n [messages, renderContent]\n );\n\n // Role configuration for Bubble.List\n const role: GetProp<typeof Bubble.List, \"role\"> = {\n ai: {\n placement: \"start\",\n typing: false,\n variant: \"filled\",\n styles: {\n content: {\n background: \"transparent\",\n padding: 0,\n },\n },\n },\n human: {\n placement: \"end\",\n variant: \"filled\",\n styles: {\n content: {\n background:\n \"linear-gradient(1777deg, rgba(153, 164, 255, 0.38), rgb(231 243 248 / 38%) 27%)\",\n },\n },\n },\n };\n\n if (items.length === 0) {\n if (isLoading) {\n return (\n <div style={{ flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\n <style>{`\n @keyframes msg-typing {\n 0%, 60%, 100% { transform: translateY(0); opacity: 0.4; }\n 30% { transform: translateY(-6px); opacity: 1; }\n }\n `}</style>\n <div style={{ display: \"flex\", gap: 6, padding: \"12px 20px\" }}>\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: \"linear-gradient(135deg, #6366f1, #a855f7)\",\n animation: \"msg-typing 1.2s ease-in-out infinite\",\n animationDelay: `${i * 0.2}s`,\n }}\n />\n ))}\n </div>\n </div>\n );\n }\n return <div style={{ flex: 1 }}></div>;\n }\n\n return (\n <MemoizedBubbleList\n items={items}\n role={role}\n className={styles.messages || className}\n />\n );\n};\n","import { createStyles } from \"antd-style\";\n\nexport const useStyle = createStyles(({ token, css }) => {\n return {\n layout: css`\n width: 100%;\n /* min-width: 1000px; */\n height: 100%;\n border-radius: 0;\n display: flex;\n background: ${token.colorBgLayout}95;\n font-family: ${token.fontFamily}, sans-serif;\n position: relative;\n overflow: hidden;\n padding: 8px;\n gap: 8px;\n\n .ant-prompts {\n color: ${token.colorText};\n }\n\n @media (max-width: 768px) {\n padding: 0;\n gap: 0;\n }\n `,\n header: css`\n min-height: 40px;\n display: flex;\n align-items: center;\n padding: 0;\n box-sizing: border-box;\n flex-shrink: 0;\n\n @media (max-width: 768px) {\n padding: 0;\n min-height: 36px;\n }\n `,\n contentArea: css`\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n gap: 8px;\n\n @media (max-width: 768px) {\n gap: 4px;\n }\n `,\n columns: css`\n flex: 1;\n display: flex;\n gap: 8px;\n overflow: hidden;\n\n @media (max-width: 768px) {\n gap: 0;\n }\n `,\n menu: css`\n // background: ${token.colorBgContainer}90;\n width: 60px;\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n transition: all 0.3s ease;\n overflow: hidden;\n position: relative;\n // border-radius: ${token.borderRadiusLG}px;\n // box-shadow: ${token.boxShadow};\n \n &.expanded {\n width: 240px;\n }\n\n @media (max-width: 768px) {\n position: fixed;\n left: 0;\n top: 0;\n bottom: 0;\n z-index: 100;\n background: ${token.colorBgLayout};\n box-shadow: ${token.boxShadow};\n width: 0;\n\n &.expanded {\n width: 280px;\n border-right: 1px solid ${token.colorBorder};\n }\n }\n `,\n menuSnap: css`\n transition: none !important;\n `,\n menuToggle: css`\n position: relative;\n bottom: 20px;\n left: 24px;\n z-index: 1;\n\n &.collapsed {\n left: 16px;\n }\n `,\n logoutBtn: css`\n position: absolute;\n bottom: 32px;\n left: 24px;\n z-index: 1;\n color: ${token.colorTextSecondary};\n\n &:hover {\n color: ${token.colorError};\n }\n\n &.collapsed {\n left: 16px;\n }\n\n .btn-text {\n margin-left: 8px;\n transition: opacity 0.3s ease, width 0.3s ease;\n }\n\n &.collapsed .btn-text {\n display: none;\n }\n `,\n conversations: css`\n padding: 0 12px;\n flex: 1;\n overflow-y: auto;\n transition: padding 0.3s ease;\n\n .collapsed & {\n padding: 0 4px;\n }\n `,\n mainContent: css`\n min-width: 320px;\n flex: 1;\n display: flex;\n position: relative;\n overflow: hidden;\n gap: 16px;\n justify-content: center;\n &.open {\n box-shadow: ${token.boxShadow};\n background: ${token.colorBgContainer};\n margin-left: 0px;\n }\n border-radius: ${token.borderRadiusLG}px;\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorBorder};\n .ant-bubble-content {\n .ant-card {\n background: #ffffff4f;\n }\n }\n\n pre {\n white-space: pre-wrap;\n word-break: break-all;\n }\n\n @media (max-width: 768px) {\n min-width: 0;\n border-radius: 0;\n border: none;\n gap: 8px;\n }\n `,\n mobileMenuToggle: css`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: ${token.borderRadius}px;\n border: 1px solid ${token.colorBorder};\n background: ${token.colorBgContainer};\n color: ${token.colorTextSecondary};\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover {\n background: ${token.colorPrimaryBg};\n color: ${token.colorPrimary};\n }\n `,\n mobilePanelClose: css`\n position: absolute;\n top: 12px;\n right: 12px;\n z-index: 5;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: ${token.borderRadius}px;\n border: none;\n background: rgba(0, 0, 0, 0.06);\n color: ${token.colorTextSecondary};\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover {\n background: rgba(0, 0, 0, 0.12);\n color: ${token.colorText};\n }\n `,\n chat: css`\n width: 100%;\n max-width: 1400px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n padding: ${token.paddingXS}px;\n gap: 0px;\n transition: all 0.3s ease;\n flex-shrink: 0;\n position: relative;\n\n &.full_content_width {\n max-width: 3000px;\n }\n\n &.drawer-open {\n min-width: 200px;\n max-width: 466px;\n }\n .ant-bubble-content-updating {\n background-image: linear-gradient(\n 90deg,\n #ff6b23 0%,\n #af3cb8 31%,\n #53b6ff 89%\n );\n background-size: 100% 2px;\n background-repeat: no-repeat;\n background-position: bottom;\n }\n\n @media (max-width: 768px) {\n padding: 4px;\n }\n `,\n detailPanel: css`\n display: flex;\n flex-direction: column;\n width: 0;\n background: ${token.colorBgContainer};\n\n\n transition: all 0.3s ease;\n overflow: hidden;\n flex-shrink: 0;\n border-radius: ${token.borderRadiusLG}px;\n\n &.open {\n width: 66%;\n box-shadow: ${token.boxShadow};\n border: 1px solid ${token.colorBorder};\n }\n\n &.small {\n width: 22%;\n }\n\n &.middle {\n width: 44%;\n }\n\n &.large {\n width: 66%;\n }\n &.full {\n width: 98%;\n position: absolute;\n z-index: 10;\n bottom: 16px;\n top: 2px;\n }\n\n @media (max-width: 768px) {\n border-radius: 0;\n\n &.open {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100vw !important;\n height: 100dvh;\n z-index: 50;\n border: none;\n }\n\n &.small,\n &.middle,\n &.large,\n &.full {\n width: 100vw !important;\n }\n }\n `,\n toolPanel: css`\n display: flex;\n flex-direction: column;\n width: 0;\n background: ${token.colorBgContainer};\n transition: all 0.3s ease;\n overflow: hidden;\n flex-shrink: 0;\n border-radius: ${token.borderRadiusLG}px;\n border: 1px solid transparent;\n\n &.open {\n width: 320px;\n box-shadow: ${token.boxShadow};\n border-color: ${token.colorBorder};\n }\n\n // Between tablet and desktop the outer shells (icon rail + room list)\n // leave too little room for a docked rail, so the panel becomes a\n // right-side sheet instead of being clipped by the columns overflow.\n @media (max-width: 1100px) {\n border-radius: 0;\n\n &.open {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: min(360px, 92vw) !important;\n height: 100dvh;\n z-index: 50;\n border: none;\n }\n }\n\n @media (max-width: 768px) {\n border-radius: 0;\n\n &.open {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100vw !important;\n height: 100dvh;\n z-index: 50;\n border: none;\n }\n }\n `,\n detailContent: css`\n // padding: 8px 8px;\n height: 100%;\n flex: 1;\n overflow: hidden;\n pre {\n white-space: pre-wrap;\n word-break: break-all;\n }\n `,\n detailHeader: css`\n padding: 16px 24px;\n border-bottom: 1px solid ${token.colorBorder};\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 500;\n }\n `,\n messages: css`\n padding: 0 20px;\n flex: 1;\n overflow: hidden;\n .ant-bubble:first-child {\n margin-top: 80px;\n }\n `,\n messagesWithHeader: css`\n .ant-bubble:first-child {\n margin-top: 80px;\n }\n `,\n placeholder: css`\n padding-top: 32px;\n `,\n sender: css`\n box-shadow: ${token.boxShadow};\n `,\n fixedHeader: css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n z-index: 2;\n background: transparent;\n `,\n logo: css`\n display: flex;\n height: 72px;\n align-items: center;\n justify-content: start;\n padding: 0 24px;\n box-sizing: border-box;\n white-space: nowrap;\n overflow: hidden;\n transition: padding 0.3s ease;\n\n img {\n width: 24px;\n height: 24px;\n display: inline-block;\n }\n\n span {\n display: inline-block;\n margin: 0 8px;\n font-weight: bold;\n color: ${token.colorText};\n font-size: 16px;\n opacity: 1;\n transition: opacity 0.3s ease, width 0.3s ease, margin 0.3s ease;\n }\n\n &.collapsed {\n padding: 0 20px;\n justify-content: center;\n\n span {\n opacity: 0;\n width: 0;\n margin: 0;\n }\n }\n `,\n addBtn: css`\n background: #1677ff0f;\n border: 1px solid #1677ff34;\n width: calc(100% - 24px);\n margin: 0 12px 24px 12px;\n white-space: nowrap;\n overflow: hidden;\n transition: all 0.3s ease;\n\n &.collapsed {\n width: 48px;\n min-width: 48px;\n margin: 0 auto 24px auto;\n justify-content: center;\n padding: 0;\n }\n `,\n // Icon mode styles (collapsed view) - Clean & Simple\n iconMode: css`\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n padding: 16px 8px;\n overflow-y: auto;\n overflow-x: hidden;\n box-sizing: border-box;\n scrollbar-width: none;\n -ms-overflow-style: none;\n \n &::-webkit-scrollbar {\n display: none;\n }\n `,\n iconModeLogo: css`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n margin: 8px auto 16px auto;\n flex-shrink: 0;\n border-radius: 12px;\n transition: all 0.2s ease;\n \n &:hover {\n background: rgba(0, 0, 0, 0.04);\n }\n `,\n iconModeContainer: css`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n width: 100%;\n box-sizing: border-box;\n scrollbar-width: none;\n -ms-overflow-style: none;\n \n &::-webkit-scrollbar {\n display: none;\n }\n `,\n iconModeDivider: css`\n width: 24px;\n height: 1px;\n background: ${token.colorBorder};\n margin: 8px auto;\n flex-shrink: 0;\n `,\n iconModeGroup: css`\n display: flex;\n flex-direction: column;\n gap: 4px;\n align-items: center;\n width: 100%;\n box-sizing: border-box;\n padding: 0 4px;\n `,\n iconModeButton: css`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border-radius: 10px;\n border: 1px solid transparent;\n background: transparent;\n color: ${token.colorTextSecondary};\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n box-sizing: border-box;\n padding: 0;\n margin: 0;\n \n &:hover {\n background: rgba(0, 0, 0, 0.04);\n color: ${token.colorPrimary};\n }\n \n &:active {\n background: rgba(0, 0, 0, 0.08);\n }\n \n .lucide {\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n }\n `,\n // Expanded sidebar styles - Clean & Simple\n expandedMenu: css`\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n padding: 16px;\n gap: 8px;\n overflow-y: auto;\n overflow-x: hidden;\n `,\n expandedMenuLogo: css`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 4px 8px;\n margin-bottom: 16px;\n font-size: 18px;\n font-weight: 600;\n color: ${token.colorText};\n white-space: nowrap;\n overflow: hidden;\n \n .logo-icon {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n \n .logo-text {\n transition: all 0.2s ease;\n opacity: 1;\n }\n \n &.collapsed .logo-text {\n opacity: 0;\n width: 0;\n }\n `,\n newAnalysisBtn: css`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n background: ${token.colorPrimary};\n border: none;\n border-radius: 20px;\n margin: 0 12px 16px 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 14px;\n font-weight: 600;\n color: white;\n white-space: nowrap;\n overflow: hidden;\n \n &:hover {\n opacity: 0.9;\n transform: translateY(-1px);\n }\n \n &:active {\n transform: translateY(0);\n }\n \n .btn-text {\n transition: all 0.2s ease;\n opacity: 1;\n }\n \n &.collapsed {\n width: 40px;\n min-width: 40px;\n height: 40px;\n padding: 0;\n margin: 0 auto 16px auto;\n border-radius: 10px;\n \n .btn-text {\n opacity: 0;\n width: 0;\n display: none;\n }\n }\n `,\n menuGroup: css`\n margin-bottom: 8px;\n `,\n menuGroupTitle: css`\n font-size: 11px;\n font-weight: 600;\n color: ${token.colorTextSecondary};\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: 8px 12px;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n transition: all 0.2s ease;\n \n &.collapsed {\n opacity: 0;\n height: 0;\n padding: 0;\n margin: 0;\n }\n `,\n menuItemExpanded: css`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 10px;\n color: ${token.colorText};\n transition: all 0.2s ease;\n cursor: pointer;\n border: none;\n background: transparent;\n width: 100%;\n text-align: left;\n font-size: 14px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n \n &:hover {\n background: rgba(0, 0, 0, 0.04);\n color: ${token.colorPrimary};\n }\n \n &:active {\n background: rgba(0, 0, 0, 0.08);\n }\n \n .menu-icon {\n flex-shrink: 0;\n width: 22px;\n height: 22px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${token.colorTextSecondary};\n transition: all 0.2s ease;\n }\n \n &:hover .menu-icon {\n color: ${token.colorPrimary};\n }\n \n .menu-label {\n transition: all 0.2s ease;\n opacity: 1;\n flex: 1;\n }\n \n &.collapsed {\n justify-content: center;\n padding: 10px;\n width: 40px;\n height: 40px;\n margin: 0 auto;\n border-radius: 10px;\n \n .menu-label {\n opacity: 0;\n width: 0;\n display: none;\n }\n }\n `,\n buttonContainerExpanded: css`\n display: flex;\n flex-direction: column;\n gap: 4px;\n align-items: stretch;\n flex: 1;\n overflow-y: auto;\n `,\n collapseBtn: css`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: 8px;\n border: 1px solid ${token.colorBorder};\n background: ${token.colorBgContainer};\n cursor: pointer;\n margin-left: auto;\n transition: all 0.2s ease;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n \n &:hover {\n background: ${token.colorBgTextHover};\n border-color: ${token.colorPrimary};\n color: ${token.colorPrimary};\n }\n \n .lucide {\n width: 18px;\n height: 18px;\n }\n `,\n\n // Empty state styles\n emptyStateContainer: css`\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 0 20px;\n transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n opacity: 1;\n transform: translateY(0);\n \n &.exiting {\n opacity: 0;\n transform: translateY(-30px);\n }\n `,\n\n welcomeSection: css`\n text-align: center;\n margin-bottom: 40px;\n animation: fadeInUp 0.5s ease-out;\n `,\n\n greeting: css`\n font-size: 34px;\n font-weight: 600;\n margin-bottom: 12px;\n color: ${token.colorText};\n \n .user-name {\n color: ${token.colorPrimary};\n }\n `,\n\n question: css`\n font-size: 28px;\n color: ${token.colorTextSecondary};\n `,\n\n promptsWrapper: css`\n margin-bottom: 32px;\n animation: fadeInUp 0.5s ease-out 0.1s both;\n `,\n\n emptyStateSenderWrapper: css`\n width: 100%;\n max-width: 800px;\n animation: fadeInUp 0.5s ease-out 0.2s both;\n transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n \n &.transitioning {\n transform: translateY(100vh);\n opacity: 0;\n }\n `,\n\n emptyStateSender: css`\n box-shadow: ${token.boxShadow};\n `,\n\n senderContainer: css`\n transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n opacity: 1;\n transform: translateY(0);\n \n &.entering {\n opacity: 0;\n transform: translateY(20px);\n }\n `,\n\n entering: css`\n opacity: 0;\n transform: translateY(20px);\n `,\n\n exiting: css`\n opacity: 0;\n transform: translateY(-30px);\n `,\n\n transitioning: css`\n transform: translateY(100vh);\n opacity: 0;\n `,\n\n '@keyframes fadeInUp': css`\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n `,\n\n // Inline drawer styles for expanded sidebar mode\n inlineDrawerContainer: css`\n background: transparent;\n overflow-y: auto;\n animation: slideDown 0.2s ease-out;\n\n @keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n max-height: 0;\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `,\n\n menuItemExpandedActive: css`\n background: ${token.colorPrimary}15 !important;\n color: ${token.colorPrimary} !important;\n\n .menu-icon {\n color: ${token.colorPrimary} !important;\n }\n `,\n\n inlineDrawerIndicator: css`\n margin-left: auto;\n display: flex;\n align-items: center;\n color: ${token.colorTextSecondary};\n transition: transform 0.2s ease;\n `,\n\n // Rotating border button for abort action\n rotatingBorderButton: css`\n position: relative;\n overflow: visible;\n \n &::before {\n content: '';\n position: absolute;\n inset: -2px;\n border-radius: 50%;\n padding: 2px;\n background: conic-gradient(\n from 0deg,\n ${token.colorPrimary},\n ${token.colorPrimary}40,\n ${token.colorPrimary}\n );\n -webkit-mask: \n linear-gradient(#fff 0 0) content-box, \n linear-gradient(#fff 0 0);\n -webkit-mask-composite: xor;\n mask-composite: exclude;\n animation: rotateBorder 2s linear infinite;\n }\n \n @keyframes rotateBorder {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n `,\n\n\n };\n});\n","import type { AssistantMessage, Message, ToolCall } from \"@axiom-lattice/protocols\";\n\nexport type TraceNodeKind = \"human\" | \"ai\" | \"tool\" | \"agent\" | \"summary\";\nexport type TraceStatus = \"running\" | \"success\" | \"error\";\nexport type TracePhaseKind = \"understand\" | \"act\" | \"delegate\" | \"answer\";\nexport type TraceEdgeKind = \"sequence\" | \"invoke\" | \"result\";\n\nexport interface TraceNodeData {\n kind: TraceNodeKind;\n status: TraceStatus;\n phase: TracePhaseKind;\n messageId: string;\n aiId?: string;\n label: string;\n content?: string;\n toolCall?: ToolCall;\n isAnswer?: boolean;\n parallelGroupId?: string;\n parallelCount?: number;\n}\n\nexport interface TraceNode {\n id: string;\n data: TraceNodeData;\n}\n\nexport interface TraceEdge {\n id: string;\n from: string;\n to: string;\n kind: TraceEdgeKind;\n}\n\nexport interface TracePhase {\n id: string;\n kind: TracePhaseKind;\n title: string;\n nodeIds: string[];\n}\n\nexport interface TraceGraph {\n nodes: TraceNode[];\n edges: TraceEdge[];\n phases: TracePhase[];\n}\n\nexport const TRACE_CARD_SIZE: Record<TraceNodeKind, { width: number; height: number }> = {\n human: { width: 420, height: 220 },\n ai: { width: 440, height: 360 },\n tool: { width: 380, height: 320 },\n agent: { width: 380, height: 320 },\n summary: { width: 260, height: 96 },\n};\n\nconst PHASE_TITLES: Record<TracePhaseKind, string> = {\n understand: \"理解与规划\",\n act: \"执行\",\n delegate: \"委派\",\n answer: \"回答\",\n};\n\nfunction isAssistant(message: Message): message is AssistantMessage {\n return message.role === \"ai\";\n}\n\nfunction buildPhases(nodes: TraceNode[]): TracePhase[] {\n const phases: TracePhase[] = [];\n for (const node of nodes) {\n const last = phases[phases.length - 1];\n if (last && last.kind === node.data.phase) {\n last.nodeIds.push(node.id);\n } else {\n phases.push({\n id: `phase:${phases.length}:${node.data.phase}`,\n kind: node.data.phase,\n title: PHASE_TITLES[node.data.phase],\n nodeIds: [node.id],\n });\n }\n }\n return phases;\n}\n\nexport interface TraceGraphOptions {\n /** Whether the agent run is currently live. Only live work is marked \"running\". */\n isLoading?: boolean;\n}\n\nexport function buildTraceGraph(\n messages: Message[],\n options: TraceGraphOptions = {}\n): TraceGraph {\n const isLoading = options.isLoading === true;\n const nodes: TraceNode[] = [];\n const edges: TraceEdge[] = [];\n const lastAssistant = [...messages].reverse().find(isAssistant);\n const lastMessage = messages[messages.length - 1];\n let frontier: string[] = [];\n let frontierIsTool = false;\n\n const connect = (to: string, kind: TraceEdgeKind) => {\n for (const from of frontier) {\n edges.push({ id: `${kind}:${from}->${to}`, from, to, kind });\n }\n };\n\n for (const message of messages) {\n if (message.role === \"human\") {\n const id = `human:${message.id}`;\n nodes.push({\n id,\n data: {\n kind: \"human\",\n status: \"success\",\n phase: \"understand\",\n messageId: message.id,\n label: \"用户\",\n content: message.content,\n },\n });\n connect(id, \"sequence\");\n frontier = [id];\n frontierIsTool = false;\n continue;\n }\n\n if (!isAssistant(message)) continue;\n\n const calls = message.tool_calls ?? [];\n const isAnswer = message === lastAssistant && calls.length === 0;\n const phase: TracePhaseKind = calls.some((c) => c.name === \"task\")\n ? \"delegate\"\n : calls.length > 0\n ? \"act\"\n : isAnswer\n ? \"answer\"\n : \"understand\";\n const unresolved = calls.some((c) => c.response === undefined);\n const isLiveTail = isLoading && message === lastMessage;\n const status: TraceStatus = isLiveTail\n ? \"running\"\n : unresolved && !isLiveTail\n ? \"error\"\n : \"success\";\n const aiId = `ai:${message.id}`;\n\n nodes.push({\n id: aiId,\n data: {\n kind: \"ai\",\n status,\n phase,\n messageId: message.id,\n label: PHASE_TITLES[phase],\n content: message.content,\n isAnswer,\n },\n });\n connect(aiId, frontierIsTool ? \"result\" : \"sequence\");\n\n const toolIds: string[] = [];\n for (const c of calls) {\n const toolId = `tool:${c.id}`;\n const toolStatus: TraceStatus =\n c.response !== undefined ? \"success\" : isLiveTail ? \"running\" : \"error\";\n nodes.push({\n id: toolId,\n data: {\n kind: c.name === \"task\" ? \"agent\" : \"tool\",\n status: toolStatus,\n phase,\n messageId: message.id,\n aiId,\n label: c.name,\n toolCall: c,\n parallelGroupId: aiId,\n parallelCount: calls.length,\n },\n });\n edges.push({ id: `invoke:${aiId}->${toolId}`, from: aiId, to: toolId, kind: \"invoke\" });\n toolIds.push(toolId);\n }\n\n if (toolIds.length > 0) {\n frontier = toolIds;\n frontierIsTool = true;\n } else {\n frontier = [aiId];\n frontierIsTool = false;\n }\n }\n\n return { nodes, edges, phases: buildPhases(nodes) };\n}\n\nexport function collapseOlderPhases(graph: TraceGraph, keepPhases: number): TraceGraph {\n if (keepPhases < 1 || graph.phases.length <= keepPhases) {\n return graph;\n }\n\n const kept = graph.phases.slice(-keepPhases);\n const older = graph.phases.slice(0, -keepPhases);\n const olderIds = new Set(older.flatMap((p) => p.nodeIds));\n const keptIds = new Set(kept.flatMap((p) => p.nodeIds));\n const summaryId = `summary:${older[0].id}`;\n\n const summaryNode: TraceNode = {\n id: summaryId,\n data: {\n kind: \"summary\",\n status: \"success\",\n phase: older[0].kind,\n messageId: summaryId,\n label: `${olderIds.size} 个步骤`,\n },\n };\n\n const nodes = [summaryNode, ...graph.nodes.filter((n) => !olderIds.has(n.id))];\n const edges = graph.edges\n .filter((e) => !olderIds.has(e.from) && !olderIds.has(e.to))\n .map((e) => ({ ...e }));\n\n const bridged = new Set<string>();\n for (const e of graph.edges) {\n if (olderIds.has(e.from) && keptIds.has(e.to) && !bridged.has(e.to)) {\n bridged.add(e.to);\n edges.push({ id: `${e.kind}:${summaryId}->${e.to}`, from: summaryId, to: e.to, kind: e.kind });\n }\n }\n\n const summaryPhase: TracePhase = {\n id: `phase:summary:${older[0].id}`,\n kind: older[0].kind,\n title: \"更早\",\n nodeIds: [summaryId],\n };\n\n return { nodes, edges, phases: [summaryPhase, ...kept] };\n}\n\nexport function resolveTraceView(\n explicit: boolean | undefined,\n configEnabled: boolean | undefined\n): boolean {\n if (explicit !== undefined) return explicit;\n return configEnabled === true;\n}\n","import { Collapse, Space, Tag } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { MDResponse } from \"./MDResponse\";\nimport { getElement } from \"./elements\";\nimport { useAgentChat } from \"@hooks/useAgentChat\";\n\nconst { Panel: CollapsePanel } = Collapse;\n\n/** Live task review interrupts render as an interactive card, not read-only history. */\nconst TASK_REVIEW_FENCE = /^```task_review\\n([\\s\\S]*?)\\n```$/;\n\nfunction parseTaskReviewInterrupt(value: unknown): Record<string, unknown> | undefined {\n if (typeof value !== \"string\") return undefined;\n const match = TASK_REVIEW_FENCE.exec(value.trim());\n if (!match) return undefined;\n try {\n const parsed: unknown = JSON.parse(match[1]);\n return typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nconst useStyle = createStyles(({ token, css }) => ({\n card: css`\n max-width: 1200px;\n margin: 8px 20px;\n background: ${token.colorPrimaryBg};\n border: 1px solid ${token.colorPrimaryBorder};\n border-radius: 16px;\n transition: border-color 0.3s ease;\n max-height: 35dvh;\n overflow-y: auto;\n\n &:hover {\n border-color: ${token.colorPrimary};\n }\n `,\n tag: css`\n font-size: 13px;\n font-weight: 600;\n color: ${token.colorPrimary};\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorPrimaryBorder};\n padding: 2px 10px;\n border-radius: 8px;\n margin-inline-end: 0;\n `,\n}));\n\nexport const HITLContainer: React.FC = () => {\n const { styles } = useStyle();\n const { interrupts } = useAgentChat();\n return interrupts && interrupts.length > 0 ? (\n <Collapse\n className={styles.card}\n size=\"small\"\n bordered={false}\n defaultActiveKey={[\"hitl\"]}\n >\n <CollapsePanel\n key=\"hitl\"\n showArrow={false}\n header={<Tag bordered={false} className={styles.tag}>Pending Feedback</Tag>}\n >\n <Space direction=\"vertical\" style={{ width: \"100%\" }}>\n {interrupts.map((interrupt) => {\n const taskReview = parseTaskReviewInterrupt(interrupt.value);\n const TaskReviewCard = taskReview === undefined ? undefined : getElement(\"task_review\")?.card_view;\n if (taskReview !== undefined && TaskReviewCard !== undefined) {\n return (\n <TaskReviewCard\n key={interrupt.id}\n component_key=\"task_review\"\n data={taskReview}\n interactive={true}\n />\n );\n }\n return <MDResponse key={interrupt.id} content={interrupt.value} />;\n })}\n </Space>\n </CollapsePanel>\n </Collapse>\n ) : null;\n};\n","import { Typography, Space, Button, message } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { useAgentChat } from \"@hooks/useAgentChat\";\nimport { ClockCircleOutlined, DownOutlined, RightOutlined, LoadingOutlined, DeleteOutlined } from \"@ant-design/icons\";\nimport { useState } from \"react\";\n\nconst useStyle = createStyles(({ css, token }) => ({\n container: css`\n max-width: 1200px;\n margin: 4px 20px 8px;\n padding: 8px 12px;\n background: ${token.colorFillTertiary};\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n &:hover {\n background: ${token.colorFillSecondary};\n }\n `,\n header: css`\n font-size: 12px;\n color: ${token.colorTextTertiary};\n display: flex;\n align-items: center;\n justify-content: space-between;\n `,\n headerLeft: css`\n display: flex;\n align-items: center;\n gap: 6px;\n `,\n messageItem: css`\n font-size: 12px;\n color: ${token.colorTextSecondary};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n line-height: 1.5;\n padding: 6px 12px;\n margin: 4px 0;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n transition: all 0.2s ease;\n \n &:hover {\n background: ${token.colorFillQuaternary};\n }\n `,\n messageContent: css`\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-right: 8px;\n `,\n actionButtons: css`\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n `,\n sendNowButton: css`\n font-size: 12px;\n padding: 4px 12px;\n height: auto;\n border-radius: 6px;\n `,\n deleteButton: css`\n font-size: 12px;\n padding: 4px 12px;\n height: auto;\n border-radius: 6px;\n `,\n messagesList: css`\n margin-top: 6px;\n animation: fadeIn 0.2s ease;\n \n @keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `,\n}));\n\nexport const PendingMessagesContainer: React.FC = () => {\n const { styles } = useStyle();\n const { pendingMessages, sendMessage, removePendingMessage } = useAgentChat();\n const [expanded, setExpanded] = useState(true);\n const [sendingId, setSendingId] = useState<string | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n\n if (!pendingMessages || pendingMessages.length === 0) return null;\n\n const handleSendMessage = async (msg: typeof pendingMessages[0]) => {\n if (sendingId || deletingId) return; // 防止重复点击\n \n setSendingId(msg.id);\n \n try {\n // 1. 先删除原 pending message\n await removePendingMessage(msg.id);\n \n // 2. 以 STEER 模式发送消息\n await sendMessage({\n input: {\n message: msg.content,\n },\n mode: 'steer', // 使用 STEER 模式插队处理\n });\n } catch (error) {\n console.error(\"Failed to send pending message:\", error);\n message.error(\"发送失败,请重试\");\n } finally {\n setSendingId(null);\n }\n };\n\n const handleDeleteMessage = async (msg: typeof pendingMessages[0]) => {\n if (sendingId || deletingId) return; // 防止重复点击\n \n setDeletingId(msg.id);\n \n try {\n // removePendingMessage 会处理:\n // 1. 停止对应的流(如果消息正在处理中)\n // 2. 从服务器队列中删除消息\n // 3. 更新本地状态\n await removePendingMessage(msg.id);\n message.success(\"消息已删除\");\n } catch (error) {\n console.error(\"Failed to delete pending message:\", error);\n message.error(\"删除失败,请重试\");\n } finally {\n setDeletingId(null);\n }\n };\n\n return (\n <div className={styles.container}>\n <div \n className={styles.header}\n onClick={() => setExpanded(!expanded)}\n >\n <Space className={styles.headerLeft}>\n <ClockCircleOutlined />\n <span>{pendingMessages.length} pending</span>\n </Space>\n {expanded ? <DownOutlined style={{ fontSize: 10 }} /> : <RightOutlined style={{ fontSize: 10 }} />}\n </div>\n \n {expanded && (\n <div className={styles.messagesList}>\n {pendingMessages.map((msg) => (\n <div\n key={msg.id}\n className={styles.messageItem}\n onClick={(e) => {\n e.stopPropagation(); // 防止触发 container 的点击\n }}\n >\n <Typography.Text\n className={styles.messageContent}\n title={msg.content}\n >\n {msg.content}\n </Typography.Text>\n \n <div className={styles.actionButtons}>\n <Button\n size=\"small\"\n loading={sendingId === msg.id}\n disabled={sendingId !== null || deletingId !== null}\n onClick={() => handleSendMessage(msg)}\n className={styles.sendNowButton}\n >\n {sendingId === msg.id ? <LoadingOutlined /> : 'Send now'}\n </Button>\n\n <Button\n size=\"small\"\n loading={deletingId === msg.id}\n disabled={sendingId !== null || deletingId !== null}\n onClick={() => handleDeleteMessage(msg)}\n className={styles.deleteButton}\n icon={deletingId === msg.id ? <LoadingOutlined /> : <DeleteOutlined />}\n />\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport { Space } from \"antd\";\nimport { ProgressTracker } from \"../ProgressTracker\";\nimport { FileExplorerButton } from \"../FileExplorerButton\";\nimport { ScheduleButton } from \"../ScheduleButton\";\nimport { TeamButton } from \"../TeamButton\";\nimport { MailboxButton } from \"../MailboxButton\";\nimport { useAgentChat } from \"../../../hooks/useAgentChat\";\n\nexport interface ThreadArtifactsProps {\n variant?: 'full' | 'compact';\n}\n\nexport const ThreadArtifacts: React.FC<ThreadArtifactsProps> = ({\n variant = 'compact',\n}) => {\n const { agentState, todos, tasks } = useAgentChat();\n \n const files = agentState?.values?.files || {};\n const fileCount = Object.keys(files).length;\n const hasTodosOrTasks = (todos && todos.length > 0) || (tasks && tasks.length > 0);\n const hasTeam = !!agentState?.values?.team;\n const teamMailbox = agentState?.values?.team_mailbox as any[] | undefined;\n const hasMailbox = hasTeam && (teamMailbox?.length ?? 0) > 0;\n\n // Compact 模式:只显示有数据的\n if (variant === 'compact') {\n const hasAnyArtifacts = hasTodosOrTasks || fileCount > 0 || hasTeam || hasMailbox;\n \n if (!hasAnyArtifacts) {\n return null;\n }\n\n return (\n <Space size={4}>\n {hasTodosOrTasks && <ProgressTracker />}\n {fileCount > 0 && <FileExplorerButton />}\n {hasTeam && <TeamButton />}\n {hasMailbox && <MailboxButton />}\n </Space>\n );\n }\n\n // Full 模式:显示所有(保持原有行为)\n return (\n <Space size={8}>\n <ProgressTracker />\n <FileExplorerButton />\n <ScheduleButton />\n <TeamButton />\n <MailboxButton />\n </Space>\n );\n};\n","import React from \"react\";\nimport { Popover, Tooltip, Progress } from \"antd\";\nimport { TodoItem, Todo } from \"@components/GenUI/elements/Todo\";\nimport { useAgentChat } from \"@hooks/useAgentChat\";\nimport { useChatUIContext } from \"./ChatUIContext\";\n\nexport type TodoProgressProps = Record<string, never>;\n\nexport const TodoProgress: React.FC<TodoProgressProps> = (_props) => {\n const { openSideApp } = useChatUIContext();\n const { todos } = useAgentChat();\n\n // Handle empty todos case\n if (!todos || todos.length === 0) {\n return (\n <Popover\n content={\n <div style={{ width: 400 }}>\n <Todo data={[]} component_key=\"header_todos\" />\n </div>\n }\n title=\"Todos\"\n trigger=\"click\"\n placement=\"bottomRight\"\n >\n <Tooltip title=\"No tasks\">\n <div\n style={{\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n <Progress\n type=\"circle\"\n strokeColor={{\n \"0%\": \"#91caff\",\n \"100%\": \"#003eb3\",\n }}\n percent={0}\n width={30}\n format={() => (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n lineHeight: 1,\n }}\n >\n <span style={{ fontSize: 8 }}>0/0</span>\n </div>\n )}\n />\n <span\n style={{\n fontSize: 12,\n color: \"#999\",\n maxWidth: 200,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n No tasks\n </span>\n </div>\n </Tooltip>\n </Popover>\n );\n }\n\n const completedCount = todos.filter(\n (item) => item.status === \"completed\"\n ).length;\n const totalCount = todos.length;\n const hasInProgress = todos.some((item) => item.status === \"in_progress\");\n const inProgressTodos = todos.filter((item) => item.status === \"in_progress\");\n const percent = Math.round((completedCount / totalCount) * 100);\n\n // Get core information to display\n const getCoreInfo = () => {\n if (inProgressTodos.length > 0) {\n // If there's only one in-progress task, show its name\n if (inProgressTodos.length === 1) {\n return inProgressTodos[0].content;\n }\n // If there are multiple in-progress tasks, show the count\n return `${inProgressTodos.length} in progress`;\n }\n // If all tasks are completed, show the completed count\n if (completedCount > 0) {\n return `${completedCount} completed`;\n }\n // Fallback (shouldn't happen, but just in case)\n return \"No tasks\";\n };\n\n const coreInfo = getCoreInfo();\n\n return (\n <Popover\n content={\n <div style={{ width: 400 }}>\n <Todo data={todos} component_key=\"header_todos\" />\n </div>\n }\n title=\"Todos\"\n trigger=\"click\"\n placement=\"bottomRight\"\n >\n <Tooltip title={`${completedCount} / ${totalCount} tasks completed`}>\n <div\n style={{\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n <Progress\n type=\"circle\"\n strokeColor={{\n \"0%\": \"#91caff\",\n \"100%\": \"#003eb3\",\n }}\n percent={percent}\n status={hasInProgress ? \"active\" : \"normal\"}\n width={22}\n format={() => (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n lineHeight: 1,\n }}\n >\n <span style={{ fontSize: 8 }}>\n {completedCount}/{totalCount}\n </span>\n </div>\n )}\n />\n <span\n style={{\n fontSize: 12,\n color: hasInProgress ? \"#1890ff\" : \"#666\",\n fontWeight: hasInProgress ? 500 : 400,\n maxWidth: 200,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {coreInfo}\n </span>\n </div>\n </Tooltip>\n </Popover>\n );\n};\n","import React from \"react\";\nimport { Tooltip, Progress } from \"antd\";\nimport { TaskBoard } from \"@components/GenUI/elements/TaskBoard\";\nimport { useAgentChat } from \"@hooks/useAgentChat\";\nimport { useChatUIContext } from \"./ChatUIContext\";\n\nexport type TaskProgressProps = Record<string, never>;\n\nexport const TaskProgress: React.FC<TaskProgressProps> = (_props) => {\n const { tasks } = useAgentChat();\n const { openSideApp } = useChatUIContext();\n\n if (!tasks || tasks.length === 0) {\n return (\n <Tooltip title=\"No tasks\">\n <div\n style={{\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"0px 4px\",\n }}\n onClick={() =>\n openSideApp({\n component_key: \"task_board\",\n message: \"Tasks\",\n data: {},\n })\n }\n >\n <Progress\n type=\"circle\"\n strokeColor={{\n \"0%\": \"#91caff\",\n \"100%\": \"#003eb3\",\n }}\n percent={0}\n width={30}\n format={() => (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n lineHeight: 1,\n }}\n >\n <span style={{ fontSize: 8 }}>0/0</span>\n </div>\n )}\n />\n <span\n style={{\n fontSize: 12,\n color: \"#999\",\n maxWidth: 200,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n No tasks\n </span>\n </div>\n </Tooltip>\n );\n }\n\n const completedCount = tasks.filter(\n (item) => item.status === \"completed\"\n ).length;\n const totalCount = tasks.length;\n const hasInProgress = tasks.some((item) => item.status === \"in_progress\");\n const inProgressTasks = tasks.filter((item) => item.status === \"in_progress\");\n const percent = Math.round((completedCount / totalCount) * 100);\n\n const getCoreInfo = () => {\n if (inProgressTasks.length > 0) {\n if (inProgressTasks.length === 1) {\n return inProgressTasks[0].title;\n }\n return `${inProgressTasks.length} in progress`;\n }\n if (completedCount > 0) {\n return `${completedCount} completed`;\n }\n return \"No tasks\";\n };\n\n const coreInfo = getCoreInfo();\n\n return (\n <Tooltip title={`${completedCount} / ${totalCount} tasks completed`}>\n <div\n style={{\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n onClick={() =>\n openSideApp({\n component_key: \"task_board\",\n message: \"Tasks\",\n data: {},\n })\n }\n >\n <Progress\n type=\"circle\"\n strokeColor={{\n \"0%\": \"#91caff\",\n \"100%\": \"#003eb3\",\n }}\n percent={percent}\n status={hasInProgress ? \"active\" : \"normal\"}\n width={22}\n format={() => (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n lineHeight: 1,\n }}\n >\n <span style={{ fontSize: 8 }}>\n {completedCount}/{totalCount}\n </span>\n </div>\n )}\n />\n <span\n style={{\n fontSize: 12,\n color: hasInProgress ? \"#1890ff\" : \"#666\",\n fontWeight: hasInProgress ? 500 : 400,\n maxWidth: 200,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {coreInfo}\n </span>\n </div>\n </Tooltip>\n );\n};\n","import React from \"react\";\nimport { useAgentChat } from \"@hooks/useAgentChat\";\nimport { TodoProgress } from \"./TodoProgress\";\nimport { TaskProgress } from \"./TaskProgress\";\n\nexport type ProgressTrackerProps = Record<string, never>;\n\nexport const ProgressTracker: React.FC<ProgressTrackerProps> = () => {\n const { todos, tasks } = useAgentChat();\n\n if (todos && todos.length > 0) {\n return <TodoProgress />;\n }\n\n if (tasks && tasks.length > 0) {\n return <TaskProgress />;\n }\n\n return <TodoProgress />;\n};\n","import React from \"react\";\nimport { Tooltip, Badge, Button } from \"antd\";\nimport { FileDoneOutlined, FileTextOutlined } from \"@ant-design/icons\";\nimport { useAgentChat } from \"@hooks/useAgentChat\";\nimport { useChatUIContext } from \"./ChatUIContext\";\n\nexport type FileExplorerButtonProps = Record<string, never>;\n\nexport const FileExplorerButton: React.FC<FileExplorerButtonProps> = (_props) => {\n const { agentState } = useAgentChat();\n const { openSideApp } = useChatUIContext();\n const files = agentState?.values?.files || [];\n // if (!files || Object.keys(files).length === 0) {\n // return null;\n // }\n\n const fileCount = Object.keys(files).length;\n\n return (\n <Tooltip title=\"File Changed\">\n {/* <Badge count={fileCount} size=\"small\" color=\"blue\"> */}\n {fileCount > 0 && <Button\n style={{\n fontSize: 12,\n color: fileCount > 0 ? \"#1890ff\" : \"#666\",\n fontWeight: fileCount > 0 ? 500 : 400,\n maxWidth: 200,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n type=\"text\"\n size=\"small\"\n icon={<FileDoneOutlined />}\n onClick={() =>\n openSideApp({\n component_key: \"file_explorer\",\n message: \"File Explorer\",\n data: { files },\n })\n }\n >{`${fileCount} files`}</Button>}\n {/* </Badge> */}\n </Tooltip>\n );\n};\n","import React, { useState, useCallback, useEffect } from \"react\";\nimport { Tooltip, Badge, Button, Spin } from \"antd\";\nimport { CalendarOutlined } from \"@ant-design/icons\";\nimport { useAgentChat } from \"../../hooks/useAgentChat\";\nimport { useChatUIContext } from \"./ChatUIContext\";\nimport { useClient } from \"../../context\";\nimport { ScheduledTask, ScheduledTaskStatus } from \"@axiom-lattice/client-sdk\";\n\n/**\n * Props for the {@link ScheduleButton} component.\n */\nexport interface ScheduleButtonProps {\n /**\n * Custom tooltip text displayed on hover.\n */\n tooltipText?: string;\n}\n\n/**\n * A toolbar button that shows the count of active scheduled tasks for the\n * current agent thread and opens an agenda viewer in the side panel on click.\n *\n * Fetches scheduled tasks via {@link useClient} on mount and whenever the\n * thread ID changes. The button is hidden when no tasks exist.\n *\n * @param tooltipText - Tooltip text shown on hover (default: \"Agenda\").\n * @returns The schedule button, or `null` if there is no thread ID or no tasks.\n *\n * @example\n * ```tsx\n * import { ScheduleButton } from \"@axiom-lattice/react-sdk\";\n *\n * <ScheduleButton tooltipText=\"Scheduled Reports\" />\n * ```\n *\n * @remarks\n * - Requires ancestor context for {@link useAgentChat} and {@link ChatUIContextProvider}.\n * - Only active tasks (status PENDING or PAUSED) contribute to the badge count.\n * - Opens a side-app with `component_key: \"schedule_viewer\"`.\n */\nexport const ScheduleButton: React.FC<ScheduleButtonProps> = ({\n tooltipText = \"Agenda\",\n}) => {\n const { threadId, assistantId } = useAgentChat();\n const { openSideApp } = useChatUIContext();\n const client = useClient(assistantId || \"\");\n\n const [scheduledTasks, setScheduledTasks] = useState<ScheduledTask[]>([]);\n const [loading, setLoading] = useState(false);\n const [taskCount, setTaskCount] = useState(0);\n\n // Fetch scheduled tasks for the current thread\n const fetchScheduledTasks = useCallback(async () => {\n if (!threadId) return;\n\n setLoading(true);\n try {\n const tasks = await client.schedules.getByThread({ threadId });\n setScheduledTasks(tasks);\n\n // Count only active tasks (pending or paused)\n const activeCount = tasks.filter(\n (task) =>\n task.status === ScheduledTaskStatus.PENDING ||\n task.status === ScheduledTaskStatus.PAUSED\n ).length;\n setTaskCount(activeCount);\n } catch (error) {\n console.error(\"Failed to fetch scheduled tasks:\", error);\n setScheduledTasks([]);\n setTaskCount(0);\n } finally {\n setLoading(false);\n }\n }, [client, threadId]);\n\n // Fetch tasks on mount and when threadId changes\n useEffect(() => {\n fetchScheduledTasks();\n }, [fetchScheduledTasks]);\n\n // Don't render the button if there's no threadId\n if (!threadId) {\n return null;\n }\n\n const handleClick = () => {\n openSideApp({\n component_key: \"schedule_viewer\",\n message: \"Agenda Viewer\",\n data: {\n threadId,\n assistantId,\n tasks: scheduledTasks,\n onRefresh: fetchScheduledTasks,\n },\n });\n };\n\n // Get core information to display\n const getCoreInfo = () => {\n if (scheduledTasks.length === 0) {\n return \"No schedules\";\n }\n if (taskCount > 0) {\n return `${taskCount} scheduled`;\n }\n return `${scheduledTasks.length} total`;\n };\n\n const coreInfo = getCoreInfo();\n\n return scheduledTasks.length === 0 ? null : (\n <Tooltip title={tooltipText}>\n {/* <Badge count={taskCount} size=\"small\" color=\"blue\"> */}\n <div\n style={{\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n <Button\n style={{\n fontSize: 12,\n color: taskCount > 0 ? \"#1890ff\" : \"#666\",\n fontWeight: taskCount > 0 ? 500 : 400,\n maxWidth: 200,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n type=\"text\"\n size=\"small\"\n icon={loading ? <Spin size=\"small\" /> : <CalendarOutlined />}\n onClick={handleClick}\n disabled={loading}\n >\n {coreInfo}\n </Button>\n\n </div>\n {/* </Badge> */}\n </Tooltip>\n );\n};\n","import React from \"react\";\nimport { Button, Tooltip } from \"antd\";\nimport { TeamOutlined } from \"@ant-design/icons\";\nimport { useAgentChat } from \"@hooks/useAgentChat\";\nimport { useChatUIContext } from \"./ChatUIContext\";\n\ninterface Teammate {\n name: string;\n role: string;\n description?: string;\n}\n\ninterface TeamData {\n teamId: string;\n teamLeadId: string;\n teammates: Teammate[];\n tasks: Array<{\n id: string;\n title: string;\n description: string;\n status: string;\n }>;\n}\n\nexport const TeamButton: React.FC = () => {\n const { agentState, threadId, assistantId } = useAgentChat();\n const { openSideApp } = useChatUIContext();\n\n const teamData = agentState?.values?.team as TeamData | undefined;\n const teammates = teamData?.teammates || [];\n\n if (!teamData || teammates.length === 0) {\n return null;\n }\n\n const handleClick = () => {\n openSideApp({\n component_key: \"team_workspace\",\n message: \"Teammates\",\n data: {\n teamId: teamData.teamId,\n teammates: teammates.map((t) => ({\n name: t.name,\n role: t.role,\n description: t.description,\n })),\n parent_thread_id: threadId,\n },\n context: {\n thread_id: threadId,\n assistant_id: assistantId,\n },\n });\n };\n\n return (\n <Tooltip title=\"Team Workspace\">\n <Button\n type=\"text\"\n size=\"small\"\n icon={<TeamOutlined />}\n onClick={handleClick}\n style={{\n fontSize: 12,\n color: \"#666\",\n }}\n >\n {teammates.length === 1 ? \"1 member\" : `${teammates.length} members`}\n </Button>\n </Tooltip>\n );\n};\n","import React from \"react\";\nimport { Button, Tooltip } from \"antd\";\nimport { MailOutlined } from \"@ant-design/icons\";\nimport { useAgentChat } from \"@hooks/useAgentChat\";\nimport { useChatUIContext } from \"./ChatUIContext\";\n\ninterface MailboxMessage {\n id: string;\n from: string;\n to: string;\n content: string;\n timestamp: string;\n type: string;\n read: boolean;\n}\n\nexport const MailboxButton: React.FC = () => {\n const { agentState } = useAgentChat();\n const { openSideApp } = useChatUIContext();\n\n const teamMailbox = agentState?.values?.team_mailbox as MailboxMessage[] | undefined;\n const totalCount = teamMailbox?.length ?? 0;\n const hasTeam = !!agentState?.values?.team;\n\n if (!hasTeam) {\n return null;\n }\n\n const handleClick = () => {\n openSideApp({\n component_key: \"mailbox\",\n message: \"Team Mailbox\",\n data: {\n teamMailbox: teamMailbox || [],\n team: agentState?.values?.team,\n },\n });\n };\n\n return (\n <Tooltip title=\"Team Mailbox\">\n <Button\n type=\"text\"\n size=\"small\"\n icon={<MailOutlined />}\n onClick={handleClick}\n style={{\n fontSize: 12,\n color: \"#666\",\n }}\n >\n {totalCount > 0 ? `${totalCount} mails` : \"Mailbox\"}\n </Button>\n </Tooltip>\n );\n};\n","import { ThreadArtifacts } from \"./AgentHeader/ThreadArtifacts\";\nimport { createStyles } from \"antd-style\";\nimport { useLatticeChatShellContext } from \"./LatticeChatShellContext\";\nimport { AgentLoadingSpinner } from \"./AgentHeader/AgentLoadingSpinner\";\nimport { useAgentChat } from \"../../hooks/useAgentChat\";\nimport { ChatViewToggle, type ChatViewMode } from \"./ChatViewToggle\";\n\nexport interface AgentHeaderProps {\n name?: string;\n description?: string;\n avatar?: string;\n variant?: 'full' | 'compact' | 'minimal';\n isThinking?: boolean;\n onNewThread?: () => void;\n onRefresh?: () => void;\n onViewHistory?: () => void;\n showTraceView?: boolean;\n viewMode?: ChatViewMode;\n onViewModeChange?: (mode: ChatViewMode) => void;\n}\n\nconst useAgentHeaderStyles = createStyles(({ token, css }) => {\n return {\n container: css`\n display: flex;\n flex-direction: column;\n padding: 8px 12px;\n border-radius: ${token.borderRadiusLG}px;\n margin: 8px 8px 0 8px;\n background: ${token.colorBgContainer};\n `,\n topRow: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 32px;\n `,\n nameRow: css`\n display: flex;\n align-items: center;\n gap: 8px;\n `,\n name: css`\n font-size: 16px;\n font-weight: 500;\n color: ${token.colorText};\n `,\n bottomRow: css`\n display: flex;\n justify-content: flex-start;\n margin-top: 4px;\n min-height: 24px;\n `,\n };\n});\n\nexport const AgentHeader: React.FC<AgentHeaderProps> = ({\n name,\n description,\n avatar,\n variant = 'full',\n onNewThread,\n onRefresh,\n onViewHistory,\n showTraceView,\n viewMode,\n onViewModeChange,\n}) => {\n const { styles } = useAgentHeaderStyles();\n const { config } = useLatticeChatShellContext();\n const { isLoading } = useAgentChat();\n\n return (\n <div className={styles.container}>\n {/* 上层:Agent 名称/WorkspaceSelector + AgentActions */}\n <div className={styles.topRow}>\n <div className={styles.nameRow}>\n {isLoading && <AgentLoadingSpinner />}\n <div className={styles.name}>\n {name || 'AI Assistant'}\n </div>\n </div>\n {/* <AgentActions\n onNewThread={onNewThread}\n onRefresh={onRefresh}\n onViewHistory={onViewHistory}\n /> */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n {showTraceView && viewMode && onViewModeChange && (\n <ChatViewToggle value={viewMode} onChange={onViewModeChange} />\n )}\n <ThreadArtifacts variant={variant === 'full' ? 'full' : 'compact'} />\n </div>\n </div>\n\n {/* 下层:ThreadArtifacts */}\n {/* {variant !== 'minimal' && (\n <div className={styles.bottomRow}>\n </div>\n )} */}\n </div>\n );\n};\n","import React from 'react';\nimport { createStyles } from 'antd-style';\n\nconst useStyles = createStyles(({ token, css }) => ({\n spinner: css`\n display: inline-block;\n width: 16px;\n height: 16px;\n margin-right: 8px;\n vertical-align: middle;\n color: ${token.colorPrimary};\n \n @keyframes pulse-opacity {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.3; }\n }\n \n @keyframes pulse-opacity-dim {\n 0%, 100% { opacity: 0.6; }\n 50% { opacity: 0.2; }\n }\n `,\n}));\n\nexport const AgentLoadingSpinner: React.FC = () => {\n const { styles } = useStyles();\n \n return (\n <svg \n className={styles.spinner} \n viewBox=\"0 0 15 15\" \n fill=\"currentColor\"\n >\n {/* Row 1 */}\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"0\" y=\"0\" style={{ opacity: 0 }} />\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"4\" y=\"0\" style={{ animation: '1.8s ease-in-out 1.4s infinite normal both running pulse-opacity-dim' }} />\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"8\" y=\"0\" style={{ animation: '2s ease-in-out 0s infinite normal both running pulse-opacity-dim' }} />\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"12\" y=\"0\" style={{ opacity: 0 }} />\n \n {/* Row 2 */}\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"0\" y=\"4\" style={{ animation: '1.6s ease-in-out 0.8s infinite normal both running pulse-opacity-dim' }} />\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"4\" y=\"4\" style={{ animation: '1.5s ease-in-out 0.9s infinite normal both running pulse-opacity' }} />\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"8\" y=\"4\" style={{ animation: '1.1s ease-in-out 0.2s infinite normal both running pulse-opacity' }} />\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"12\" y=\"4\" style={{ animation: '1s ease-in-out 0.9s infinite normal both running pulse-opacity-dim' }} />\n \n {/* Row 3 */}\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"0\" y=\"8\" style={{ animation: '1.9s ease-in-out 0.8s infinite normal both running pulse-opacity-dim' }} />\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"4\" y=\"8\" style={{ animation: '1.1s ease-in-out 0.7s infinite normal both running pulse-opacity' }} />\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"8\" y=\"8\" style={{ animation: '1.6s ease-in-out 1.3s infinite normal both running pulse-opacity' }} />\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"12\" y=\"8\" style={{ animation: '1.3s ease-in-out 1.1s infinite normal both running pulse-opacity-dim' }} />\n \n {/* Row 4 */}\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"0\" y=\"12\" style={{ opacity: 0 }} />\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"4\" y=\"12\" style={{ animation: '1.9s ease-in-out 0.5s infinite normal both running pulse-opacity-dim' }} />\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"8\" y=\"12\" style={{ animation: '1.4s ease-in-out 0.4s infinite normal both running pulse-opacity-dim' }} />\n <rect width=\"3\" height=\"3\" rx=\"1\" x=\"12\" y=\"12\" style={{ opacity: 0 }} />\n </svg>\n );\n};\n","import React from \"react\";\nimport { MessageOutlined, NodeIndexOutlined } from \"@ant-design/icons\";\nimport { SegmentedToggle, type SegmentOption } from \"@components/shared/SegmentedToggle\";\n\nexport type ChatViewMode = \"chat\" | \"graph\";\n\nexport interface ChatViewToggleProps {\n value: ChatViewMode;\n onChange: (mode: ChatViewMode) => void;\n}\n\nconst OPTIONS: SegmentOption<ChatViewMode>[] = [\n { value: \"chat\", icon: <MessageOutlined />, tooltip: \"对话\" },\n { value: \"graph\", icon: <NodeIndexOutlined />, tooltip: \"执行过程\" },\n];\n\nexport const ChatViewToggle: React.FC<ChatViewToggleProps> = ({ value, onChange }) => (\n <SegmentedToggle\n value={value}\n onChange={onChange}\n options={OPTIONS}\n size=\"small\"\n ariaLabel=\"视图切换\"\n />\n);\n","import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { Tooltip, theme } from \"antd\";\n\nexport interface SegmentOption<T extends string = string> {\n value: T;\n icon?: React.ReactNode;\n label?: React.ReactNode;\n tooltip?: string;\n disabled?: boolean;\n}\n\nexport interface SegmentedToggleProps<T extends string = string> {\n value: T;\n onChange: (value: T) => void;\n options: SegmentOption<T>[];\n size?: \"small\" | \"default\";\n block?: boolean;\n ariaLabel?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function SegmentedToggle<T extends string = string>({\n value,\n onChange,\n options,\n size = \"default\",\n block = false,\n ariaLabel,\n className,\n style,\n}: SegmentedToggleProps<T>): React.ReactElement {\n const { token } = theme.useToken();\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const [thumb, setThumb] = useState<{ left: number; width: number }>({ left: 0, width: 0 });\n\n const activeIndex = Math.max(\n 0,\n options.findIndex((option) => option.value === value)\n );\n\n const measure = useCallback(() => {\n const element = itemRefs.current[activeIndex];\n if (element) {\n setThumb({ left: element.offsetLeft, width: element.offsetWidth });\n }\n }, [activeIndex]);\n\n useLayoutEffect(() => {\n measure();\n }, [measure, options.length, size, block]);\n\n useEffect(() => {\n window.addEventListener(\"resize\", measure);\n return () => window.removeEventListener(\"resize\", measure);\n }, [measure]);\n\n const height = size === \"small\" ? 24 : 32;\n const iconPadding = size === \"small\" ? 3 : 5;\n\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel}\n className={className}\n style={{\n position: \"relative\",\n display: block ? \"flex\" : \"inline-flex\",\n width: block ? \"100%\" : undefined,\n alignItems: \"center\",\n padding: 2,\n borderRadius: 9999,\n background: token.colorFillTertiary,\n ...style,\n }}\n >\n <span\n aria-hidden\n style={{\n position: \"absolute\",\n top: 2,\n left: 0,\n height,\n width: thumb.width,\n borderRadius: 9999,\n background: token.colorBgContainer,\n boxShadow: token.boxShadowTertiary,\n transform: `translateX(${thumb.left}px)`,\n transition:\n \"transform 200ms cubic-bezier(0.4, 0, 0.2, 1), width 200ms cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n {options.map((option, index) => {\n const active = option.value === value;\n const accessibleName =\n option.tooltip ?? (typeof option.label === \"string\" ? option.label : undefined);\n const button = (\n <button\n ref={(element) => {\n itemRefs.current[index] = element;\n }}\n type=\"button\"\n disabled={option.disabled}\n aria-label={accessibleName}\n aria-pressed={active}\n onClick={() => {\n if (!active && !option.disabled) {\n onChange(option.value);\n }\n }}\n onMouseDown={(event) => event.preventDefault()}\n style={{\n position: \"relative\",\n zIndex: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n flex: block ? 1 : undefined,\n height,\n padding: option.label\n ? `0 ${size === \"small\" ? 10 : 14}px`\n : `0 ${iconPadding}px`,\n minWidth: height,\n border: \"none\",\n background: \"transparent\",\n borderRadius: 9999,\n cursor: option.disabled ? \"not-allowed\" : \"pointer\",\n color: option.disabled\n ? token.colorTextDisabled\n : active\n ? token.colorPrimary\n : token.colorTextTertiary,\n fontSize: size === \"small\" ? 13 : 14,\n opacity: option.disabled ? 0.6 : 1,\n transition: \"color 200ms ease\",\n }}\n >\n {option.icon}\n {option.label && <span>{option.label}</span>}\n </button>\n );\n return option.tooltip ? (\n <Tooltip key={option.value} title={option.tooltip}>\n {button}\n </Tooltip>\n ) : (\n <React.Fragment key={option.value}>{button}</React.Fragment>\n );\n })}\n </div>\n );\n}\n","import React, { useCallback, useContext } from \"react\";\nimport { Tooltip, Button, Dropdown, Badge } from \"antd\";\nimport { HistoryOutlined, PlusOutlined, UnorderedListOutlined } from \"@ant-design/icons\";\nimport type { MenuProps } from \"antd\";\nimport {\n useConversationContext,\n ConversationContext,\n} from \"./ConversationContext\";\nimport {\n useLatticeChatShellContext,\n LatticeChatShellContext,\n} from \"./LatticeChatShellContext\";\n\n/**\n * Button to create a new thread\n */\nexport const CreateThreadButton: React.FC = () => {\n const { createThread, assistantId, isLoading } = useConversationContext();\n const { config } = useLatticeChatShellContext();\n\n // Only show if thread creation is enabled\n if (!config.enableThreadCreation) {\n return null;\n }\n\n // Don't show if no assistant is selected\n if (!assistantId) {\n return null;\n }\n\n const handleCreateThread = useCallback(async () => {\n try {\n await createThread();\n } catch (error) {\n console.error(\"Failed to create thread:\", error);\n }\n }, [createThread]);\n\n return (\n <Tooltip title=\"Create New Conversation\">\n <Button\n type=\"text\"\n icon={<PlusOutlined />}\n onClick={handleCreateThread}\n disabled={isLoading}\n loading={isLoading}\n />\n </Tooltip>\n );\n};\n\n/**\n * Button to view thread list\n */\nexport const ThreadListButton: React.FC = () => {\n const {\n threads,\n selectThread,\n listThreads,\n isLoading,\n assistantId,\n } = useConversationContext();\n const { config } = useLatticeChatShellContext();\n\n // Only show if thread list is enabled\n if (!config.enableThreadList) {\n return null;\n }\n\n // Don't show if no assistant is selected\n if (!assistantId) {\n return null;\n }\n\n const handleRefresh = useCallback(async () => {\n try {\n await listThreads();\n } catch (error) {\n console.error(\"Failed to refresh threads:\", error);\n }\n }, [listThreads]);\n\n const menuItems: MenuProps[\"items\"] = threads.map((t) => ({\n key: t.id,\n label: t.label,\n onClick: () => selectThread(t.id),\n }));\n\n // Add refresh action at the top\n const items: MenuProps[\"items\"] = [\n {\n key: \"refresh\",\n label: \"Refresh Conversation History\",\n onClick: handleRefresh,\n disabled: isLoading,\n },\n ...(threads.length > 0\n ? [\n {\n type: \"divider\" as const,\n },\n ...menuItems,\n ]\n : []),\n ];\n\n return (\n <Tooltip title=\"Conversation History\">\n <Dropdown\n menu={{ items }}\n trigger={[\"click\"]}\n placement=\"bottomRight\"\n >\n {/* <Badge count={threads.length} size=\"small\" color=\"blue\"> */}\n <Button\n type=\"text\"\n icon={<HistoryOutlined />}\n disabled={isLoading}\n />\n {/* </Badge> */}\n </Dropdown>\n </Tooltip>\n );\n};\n\n/**\n * Container component that conditionally renders thread management buttons\n * This component safely handles cases where ConversationContext or LatticeChatShellContext may not be available\n */\nexport const ThreadManagementButtons: React.FC = () => {\n // Check if LatticeChatShellContext is available\n const shellContext = useContext(LatticeChatShellContext);\n\n // Check if ConversationContext is available\n const conversationContext = useContext(ConversationContext);\n\n // If either context is not available, return null\n if (!shellContext || !conversationContext) {\n return null;\n }\n\n const config = shellContext.config;\n const showCreateButton = config.enableThreadCreation ?? true;\n const showListButton = config.enableThreadList ?? true;\n\n if (!showCreateButton && !showListButton) {\n return null;\n }\n\n // Don't render if no assistant is selected\n if (!conversationContext.assistantId) {\n return null;\n }\n\n return (\n <>\n {showCreateButton && <CreateThreadButton />}\n {showListButton && <ThreadListButton />}\n </>\n );\n};\n","import React, { useRef, useState } from \"react\";\nimport { Modal, List, Checkbox, Spin, Empty, Typography, Button, Space, Tooltip } from \"antd\";\nimport { Database } from \"lucide-react\";\nimport { useApi } from \"../../hooks/useApi\";\n\n\nexport interface DatabasePickerProps {\n senderRef: React.RefObject<any>;\n iconOnly?: boolean;\n}\n\nexport const DatabasePicker: React.FC<DatabasePickerProps> = ({ senderRef, iconOnly }) => {\n const [modalOpen, setModalOpen] = useState(false);\n const [databases, setDatabases] = useState<\n Array<{ key: string; name?: string; description?: string }>\n >([]);\n const [loading, setLoading] = useState(false);\n const [selectedDatabases, setSelectedDatabases] = useState<string[]>([]);\n const { get } = useApi();\n const fetchedRef = useRef(false);\n\n const loadDatabases = async () => {\n setLoading(true);\n try {\n const data = await get<{ success: boolean; data: { records: Array<{ key: string; name?: string; description?: string }> } }>(\"/api/database-configs\");\n if (data.success && data.data && Array.isArray(data.data.records)) {\n setDatabases(data.data.records);\n }\n } catch (error) {\n console.error(\"Failed to fetch databases:\", error);\n } finally {\n setLoading(false);\n }\n };\n\n const handleOpenModal = () => {\n setSelectedDatabases([]);\n if (!fetchedRef.current) {\n loadDatabases();\n fetchedRef.current = true;\n }\n setModalOpen(true);\n };\n\n const handleModalOk = () => {\n selectedDatabases.forEach((dbKey) => {\n const db = databases.find((d) => d.key === dbKey);\n if (db && senderRef.current) {\n senderRef.current.insert?.(\n [\n {\n type: \"tag\",\n key: `db_${dbKey}_${Date.now()}`,\n props: {\n label: <Space size={1}><Database size={10} /> <Typography.Text>{db.name || dbKey}</Typography.Text></Space>,\n value: `[Database Scope:${db.name || dbKey}]`,\n },\n },\n ],\n \"cursor\"\n );\n }\n });\n setModalOpen(false);\n setSelectedDatabases([]);\n };\n\n return (\n <>\n <Tooltip title={iconOnly ? \"Database\" : undefined}>\n <Button\n icon={<Database size={iconOnly ? 20 : 22} />}\n onClick={handleOpenModal}\n type=\"text\"\n style={{\n height: 32,\n width: iconOnly ? 32 : undefined,\n borderRadius: 8,\n padding: iconOnly ? 0 : undefined,\n paddingLeft: iconOnly ? 0 : 16,\n paddingRight: iconOnly ? 0 : 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n }}\n >\n {!iconOnly && \"Database\"}\n </Button>\n </Tooltip>\n\n <Modal\n title=\"Select Database\"\n open={modalOpen}\n onOk={handleModalOk}\n onCancel={() => setModalOpen(false)}\n width={600}\n okText=\"Confirm\"\n cancelText=\"Cancel\"\n >\n {loading ? (\n <div style={{ textAlign: \"center\", padding: 40 }}>\n <Spin size=\"large\" />\n </div>\n ) : databases.length === 0 ? (\n <Empty\n description=\"No databases available\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ) : (\n <List\n dataSource={databases}\n renderItem={(db) => {\n const isSelected = selectedDatabases.includes(db.key);\n return (\n <List.Item\n key={db.key}\n style={{\n padding: \"12px 16px\",\n cursor: \"pointer\",\n borderRadius: 8,\n backgroundColor: isSelected ? \"#f6ffed\" : \"transparent\",\n border: `1px solid ${isSelected ? \"#52c41a\" : \"transparent\"}`,\n marginBottom: 8,\n transition: \"all 0.2s ease\",\n }}\n onClick={() => {\n const newValue = isSelected\n ? selectedDatabases.filter((id) => id !== db.key)\n : [...selectedDatabases, db.key];\n setSelectedDatabases(newValue);\n }}\n >\n <List.Item.Meta\n avatar={\n <Checkbox\n checked={isSelected}\n onChange={() => {\n const newValue = isSelected\n ? selectedDatabases.filter((id) => id !== db.key)\n : [...selectedDatabases, db.key];\n setSelectedDatabases(newValue);\n }}\n onClick={(e) => e.stopPropagation()}\n />\n }\n title={\n <Typography.Text strong={isSelected}>\n {db.name || db.key}\n </Typography.Text>\n }\n description={\n db.description && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n {db.description}\n </Typography.Text>\n )\n }\n />\n </List.Item>\n );\n }}\n style={{ maxHeight: \"50vh\", overflowY: \"auto\" }}\n split={false}\n />\n )}\n </Modal>\n </>\n );\n};\n","import React, { useRef, useState } from \"react\";\nimport { Modal, List, Checkbox, Spin, Empty, Typography, Button, Space, Tooltip } from \"antd\";\nimport { BrainCircuit } from \"lucide-react\";\nimport { useApi } from \"../../hooks/useApi\";\n\n\nexport interface SkillPickerProps {\n senderRef: React.RefObject<any>;\n iconOnly?: boolean;\n}\n\nexport const SkillPicker: React.FC<SkillPickerProps> = ({ senderRef, iconOnly }) => {\n const [modalOpen, setModalOpen] = useState(false);\n const [skills, setSkills] = useState<\n Array<{ id: string; name: string; description: string }>\n >([]);\n const [loading, setLoading] = useState(false);\n const [selectedSkills, setSelectedSkills] = useState<string[]>([]);\n const { get } = useApi();\n const fetchedRef = useRef(false);\n\n const loadSkills = async () => {\n setLoading(true);\n try {\n const data = await get<{ success: boolean; data: { records: Array<{ id: string; name: string; description: string }> } }>(\"/api/skills\");\n if (data.success && data.data && Array.isArray(data.data.records)) {\n setSkills(data.data.records);\n }\n } catch (error) {\n console.error(\"Failed to fetch skills:\", error);\n } finally {\n setLoading(false);\n }\n };\n\n const handleOpenModal = () => {\n setSelectedSkills([]);\n if (!fetchedRef.current) {\n loadSkills();\n fetchedRef.current = true;\n }\n setModalOpen(true);\n };\n\n const handleModalOk = () => {\n selectedSkills.forEach((skillId) => {\n const skill = skills.find((s) => s.id === skillId);\n if (skill && senderRef.current) {\n senderRef.current.insert?.(\n [\n {\n type: \"tag\",\n key: `skill_${skillId}_${Date.now()}`,\n props: {\n label: <Space size={1}><BrainCircuit size={12} /> <Typography.Text>{skill.name}</Typography.Text></Space>,\n value: `[Use Skill:${skill.name}]`,\n },\n },\n ],\n \"cursor\"\n );\n }\n });\n setModalOpen(false);\n setSelectedSkills([]);\n };\n\n return (\n <>\n <Tooltip title={iconOnly ? \"Skills\" : undefined}>\n <Button\n icon={<BrainCircuit size={iconOnly ? 20 : 22} />}\n onClick={handleOpenModal}\n type=\"text\"\n style={{\n height: 32,\n width: iconOnly ? 32 : undefined,\n borderRadius: 8,\n padding: iconOnly ? 0 : undefined,\n paddingLeft: iconOnly ? 0 : 16,\n paddingRight: iconOnly ? 0 : 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n }}\n >\n {!iconOnly && \"Skills\"}\n </Button>\n </Tooltip>\n\n <Modal\n title=\"Select Skills\"\n open={modalOpen}\n onOk={handleModalOk}\n onCancel={() => setModalOpen(false)}\n width={600}\n okText=\"Confirm\"\n cancelText=\"Cancel\"\n >\n {loading ? (\n <div style={{ textAlign: \"center\", padding: 40 }}>\n <Spin size=\"large\" />\n </div>\n ) : skills.length === 0 ? (\n <Empty\n description=\"No skills available\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ) : (\n <List\n dataSource={skills}\n renderItem={(skill) => {\n const isSelected = selectedSkills.includes(skill.id);\n return (\n <List.Item\n key={skill.id}\n style={{\n padding: \"12px 16px\",\n cursor: \"pointer\",\n borderRadius: 8,\n backgroundColor: isSelected ? \"#f6ffed\" : \"transparent\",\n border: `1px solid ${isSelected ? \"#52c41a\" : \"transparent\"}`,\n marginBottom: 8,\n transition: \"all 0.2s ease\",\n }}\n onClick={() => {\n const newValue = isSelected\n ? selectedSkills.filter((id) => id !== skill.id)\n : [...selectedSkills, skill.id];\n setSelectedSkills(newValue);\n }}\n >\n <List.Item.Meta\n avatar={\n <Checkbox\n checked={isSelected}\n onChange={() => {\n const newValue = isSelected\n ? selectedSkills.filter((id) => id !== skill.id)\n : [...selectedSkills, skill.id];\n setSelectedSkills(newValue);\n }}\n onClick={(e) => e.stopPropagation()}\n />\n }\n title={\n <Typography.Text strong={isSelected}>\n {skill.name}\n </Typography.Text>\n }\n description={\n skill.description && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n {skill.description}\n </Typography.Text>\n )\n }\n />\n </List.Item>\n );\n }}\n style={{ maxHeight: \"50vh\", overflowY: \"auto\" }}\n split={false}\n />\n )}\n </Modal>\n </>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport { Modal, List, Spin, Empty, Typography, Button, Tooltip } from \"antd\";\nimport { Bot } from \"lucide-react\";\nimport { useAssistantContext } from \"./AssistantContext\";\n\nexport interface AgentPickerProps {\n senderRef: React.RefObject<any>;\n iconOnly?: boolean;\n}\n\nexport const AgentPicker: React.FC<AgentPickerProps> = ({ senderRef, iconOnly }) => {\n const [modalOpen, setModalOpen] = useState(false);\n const [loading, setLoading] = useState(false);\n const [selectedAgent, setSelectedAgent] = useState<string | null>(null);\n const { assistants, currentAssistant, selectAssistant, refresh, isLoading } = useAssistantContext();\n\n useEffect(() => {\n if (!modalOpen) {\n return;\n }\n let cancelled = false;\n setLoading(true);\n void refresh().finally(() => {\n if (!cancelled) {\n setLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [modalOpen, refresh]);\n\n const handleOpenModal = () => {\n setSelectedAgent(currentAssistant?.id || null);\n setModalOpen(true);\n };\n\n const handleModalOk = async () => {\n if (selectedAgent && selectedAgent !== currentAssistant?.id) {\n await selectAssistant(selectedAgent);\n }\n setModalOpen(false);\n };\n\n const handleAgentClick = (agentId: string) => {\n setSelectedAgent(agentId);\n };\n\n return (\n <>\n <Tooltip title={iconOnly ? (currentAssistant?.name || \"Agent\") : undefined}>\n <Button\n icon={<Bot size={iconOnly ? 20 : 22} />}\n onClick={handleOpenModal}\n type=\"text\"\n style={{\n height: 32,\n width: iconOnly ? 32 : undefined,\n borderRadius: 8,\n padding: iconOnly ? 0 : undefined,\n paddingLeft: iconOnly ? 0 : 16,\n paddingRight: iconOnly ? 0 : 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n }}\n >\n {!iconOnly && (currentAssistant?.name || \"Agent\")}\n </Button>\n </Tooltip>\n\n <Modal\n title=\"Select Agent\"\n open={modalOpen}\n onOk={handleModalOk}\n onCancel={() => setModalOpen(false)}\n width={600}\n okText=\"Confirm\"\n cancelText=\"Cancel\"\n >\n {loading || isLoading ? (\n <div style={{ textAlign: \"center\", padding: 40 }}><Spin /></div>\n ) : assistants.length === 0 ? (\n <Empty\n description=\"No agents available\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ) : (\n <List\n dataSource={assistants}\n renderItem={(agent) => {\n const isSelected = selectedAgent === agent.id;\n return (\n <List.Item\n key={agent.id}\n style={{\n padding: \"12px 16px\",\n cursor: \"pointer\",\n borderRadius: 8,\n backgroundColor: isSelected ? \"#f6ffed\" : \"transparent\",\n border: `1px solid ${isSelected ? \"#52c41a\" : \"transparent\"}`,\n marginBottom: 8,\n transition: \"all 0.2s ease\",\n }}\n onClick={() => handleAgentClick(agent.id)}\n >\n <List.Item.Meta\n avatar={\n <div\n style={{\n width: 40,\n height: 40,\n borderRadius: 10,\n background: isSelected ? \"#52c41a\" : \"#f0f0f0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Bot size={20} color={isSelected ? \"white\" : \"#666\"} />\n </div>\n }\n title={\n <Typography.Text strong={isSelected}>\n {agent.name}\n </Typography.Text>\n }\n description={\n agent.description && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n {agent.description}\n </Typography.Text>\n )\n }\n />\n </List.Item>\n );\n }}\n style={{ maxHeight: \"50vh\", overflowY: \"auto\" }}\n split={false}\n />\n )}\n </Modal>\n </>\n );\n};\n\nexport default AgentPicker;\n","import React, { useEffect, useState, useRef } from \"react\";\nimport { Modal, List, Spin, Empty, Typography, Button, Tag, Tooltip } from \"antd\";\nimport { Database, Check, Server } from \"lucide-react\";\nimport { useLatticeChatShellContext } from \"./LatticeChatShellContext\";\nimport { useConversationContext } from \"./ConversationContext\";\nimport { useApi } from \"../../hooks/useApi\";\n\nexport interface MetricsDataSourceItem {\n id: string | number;\n name: string;\n serverKey: string;\n serverName: string;\n connected: boolean;\n description?: string;\n schemaName?: string;\n}\n\nexport interface MetricsDataSourcePickerProps {\n senderRef: React.RefObject<any>;\n iconOnly?: boolean;\n}\n\nconst SESSION_STORAGE_KEY = \"metrics_datasource_selection\";\n\nexport const MetricsDataSourcePicker: React.FC<MetricsDataSourcePickerProps> = ({\n senderRef,\n iconOnly,\n}) => {\n const [modalOpen, setModalOpen] = useState(false);\n const [loading, setLoading] = useState(false);\n const [dataSources, setDataSources] = useState<MetricsDataSourceItem[]>([]);\n const { config } = useLatticeChatShellContext();\n const { customRunConfig, updateCustomRunConfig } = useConversationContext();\n const { get } = useApi();\n const hasInitializedRef = useRef(false);\n\n const loadDataSources = async () => {\n setLoading(true);\n try {\n // 1. 获取所有 metrics 服务器配置\n const configsData = await get<{\n success: boolean;\n data?: { records: any[] };\n }>(\"/api/metrics-configs\");\n\n if (!configsData.success || !configsData.data?.records) {\n setDataSources([]);\n return;\n }\n\n // 2. 过滤出 semantic 类型的服务器\n const semanticConfigs = configsData.data.records.filter(\n (config: any) => config.config?.type === \"semantic\"\n );\n\n // 3. 获取每个服务器的数据源\n const allDataSources: MetricsDataSourceItem[] = [];\n\n for (const serverConfig of semanticConfigs) {\n try {\n const dsData = await get<{\n success: boolean;\n data?: { datasources: any[] };\n }>(`/api/metrics-configs/${serverConfig.key}/datasources`);\n\n if (dsData.success && dsData.data?.datasources) {\n const serverDataSources = dsData.data.datasources.map((ds: any) => ({\n id: ds.id,\n name: ds.name,\n serverKey: serverConfig.key,\n serverName: serverConfig.name || serverConfig.key,\n connected: ds.connected,\n description: ds.description,\n schemaName: ds.schemaName,\n }));\n allDataSources.push(...serverDataSources);\n }\n } catch (error) {\n console.error(`Failed to fetch datasources for ${serverConfig.key}:`, error);\n }\n }\n\n setDataSources(allDataSources);\n } catch (error) {\n console.error(\"Failed to load metrics datasources:\", error);\n setDataSources([]);\n } finally {\n setLoading(false);\n }\n };\n\n // 当 modal 打开时加载数据源列表\n const handleOpenModal = () => {\n loadDataSources();\n setModalOpen(true);\n };\n\n // 从 sessionStorage 恢复数据源选择\n const restoreFromSessionStorage = () => {\n try {\n const saved = sessionStorage.getItem(SESSION_STORAGE_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n if (parsed.serverKey && parsed.datasourceId) {\n updateCustomRunConfig({\n metricsDataSource: {\n serverKey: parsed.serverKey,\n datasourceId: parsed.datasourceId,\n },\n });\n return true;\n }\n }\n } catch (error) {\n console.error(\"Failed to restore datasource from sessionStorage:\", error);\n }\n return false;\n };\n\n // 保存数据源选择到 sessionStorage\n const saveToSessionStorage = (serverKey: string, datasourceId: string | number) => {\n try {\n sessionStorage.setItem(\n SESSION_STORAGE_KEY,\n JSON.stringify({ serverKey, datasourceId })\n );\n } catch (error) {\n console.error(\"Failed to save datasource to sessionStorage:\", error);\n }\n };\n\n // 首次加载时:加载数据源列表,尝试从 sessionStorage 恢复,如果有数据源但未选择则弹出选择列表\n useEffect(() => {\n if (hasInitializedRef.current) return;\n hasInitializedRef.current = true;\n\n // 先加载数据源列表(后台加载,不显示 loading)\n loadDataSources().then(() => {\n const hasExistingSelection = customRunConfig?.metricsDataSource;\n if (hasExistingSelection) {\n // 已经有选择了,保存到 sessionStorage\n saveToSessionStorage(\n hasExistingSelection.serverKey,\n hasExistingSelection.datasourceId\n );\n return;\n }\n\n // 尝试从 sessionStorage 恢复\n const restored = restoreFromSessionStorage();\n if (!restored) {\n // 没有缓存,检查是否有可用数据源,有才弹出选择列表\n // dataSources 会在 loadDataSources 完成后更新,但这里需要读取最新的值\n // 所以在 then 回调中再次获取数据源列表来判断\n setDataSources((currentDataSources) => {\n if (currentDataSources.length > 0) {\n setModalOpen(true);\n }\n return currentDataSources;\n });\n }\n });\n }, []);\n\n // 获取当前选中的数据源信息\n const getSelectedDataSource = () => {\n const metricsDataSource = customRunConfig?.metricsDataSource;\n if (!metricsDataSource) return null;\n \n const { serverKey, datasourceId } = metricsDataSource;\n return dataSources.find(\n (d) => d.serverKey === serverKey && String(d.id) === String(datasourceId)\n );\n };\n\n // 检查是否已选中某个数据源\n const isSelected = (dataSource: MetricsDataSourceItem) => {\n const metricsDataSource = customRunConfig?.metricsDataSource;\n if (!metricsDataSource) return false;\n \n return (\n dataSource.serverKey === metricsDataSource.serverKey &&\n String(dataSource.id) === String(metricsDataSource.datasourceId)\n );\n };\n\n const handleSelect = (dataSource: MetricsDataSourceItem) => {\n if (!dataSource.connected) return;\n\n // 更新 customRunConfig,设置 metricsDataSource\n updateCustomRunConfig({\n metricsDataSource: {\n serverKey: dataSource.serverKey,\n datasourceId: dataSource.id,\n },\n });\n\n // 保存到 sessionStorage\n saveToSessionStorage(dataSource.serverKey, dataSource.id);\n\n setModalOpen(false);\n };\n\n const getSelectedName = () => {\n const ds = getSelectedDataSource();\n return ds?.name || null;\n };\n\n // 按服务器分组\n const groupedDataSources = dataSources.reduce((acc, ds) => {\n if (!acc[ds.serverName]) {\n acc[ds.serverName] = [];\n }\n acc[ds.serverName].push(ds);\n return acc;\n }, {} as Record<string, MetricsDataSourceItem[]>);\n\n return (\n <>\n <Tooltip title={iconOnly ? (getSelectedName() || \"Select Data Source\") : (dataSources.length === 0 ? \"No data sources available\" : undefined)}>\n <Button\n icon={<Database size={iconOnly ? 18 : 18} />}\n onClick={handleOpenModal}\n type=\"text\"\n disabled={dataSources.length === 0}\n style={{\n height: 32,\n width: iconOnly ? 32 : undefined,\n borderRadius: 8,\n padding: iconOnly ? 0 : undefined,\n paddingLeft: iconOnly ? 0 : 12,\n paddingRight: iconOnly ? 0 : 12,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n border: \"none\",\n fontSize: 14,\n }}\n >\n {!iconOnly && (getSelectedName() || \"Select Data Source\")}\n </Button>\n </Tooltip>\n\n <Modal\n title={\n <div style={{ fontSize: 16, fontWeight: 600 }}>\n Select Metrics Data Source\n </div>\n }\n open={modalOpen}\n onCancel={() => setModalOpen(false)}\n width={560}\n footer={null}\n styles={{\n body: {\n padding: \"16px 20px\",\n maxHeight: \"60vh\",\n overflowY: \"auto\",\n },\n }}\n >\n {loading ? (\n <div style={{ textAlign: \"center\", padding: 40 }}>\n <Spin size=\"large\" />\n </div>\n ) : dataSources.length === 0 ? (\n <Empty\n description=\"No Metrics Data Sources Available\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 24 }}>\n {Object.entries(groupedDataSources).map(([serverName, sources]) => (\n <div key={serverName}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 12,\n paddingBottom: 8,\n borderBottom: \"1px solid #f0f0f0\",\n }}\n >\n <Server size={14} color=\"#8c8c8c\" />\n <Typography.Text\n style={{\n fontSize: 13,\n fontWeight: 500,\n color: \"#595959\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.5px\",\n }}\n >\n {serverName}\n </Typography.Text>\n <Tag style={{ fontSize: 11, padding: \"0 6px\", lineHeight: \"18px\" }}>\n {sources.length}\n </Tag>\n </div>\n <List\n dataSource={sources}\n renderItem={(dataSource) => {\n const isConnected = dataSource.connected;\n const selected = isSelected(dataSource);\n return (\n <List.Item\n key={`${dataSource.serverKey}-${dataSource.id}`}\n style={{\n padding: \"10px 12px\",\n cursor: isConnected ? \"pointer\" : \"not-allowed\",\n borderRadius: 6,\n backgroundColor: selected ? \"#f0f5ff\" : \"transparent\",\n border: selected ? \"1px solid #2f54eb\" : \"1px solid transparent\",\n opacity: isConnected ? 1 : 0.5,\n marginBottom: 6,\n transition: \"all 0.15s ease\",\n }}\n onClick={() => handleSelect(dataSource)}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n width: \"100%\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n }}\n >\n <div\n style={{\n width: 32,\n height: 32,\n borderRadius: 6,\n background: selected\n ? \"#2f54eb\"\n : isConnected\n ? \"#f5f5f5\"\n : \"#f0f0f0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n {selected ? (\n <Check size={16} color=\"#fff\" />\n ) : (\n <Database\n size={16}\n color={isConnected ? \"#595959\" : \"#8c8c8c\"}\n />\n )}\n </div>\n <div>\n <Typography.Text\n style={{\n fontSize: 14,\n fontWeight: selected ? 500 : 400,\n color: selected ? \"#2f54eb\" : \"#262626\",\n }}\n >\n {dataSource.name}\n </Typography.Text>\n {!isConnected && (\n <div>\n <Typography.Text\n style={{\n fontSize: 12,\n color: \"#8c8c8c\",\n }}\n >\n Disconnected\n </Typography.Text>\n </div>\n )}\n </div>\n </div>\n {selected && (\n <Tag\n color=\"blue\"\n style={{\n fontSize: 11,\n padding: \"0 8px\",\n margin: 0,\n }}\n >\n Selected\n </Tag>\n )}\n </div>\n </List.Item>\n );\n }}\n split={false}\n />\n </div>\n ))}\n </div>\n )}\n </Modal>\n </>\n );\n};\n\nexport default MetricsDataSourcePicker;\n","import React, { useState, useEffect, useCallback, useRef } from \"react\";\nimport { Select } from \"antd\";\nimport { useApi } from \"../../hooks/useApi\";\n\nconst STORAGE_KEY = 'axiom-lattice:selected-model';\n\nconst getStoredModelKey = (): string | null => {\n try {\n return sessionStorage.getItem(STORAGE_KEY);\n } catch {\n return null;\n }\n};\n\nconst setStoredModelKey = (key: string): void => {\n try {\n sessionStorage.setItem(STORAGE_KEY, key);\n } catch {\n // silently ignore if sessionStorage is unavailable\n }\n};\n\n/**\n * Model runtime configuration passed to the agent when a model is selected.\n */\nexport interface ModelConfig {\n /** The model key as registered on the server (e.g., \"gpt-4o\"). */\n modelKey: string;\n /** Sampling temperature (0-2). Higher values produce more random output. */\n temperature?: number;\n /** Maximum tokens in the generated response. */\n maxTokens?: number;\n /** Nucleus sampling parameter (0-1). */\n topP?: number;\n /** Penalty for repeating tokens (-2 to 2). */\n frequencyPenalty?: number;\n /** Penalty for introducing new topics (-2 to 2). */\n presencePenalty?: number;\n}\n\n/**\n * Model metadata returned by the `/api/models` endpoint.\n */\nexport interface ModelInfo {\n /** Unique model key (used as the selection value). */\n key: string;\n /** Provider identifier (e.g., \"openai\", \"azure\"). */\n provider: string;\n /** Model name as known by the provider (e.g., \"gpt-4o\"). */\n model: string;\n /** Human-readable display name for the dropdown. */\n displayName?: string;\n}\n\n/**\n * Props for the {@link ModelSelector} component.\n */\nexport interface ModelSelectorProps {\n /** Currently selected model configuration (controlled). */\n value?: ModelConfig | null;\n /** Called when the user selects a model. */\n onChange?: (config: ModelConfig | null) => void;\n /** Default model key used when the fetch response includes a matching model. */\n defaultModelKey?: string;\n /** Inline styles applied to the Select element. */\n style?: React.CSSProperties;\n}\n\n/**\n * A borderless Ant Design `Select` dropdown for choosing the LLM model.\n *\n * Fetches available models from `/api/models` on first render and caches the result.\n * When a default model key matches a model in the list, it is auto-selected.\n * The selection is reported via the {@link ModelSelectorProps.onChange} callback,\n * which typically feeds into `updateCustomRunConfig` in the {@link Chating} component.\n *\n * @param value - Currently selected model config (controlled).\n * @param onChange - Callback when the selection changes.\n * @param defaultModelKey - Model key to auto-select if found in the model list.\n * @param style - Inline styles for the Select wrapper.\n * @returns A compact model selector with hover-highlight background.\n *\n * @example\n * ```tsx\n * import { ModelSelector } from \"@axiom-lattice/react-sdk\";\n *\n * <ModelSelector\n * value={modelConfig}\n * onChange={(config) => updateCustomRunConfig({ modelConfig: config })}\n * defaultModelKey=\"gpt-4o\"\n * />\n * ```\n *\n * @remarks\n * - Supports both controlled (`value` prop) and uncontrolled (internal state) usage.\n * - Fetch is performed only once per component mount via a ref guard.\n * - The dropdown is intentionally borderless to blend into the sender footer.\n */\nexport const ModelSelector: React.FC<ModelSelectorProps> = ({ \n value,\n onChange,\n defaultModelKey = 'default',\n style\n}) => {\n const [models, setModels] = useState<ModelInfo[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [internalValue, setInternalValue] = useState<ModelConfig | null>(null);\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const hasFetchedRef = useRef(false);\n const hasSetDefaultRef = useRef(false);\n \n const { get } = useApi();\n\n const selectedModelConfig = value !== undefined ? value : internalValue;\n const setSelectedModelConfig = useCallback((config: ModelConfig | null) => {\n if (value === undefined) {\n setInternalValue(config);\n }\n onChange?.(config);\n }, [value, onChange]);\n\n const fetchModels = useCallback(async () => {\n if (hasFetchedRef.current) return;\n hasFetchedRef.current = true;\n \n setIsLoading(true);\n try {\n const response = await get<{ success: boolean; data: ModelInfo[] }>('/api/models');\n const modelList = response.data || [];\n setModels(modelList);\n \n if (!hasSetDefaultRef.current && !selectedModelConfig && modelList.length > 0) {\n hasSetDefaultRef.current = true;\n\n const storedKey = getStoredModelKey();\n if (storedKey) {\n const storedModel = modelList.find(m => m.key === storedKey);\n if (storedModel) {\n setSelectedModelConfig({ modelKey: storedModel.key });\n return;\n }\n }\n\n const defaultModel = modelList.find(m => m.key === defaultModelKey);\n if (defaultModel) {\n setSelectedModelConfig({ modelKey: defaultModel.key });\n }\n }\n } catch (err) {\n console.error('Failed to fetch models:', err);\n } finally {\n setIsLoading(false);\n }\n }, [get, defaultModelKey]);\n\n useEffect(() => {\n fetchModels();\n }, [fetchModels]);\n\n const handleChange = (modelKey: string) => {\n setSelectedModelConfig({ modelKey });\n setStoredModelKey(modelKey);\n setDropdownOpen(false);\n };\n\n const currentModel = models.find(m => m.key === selectedModelConfig?.modelKey);\n const displayText = currentModel?.displayName || currentModel?.model || \"Model\";\n\n return (\n <div\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={{\n display: 'inline-block',\n borderRadius: 8,\n backgroundColor: isHovered ? 'rgba(0, 0, 0, 0.06)' : 'transparent',\n transition: 'background-color 0.2s ease',\n }}\n >\n <Select\n variant=\"borderless\"\n value={selectedModelConfig?.modelKey}\n onChange={handleChange}\n loading={isLoading}\n open={dropdownOpen}\n onDropdownVisibleChange={setDropdownOpen}\n style={{ minWidth: 80, ...style }}\n placeholder=\"Model\"\n suffixIcon={null}\n options={models.map(model => ({\n value: model.key,\n label: model.displayName || model.model,\n }))}\n dropdownMatchSelectWidth={false}\n />\n </div>\n );\n};\n","import {\n BulbOutlined,\n GlobalOutlined,\n BarChartOutlined,\n CodeOutlined,\n FileTextOutlined,\n DatabaseOutlined,\n ToolOutlined,\n TagsOutlined,\n MoreOutlined,\n CheckCircleOutlined,\n CoffeeOutlined,\n FireOutlined,\n RocketOutlined,\n SmileOutlined,\n WarningOutlined,\n} from \"@ant-design/icons\";\nimport type { PromptsProps } from \"@ant-design/x\";\nimport { Prompts } from \"@ant-design/x\";\nimport { Space, Typography, Spin, Empty } from \"antd\";\nimport React, { useEffect, useState, useMemo } from \"react\";\nimport { BrainCircuit } from \"lucide-react\";\nimport { useApi } from \"../../hooks/useApi\";\n\nexport interface SkillCategoryPromptsProps {\n senderRef: React.RefObject<any>;\n visible?: boolean;\n}\n\ninterface Skill {\n id: string;\n name: string;\n description: string;\n metadata?: {\n category?: string;\n [key: string]: any;\n };\n}\n\ninterface CategoryConfig {\n icon: React.ReactNode;\n color: string;\n label: string;\n}\n\n// Category configuration mapping\nconst categoryConfig: Record<string, CategoryConfig> = {\n business_analysis: {\n icon: <BarChartOutlined />,\n color: \"#1890FF\",\n label: \"Business Analysis\",\n },\n code_generation: {\n icon: <CodeOutlined />,\n color: \"#722ED1\",\n label: \"Code Generation\",\n },\n document_processing: {\n icon: <FileTextOutlined />,\n color: \"#52C41A\",\n label: \"Document Processing\",\n },\n data_analysis: {\n icon: <DatabaseOutlined />,\n color: \"#13C2C2\",\n label: \"Data Analysis\",\n },\n tool_operation: {\n icon: <ToolOutlined />,\n color: \"#FAAD14\",\n label: \"Tool Operations\",\n },\n general: {\n icon: <BulbOutlined />,\n color: \"#FFD700\",\n label: \"General Skills\",\n },\n global: {\n icon: <GlobalOutlined />,\n color: \"#EB2F96\",\n label: \"Global Skills\",\n },\n};\n\n// Get category config with fallback\nconst getCategoryConfig = (category: string): CategoryConfig => {\n return (\n categoryConfig[category] || {\n icon: <TagsOutlined />,\n color: \"#8C8C8C\",\n label: category,\n }\n );\n};\n\n// Color palette for simple mode icons\nconst iconColors = [\n \"#FFD700\", // Bulb - yellow\n \"#1890FF\", // Info - blue\n \"#FF4D4F\", // Warning - red\n \"#722ED1\", // Rocket - purple\n \"#52C41A\", // CheckCircle - green\n \"#964B00\", // Coffee - brown\n \"#FAAD14\", // Smile - orange\n \"#FF4D4F\", // Fire - red\n \"#13C2C2\", // Cyan\n \"#EB2F96\", // Magenta\n];\n\n// Icon components for simple mode\nconst simpleIcons = [\n <BulbOutlined />,\n <RocketOutlined />,\n <WarningOutlined />,\n <CheckCircleOutlined />,\n <CoffeeOutlined />,\n <SmileOutlined />,\n <FireOutlined />,\n <BarChartOutlined />,\n <CodeOutlined />,\n <DatabaseOutlined />,\n];\n\nexport const SkillCategoryPrompts: React.FC<SkillCategoryPromptsProps> = ({\n senderRef,\n visible = true,\n}) => {\n const [skills, setSkills] = useState<Skill[]>([]);\n const [loading, setLoading] = useState(false);\n const [showAll, setShowAll] = useState(false);\n const { get } = useApi();\n\n const MAX_SIMPLE_ITEMS = 10;\n\n // Fetch skills from API\n useEffect(() => {\n const loadSkills = async () => {\n setLoading(true);\n try {\n const data = await get<{ success: boolean; data: { records: Skill[] } }>(\"/api/skills\");\n if (data.success && data.data && Array.isArray(data.data.records)) {\n setSkills(data.data.records);\n }\n } catch (error) {\n console.error(\"Failed to fetch skills:\", error);\n } finally {\n setLoading(false);\n }\n };\n\n if (visible) {\n loadSkills();\n }\n }, [get, visible]);\n\n // Group skills by category\n const groupedSkills = useMemo(() => {\n const groups: Record<string, Skill[]> = {};\n skills.forEach((skill) => {\n const category = skill.metadata?.category || \"global\";\n if (!groups[category]) {\n groups[category] = [];\n }\n groups[category].push(skill);\n });\n return groups;\n }, [skills]);\n\n // Handle skill click - insert tag\n const handleSkillClick = (skill: Skill) => {\n if (senderRef.current) {\n senderRef.current.insert?.(\n [\n {\n type: \"tag\",\n key: `skill_${skill.id}_${Date.now()}`,\n props: {\n label: (\n <Space size={1}>\n <BrainCircuit size={12} />\n <Typography.Text>{skill.name}</Typography.Text>\n </Space>\n ),\n value: `[Use Skill:${skill.name}]`,\n },\n },\n ],\n \"cursor\"\n );\n }\n };\n\n // Handle more button click\n const handleMoreClick = () => {\n setShowAll(true);\n };\n\n // Get simple mode items (no grouping)\n const getSimpleItems = (): PromptsProps[\"items\"] => {\n const items: PromptsProps[\"items\"] = skills.slice(0, MAX_SIMPLE_ITEMS).map((skill, index) => ({\n key: skill.id,\n icon: (\n <span style={{ color: iconColors[index % iconColors.length] }}>\n {simpleIcons[index % simpleIcons.length]}\n </span>\n ),\n label: skill.name,\n }));\n\n // Add \"More\" button if there are more skills\n if (skills.length > MAX_SIMPLE_ITEMS || Object.keys(groupedSkills).length > 1) {\n items.push({\n key: \"more\",\n icon: <MoreOutlined style={{ color: \"#8C8C8C\" }} />,\n description: \"View more skill categories\",\n });\n }\n\n return items;\n };\n\n // Convert skills to Prompts items for grouped mode\n const getGroupedItems = (skillsList: Skill[]): PromptsProps[\"items\"] => {\n return skillsList.map((skill) => ({\n key: skill.id,\n icon: (\n <BrainCircuit\n size={16}\n style={{\n color: getCategoryConfig(skill.metadata?.category || \"global\").color,\n }}\n />\n ),\n label: skill.name,\n description:\n skill.description?.slice(0, 60) +\n (skill.description?.length > 60 ? \"...\" : \"\"),\n }));\n };\n\n if (!visible) {\n return null;\n }\n\n if (loading) {\n return (\n <div style={{ textAlign: \"center\", padding: 40 }}>\n <Spin size=\"large\" />\n </div>\n );\n }\n\n if (skills.length === 0) {\n return null;\n }\n\n // Simple mode: show all skills in one list without grouping\n if (!showAll) {\n return (\n <div\n style={{\n padding: \"0 16px\",\n maxHeight: \"calc(100% - 220px)\",\n overflowY: \"auto\",\n overflowX: \"hidden\",\n }}\n >\n <Prompts\n title=\"✨ Quick actions\"\n items={getSimpleItems()}\n onItemClick={(info) => {\n if (info.data.key === \"more\") {\n handleMoreClick();\n } else {\n const skill = skills.find((s) => s.id === info.data.key);\n if (skill) {\n handleSkillClick(skill);\n }\n }\n }}\n wrap\n styles={{\n item: {\n flex: \"none\",\n // width: \"calc(50% - 6px)\",\n },\n }}\n />\n </div>\n );\n }\n\n // Grouped mode: show skills grouped by category\n return (\n <div\n style={{\n padding: \"0 16px\",\n maxHeight: \"calc(100% - 220px)\",\n overflowY: \"auto\",\n overflowX: \"hidden\",\n }}\n >\n {Object.entries(groupedSkills).map(([category, categorySkills]) => {\n const config = getCategoryConfig(category);\n return (\n <div key={category} style={{ marginBottom: 16 }}>\n <Prompts\n title={\n <Space>\n <span style={{ color: config.color }}>{config.icon}</span>\n <span>{config.label}</span>\n </Space>\n }\n items={getGroupedItems(categorySkills)}\n onItemClick={(info) => {\n const skill = categorySkills.find((s) => s.id === info.data.key);\n if (skill) {\n handleSkillClick(skill);\n }\n }}\n wrap\n styles={{\n item: {\n flex: \"none\",\n width: \"calc(50% - 6px)\",\n },\n }}\n />\n </div>\n );\n })}\n </div>\n );\n};\n\nexport default SkillCategoryPrompts;\n","import {\n DollarOutlined,\n LineChartOutlined,\n ToolOutlined,\n MoreOutlined,\n TagsOutlined,\n} from \"@ant-design/icons\";\nimport type { PromptsProps } from \"@ant-design/x\";\nimport { Prompts } from \"@ant-design/x\";\nimport type { SlotConfigType } from \"@ant-design/x/es/sender/interface\";\nimport { Space, Typography, Tabs } from \"antd\";\nimport React, { useState, useMemo } from \"react\";\nimport {\n useLatticeChatShellContext,\n type QuickPromptItem,\n type QuickPromptCategory,\n} from \"./LatticeChatShellContext\";\n\nexport interface BusinessAnalysisPromptsProps {\n visible?: boolean;\n disabled?: boolean;\n onItemClick?: (item: QuickPromptItem) => void;\n maxSimpleItems?: number;\n simpleModeTitle?: string;\n expandModeTitle?: string;\n}\n\n// Default icons for categories\nconst defaultCategoryIcons: Record<string, React.ReactNode> = {\n financial: <DollarOutlined />,\n sales: <LineChartOutlined />,\n operations: <ToolOutlined />,\n};\n\n// Default colors for categories\nconst defaultCategoryColors: Record<string, string> = {\n financial: \"#52C41A\",\n sales: \"#1890FF\",\n operations: \"#FA8C16\",\n};\n\n// Helper function to convert string to SlotConfigType[]\nconst stringToSlotConfig = (text: string): SlotConfigType[] => [\n { type: \"text\", value: text },\n];\n\n// Default analysis data\nconst defaultAnalysisData: QuickPromptCategory[] = [\n {\n key: \"sales\",\n title: \"Sales Analysis\",\n items: [\n {\n key: \"sales_comprehensive_analysis\",\n label: \"Comprehensive Sales Analysis\",\n description: \"Analyze sales revenue by specified dimensions with trend analysis and growth opportunities\",\n content: [\n { type: \"text\", value: \"Please analyze sales revenue of last \" },\n { type: \"select\", key: \"time_period\", props: { options: [\"year\", \"quarter\", \"month\", \"week\"], defaultValue: \"year\" } },\n { type: \"text\", value: \" by product group, customer and territory, indicate sales trend, concerns and growth opportunities.\" },\n ],\n },\n {\n key: \"sales_performance\",\n label: \"Sales Performance Analysis\",\n description: \"Aggregate omni-channel sales, evaluate performance achievement rate, and compare with historical growth\",\n content: stringToSlotConfig(\"Please aggregate omni-channel sales, evaluate performance achievement rate, and compare with historical growth.\"),\n },\n {\n key: \"sales_top_customers\",\n label: \"Top Customer Analysis\",\n description: \"Identify top 10% customers by sales volume, analyze their purchase preferences and churn risks\",\n content: [\n { type: \"text\", value: \"Please identify the top \" },\n { type: \"input\", key: \"percentage_threshold\", props: { placeholder: \"10%\", defaultValue: \"10%\" } },\n { type: \"text\", value: \" customers by sales volume, analyze their purchase preferences and churn risks.\" },\n ],\n },\n {\n key: \"sales_trend\",\n label: \"Sales Trend Analysis\",\n description: \"Analyze sales peaks and troughs through time series, forecast sales trends for the next quarter\",\n content: [\n { type: \"text\", value: \"Please analyze sales peaks and troughs through time series, and forecast sales trends for \" },\n { type: \"input\", key: \"forecast_period\", props: { placeholder: \"the next quarter\", defaultValue: \"the next quarter\" } },\n { type: \"text\", value: \".\" },\n ],\n },\n {\n key: \"sales_rep_performance\",\n label: \"Sales Representative Performance\",\n description: \"Quantitatively evaluate conversion rates, average order value, and contract fulfillment efficiency of each sales representative\",\n content: stringToSlotConfig(\"Please quantitatively evaluate conversion rates, average order value, and contract fulfillment efficiency of each sales representative.\"),\n },\n {\n key: \"sales_regional\",\n label: \"Regional Sales Comparison\",\n description: \"Compare sales penetration across different geographic regions, identify markets with abnormal performance\",\n content: [\n { type: \"text\", value: \"Please compare sales penetration across \" },\n { type: \"input\", key: \"geographic_scope\", props: { placeholder: \"different geographic regions\", defaultValue: \"different geographic regions\" } },\n { type: \"text\", value: \", and identify markets with abnormal performance.\" },\n ],\n },\n {\n key: \"sales_product_volume\",\n label: \"Product Volume Analysis\",\n description: \"Count sales quantities of each SKU, identify best-selling products and slow-moving inventory\",\n content: [\n { type: \"text\", value: \"Please count sales quantities of \" },\n { type: \"input\", key: \"product_identifier\", props: { placeholder: \"each SKU\", defaultValue: \"each SKU\" } },\n { type: \"text\", value: \", and identify best-selling products and slow-moving inventory.\" },\n ],\n },\n ],\n },\n {\n key: \"financial\",\n title: \"Financial Analysis\",\n items: [\n {\n key: \"financial_gross_margin\",\n label: \"Product Line Gross Margin Analysis\",\n description: \"Compare gross margin levels across product lines, identify high-margin contributors and loss-making businesses\",\n content: [\n { type: \"text\", value: \"Please analyze the gross margin levels of \" },\n { type: \"input\", key: \"product_scope\", props: { placeholder: \"each product line\", defaultValue: \"each product line\" } },\n { type: \"text\", value: \", identify high-margin contributors and loss-making businesses, and provide optimization suggestions.\" },\n ],\n },\n {\n key: \"financial_customer_profitability\",\n label: \"Customer Profitability Analysis\",\n description: \"Analyze net profit contribution by different customer dimensions, identify core high-quality customers and high-service-cost customers\",\n content: [\n { type: \"text\", value: \"Please analyze the net profit contribution by \" },\n { type: \"input\", key: \"customer_dimension\", props: { placeholder: \"different customer dimensions\", defaultValue: \"different customer dimensions\" } },\n { type: \"text\", value: \", identify core high-quality customers and high-service-cost customers, and propose customer tier management recommendations.\" },\n ],\n },\n {\n key: \"financial_monthly_report\",\n label: \"Monthly Financial Report\",\n description: \"Based on this month's accounting data, automatically generate income statement, balance sheet, and cash flow statement summaries\",\n content: [\n { type: \"text\", value: \"Please generate income statement, balance sheet, and cash flow statement summaries based on \" },\n { type: \"input\", key: \"time_period\", props: { placeholder: \"this month's\", defaultValue: \"this month's\" } },\n { type: \"text\", value: \" accounting data, and analyze key financial indicators.\" },\n ],\n },\n {\n key: \"financial_ratio\",\n label: \"Financial Ratio Analysis\",\n description: \"Calculate and analyze key indicators such as current ratio, debt-to-asset ratio, and ROE to assess company financial health\",\n content: stringToSlotConfig(\"Please calculate and analyze key financial indicators such as current ratio, debt-to-asset ratio, and ROE to assess company financial health.\"),\n },\n {\n key: \"financial_cashflow\",\n label: \"Cash Flow Analysis\",\n description: \"Track cash flows from operating, investing, and financing activities, analyze reasons for changes in net cash flow\",\n content: stringToSlotConfig(\"Please track cash flows from operating, investing, and financing activities, and analyze the reasons and trends for changes in net cash flow.\"),\n },\n {\n key: \"financial_cost_structure\",\n label: \"Cost Structure Analysis\",\n description: \"Break down direct costs and indirect expenses of products or services, identify core drivers affecting total costs\",\n content: [\n { type: \"text\", value: \"Please break down direct costs and indirect expenses of \" },\n { type: \"input\", key: \"cost_object\", props: { placeholder: \"products or services\", defaultValue: \"products or services\" } },\n { type: \"text\", value: \", and identify core drivers affecting total costs.\" },\n ],\n },\n ],\n },\n {\n key: \"operations\",\n title: \"Operations Analysis\",\n items: [\n {\n key: \"ops_supplier_evaluation\",\n label: \"Supplier Performance Evaluation\",\n description: \"Based on delivery quality, response speed, and price competitiveness, conduct comprehensive rating of core suppliers\",\n content: [\n { type: \"text\", value: \"Please conduct comprehensive rating of \" },\n { type: \"input\", key: \"supplier_scope\", props: { placeholder: \"core suppliers\", defaultValue: \"core suppliers\" } },\n { type: \"text\", value: \" based on delivery quality, response speed, and price competitiveness.\" },\n ],\n },\n {\n key: \"ops_inventory_turnover\",\n label: \"Inventory Turnover Analysis\",\n description: \"Calculate inventory turnover rate and days, identify slow-moving inventory materials to release capital\",\n content: stringToSlotConfig(\"Please calculate inventory turnover rate and days, and identify slow-moving inventory materials to release capital.\"),\n },\n {\n key: \"ops_delivery_ontime\",\n label: \"On-Time Delivery Analysis\",\n description: \"Count order lead time from placement to delivery, analyze core links causing delayed deliveries\",\n content: stringToSlotConfig(\"Please count order lead time from placement to delivery, and analyze core links causing delayed deliveries.\"),\n },\n {\n key: \"ops_procurement_cost\",\n label: \"Procurement Cost Analysis\",\n description: \"Monitor raw material procurement price fluctuations, analyze impact of procurement premiums or savings on profit\",\n content: [\n { type: \"text\", value: \"Please monitor \" },\n { type: \"input\", key: \"procurement_category\", props: { placeholder: \"raw material\", defaultValue: \"raw material\" } },\n { type: \"text\", value: \" procurement price fluctuations, and analyze impact of procurement premiums or savings on profit.\" },\n ],\n },\n {\n key: \"ops_production_efficiency\",\n label: \"Production Efficiency Analysis\",\n description: \"Calculate Overall Equipment Effectiveness (OEE) or per capita output, identify efficiency bottlenecks on production lines\",\n content: [\n { type: \"text\", value: \"Please calculate Overall Equipment Effectiveness (OEE) or per capita output, and identify efficiency bottlenecks on \" },\n { type: \"input\", key: \"production_scope\", props: { placeholder: \"production lines\", defaultValue: \"production lines\" } },\n { type: \"text\", value: \".\" },\n ],\n },\n {\n key: \"ops_order_fulfillment\",\n label: \"Order Fulfillment Analysis\",\n description: \"Analyze the full process from order receipt to final delivery, optimize order processing response time\",\n content: [\n { type: \"text\", value: \"Please analyze the full process from order receipt to final delivery, and optimize \" },\n { type: \"input\", key: \"optimization_target\", props: { placeholder: \"order processing response time\", defaultValue: \"order processing response time\" } },\n { type: \"text\", value: \".\" },\n ],\n },\n ],\n },\n];\n\n// Color palette for simple mode\nconst simpleModeColors = [\n \"#1890FF\",\n \"#52C41A\",\n \"#FAAD14\",\n \"#722ED1\",\n \"#13C2C2\",\n \"#EB2F96\",\n \"#FA541C\",\n \"#2F54EB\",\n];\n\nexport const BusinessAnalysisPrompts: React.FC<BusinessAnalysisPromptsProps> = ({\n visible = true,\n disabled = false,\n onItemClick,\n maxSimpleItems = 8,\n simpleModeTitle = \"Quick Analysis\",\n expandModeTitle = \"Analysis Categories\",\n}) => {\n const [showAll, setShowAll] = useState(false);\n const { config } = useLatticeChatShellContext();\n\n // Get analysis data from config or use default\n const analysisData: QuickPromptCategory[] = useMemo(() => {\n const customData = config.quickPromptsData;\n if (customData && Array.isArray(customData) && customData.length > 0) {\n // Merge custom data with defaults for icons/colors if not provided\n return customData.map((category) => ({\n ...category,\n icon: category.icon || defaultCategoryIcons[category.key] || <TagsOutlined />,\n color: category.color || defaultCategoryColors[category.key] || \"#8C8C8C\",\n items: category.items.map((item) => ({\n ...item,\n // Ensure content is SlotConfigType[] format\n content: typeof item.content === \"string\"\n ? stringToSlotConfig(item.content)\n : item.content,\n })),\n }));\n }\n // Use default data with icons and colors\n return defaultAnalysisData.map((category) => ({\n ...category,\n icon: defaultCategoryIcons[category.key] || <TagsOutlined />,\n color: defaultCategoryColors[category.key] || \"#8C8C8C\",\n }));\n }, [config.quickPromptsData]);\n\n // Flatten all items for simple mode\n const allItems = useMemo(() => {\n const items: QuickPromptItem[] = [];\n analysisData.forEach((category) => {\n category.items.forEach((item) => {\n items.push({\n ...item,\n // Inherit category color if item doesn't have icon color\n icon: item.icon || category.icon,\n });\n });\n });\n return items;\n }, [analysisData]);\n\n\n\n // Get simple mode items (flattened, no grouping)\n const getSimpleItems = (): PromptsProps[\"items\"] => {\n const items: PromptsProps[\"items\"] = allItems.slice(0, maxSimpleItems).map((item, index) => ({\n key: item.key,\n icon: (\n <span style={{ color: simpleModeColors[index % simpleModeColors.length] }}>\n {item.icon || <TagsOutlined />}\n </span>\n ),\n label: item.label,\n }));\n\n // Add \"More\" button if there are more items\n if (allItems.length > maxSimpleItems || analysisData.length > 1) {\n items.push({\n key: \"more\",\n icon: <MoreOutlined style={{ color: \"#8C8C8C\" }} />,\n description: \"View more analysis options\",\n });\n }\n\n return items;\n };\n\n // Convert items to Prompts items for grouped mode\n const getGroupedItems = (items: QuickPromptItem[]): PromptsProps[\"items\"] => {\n return items.map((item) => ({\n key: item.key,\n icon: <span style={{ color: \"#8C8C8C\" }}>{item.icon || <TagsOutlined />}</span>,\n label: item.label,\n description: item.description,\n }));\n };\n\n if (!visible) {\n return null;\n }\n\n // Simple mode: show all items in one list without grouping\n if (!showAll) {\n return (\n <div\n style={{\n padding: \"16px\",\n maxWidth: \"800px\",\n margin: \"0 auto\",\n }}\n >\n <Prompts\n title={simpleModeTitle}\n items={getSimpleItems()}\n onItemClick={(info: any) => {\n if (info.data.key === \"more\") {\n setShowAll(true);\n } else {\n const item = allItems.find((i) => i.key === info.data.key);\n if (item && onItemClick) {\n onItemClick(item);\n }\n }\n }}\n wrap\n styles={{\n item: {\n flex: \"none\",\n width: \"calc(50% - 8px)\",\n minWidth: \"280px\",\n },\n }}\n />\n </div>\n );\n }\n\n // Grouped mode: show items grouped by category with tabs\n return (\n <div\n style={{\n padding: \"16px\",\n maxWidth: \"800px\",\n margin: \"0 auto\",\n }}\n >\n <Tabs\n defaultActiveKey={analysisData[0]?.key}\n items={analysisData.map((category) => ({\n key: category.key,\n label: (\n <Space>\n <span style={{ color: category.color }}>{category.icon}</span>\n <span>{category.title}</span>\n </Space>\n ),\n children: (\n <Prompts\n items={getGroupedItems(category.items)}\n onItemClick={(info: any) => {\n const item = category.items.find((i) => i.key === info.data.key);\n if (item && onItemClick) {\n onItemClick(item);\n }\n }}\n wrap\n styles={{\n item: {\n flex: \"none\",\n width: \"calc(50% - 8px)\",\n minWidth: \"280px\",\n },\n }}\n />\n ),\n }))}\n />\n </div>\n );\n};\n\nexport default BusinessAnalysisPrompts;\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Button, message } from \"antd\";\nimport { AudioLines, Loader2, AlertCircle } from \"lucide-react\";\nimport { createStyles } from \"antd-style\";\nimport { useApi } from \"@hooks/useApi\";\nimport {\n useVoiceRecorder,\n type RecorderMode,\n type UseVoiceRecorderOptions,\n} from \"../../hooks/useVoiceRecorder\";\n\nconst useStyle = createStyles(({ css, token }) => ({\n btn: css`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n `,\n waveContainer: css`\n display: inline-flex;\n align-items: center;\n gap: 2px;\n height: 18px;\n `,\n waveBar: css`\n width: 4px;\n min-height: 3px;\n border-radius: 2px;\n background: ${token.colorPrimary};\n transition: height 0.08s ease;\n @keyframes idle-wave-1 { 0%,100%{height:3px} 50%{height:6px} }\n @keyframes idle-wave-2 { 0%,100%{height:3px} 30%{height:8px} 70%{height:3px} }\n @keyframes idle-wave-3 { 0%,100%{height:3px} 50%{height:10px} }\n @keyframes idle-wave-4 { 0%,70%{height:3px} 30%{height:8px} 100%{height:3px} }\n @keyframes idle-wave-5 { 0%,100%{height:3px} 50%{height:6px} }\n &:nth-child(1) { animation: idle-wave-1 1.2s ease-in-out infinite; }\n &:nth-child(2) { animation: idle-wave-2 1.2s ease-in-out infinite; }\n &:nth-child(3) { animation: idle-wave-3 1.2s ease-in-out infinite; }\n &:nth-child(4) { animation: idle-wave-4 1.2s ease-in-out infinite; }\n &:nth-child(5) { animation: idle-wave-5 1.2s ease-in-out infinite; }\n `,\n waveBarActive: css`\n animation: none !important;\n `,\n spin: css`\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n animation: spin 1s linear infinite;\n `,\n}));\n\nexport interface VoiceInputButtonProps {\n mode?: RecorderMode;\n onTranscription: (text: string) => void;\n disabled?: boolean;\n maxDuration?: number;\n autoMode?: UseVoiceRecorderOptions[\"autoMode\"];\n}\n\nexport const VoiceInputButton: React.FC<VoiceInputButtonProps> = ({\n mode: initialMode = \"auto\",\n onTranscription,\n disabled = false,\n maxDuration,\n autoMode,\n}) => {\n const { styles } = useStyle();\n const {\n startRecording,\n stopRecording,\n retryTranscription,\n state,\n } = useVoiceRecorder({\n mode: initialMode,\n onTranscription,\n maxDuration,\n autoMode,\n });\n\n // Auto-detect if STT models are registered\n const [sttAvailable, setSttAvailable] = useState(false);\n const { get: apiGet } = useApi();\n useEffect(() => {\n apiGet<{ models?: Array<unknown> } | Array<unknown>>(\"/api/stt/models\")\n .then((data) => {\n const models = Array.isArray(data) ? data : data.models;\n setSttAvailable((models?.length ?? 0) > 0);\n })\n .catch(() => {\n // keep disabled on error\n });\n }, [apiGet]);\n\n const noSttModel = !sttAvailable;\n\n const isRetryableError = state.error?.type === \"upload_failed\" || state.error?.type === \"timeout\";\n\n const handleClick = useCallback(() => {\n switch (state.status) {\n case \"idle\":\n if (state.error) {\n if (isRetryableError) {\n retryTranscription();\n } else {\n startRecording();\n }\n } else {\n startRecording();\n }\n break;\n case \"recording\":\n stopRecording();\n break;\n }\n }, [state.status, state.error, isRetryableError, startRecording, stopRecording, retryTranscription]);\n\n const isRecording = state.status === \"recording\";\n const isUploading = state.status === \"uploading\";\n const isRequesting = state.status === \"requesting\";\n const isIdle = state.status === \"idle\";\n const hasError = !!state.error;\n const isAutoMode = state.mode === \"auto\";\n\n const lastErrorRef = useRef<string>(\"\");\n\n React.useEffect(() => {\n if (state.error) {\n const errorKey = `${state.error.type}:${state.error.message}`;\n if (errorKey !== lastErrorRef.current) {\n lastErrorRef.current = errorKey;\n message.error(state.error.message, 3);\n }\n } else {\n lastErrorRef.current = \"\";\n }\n }, [state.error]);\n\n const getIcon = () => {\n if (hasError && isIdle) return <AlertCircle size={18} />;\n if (isUploading || isRequesting) return <Loader2 size={18} className={styles.spin} />;\n if (isRecording) {\n const bands = state.frequencyBands;\n const speaking = state.voiceLevel > 0.05;\n const envelope = [0.5, 0.75, 1.0, 0.75, 0.5]; // edges always shorter\n return (\n <span className={styles.waveContainer}>\n {bands.map((level, i) => (\n <span\n key={i}\n className={`${styles.waveBar} ${speaking ? styles.waveBarActive : \"\"}`}\n style={speaking ? { height: `${2 + level * 14 * envelope[i]}px` } : undefined}\n />\n ))}\n </span>\n );\n }\n return <AudioLines size={18} />;\n };\n\n const getColor = () => {\n if (hasError && isIdle) return \"#f59e0b\";\n if (isUploading || isRequesting) return \"#6366f1\";\n return \"#888\";\n };\n\n const isBusy = isUploading || isRequesting;\n\n const getAriaLabel = () => {\n if (noSttModel) return \"Voice input unavailable: No STT model configured\";\n if (isBusy) return \"Transcribing...\";\n if (hasError && isIdle) return isRetryableError ? \"Transcription failed, tap to retry\" : \"Tap to re-record\";\n if (isRecording) return state.mode === \"auto\"\n ? `Stop recording (${state.duration}s, ${state.partialTexts.length} segments transcribed)`\n : `Stop recording (${state.duration}s)`;\n return \"Start voice input\";\n };\n\n const getTitle = () => {\n if (noSttModel) return \"No STT model configured\";\n if (isBusy) return \"Uploading...\";\n if (hasError && isIdle) return isRetryableError ? \"Transcription failed, tap to retry\" : \"Tap to re-record\";\n if (isRecording) {\n const mins = Math.floor(state.duration / 60);\n const secs = state.duration % 60;\n const time = `${String(mins).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`;\n const mode = isAutoMode ? \"Auto\" : \"Manual\";\n const chunks = state.partialTexts.length > 0 ? ` ${state.partialTexts.length} segments` : \"\";\n return `${mode} mode, recording ${time}${chunks} — tap to stop`;\n }\n return \"Start voice input\";\n };\n\n return (\n <Button\n type=\"text\"\n className={styles.btn}\n style={{\n color: getColor(),\n cursor: isBusy ? \"wait\" : \"pointer\",\n minWidth: 44,\n minHeight: 44,\n }}\n icon={getIcon()}\n onClick={handleClick}\n disabled={disabled || isBusy || noSttModel}\n aria-label={getAriaLabel()}\n aria-pressed={isRecording}\n title={getTitle()}\n />\n );\n};\n","import type { FileItem } from \"@axiom-lattice/client-sdk\";\n\nexport const MAX_FILE_TREE_DEPTH = 10;\n\ntype ListPathByFolder = (path: string, assistantId?: string) => Promise<FileItem[]>;\n\n/**\n * Recursively collects all files (non-directory entries) under the given folders,\n * traversing subdirectories via `listPathByFolder`. Directories are not returned.\n *\n * @param listPathByFolder - Lists the direct children of a folder path.\n * @param folderNames - The root folders to walk.\n * @param assistantId - Optional assistant used by the backend to scope files.\n * @param maxDepth - Guards against unbounded recursion.\n * @returns All files found at any depth across all folders.\n */\nexport async function collectAllWorkspaceFiles(\n listPathByFolder: ListPathByFolder,\n folderNames: string[],\n assistantId?: string,\n maxDepth = MAX_FILE_TREE_DEPTH,\n): Promise<FileItem[]> {\n const collectFolder = async (\n folderPath: string,\n depth: number,\n seen: Set<string>,\n ): Promise<FileItem[]> => {\n if (depth > maxDepth || seen.has(folderPath)) {\n return [];\n }\n seen.add(folderPath);\n\n const items = await listPathByFolder(folderPath, assistantId);\n const files: FileItem[] = [];\n for (const item of items) {\n if (item.is_dir) {\n files.push(...(await collectFolder(item.path, depth + 1, seen)));\n } else {\n files.push(item);\n }\n }\n return files;\n };\n\n const results = await Promise.all(folderNames.map((name) => collectFolder(name, 0, new Set())));\n return results.flat();\n}\n","import type { FileItem } from \"@axiom-lattice/client-sdk\";\n\n/**\n * Grep-style filter over a flat file list: every file whose full path or\n * basename contains the query (case-insensitive) is kept. An empty or\n * whitespace-only query returns the full list unchanged.\n *\n * @param files - Flat list of files (any depth), e.g. from {@link collectAllWorkspaceFiles}.\n * @param query - The text typed after `@` in the chat input.\n * @returns Files matching the query.\n */\nexport function filterFilesByQuery(files: FileItem[], query: string): FileItem[] {\n const q = query.trim().toLowerCase();\n if (!q) {\n return files;\n }\n return files.filter((file) => {\n const path = (file.path || \"\").toLowerCase();\n const name = (file.name || \"\").toLowerCase();\n return path.includes(q) || name.includes(q);\n });\n}\n\n/** 建议下拉一次渲染的最大条数,超出部分截断并提示继续输入缩小范围 */\nexport const MAX_SUGGESTION_VISIBLE = 10;\n\nexport interface TruncatedMatches {\n visible: FileItem[];\n hiddenCount: number;\n}\n\n/**\n * 截断匹配结果,保证下拉菜单渲染条数有上限(antd Cascader 菜单无虚拟化,\n * 大列表直接渲染会导致 DOM 过多和超出屏幕)。\n *\n * @param files - 过滤后的匹配文件列表。\n * @param maxVisible - 最多渲染的条数,默认 {@link MAX_SUGGESTION_VISIBLE}。\n * @returns 可见列表与隐藏条数。\n */\nexport function truncateMatches(\n files: FileItem[],\n maxVisible = MAX_SUGGESTION_VISIBLE,\n): TruncatedMatches {\n if (files.length <= maxVisible) {\n return { visible: files, hiddenCount: 0 };\n }\n return { visible: files.slice(0, maxVisible), hiddenCount: files.length - maxVisible };\n}\n","/**\n * 镜像 @ant-design/x Suggestion 内部 useActive 的 offsetRow 导航规则\n * (单列扁平列表:(prev + offset + count) % count,环绕),供 Enter 选中时\n * 定位当前高亮项。库的 useActive 吞掉 Enter 但不执行选中,选中逻辑需在\n * 组件层自己补上,因此必须与库的方向键移动规则完全一致。\n */\nexport function moveActiveIndex(prevIndex: number, offset: number, itemCount: number): number {\n if (itemCount <= 0) {\n return 0;\n }\n return (prevIndex + offset + itemCount) % itemCount;\n}\n\n/**\n * 构造传给 Sender.insert 的 replaceCharacters:库的替换逻辑是\n * `textBeforeCursor.endsWith(replaceCharacters)`,只传触发字符(@ 或 /)时\n * 只能替换光标前紧邻的一个字符;传完整的 \"@查询词\" 才能把触发词整体替换掉。\n */\nexport function buildReplaceChars(content: string, triggerChar: \"@\" | \"/\"): string {\n const idx = content.lastIndexOf(triggerChar);\n if (idx < 0) {\n return triggerChar;\n }\n const tail = content.slice(idx + 1);\n return tail ? triggerChar + tail : triggerChar;\n}\n","import React, { useEffect, useRef } from \"react\";\nimport { useAgentChat } from \"@hooks/useAgentChat\";\n\nexport interface InitialMessageRequest {\n requestId: string;\n content: string;\n}\n\nexport type InitialMessageAttemptRegistry = React.MutableRefObject<Set<string>>;\n\ninterface InitialMessageSubmitterProps {\n request?: InitialMessageRequest | null;\n onSubmitted?: (requestId: string) => void;\n attemptedRequestIdsRef?: InitialMessageAttemptRegistry;\n}\n\nexport function InitialMessageSubmitter({\n request,\n onSubmitted,\n attemptedRequestIdsRef,\n}: InitialMessageSubmitterProps): React.ReactElement | null {\n const { isLoading, sendMessage, threadId } = useAgentChat();\n const localAttemptedRequestIdsRef = useRef(new Set<string>());\n const requestRegistryRef = attemptedRequestIdsRef ?? localAttemptedRequestIdsRef;\n const sendMessageRef = useRef(sendMessage);\n const onSubmittedRef = useRef(onSubmitted);\n\n useEffect(() => {\n sendMessageRef.current = sendMessage;\n }, [sendMessage]);\n\n useEffect(() => {\n onSubmittedRef.current = onSubmitted;\n }, [onSubmitted]);\n\n useEffect(() => {\n if (\n !request ||\n !request.content.trim() ||\n !threadId ||\n isLoading ||\n requestRegistryRef.current.has(request.requestId)\n ) {\n return;\n }\n\n const { requestId, content } = request;\n requestRegistryRef.current.add(requestId);\n\n let sendResult: Promise<void>;\n try {\n sendResult = sendMessageRef.current({\n input: { message: content },\n streaming: true,\n throwOnError: true,\n });\n } catch {\n requestRegistryRef.current.delete(requestId);\n return;\n }\n\n void sendResult.then(\n () => onSubmittedRef.current?.(requestId),\n () => requestRegistryRef.current.delete(requestId),\n );\n }, [isLoading, request?.content, request?.requestId, requestRegistryRef, threadId]);\n\n return null;\n}\n","import React, { useEffect, useRef } from \"react\";\nimport { useAgentChat } from \"@hooks/useAgentChat\";\nimport type { EmbedChatMessage, EmbedChatMessageHandler, EmbedChatReadyApi, EmbedChatReadyHandler } from \"../../integrations/web-app/embed/embedBridge\";\n\nexport type { EmbedChatMessage, EmbedChatMessageHandler, EmbedChatReadyApi, EmbedChatReadyHandler };\n\ninterface EmbedChatBridgeProps {\n onReady?: EmbedChatReadyHandler;\n onMessage?: EmbedChatMessageHandler;\n}\n\n/**\n * Headless bridge that exposes programmatic send + message observation for an\n * embedded chat. Rendered by {@link Chating} when the callbacks are provided;\n * must live inside the per-thread provider subtree where `useAgentChat` is\n * thread-bound.\n *\n * Event model:\n * - `onReady` fires once per mount when the thread first becomes available;\n * the handle stays valid across thread switches (it always calls the latest\n * thread's `sendMessage`).\n * - `onMessage` emits each accepted human message immediately, and each AI\n * reply once its stream completes (final content, not partial deltas).\n * - History delivered while a thread is loading is baseline-marked, never\n * emitted — only live conversation traffic reaches the host.\n */\nexport function EmbedChatBridge({ onReady, onMessage }: EmbedChatBridgeProps): null {\n const { messages, isLoading, sendMessage, threadId } = useAgentChat();\n\n const sendMessageRef = useRef(sendMessage);\n sendMessageRef.current = sendMessage;\n const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n const onMessageRef = useRef(onMessage);\n onMessageRef.current = onMessage;\n\n const readyAnnouncedRef = useRef(false);\n useEffect(() => {\n if (readyAnnouncedRef.current || !threadId) return;\n readyAnnouncedRef.current = true;\n onReadyRef.current?.({\n sendMessage: (text: string): void => {\n const trimmed = text.trim();\n if (!trimmed) return;\n void sendMessageRef.current({\n input: { message: trimmed },\n streaming: true,\n throwOnError: true,\n }).catch(() => undefined);\n },\n });\n }, [threadId]);\n\n const lastThreadIdRef = useRef<string | null>(null);\n const seenIdsRef = useRef<Set<string>>(new Set());\n const pendingAiIdsRef = useRef<Set<string>>(new Set());\n const suppressingRef = useRef(true);\n const prevLoadingRef = useRef(false);\n\n useEffect(() => {\n if (lastThreadIdRef.current !== threadId) {\n lastThreadIdRef.current = threadId;\n seenIdsRef.current = new Set();\n pendingAiIdsRef.current = new Set();\n suppressingRef.current = true;\n prevLoadingRef.current = isLoading;\n }\n\n const wasSuppressing = suppressingRef.current;\n const settled = prevLoadingRef.current && !isLoading;\n prevLoadingRef.current = isLoading;\n\n for (const message of messages) {\n const { id, role } = message;\n const content = message.content;\n if (typeof content !== \"string\" || seenIdsRef.current.has(id)) continue;\n if (wasSuppressing) {\n seenIdsRef.current.add(id);\n continue;\n }\n if (role === \"human\") {\n seenIdsRef.current.add(id);\n onMessageRef.current?.({ role: \"human\", content });\n } else if (role === \"ai\") {\n pendingAiIdsRef.current.add(id);\n }\n }\n\n if (wasSuppressing && settled) {\n suppressingRef.current = false;\n } else if (settled) {\n for (const id of pendingAiIdsRef.current) {\n if (seenIdsRef.current.has(id)) continue;\n const message = messages.find((candidate) => candidate.id === id);\n if (!message || typeof message.content !== \"string\") continue;\n seenIdsRef.current.add(id);\n onMessageRef.current?.({ role: \"ai\", content: message.content });\n }\n pendingAiIdsRef.current.clear();\n }\n }, [messages, isLoading, threadId]);\n\n return null;\n}\n","import { ToolCallData } from \"../types\";\nimport { ElementProps } from \"../types\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\nimport { ContentPreviewCollapse } from \"./ContentPreviewCollapse\";\nimport { Avatar, Button, List, Space, Typography } from \"antd\";\nimport {\n SearchOutlined,\n GlobalOutlined,\n UserOutlined,\n} from \"@ant-design/icons\";\nimport { createStyles } from \"antd-style\";\nimport React from \"react\";\n\nconst { Text } = Typography;\n\nconst useStyle = createStyles(({ token, css }) => ({\n listContainer: css`\n background: ${token.colorBgContainer};\n border-radius: ${token.borderRadius}px;\n padding: 8px 0;\n `,\n listItem: css`\n padding: 12px 16px;\n border-bottom: 1px solid ${token.colorBorderSecondary};\n transition: background-color 0.2s ease;\n cursor: pointer;\n\n &:hover {\n background: ${token.colorFillTertiary};\n }\n\n &:last-child {\n border-bottom: none;\n }\n `,\n itemContent: css`\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n `,\n iconWrapper: css`\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: ${token.colorPrimary};\n color: white;\n font-size: 14px;\n font-weight: 600;\n `,\n titleWrapper: css`\n flex: 1;\n min-width: 0;\n `,\n title: css`\n color: ${token.colorText};\n font-size: ${token.fontSize}px;\n line-height: 1.5;\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n source: css`\n color: ${token.colorTextSecondary};\n font-size: ${token.fontSizeSM}px;\n margin: 0;\n flex-shrink: 0;\n margin-left: 16px;\n `,\n}));\n\n// Extract domain from URL\nconst getDomainFromUrl = (url: string): string => {\n try {\n const urlObj = new URL(url);\n return urlObj.hostname.replace(/^www\\./, \"\");\n } catch {\n return url;\n }\n};\n\n// Get icon text from domain\nconst getIconText = (domain: string): string => {\n if (!domain) return \"?\";\n const parts = domain.split(\".\");\n if (parts.length >= 2) {\n const mainPart = parts[parts.length - 2];\n return mainPart.substring(0, 2).toUpperCase();\n }\n return domain.substring(0, 2).toUpperCase();\n};\n\n// Get icon color based on domain\nconst getIconColor = (domain: string): string => {\n const colors = [\n \"#1890ff\", // blue\n \"#52c41a\", // green\n \"#fa8c16\", // orange\n \"#eb2f96\", // pink\n \"#722ed1\", // purple\n \"#13c2c2\", // cyan\n \"#f5222d\", // red\n ];\n let hash = 0;\n for (let i = 0; i < domain.length; i++) {\n hash = domain.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n};\n\nexport const InternetSearchCard: React.FC<ElementProps<ToolCallData>> = ({\n data,\n component_key,\n interactive = true,\n}) => {\n const { styles } = useStyle();\n const toolCallData = data;\n const { query } = toolCallData?.args || {};\n const dataSource = JSON.parse(toolCallData.response || \"[]\");\n const openSideApp = useSideAppOpener();\n\n if (!toolCallData) {\n return null;\n }\n\n const header = (\n <Space>\n <Text strong>Internet Search</Text>\n <Text title={query}>{query}</Text>\n </Space>\n );\n\n return (\n <ContentPreviewCollapse\n panelKey={toolCallData.id}\n header={header}\n expandIcon={() => <SearchOutlined />}\n >\n <List\n size=\"small\"\n dataSource={dataSource}\n renderItem={(item: any) => {\n const url = item.url || \"\";\n const domain = getDomainFromUrl(url);\n const iconText = getIconText(domain);\n const iconColor = getIconColor(domain);\n\n return (\n <List.Item extra={<Text className={styles.source}>{domain}</Text>}>\n <Space style={{ width: \"100%\" }}>\n <Avatar style={{ background: iconColor }}>{iconText}</Avatar>{\" \"}\n <Button\n type=\"text\"\n onClick={() => {\n openSideApp({\n component_key: \"attachments\",\n data: { url, message: item.title },\n message: item.title,\n });\n }}\n >\n {item.title}\n </Button>\n </Space>\n </List.Item>\n );\n }}\n />\n </ContentPreviewCollapse>\n );\n};\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport {\n List,\n Tag,\n Button,\n Empty,\n Spin,\n Typography,\n Space,\n Tooltip,\n Popconfirm,\n message,\n Card,\n Descriptions,\n} from \"antd\";\nimport {\n ClockCircleOutlined,\n PauseCircleOutlined,\n PlayCircleOutlined,\n StopOutlined,\n ReloadOutlined,\n CheckCircleOutlined,\n CloseCircleOutlined,\n ExclamationCircleOutlined,\n SyncOutlined,\n FieldTimeOutlined,\n} from \"@ant-design/icons\";\nimport { createStyles } from \"antd-style\";\nimport dayjs from \"dayjs\";\nimport relativeTime from \"dayjs/plugin/relativeTime.js\";\nimport { ElementProps } from \"../types\";\nimport { useClient } from \"../../../context\";\nimport {\n ScheduledTask,\n ScheduledTaskStatus,\n ScheduleExecutionType,\n} from \"@axiom-lattice/client-sdk\";\n\ndayjs.extend(relativeTime);\n\nconst { Text, Title } = Typography;\n\nconst useStyles = createStyles(({ token, css }) => ({\n container: css`\n height: 100%;\n padding: 16px;\n overflow: auto;\n background: ${token.colorBgContainer};\n `,\n header: css`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n padding-bottom: 12px;\n border-bottom: 1px solid ${token.colorBorderSecondary};\n `,\n taskCard: css`\n margin-bottom: 12px;\n border-radius: ${token.borderRadiusLG}px;\n transition: box-shadow 0.2s;\n\n &:hover {\n box-shadow: ${token.boxShadowSecondary};\n }\n `,\n taskHeader: css`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 8px;\n `,\n taskType: css`\n font-weight: 600;\n font-size: 14px;\n color: ${token.colorText};\n `,\n taskId: css`\n font-family: monospace;\n font-size: 11px;\n color: ${token.colorTextSecondary};\n word-break: break-all;\n `,\n metaRow: css`\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n margin-top: 8px;\n `,\n metaItem: css`\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: ${token.colorTextSecondary};\n `,\n actions: css`\n display: flex;\n gap: 4px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid ${token.colorBorderSecondary};\n `,\n emptyContainer: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n `,\n cronExpression: css`\n font-family: monospace;\n background: ${token.colorFillSecondary};\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 12px;\n `,\n messageContent: css`\n margin-top: 4px;\n max-width: 300px;\n word-break: break-word;\n `,\n}));\n\n/**\n * Get status tag color\n */\nconst getStatusColor = (status: ScheduledTaskStatus): string => {\n switch (status) {\n case ScheduledTaskStatus.PENDING:\n return \"processing\";\n case ScheduledTaskStatus.RUNNING:\n return \"blue\";\n case ScheduledTaskStatus.COMPLETED:\n return \"success\";\n case ScheduledTaskStatus.FAILED:\n return \"error\";\n case ScheduledTaskStatus.CANCELLED:\n return \"default\";\n case ScheduledTaskStatus.PAUSED:\n return \"warning\";\n default:\n return \"default\";\n }\n};\n\n/**\n * Get status icon\n */\nconst getStatusIcon = (status: ScheduledTaskStatus): React.ReactNode => {\n switch (status) {\n case ScheduledTaskStatus.PENDING:\n return <ClockCircleOutlined />;\n case ScheduledTaskStatus.RUNNING:\n return <SyncOutlined spin />;\n case ScheduledTaskStatus.COMPLETED:\n return <CheckCircleOutlined />;\n case ScheduledTaskStatus.FAILED:\n return <CloseCircleOutlined />;\n case ScheduledTaskStatus.CANCELLED:\n return <StopOutlined />;\n case ScheduledTaskStatus.PAUSED:\n return <PauseCircleOutlined />;\n default:\n return <ClockCircleOutlined />;\n }\n};\n\n/**\n * Format timestamp to readable string\n */\nconst formatTime = (timestamp: number | undefined): string => {\n if (!timestamp) return \"-\";\n return dayjs(timestamp).format(\"YYYY-MM-DD HH:mm:ss\");\n};\n\n/**\n * Get relative time string\n */\nconst getRelativeTime = (timestamp: number | undefined): string => {\n if (!timestamp) return \"\";\n return dayjs(timestamp).fromNow();\n};\n\n/**\n * ScheduleViewer - Side app component for displaying scheduled tasks\n */\nexport const ScheduleViewer: React.FC<ElementProps> = ({ data }) => {\n const { styles } = useStyles();\n const { threadId, assistantId, tasks: initialTasks, onRefresh } = data ?? {};\n const client = useClient(assistantId || \"\");\n\n const [tasks, setTasks] = useState<ScheduledTask[]>(initialTasks || []);\n const [loading, setLoading] = useState(false);\n const [actionLoading, setActionLoading] = useState<string | null>(null);\n\n // Refresh tasks\n const handleRefresh = useCallback(async () => {\n if (!threadId) return;\n\n setLoading(true);\n try {\n const fetchedTasks = await client.schedules.getByThread({ threadId });\n setTasks(fetchedTasks);\n onRefresh?.();\n } catch (error) {\n console.error(\"Failed to refresh tasks:\", error);\n message.error(\"Failed to refresh scheduled tasks\");\n } finally {\n setLoading(false);\n }\n }, [client, threadId, onRefresh]);\n\n // Handle cancel task\n const handleCancel = useCallback(\n async (taskId: string) => {\n setActionLoading(taskId);\n try {\n await client.schedules.cancel(taskId);\n message.success(\"Task cancelled successfully\");\n await handleRefresh();\n } catch (error) {\n console.error(\"Failed to cancel task:\", error);\n message.error(\"Failed to cancel task\");\n } finally {\n setActionLoading(null);\n }\n },\n [client, handleRefresh]\n );\n\n // Handle pause task\n const handlePause = useCallback(\n async (taskId: string) => {\n setActionLoading(taskId);\n try {\n await client.schedules.pause(taskId);\n message.success(\"Task paused successfully\");\n await handleRefresh();\n } catch (error) {\n console.error(\"Failed to pause task:\", error);\n message.error(\"Failed to pause task\");\n } finally {\n setActionLoading(null);\n }\n },\n [client, handleRefresh]\n );\n\n // Handle resume task\n const handleResume = useCallback(\n async (taskId: string) => {\n setActionLoading(taskId);\n try {\n await client.schedules.resume(taskId);\n message.success(\"Task resumed successfully\");\n await handleRefresh();\n } catch (error) {\n console.error(\"Failed to resume task:\", error);\n message.error(\"Failed to resume task\");\n } finally {\n setActionLoading(null);\n }\n },\n [client, handleRefresh]\n );\n\n // Auto-refresh when component mounts\n useEffect(() => {\n if (threadId && (!initialTasks || initialTasks.length === 0)) {\n handleRefresh();\n }\n }, [threadId]);\n\n // Update tasks when initialTasks changes\n useEffect(() => {\n if (initialTasks) {\n setTasks(initialTasks);\n }\n }, [initialTasks]);\n\n // Render task actions based on status\n const renderActions = (task: ScheduledTask): React.ReactNode => {\n const isLoading = actionLoading === task.taskId;\n const isPending = task.status === ScheduledTaskStatus.PENDING;\n const isPaused = task.status === ScheduledTaskStatus.PAUSED;\n const isCron = task.executionType === ScheduleExecutionType.CRON;\n\n return (\n <Space className={styles.actions}>\n {isPending && isCron && (\n <Tooltip title=\"Pause\">\n <Button\n type=\"text\"\n size=\"small\"\n icon={<PauseCircleOutlined />}\n onClick={() => handlePause(task.taskId)}\n loading={isLoading}\n />\n </Tooltip>\n )}\n\n {isPaused && (\n <Tooltip title=\"Resume\">\n <Button\n type=\"text\"\n size=\"small\"\n icon={<PlayCircleOutlined />}\n onClick={() => handleResume(task.taskId)}\n loading={isLoading}\n />\n </Tooltip>\n )}\n\n {(isPending || isPaused) && (\n <Popconfirm\n title=\"Cancel this scheduled task?\"\n description=\"This action cannot be undone.\"\n onConfirm={() => handleCancel(task.taskId)}\n okText=\"Yes\"\n cancelText=\"No\"\n >\n <Tooltip title=\"Cancel\">\n <Button\n type=\"text\"\n size=\"small\"\n danger\n icon={<StopOutlined />}\n loading={isLoading}\n />\n </Tooltip>\n </Popconfirm>\n )}\n </Space>\n );\n };\n\n // Render task card\n const renderTask = (task: ScheduledTask): React.ReactNode => {\n const isActive =\n task.status === ScheduledTaskStatus.PENDING ||\n task.status === ScheduledTaskStatus.PAUSED;\n\n return (\n <Card\n key={task.taskId}\n className={styles.taskCard}\n size=\"small\"\n bordered\n >\n <div className={styles.taskHeader}>\n <div>\n <div className={styles.taskType}>{task.taskType}</div>\n <div className={styles.taskId}>{task.taskId}</div>\n {task.payload?.message?.content && (\n <div className={styles.messageContent}>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {task.payload.message.content}\n </Text>\n </div>\n )}\n </div>\n <Tag color={getStatusColor(task.status)} icon={getStatusIcon(task.status)}>\n {task.status.toUpperCase()}\n </Tag>\n </div>\n\n <div className={styles.metaRow}>\n <Tooltip title=\"Execution Type\">\n <div className={styles.metaItem}>\n <FieldTimeOutlined />\n <span>\n {task.executionType === ScheduleExecutionType.CRON ? \"Recurring\" : \"One-time\"}\n </span>\n </div>\n </Tooltip>\n\n {task.cronExpression && (\n <Tooltip title=\"Cron Expression\">\n <div className={styles.metaItem}>\n <ClockCircleOutlined />\n <code className={styles.cronExpression}>{task.cronExpression}</code>\n </div>\n </Tooltip>\n )}\n\n {task.nextRunAt && (\n <Tooltip title={`Next run: ${formatTime(task.nextRunAt)}`}>\n <div className={styles.metaItem}>\n <ClockCircleOutlined />\n <span>Next: {getRelativeTime(task.nextRunAt)}</span>\n </div>\n </Tooltip>\n )}\n\n {task.executeAt && !task.cronExpression && (\n <Tooltip title={`Execute at: ${formatTime(task.executeAt)}`}>\n <div className={styles.metaItem}>\n <ClockCircleOutlined />\n <span>At: {getRelativeTime(task.executeAt)}</span>\n </div>\n </Tooltip>\n )}\n\n {task.runCount > 0 && (\n <Tooltip title=\"Run count\">\n <div className={styles.metaItem}>\n <SyncOutlined />\n <span>\n Runs: {task.runCount}\n {task.maxRuns ? ` / ${task.maxRuns}` : \"\"}\n </span>\n </div>\n </Tooltip>\n )}\n </div>\n\n {task.lastError && (\n <div style={{ marginTop: 8 }}>\n <Text type=\"danger\" style={{ fontSize: 12 }}>\n <ExclamationCircleOutlined style={{ marginRight: 4 }} />\n {task.lastError}\n </Text>\n </div>\n )}\n\n {isActive && renderActions(task)}\n </Card>\n );\n };\n\n return (\n <div className={styles.container}>\n <div className={styles.header}>\n <Title level={5} style={{ margin: 0 }}>\n Scheduled Tasks\n </Title>\n <Tooltip title=\"Refresh\">\n <Button\n type=\"text\"\n icon={<ReloadOutlined spin={loading} />}\n onClick={handleRefresh}\n loading={loading}\n />\n </Tooltip>\n </div>\n\n {loading && tasks.length === 0 ? (\n <div className={styles.emptyContainer}>\n <Spin size=\"large\" />\n <Text type=\"secondary\" style={{ marginTop: 16 }}>\n Loading scheduled tasks...\n </Text>\n </div>\n ) : tasks.length === 0 ? (\n <div className={styles.emptyContainer}>\n <Empty\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n description=\"No scheduled tasks for this thread\"\n />\n </div>\n ) : (\n <div>\n {tasks.map(renderTask)}\n </div>\n )}\n </div>\n );\n};\n\nexport default ScheduleViewer;\n","import React from \"react\";\nimport { Button, Flex, Space, Typography } from \"antd\";\nimport { ElementProps, ToolCallData } from \"../types\";\nimport { getFileIcon } from \"./getFileIcon\";\nimport { MDResponse } from \"../MDResponse\";\nimport { ContentPreviewCollapse } from \"./ContentPreviewCollapse\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\nimport { CheckCircleOutlined, InfoCircleOutlined, LoadingOutlined } from \"@ant-design/icons\";\n\nimport { useOptionalConversationContext } from \"@components/Chat/ConversationContext\";\nimport { useLatticeChatShellContext } from \"@components/Chat/LatticeChatShellContext\";\n\nconst { Text } = Typography;\n\nexport const BrowserViewer: React.FC<ElementProps<ToolCallData>> = ({\n data,\n component_key,\n interactive = true,\n}) => {\n const toolCallData = data as ToolCallData;\n const { threadId, assistantId } = useOptionalConversationContext() ?? {};\n const { config } = useLatticeChatShellContext();\n\n const ws_path = `/sandbox/assistants/${assistantId}/threads/${threadId}/sandbox/websockify`;\n let targetUrl = `/api/assistants/${assistantId}/threads/${threadId}/sandbox?autoconnect=true&resize=scale&reconnect=1&path${ws_path}`;\n if (config.globalSharedSandboxURL) {\n targetUrl = `${config.globalSharedSandboxURL}/vnc/index.html?autoconnect=true&resize=scale&reconnect=1&path=/sandbox/global/websockify`;\n }\n\n function getStatusIcon(status: string | undefined) {\n switch (status) {\n case \"success\":\n return <CheckCircleOutlined style={{ color: \"#52c41a\" }} />;\n case \"error\":\n return <InfoCircleOutlined style={{ color: \"#ff4d4f\" }} />;\n default:\n return <LoadingOutlined style={{ color: \"#1890ff\" }} />;\n }\n }\n\n // Format tool name: handle snake_case and camelCase\n const formatToolName = (name: string) => {\n if (!name) {\n return \"\";\n }\n return name\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // Handle camelCase\n .split(/[_-]/) // Handle snake_case and kebab-case\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n };\n\n // 构建标题,包含工具名称、ID和参数摘要\n const formatArgsPreview = (args: Record<string, any>) => {\n try {\n // 将参数转换为字符串,只显示值不显示键\n const argsStr = Object.values(args)\n .map((value) => {\n const valueStr =\n typeof value === \"object\"\n ? JSON.stringify(value).substring(0, 50) +\n (JSON.stringify(value).length > 50 ? \"...\" : \"\")\n : String(value).substring(0, 50) +\n (String(value).length > 50 ? \"...\" : \"\");\n return valueStr;\n })\n .join(\" \");\n const result =\n argsStr.length > 100 ? argsStr.substring(0, 100) + \"...\" : argsStr;\n\n return result.replaceAll(\"\\n\", \" \");\n } catch (e) {\n return \"Error parsing args\";\n }\n };\n\n const header = (\n <Flex align=\"center\" wrap=\"wrap\">\n <Typography.Text strong>\n {formatToolName(toolCallData.name)}\n </Typography.Text>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: \"12px\", marginLeft: \"8px\" }}\n >\n {formatArgsPreview(toolCallData.args)}\n </Typography.Text>\n </Flex>\n );\n\n const openSideApp = useSideAppOpener();\n if (!toolCallData) {\n return null;\n }\n\n\n\n const handleItemClick = (toolCallData: ToolCallData) => {\n openSideApp({\n component_key: \"browser_viewer\",\n message: \"View Browser\",\n data: {\n url: targetUrl\n },\n });\n };\n return (\n <ContentPreviewCollapse\n panelKey={toolCallData.id}\n header={header}\n expandIcon={() => getStatusIcon(toolCallData.status)}\n extra={\n <Button\n type=\"link\"\n size=\"small\"\n onClick={(evt) => {\n // evt.preventDefault();\n evt.stopPropagation();\n handleItemClick(toolCallData);\n }}\n >\n View Browser\n </Button>\n }\n >\n <MDResponse content={toolCallData.response || \"\"} />\n </ContentPreviewCollapse>\n );\n};\n","import React from \"react\";\nimport { Button, Space, Typography } from \"antd\";\nimport { ElementProps, ToolCallData } from \"../types\";\nimport { getFileIcon } from \"./getFileIcon\";\nimport { MDResponse } from \"../MDResponse\";\nimport { ContentPreviewCollapse } from \"./ContentPreviewCollapse\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\nimport { getStatusIcon } from \"./getStatusIcon\";\n\nconst { Text } = Typography;\n\nexport const ExecuteCode: React.FC<ElementProps<ToolCallData>> = ({\n data,\n component_key,\n interactive = true,\n}) => {\n const toolCallData = data;\n const { language, code } = toolCallData?.args || {};\n const openSideApp = useSideAppOpener();\n if (!toolCallData) {\n return null;\n }\n\n const header = (\n <Space>\n <Text strong>Execute Code</Text>\n </Space>\n );\n const handleItemClick = (toolCallData: ToolCallData) => {\n openSideApp({\n component_key: \"file_content_diff_view\",\n message: \"Code View\",\n data: {\n old_code: \"\",\n new_code: code,\n },\n });\n };\n\n const content = `\\`\\`\\`${language}\\n${code}\\n\\`\\`\\``;\n\n\n return (\n <ContentPreviewCollapse\n panelKey={toolCallData.id}\n header={header}\n expandIcon={() => getStatusIcon(toolCallData.status)}\n extra={\n <Button\n type=\"link\"\n size=\"small\"\n onClick={(evt) => {\n // evt.preventDefault();\n evt.stopPropagation();\n handleItemClick(toolCallData);\n }}\n >\n Code View\n </Button>\n }\n >\n <MDResponse content={content} />\n\n {toolCallData.response && <MDResponse content={toolCallData.response || \"\"} />}\n\n </ContentPreviewCollapse>\n );\n};\n","import React, { useMemo } from \"react\";\nimport { ElementProps, ToolCallData } from \"../types\";\nimport { Card, Typography, Avatar, Tag, List, Space, Button, Skeleton } from \"antd\";\nimport { UserOutlined, TeamOutlined } from \"@ant-design/icons\";\nimport { Monitor } from \"lucide-react\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\nimport { useAgentChat } from \"@hooks\";\n\nconst { Text } = Typography;\n\nexport interface Teammate {\n id?: string;\n name: string;\n role: string;\n description?: string;\n avatar?: string;\n}\n\nexport interface TaskItem {\n id: string;\n title: string;\n description: string;\n status: string;\n}\n\nexport interface TeamGraphArgs {\n teamName?: string;\n teammates?: Teammate[];\n}\n\nexport interface TeamInfo {\n teamId: string;\n teamLeadId: string;\n teammates: Teammate[];\n tasks: Array<{\n id: string;\n title: string;\n description: string;\n status: string;\n }>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface TeamGraphProps extends ElementProps<ToolCallData> { }\n\nconst extractTeamInfo = (response: string): Partial<TeamInfo> | null => {\n if (!response) return null;\n const jsonMatch = response.match(/```json\\n([\\s\\S]*?)\\n```/);\n if (jsonMatch && jsonMatch[1]) {\n try {\n const parsed = JSON.parse(jsonMatch[1]);\n return {\n teamId: parsed?.teamId,\n teamLeadId: parsed?.teamLeadId,\n teammates: Array.isArray(parsed?.teammates) ? parsed.teammates : [],\n tasks: Array.isArray(parsed?.tasks) ? parsed.tasks : [],\n };\n } catch {\n return null;\n }\n }\n return null;\n};\n\nconst safeGetTeammates = (data: any): Teammate[] => {\n if (!data) return [];\n const teamInfo = extractTeamInfo(data.response);\n if (teamInfo?.teammates && Array.isArray(teamInfo.teammates)) {\n return teamInfo.teammates.filter((t) => t && t.name);\n }\n const args = data.args;\n if (args?.teammates && Array.isArray(args.teammates)) {\n return args.teammates.filter((t: Teammate) => t && t.name);\n }\n return [];\n};\n\nconst safeGetTeamId = (data: any): string => {\n if (!data) return \"\";\n const teamInfo = extractTeamInfo(data.response);\n if (teamInfo?.teamId) return teamInfo.teamId;\n return data.args?.teamName || \"\";\n};\n\nconst safeGetTasks = (data: any): TaskItem[] => {\n if (!data) return [];\n const teamInfo = extractTeamInfo(data.response);\n if (teamInfo?.tasks && Array.isArray(teamInfo.tasks)) {\n return teamInfo.tasks.filter((t) => t && t.id);\n }\n const args = data.args;\n if (args?.tasks && Array.isArray(args.tasks)) {\n return args.tasks.filter((t: TaskItem) => t && t.id);\n }\n return [];\n};\n\nconst TeamGraph: React.FC<TeamGraphProps> = ({ data }) => {\n const teammates = safeGetTeammates(data);\n const tasks = safeGetTasks(data);\n const teamId = safeGetTeamId(data);\n const openSideApp = useSideAppOpener();\n const { threadId, assistantId } = useAgentChat();\n\n const colors = [\n \"#1890ff\",\n \"#52c41a\",\n \"#faad14\",\n \"#f5222d\",\n \"#722ed1\",\n \"#13c2c2\",\n \"#eb2f96\",\n \"#fa8c16\",\n ];\n\n const getBadgeColor = (name: string): string => {\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n };\n\n const getInitials = (name: string): string => {\n return name\n .split(\" \")\n .map((n) => n.charAt(0))\n .join(\"\")\n .toUpperCase()\n .slice(0, 2);\n };\n\n const handleOpenWorkspace = () => {\n if (!teamId) return;\n openSideApp({\n component_key: \"team_workspace\",\n message: \"Teammates\",\n data: {\n teamId,\n teammates,\n parent_thread_id: threadId,\n },\n context: {\n thread_id: threadId,\n assistant_id: assistantId,\n },\n });\n };\n\n const showWorkbench = !!teamId && teammates.length > 0;\n\n if (teammates.length === 0) {\n return (\n <Card style={{ width: \"100%\" }} bodyStyle={{ padding: 12 }}>\n <Skeleton active />\n </Card>\n );\n }\n\n return (\n <Card\n style={{ width: \"100%\" }}\n bodyStyle={{ padding: 12 }}\n title={\n <Space>\n <TeamOutlined />\n <span>Team Members</span>\n </Space>\n }\n extra={\n showWorkbench ? (\n <Button\n type=\"text\"\n icon={<Monitor size={16} />}\n onClick={handleOpenWorkspace}\n >\n Workbench\n </Button>\n ) : null\n }\n >\n <List\n dataSource={teammates}\n renderItem={(teammate) => (\n <List.Item style={{ display: \"block\" }}>\n <Space align=\"center\" size={12}>\n <Avatar\n size={40}\n icon={<UserOutlined />}\n src={teammate?.avatar}\n style={{\n backgroundColor: getBadgeColor(teammate?.name || \"\"),\n color: \"#fff\",\n fontSize: 14,\n fontWeight: 600,\n }}\n >\n {getInitials(teammate?.name || \"\")}\n </Avatar>\n <div style={{ flex: 1 }}>\n <Text strong style={{ display: \"block\" }}>\n {teammate?.name || \"Unnamed\"}\n </Text>\n <Tag\n color=\"blue\"\n style={{ margin: 0, marginTop: 4 }}\n >\n {teammate?.role || \"unknown\"}\n </Tag>\n </div>\n </Space>\n {teammate?.description && (\n <Text type=\"secondary\" style={{ display: \"block\", marginTop: 8, fontSize: 12, marginLeft: 52 }}>\n {teammate.description}\n </Text>\n )}\n </List.Item>\n )}\n />\n {tasks.length > 0 && (\n <div style={{ marginTop: 16, paddingTop: 16, borderTop: \"1px solid #f0f0f0\" }}>\n <Text strong style={{ display: \"block\", marginBottom: 8 }}>\n Pending Tasks ({tasks.filter((t) => t.status === \"pending\").length})\n </Text>\n <List\n size=\"small\"\n dataSource={tasks.filter((t) => t.status === \"pending\")}\n renderItem={(task) => (\n <List.Item style={{ padding: \"8px 0\" }}>\n <div>\n <Text style={{ fontSize: 12, color: \"#7A7A7A\" }}>{task.id}</Text>\n <Text strong style={{ display: \"block\", fontSize: 13 }}>\n {task.title}\n </Text>\n {task.description && (\n <Text type=\"secondary\" style={{ fontSize: 11 }}>\n {task.description.length > 100\n ? task.description.slice(0, 100) + \"...\"\n : task.description}\n </Text>\n )}\n </div>\n </List.Item>\n )}\n />\n </div>\n )}\n </Card>\n );\n};\n\nexport default TeamGraph;\n","import React, { useMemo } from \"react\";\nimport { ElementProps } from \"../types\";\nimport { TaskBoardCard } from \"./TaskBoardCard\";\nimport { useAgentChat } from \"@hooks/useAgentChat\";\n\nexport type TaskStatus = \"pending\" | \"in_progress\" | \"completed\" | \"failed\";\n\nexport interface Task {\n id: string;\n title: string;\n description: string;\n status: TaskStatus;\n assignee?: string;\n dependencies: string[];\n result?: string;\n error?: string;\n}\n\nexport interface TaskBoardData {\n teamId?: string;\n tasks: Task[];\n teammates?: string[];\n onAddTask?: () => void;\n}\n\ninterface Column {\n id: TaskStatus;\n title: string;\n color: string;\n}\n\nconst COLUMNS: Column[] = [\n { id: \"pending\", title: \"Pending\", color: \"#7A7A7A\" },\n { id: \"in_progress\", title: \"In Progress\", color: \"#E42313\" },\n { id: \"completed\", title: \"Completed\", color: \"#22C55E\" },\n { id: \"failed\", title: \"Failed\", color: \"#f5222d\" },\n];\n\nconst useStyle = () => {\n return {\n container: {\n background: \"#FFFFFF\",\n padding: \"40px 48px\",\n gap: \"32px\",\n display: \"flex\",\n flexDirection: \"column\" as const,\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n },\n header: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n height: \"80px\",\n },\n titleSection: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: \"4px\",\n },\n pageTitle: {\n fontFamily: \"'Space Grotesk', sans-serif\",\n fontSize: \"40px\",\n fontWeight: 500,\n color: \"#0D0D0D\",\n letterSpacing: \"-1px\",\n margin: 0,\n },\n pageSubtitle: {\n fontFamily: \"'Inter', sans-serif\",\n fontSize: \"14px\",\n color: \"#7A7A7A\",\n margin: 0,\n },\n actions: {\n display: \"flex\",\n gap: \"12px\",\n },\n addButton: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n width: \"120px\",\n height: \"40px\",\n background: \"#0D0D0D\",\n color: \"#FFFFFF\",\n border: \"none\",\n borderRadius: \"0px\",\n fontFamily: \"'Space Grotesk', sans-serif\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: \"pointer\",\n },\n boardContainer: {\n display: \"flex\",\n gap: \"24px\",\n overflowX: \"auto\" as const,\n paddingBottom: \"16px\",\n },\n column: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: \"16px\",\n minWidth: \"320px\",\n maxWidth: \"320px\",\n },\n columnHeader: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n height: \"40px\",\n },\n columnTitle: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n },\n statusDot: {\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"0px\",\n },\n columnLabel: {\n fontFamily: \"'Space Grotesk', sans-serif\",\n fontSize: \"14px\",\n fontWeight: 600,\n color: \"#0D0D0D\",\n margin: 0,\n },\n columnCount: {\n fontFamily: \"'Inter', sans-serif\",\n fontSize: \"12px\",\n color: \"#7A7A7A\",\n },\n emptyColumn: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"120px\",\n border: \"1px dashed #E8E8E8\",\n color: \"#B0B0B0\",\n fontSize: \"13px\",\n },\n };\n};\n\nexport const TaskBoard: React.FC<ElementProps<TaskBoardData>> = ({\n data,\n}) => {\n const styles = useStyle();\n const { tasks: contextTasks } = useAgentChat();\n const { tasks: propTasks, onAddTask, teammates } = data || {};\n const tasks = contextTasks || propTasks || [];\n\n const tasksByStatus = useMemo(() => {\n const grouped: Record<TaskStatus, Task[]> = {\n pending: [],\n in_progress: [],\n completed: [],\n failed: [],\n };\n\n tasks?.forEach((task) => {\n if (grouped[task.status]) {\n grouped[task.status].push(task);\n }\n });\n\n return grouped;\n }, [tasks]);\n\n const getAllTaskIds = () => {\n return new Set(tasks?.map((t) => t.id) || []);\n };\n\n const allTaskIds = getAllTaskIds();\n\n const getDependencyStatus = (depId: string): boolean => {\n const depTask = tasks?.find((t) => t.id === depId);\n return depTask?.status === \"completed\";\n };\n\n const handleAddTask = () => {\n if (onAddTask) {\n onAddTask();\n }\n };\n\n return (\n <div style={styles.container}>\n {/* Header */}\n <div style={styles.header}>\n <div style={styles.titleSection}>\n <h1 style={styles.pageTitle}>Task Board</h1>\n <p style={styles.pageSubtitle}>Track team progress and task status</p>\n </div>\n <div style={styles.actions}>\n <button style={styles.addButton} onClick={handleAddTask}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n Add Task\n </button>\n </div>\n </div>\n\n {/* Board */}\n <div style={styles.boardContainer}>\n {COLUMNS.map((column) => {\n const columnTasks = tasksByStatus[column.id] || [];\n \n return (\n <div key={column.id} style={styles.column}>\n {/* Column Header */}\n <div style={styles.columnHeader}>\n <div style={styles.columnTitle}>\n <div style={{ ...styles.statusDot, background: column.color }} />\n <span style={styles.columnLabel}>{column.title}</span>\n </div>\n <span style={styles.columnCount}>{columnTasks.length}</span>\n </div>\n\n {/* Tasks */}\n {columnTasks.length > 0 ? (\n columnTasks.map((task) => (\n <TaskBoardCard\n key={task.id}\n task={task}\n allTaskIds={allTaskIds}\n getDependencyStatus={getDependencyStatus}\n />\n ))\n ) : (\n <div style={styles.emptyColumn}>No tasks</div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport { Task, TaskStatus } from \"./TaskBoard\";\n\ninterface TaskBoardCardProps {\n task: Task;\n allTaskIds: Set<string>;\n getDependencyStatus: (depId: string) => boolean;\n}\n\nconst useStyle = (status: TaskStatus, isCompleted: boolean) => {\n return {\n card: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: \"8px\",\n padding: \"16px\",\n background: isCompleted ? \"#FAFAFA\" : \"#FFFFFF\",\n border: \"1px solid #E8E8E8\",\n borderRadius: \"0px\",\n cursor: \"pointer\",\n transition: \"border-color 0.2s ease\",\n maxWidth: \"100%\",\n overflow: \"hidden\",\n },\n header: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n },\n taskId: {\n fontFamily: \"'Space Grotesk', sans-serif\",\n fontSize: \"12px\",\n fontWeight: 500,\n color: \"#7A7A7A\",\n },\n assignee: {\n fontFamily: \"'Inter', sans-serif\",\n fontSize: \"11px\",\n fontWeight: 500,\n color: status === \"completed\" ? \"#22C55E\" : \"#E42313\",\n },\n title: {\n fontFamily: \"'Space Grotesk', sans-serif\",\n fontSize: \"14px\",\n fontWeight: 500,\n color: \"#0D0D0D\",\n margin: 0,\n lineHeight: 1.4,\n },\n description: {\n fontFamily: \"'Inter', sans-serif\",\n fontSize: \"12px\",\n color: \"#7A7A7A\",\n margin: 0,\n lineHeight: 1.4,\n },\n depRow: {\n display: \"flex\",\n flexWrap: \"wrap\" as const,\n alignItems: \"center\",\n gap: \"4px\",\n marginTop: \"4px\",\n },\n depLabel: {\n fontFamily: \"'Inter', sans-serif\",\n fontSize: \"11px\",\n color: \"#B0B0B0\",\n },\n depBadge: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n padding: \"2px 6px\",\n fontSize: \"10px\",\n borderRadius: \"0px\",\n },\n depBadgeCompleted: {\n background: \"#22C55E\",\n border: \"1px solid #22C55E\",\n color: \"#FFFFFF\",\n },\n depBadgePending: {\n background: \"transparent\",\n border: \"1px solid #E8E8E8\",\n color: \"#7A7A7A\",\n },\n depBadgeInvalid: {\n background: \"transparent\",\n border: \"1px solid #f5222d\",\n color: \"#f5222d\",\n },\n checkIcon: {\n width: \"10px\",\n height: \"10px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n circleIcon: {\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"50%\",\n background: \"#7A7A7A\",\n },\n };\n};\n\nconst CheckIcon: React.FC = () => (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\">\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n);\n\nconst CircleIcon: React.FC = () => (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n </svg>\n);\n\nexport const TaskBoardCard: React.FC<TaskBoardCardProps> = ({\n task,\n allTaskIds,\n getDependencyStatus,\n}) => {\n const isCompleted = task.status === \"completed\";\n const styles = useStyle(task.status, isCompleted);\n\n const renderDependencyBadges = () => {\n if (!task.dependencies || task.dependencies.length === 0) {\n return (\n <span style={{ ...styles.depLabel, color: \"#7A7A7A\" }}>none</span>\n );\n }\n\n return task.dependencies.map((depId) => {\n const isValidDep = allTaskIds.has(depId);\n const isDepCompleted = isValidDep ? getDependencyStatus(depId) : false;\n\n let badgeStyle = styles.depBadgePending;\n if (!isValidDep) {\n badgeStyle = styles.depBadgeInvalid;\n } else if (isDepCompleted) {\n badgeStyle = styles.depBadgeCompleted;\n }\n\n return (\n <span\n key={depId}\n style={{\n ...styles.depBadge,\n ...badgeStyle,\n marginRight: \"4px\",\n }}\n >\n <span style={styles.checkIcon}>\n {isValidDep && isDepCompleted ? <CheckIcon /> : isValidDep ? <CircleIcon /> : null}\n </span>\n {depId}\n </span>\n );\n });\n };\n\n return (\n <div style={styles.card}>\n {/* Header */}\n <div style={styles.header}>\n <span style={styles.taskId}>{task.id}</span>\n {task.assignee && (\n <span style={styles.assignee}>@{task.assignee}</span>\n )}\n </div>\n\n {/* Title */}\n <h3 style={styles.title}>{task.title}</h3>\n\n {/* Description */}\n {task.description && (\n <p style={styles.description}>{task.description}</p>\n )}\n\n {/* Dependencies */}\n <div style={styles.depRow}>\n <span style={styles.depLabel}>Deps:</span>\n {renderDependencyBadges()}\n </div>\n </div>\n );\n};\n","import React, { useState, useMemo, useRef, useEffect } from \"react\";\nimport { ElementProps } from \"../types\";\n\nexport type MessageType = \"info\" | \"request\" | \"response\" | \"status_update\";\n\nexport interface MailboxMessage {\n id: string;\n from: string;\n to: string;\n content: string;\n timestamp: Date;\n type: MessageType;\n read: boolean;\n}\n\nexport interface Teammate {\n name: string;\n role: string;\n status?: \"online\" | \"away\" | \"offline\";\n}\n\nexport interface TeamChatData {\n teamId?: string;\n teamName?: string;\n currentUser: string;\n teammates: Teammate[];\n messages: MailboxMessage[];\n onSendMessage?: (content: string) => void;\n}\n\nconst useStyle = () => {\n return {\n container: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n height: \"100%\",\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n background: \"#FFFFFF\",\n },\n header: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n height: \"60px\",\n padding: \"0 24px\",\n borderBottom: \"1px solid #E8E8E8\",\n },\n titleSection: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: \"2px\",\n },\n teamName: {\n fontFamily: \"'Space Grotesk', sans-serif\",\n fontSize: \"18px\",\n fontWeight: 600,\n color: \"#0D0D0D\",\n margin: 0,\n },\n teamDesc: {\n fontFamily: \"'Inter', sans-serif\",\n fontSize: \"12px\",\n color: \"#7A7A7A\",\n margin: 0,\n },\n mainContainer: {\n display: \"flex\",\n flex: 1,\n overflow: \"hidden\",\n },\n sidebar: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n width: \"260px\",\n borderRight: \"1px solid #E8E8E8\",\n background: \"#FAFAFA\",\n overflow: \"auto\" as const,\n },\n sidebarHeader: {\n padding: \"16px\",\n borderBottom: \"1px solid #E8E8E8\",\n },\n sidebarTitle: {\n fontFamily: \"'Space Grotesk', sans-serif\",\n fontSize: \"14px\",\n fontWeight: 600,\n color: \"#0D0D0D\",\n margin: 0,\n },\n member: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n padding: \"8px 16px\",\n cursor: \"pointer\",\n },\n memberHover: {\n background: \"#F0F0F0\",\n },\n avatar: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"32px\",\n height: \"32px\",\n flexShrink: 0,\n },\n avatarText: {\n fontFamily: \"'Space Grotesk', sans-serif\",\n fontSize: \"11px\",\n fontWeight: 600,\n color: \"#FFFFFF\",\n },\n memberInfo: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: \"0px\",\n minWidth: 0,\n },\n memberName: {\n fontFamily: \"'Space Grotesk', sans-serif\",\n fontSize: \"13px\",\n fontWeight: 500,\n color: \"#0D0D0D\",\n margin: 0,\n },\n memberRole: {\n fontFamily: \"'Inter', sans-serif\",\n fontSize: \"11px\",\n color: \"#7A7A7A\",\n margin: 0,\n },\n statusDot: {\n width: \"8px\",\n height: \"8px\",\n marginLeft: \"auto\",\n },\n chatArea: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n flex: 1,\n overflow: \"hidden\",\n },\n messages: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: \"16px\",\n padding: \"24px\",\n flex: 1,\n overflow: \"auto\" as const,\n },\n message: {\n display: \"flex\",\n gap: \"12px\",\n alignItems: \"flex-start\",\n },\n messageSelf: {\n justifyContent: \"flex-end\",\n },\n messageBubble: {\n maxWidth: \"400px\",\n padding: \"12px\",\n },\n messageContent: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: \"4px\",\n flex: 1,\n },\n messageHeader: {\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"center\",\n },\n senderName: {\n fontFamily: \"'Space Grotesk', sans-serif\",\n fontSize: \"13px\",\n fontWeight: 600,\n color: \"#0D0D0D\",\n margin: 0,\n },\n senderNameSelf: {\n color: \"#FFFFFF\",\n },\n messageTime: {\n fontFamily: \"'Inter', sans-serif\",\n fontSize: \"11px\",\n color: \"#7A7A7A\",\n margin: 0,\n },\n messageTimeSelf: {\n color: \"#B0B0B0\",\n },\n messageText: {\n fontFamily: \"'Inter', sans-serif\",\n fontSize: \"13px\",\n color: \"#0D0D0D\",\n lineHeight: 1.5,\n margin: 0,\n },\n messageTextSelf: {\n color: \"#FFFFFF\",\n },\n inputArea: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n padding: \"12px 24px\",\n borderTop: \"1px solid #E8E8E8\",\n background: \"#FFFFFF\",\n },\n input: {\n display: \"flex\",\n alignItems: \"center\",\n flex: 1,\n height: \"40px\",\n padding: \"0 16px\",\n gap: \"8px\",\n border: \"1px solid #E8E8E8\",\n },\n inputText: {\n flex: 1,\n border: \"none\",\n outline: \"none\",\n fontFamily: \"'Inter', sans-serif\",\n fontSize: \"13px\",\n background: \"transparent\",\n },\n placeholder: {\n color: \"#B0B0B0\",\n fontFamily: \"'Inter', sans-serif\",\n fontSize: \"13px\",\n },\n sendButton: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n width: \"80px\",\n height: \"40px\",\n background: \"#0D0D0D\",\n border: \"none\",\n cursor: \"pointer\",\n },\n sendText: {\n fontFamily: \"'Space Grotesk', sans-serif\",\n fontSize: \"13px\",\n fontWeight: 500,\n color: \"#FFFFFF\",\n },\n mention: {\n color: \"#E42313\",\n fontWeight: 500,\n },\n };\n};\n\nconst COLORS = [\n \"#1890ff\",\n \"#52c41a\",\n \"#faad14\",\n \"#f5222d\",\n \"#722ed1\",\n \"#13c2c2\",\n \"#eb2f96\",\n \"#fa8c16\",\n];\n\nconst STATUS_COLORS = {\n online: \"#22C55E\",\n away: \"#faad14\",\n offline: \"#7A7A7A\",\n};\n\nconst getAvatarColor = (name: string): string => {\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return COLORS[Math.abs(hash) % COLORS.length];\n};\n\nconst getInitials = (name: string): string => {\n return name\n .split(/[\\s_-]/)\n .map((n) => n.charAt(0))\n .join(\"\")\n .toUpperCase()\n .slice(0, 2);\n};\n\nconst formatTime = (date: Date): string => {\n const d = new Date(date);\n return d.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n};\n\nconst renderMessageWithMentions = (content: string, mentions: string[], styles: any) => {\n if (mentions.length === 0) {\n return <span style={styles.messageText}>{content}</span>;\n }\n\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n\n mentions.forEach((mention) => {\n const index = content.indexOf(`@${mention}`);\n if (index !== -1) {\n if (index > lastIndex) {\n parts.push(content.slice(lastIndex, index));\n }\n parts.push(\n <span key={mention} style={styles.mention}>\n @{mention}\n </span>\n );\n lastIndex = index + mention.length + 1;\n }\n });\n\n if (lastIndex < content.length) {\n parts.push(content.slice(lastIndex));\n }\n\n return <span style={styles.messageText}>{parts}</span>;\n};\n\nexport const TeamChat: React.FC<ElementProps<TeamChatData>> = ({ data }) => {\n const styles = useStyle();\n const { teamName, currentUser, teammates, messages, onSendMessage } = data || {};\n const [inputValue, setInputValue] = useState(\"\");\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n const sortedMessages = useMemo(() => {\n return [...(messages || [])].sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n );\n }, [messages]);\n\n const mentions = useMemo(() => {\n return teammates?.map((t) => t.name) || [];\n }, [teammates]);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [sortedMessages]);\n\n const handleSend = () => {\n if (inputValue.trim() && onSendMessage) {\n onSendMessage(inputValue.trim());\n setInputValue(\"\");\n }\n };\n\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n const getStatusColor = (status?: string) => {\n return STATUS_COLORS[status as keyof typeof STATUS_COLORS] || STATUS_COLORS.offline;\n };\n\n return (\n <div style={styles.container}>\n {/* Header */}\n <div style={styles.header}>\n <div style={styles.titleSection}>\n <h2 style={styles.teamName}>{teamName || \"Team Chat\"}</h2>\n <p style={styles.teamDesc}>\n {teammates?.length || 0} member{teammates?.length !== 1 ? \"s\" : \"\"}\n </p>\n </div>\n </div>\n\n {/* Main Container */}\n <div style={styles.mainContainer}>\n {/* Sidebar - Team Members */}\n <div style={styles.sidebar}>\n <div style={styles.sidebarHeader}>\n <p style={styles.sidebarTitle}>Team Members</p>\n </div>\n {teammates?.map((member) => (\n <div key={member.name} style={styles.member}>\n <div\n style={{\n ...styles.avatar,\n background: getAvatarColor(member.name),\n }}\n >\n <span style={styles.avatarText}>\n {getInitials(member.name)}\n </span>\n </div>\n <div style={styles.memberInfo}>\n <p style={styles.memberName}>\n {member.name}\n {member.name === currentUser && \" (You)\"}\n </p>\n <p style={styles.memberRole}>{member.role}</p>\n </div>\n <div\n style={{\n ...styles.statusDot,\n background: getStatusColor(member.status),\n }}\n />\n </div>\n ))}\n </div>\n\n {/* Chat Area */}\n <div style={styles.chatArea}>\n {/* Messages */}\n <div style={styles.messages}>\n {sortedMessages.map((msg) => {\n const isSelf = msg.from === currentUser;\n return (\n <div\n key={msg.id}\n style={{\n ...styles.message,\n ...(isSelf ? styles.messageSelf : {}),\n }}\n >\n {!isSelf && (\n <div\n style={{\n ...styles.avatar,\n background: getAvatarColor(msg.from),\n }}\n >\n <span style={styles.avatarText}>\n {getInitials(msg.from)}\n </span>\n </div>\n )}\n <div\n style={{\n ...styles.messageContent,\n ...(isSelf ? { alignItems: \"flex-end\" } : {}),\n }}\n >\n <div style={styles.messageHeader}>\n <span\n style={{\n ...styles.senderName,\n ...(isSelf ? styles.senderNameSelf : {}),\n }}\n >\n {isSelf ? \"You\" : msg.from}\n </span>\n <span\n style={{\n ...styles.messageTime,\n ...(isSelf ? styles.messageTimeSelf : {}),\n }}\n >\n {formatTime(msg.timestamp)}\n </span>\n </div>\n {isSelf ? (\n <div\n style={{\n ...styles.messageBubble,\n ...styles.messageTextSelf,\n background: \"#0D0D0D\",\n }}\n >\n {renderMessageWithMentions(msg.content, mentions, styles)}\n </div>\n ) : (\n renderMessageWithMentions(msg.content, mentions, styles)\n )}\n </div>\n </div>\n );\n })}\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input Area */}\n <div style={styles.inputArea}>\n <div style={styles.input}>\n <input\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyPress={handleKeyPress}\n placeholder=\"Type a message... (@mention someone)\"\n style={styles.inputText}\n />\n </div>\n <button style={styles.sendButton} onClick={handleSend}>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>\n </svg>\n <span style={styles.sendText}>Send</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React, { useState, useMemo } from \"react\";\nimport { Typography, Badge, Empty, Tooltip } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport {\n ChevronDown,\n ChevronRight,\n Mail,\n Circle,\n} from \"lucide-react\";\nimport { MailboxDetailModal } from \"./MailboxDetailModal\";\n\nexport interface MailboxMessage {\n id: string;\n from: string;\n to: string;\n content: string;\n timestamp: string;\n type: string;\n read: boolean;\n}\n\nconst { Title, Text } = Typography;\n\nconst useStyles = createStyles(({ token, css }) => ({\n container: css`\n padding: ${token.paddingLG}px;\n height: 100%;\n display: flex;\n flex-direction: column;\n `,\n header: css`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: ${token.marginLG}px;\n `,\n title: css`\n margin: 0 !important;\n font-family: \"Space Grotesk\", sans-serif;\n `,\n content: css`\n flex: 1;\n overflow: auto;\n `,\n // List styles matching IssuesView\n listContainer: css`\n border: 1px solid ${token.colorBorderSecondary};\n border-radius: ${token.borderRadiusLG}px;\n overflow: hidden;\n `,\n listGroup: css`\n border-bottom: 1px solid ${token.colorBorderSecondary};\n \n &:last-child {\n border-bottom: none;\n }\n `,\n listGroupHeader: css`\n display: flex;\n align-items: center;\n gap: ${token.marginSM}px;\n padding: ${token.paddingSM}px ${token.paddingMD}px;\n background: ${token.colorBgLayout};\n cursor: pointer;\n user-select: none;\n \n &:hover {\n background: ${token.colorBgTextHover};\n }\n `,\n listGroupAvatar: css`\n width: 24px;\n height: 24px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n font-weight: 600;\n color: #fff;\n flex-shrink: 0;\n `,\n listGroupTitle: css`\n font-weight: 600;\n font-size: 13px;\n color: ${token.colorText};\n `,\n listGroupCount: css`\n font-size: 12px;\n color: ${token.colorTextSecondary};\n margin-left: auto;\n `,\n listGroupContent: css`\n background: ${token.colorBgContainer};\n `,\n listItem: css`\n display: flex;\n align-items: center;\n gap: ${token.marginMD}px;\n padding: ${token.paddingSM}px ${token.paddingMD}px;\n border-bottom: 1px solid ${token.colorBorderSecondary};\n cursor: pointer;\n transition: background 0.2s ease;\n \n &:hover {\n background: ${token.colorBgTextHover};\n }\n \n &:last-child {\n border-bottom: none;\n }\n `,\n listItemUnread: css`\n background: ${token.colorPrimaryBg};\n \n &:hover {\n background: ${token.colorPrimaryBgHover};\n }\n `,\n listItemIcon: css`\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n `,\n listItemContent: css`\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n `,\n listItemPreview: css`\n font-size: 14px;\n color: ${token.colorText};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n listItemMeta: css`\n font-size: 12px;\n color: ${token.colorTextTertiary};\n `,\n listItemRight: css`\n display: flex;\n align-items: center;\n gap: ${token.marginSM}px;\n flex-shrink: 0;\n `,\n listItemDate: css`\n font-size: 12px;\n color: ${token.colorTextTertiary};\n width: 80px;\n text-align: right;\n `,\n unreadBadge: css`\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: ${token.colorError};\n flex-shrink: 0;\n `,\n emptyState: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: ${token.colorTextSecondary};\n `,\n}));\n\ninterface MailboxPanelProps {\n data: {\n teamMailbox: MailboxMessage[];\n team: {\n teamId: string;\n teamLeadId: string;\n teammates: { name: string; role: string; description?: string }[];\n };\n };\n}\n\ninterface MessageGroup {\n sender: string;\n messages: MailboxMessage[];\n unreadCount: number;\n}\n\nconst getInitials = (name: string): string => {\n return name\n .split(/[\\s_-]/)\n .map((n) => n.charAt(0))\n .join(\"\")\n .toUpperCase()\n .slice(0, 2);\n};\n\nconst getAvatarColor = (name: string): string => {\n const colors = [\n \"#1890ff\",\n \"#52c41a\",\n \"#faad14\",\n \"#f5222d\",\n \"#722ed1\",\n \"#13c2c2\",\n \"#eb2f96\",\n \"#fa8c16\",\n ];\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n};\n\nconst formatDate = (timestamp: string): string => {\n const date = new Date(timestamp);\n const now = new Date();\n const diffDays = Math.floor((now.getTime() - date.getTime()) / (1000 * 60 * 60 * 24));\n \n if (diffDays === 0) {\n return date.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n } else if (diffDays === 1) {\n return \"Yesterday\";\n } else if (diffDays < 7) {\n return date.toLocaleDateString([], { weekday: \"short\" });\n } else {\n return date.toLocaleDateString([], { month: \"short\", day: \"numeric\" });\n }\n};\n\nconst getMessagePreview = (content: string): string => {\n const firstLine = content.split(\"\\n\")[0];\n return firstLine.length > 80 ? firstLine.slice(0, 80) + \"...\" : firstLine;\n};\n\n// List Group Component\nconst MessageGroupComponent: React.FC<{\n group: MessageGroup;\n styles: any;\n defaultExpanded?: boolean;\n onMessageClick: (message: MailboxMessage) => void;\n}> = ({ group, styles, defaultExpanded = true, onMessageClick }) => {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n\n return (\n <div className={styles.listGroup}>\n <div\n className={styles.listGroupHeader}\n onClick={() => setIsExpanded(!isExpanded)}\n >\n {isExpanded ? (\n <ChevronDown size={16} />\n ) : (\n <ChevronRight size={16} />\n )}\n <div\n className={styles.listGroupAvatar}\n style={{ background: getAvatarColor(group.sender) }}\n >\n {getInitials(group.sender)}\n </div>\n <span className={styles.listGroupTitle}>{group.sender}</span>\n <span className={styles.listGroupCount}>\n {group.messages.length} messages\n {group.unreadCount > 0 && (\n <span style={{ color: \"#ff4d4f\", marginLeft: 8 }}>\n ({group.unreadCount} unread)\n </span>\n )}\n </span>\n </div>\n {isExpanded && (\n <div className={styles.listGroupContent}>\n {group.messages.map((message) => (\n <div\n key={message.id}\n className={`${styles.listItem} ${!message.read ? styles.listItemUnread : \"\"}`}\n onClick={() => onMessageClick(message)}\n >\n <div className={styles.listItemIcon}>\n {!message.read ? (\n <div className={styles.unreadBadge} />\n ) : (\n <Circle size={8} style={{ color: \"#d9d9d9\" }} />\n )}\n </div>\n <div className={styles.listItemContent}>\n <span className={styles.listItemPreview}>\n {getMessagePreview(message.content)}\n </span>\n <span className={styles.listItemMeta}>\n To: {message.to} • {message.type}\n </span>\n </div>\n <div className={styles.listItemRight}>\n <span className={styles.listItemDate}>\n {formatDate(message.timestamp)}\n </span>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport const MailboxPanel: React.FC<MailboxPanelProps> = ({ data }) => {\n const { styles } = useStyles();\n const [selectedMessage, setSelectedMessage] = useState<MailboxMessage | null>(null);\n const [modalVisible, setModalVisible] = useState(false);\n\n const { teamMailbox = [] } = data || {};\n\n // Group messages by sender\n const messageGroups: MessageGroup[] = useMemo(() => {\n const groupsMap = new Map<string, MailboxMessage[]>();\n\n teamMailbox.forEach((message) => {\n const sender = message.from;\n if (!groupsMap.has(sender)) {\n groupsMap.set(sender, []);\n }\n groupsMap.get(sender)!.push(message);\n });\n\n // Convert to array and calculate unread counts\n const groups: MessageGroup[] = Array.from(groupsMap.entries())\n .map(([sender, messages]) => ({\n sender,\n messages: messages.sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n ),\n unreadCount: messages.filter((m) => !m.read).length,\n }))\n .sort((a, b) => {\n // Sort by unread count first, then by total messages\n if (a.unreadCount !== b.unreadCount) {\n return b.unreadCount - a.unreadCount;\n }\n return b.messages.length - a.messages.length;\n });\n\n return groups;\n }, [teamMailbox]);\n\n const totalUnread = teamMailbox.filter((m) => !m.read).length;\n\n const handleMessageClick = (message: MailboxMessage) => {\n setSelectedMessage(message);\n setModalVisible(true);\n };\n\n const handleCloseModal = () => {\n setModalVisible(false);\n setSelectedMessage(null);\n };\n\n return (\n <div className={styles.container}>\n <div className={styles.header}>\n <div>\n <Title level={3} className={styles.title}>\n <Mail size={20} style={{ marginRight: 8, verticalAlign: \"middle\" }} />\n Mailbox\n </Title>\n <Text type=\"secondary\">\n {teamMailbox.length} messages • {messageGroups.length} senders\n {totalUnread > 0 && ` • ${totalUnread} unread`}\n </Text>\n </div>\n </div>\n\n <div className={styles.content}>\n {teamMailbox.length === 0 ? (\n <div className={styles.emptyState}>\n <Empty description=\"No messages\" />\n </div>\n ) : (\n <div className={styles.listContainer}>\n {messageGroups.map((group) => (\n <MessageGroupComponent\n key={group.sender}\n group={group}\n styles={styles}\n defaultExpanded={group.unreadCount > 0}\n onMessageClick={handleMessageClick}\n />\n ))}\n </div>\n )}\n </div>\n\n <MailboxDetailModal\n message={selectedMessage}\n visible={modalVisible}\n onClose={handleCloseModal}\n />\n </div>\n );\n};\n\nexport default MailboxPanel;\n","import React from \"react\";\nimport { Modal, Typography, Tag, Divider } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { Mail, Calendar, User, ArrowRight } from \"lucide-react\";\nimport type { MailboxMessage } from \"./MailboxPanel\";\n\nconst { Title, Text, Paragraph } = Typography;\n\nconst useStyles = createStyles(({ token, css }) => ({\n modalContent: css`\n padding: 0;\n `,\n header: css`\n display: flex;\n align-items: center;\n gap: ${token.marginSM}px;\n margin-bottom: ${token.marginMD}px;\n `,\n messageIcon: css`\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${token.colorPrimary};\n `,\n messageId: css`\n font-family: \"Space Grotesk\", sans-serif;\n font-size: 14px;\n color: ${token.colorTextSecondary};\n font-weight: 500;\n `,\n title: css`\n font-family: \"Space Grotesk\", sans-serif;\n font-size: 20px;\n font-weight: 600;\n margin: ${token.marginMD}px 0 !important;\n line-height: 1.3;\n `,\n metaSection: css`\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: ${token.marginMD}px;\n margin-bottom: ${token.marginLG}px;\n padding: ${token.paddingMD}px;\n background: ${token.colorBgLayout};\n border-radius: ${token.borderRadius}px;\n `,\n metaItem: css`\n display: flex;\n flex-direction: column;\n gap: ${token.marginXS}px;\n `,\n metaLabel: css`\n font-size: 12px;\n color: ${token.colorTextTertiary};\n text-transform: uppercase;\n letter-spacing: 0.5px;\n font-weight: 500;\n `,\n metaValue: css`\n font-size: 14px;\n color: ${token.colorText};\n display: flex;\n align-items: center;\n gap: ${token.marginXS}px;\n `,\n avatar: css`\n width: 24px;\n height: 24px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n font-weight: 600;\n color: #fff;\n `,\n contentSection: css`\n margin-top: ${token.marginLG}px;\n `,\n contentLabel: css`\n font-size: 12px;\n color: ${token.colorTextTertiary};\n text-transform: uppercase;\n letter-spacing: 0.5px;\n font-weight: 500;\n margin-bottom: ${token.marginSM}px;\n `,\n contentBox: css`\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorBorderSecondary};\n border-radius: ${token.borderRadius}px;\n padding: ${token.paddingLG}px;\n `,\n messageContent: css`\n font-size: 14px;\n line-height: 1.8;\n color: ${token.colorText};\n white-space: pre-wrap;\n word-break: break-word;\n `,\n typeTag: css`\n margin-top: ${token.marginMD}px;\n `,\n}));\n\ninterface MailboxDetailModalProps {\n message: MailboxMessage | null;\n visible: boolean;\n onClose: () => void;\n}\n\nconst getInitials = (name: string): string => {\n return name\n .split(/[\\s_-]/)\n .map((n) => n.charAt(0))\n .join(\"\")\n .toUpperCase()\n .slice(0, 2);\n};\n\nconst getAvatarColor = (name: string): string => {\n const colors = [\n \"#1890ff\",\n \"#52c41a\",\n \"#faad14\",\n \"#f5222d\",\n \"#722ed1\",\n \"#13c2c2\",\n \"#eb2f96\",\n \"#fa8c16\",\n ];\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n};\n\nconst formatDate = (timestamp: string): string => {\n const date = new Date(timestamp);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n};\n\nexport const MailboxDetailModal: React.FC<MailboxDetailModalProps> = ({\n message,\n visible,\n onClose,\n}) => {\n const { styles } = useStyles();\n\n if (!message) return null;\n\n return (\n <Modal\n title={null}\n open={visible}\n onCancel={onClose}\n footer={null}\n width={640}\n centered\n styles={{\n content: {\n borderRadius: 12,\n padding: 0,\n overflow: \"hidden\",\n },\n body: {\n padding: 24,\n },\n }}\n >\n <div className={styles.modalContent}>\n {/* Header */}\n <div className={styles.header}>\n <div className={styles.messageIcon}>\n <Mail size={20} />\n </div>\n <Text className={styles.messageId}>{message.id}</Text>\n {!message.read && (\n <Tag color=\"red\">Unread</Tag>\n )}\n </div>\n\n {/* Title */}\n <Title level={4} className={styles.title}>\n Message from {message.from}\n </Title>\n\n {/* Meta Info */}\n <div className={styles.metaSection}>\n <div className={styles.metaItem}>\n <Text className={styles.metaLabel}>From</Text>\n <div className={styles.metaValue}>\n <div\n className={styles.avatar}\n style={{ background: getAvatarColor(message.from) }}\n >\n {getInitials(message.from)}\n </div>\n <span>{message.from}</span>\n </div>\n </div>\n\n <div className={styles.metaItem}>\n <Text className={styles.metaLabel}>To</Text>\n <div className={styles.metaValue}>\n <div\n className={styles.avatar}\n style={{ background: getAvatarColor(message.to) }}\n >\n {getInitials(message.to)}\n </div>\n <span>{message.to}</span>\n </div>\n </div>\n\n <div className={styles.metaItem}>\n <Text className={styles.metaLabel}>Time</Text>\n <div className={styles.metaValue}>\n <Calendar size={14} />\n <span>{formatDate(message.timestamp)}</span>\n </div>\n </div>\n\n <div className={styles.metaItem}>\n <Text className={styles.metaLabel}>Type</Text>\n <div className={styles.metaValue}>\n <Tag color={message.type === \"broadcast\" ? \"blue\" : \"default\"}>\n {message.type}\n </Tag>\n </div>\n </div>\n </div>\n\n <Divider />\n\n {/* Content */}\n <div className={styles.contentSection}>\n <Text className={styles.contentLabel}>Message Content</Text>\n <div className={styles.contentBox}>\n <Paragraph className={styles.messageContent}>\n {message.content}\n </Paragraph>\n </div>\n </div>\n </div>\n </Modal>\n );\n};\n\nexport default MailboxDetailModal;\n","import React, { useCallback } from \"react\";\nimport { Button, message, Space, Typography } from \"antd\";\nimport { ExpandOutlined } from \"@ant-design/icons\";\nimport { ElementProps, ToolCallData } from \"../types\";\nimport { getFileIcon } from \"./getFileIcon\";\nimport { MDResponse } from \"../MDResponse\";\nimport { ContentPreviewCollapse } from \"./ContentPreviewCollapse\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\nimport StreamingHTMLRenderer from \"@streaming-html\";\nimport { useAgentChat } from \"@hooks\";\nimport { radius, colors } from \"../../../theme/axiom-tokens\";\n\nexport const ShowWidget: React.FC<ElementProps<ToolCallData>> = ({\n data,\n component_key,\n interactive = true,\n}) => {\n const toolCallData = data;\n const { title, loading_messages, widget_code } = toolCallData?.args || {};\n const openSideApp = useSideAppOpener();\n\n const { sendMessage } = useAgentChat();\n\n if (!toolCallData) {\n return null;\n }\n\n // Parse response to check completion status\n let isComplete = false;\n let finalHTML = widget_code || '';\n\n\n if (toolCallData?.response) {\n try {\n const responseObj = JSON.parse(toolCallData.response);\n if (toolCallData.status === 'success') {\n isComplete = true;\n finalHTML = responseObj.widget_code || widget_code || '';\n }\n } catch (e) {\n // Parsing failed, use widget_code\n console.warn('Failed to parse tool response:', e);\n }\n }\n const sendPrompt = useCallback((text: string) => {\n sendMessage({\n input: {\n message: text\n }\n });\n }, [sendMessage]);\n\n const handleOpenInSideApp = useCallback(() => {\n openSideApp({\n component_key: \"show_widget\",\n data: {\n widget_code: finalHTML,\n title: title || \"Widget\",\n },\n message: title || \"Widget\",\n });\n }, [openSideApp, finalHTML, title]);\n\n return (\n <div style={{ \n display: 'flex', \n flexDirection: 'column',\n borderRadius: radius.lg,\n overflow: 'hidden'\n }}>\n {isComplete && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '8px 12px',\n position: 'relative',\n }}\n >\n <Typography.Text\n strong\n style={{\n fontSize: '14px',\n color: colors.light.text,\n }}\n >\n {title || \"Widget\"}\n </Typography.Text>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ExpandOutlined />}\n onClick={handleOpenInSideApp}\n style={{\n position: 'absolute',\n right: 8,\n }}\n title=\"Open in side app\"\n />\n </div>\n )}\n <div style={{ position: 'relative', flex: 1 }}>\n <StreamingHTMLRenderer\n html={finalHTML}\n isComplete={isComplete}\n onError={(err) => console.error('Widget render error:', err)}\n onPrompt={sendPrompt}\n loadingMessages={loading_messages}\n />\n </div>\n </div>\n );\n};\n","import React, { useEffect, useRef, useCallback, useState } from 'react';\nimport { StreamingHTMLRendererProps, StreamingError } from './types';\nimport { generateIframeSrcdoc } from './IframeHTMLBridge';\nimport { radius, colors } from '../theme/axiom-tokens';\n\n/**\n * 流式 HTML 渲染器组件\n * 使用 iframe 架构安全地渲染可能不完整的 HTML 片段\n */\nexport const StreamingHTMLRenderer: React.FC<StreamingHTMLRendererProps> = ({\n html,\n className = '',\n isComplete = false,\n onError,\n onPrompt,\n title = 'Streaming HTML Content', loadingMessages\n}) => {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const prevHTMLRef = useRef<string>('');\n const isReadyRef = useRef<boolean>(false);\n const pendingChunksRef = useRef<string[]>([]);\n const isCompleteRef = useRef<boolean>(isComplete);\n const isScriptExecuted = useRef<boolean>(false);\n\n const [iframeHeight, setIframeHeight] = React.useState<number>(0);\n const [iframeWidth, setIframeWidth] = React.useState<number | undefined>(undefined);\n const [currentMessageIndex, setCurrentMessageIndex] = useState(0);\n const [showLoading, setShowLoading] = useState(true);\n\n // 同步 isComplete 到 ref\n useEffect(() => {\n isCompleteRef.current = isComplete;\n }, [isComplete]);\n\n /**\n * 处理 loading messages 轮播\n */\n useEffect(() => {\n // 如果 iframe 已经有内容,隐藏 loading\n if (iframeHeight > 0) {\n setShowLoading(false);\n return;\n }\n\n // 如果没有 loading messages,不显示 loading\n if (!loadingMessages || loadingMessages.length === 0) {\n setShowLoading(false);\n return;\n }\n\n // 显示 loading,开始轮播\n setShowLoading(true);\n\n if (loadingMessages.length === 1) {\n setCurrentMessageIndex(0);\n return;\n }\n\n // 多条消息时轮播,每条显示 1.5 秒\n const interval = setInterval(() => {\n setCurrentMessageIndex((prev) => {\n if (prev >= loadingMessages.length - 1) {\n // 到达最后一条,停止轮播\n clearInterval(interval);\n return prev;\n }\n return prev + 1;\n });\n }, 1500);\n\n return () => clearInterval(interval);\n }, [iframeHeight, loadingMessages]);\n\n /**\n * 执行 iframe 中的脚本\n */\n const executeScripts = useCallback(() => {\n if (isScriptExecuted.current) {\n console.log('[StreamingHTMLRenderer] scripts is executed');\n\n return;\n }\n console.log('[StreamingHTMLRenderer] Executing scripts...');\n const iframe = iframeRef.current;\n if (!iframe || !iframe.contentWindow) {\n console.log('[StreamingHTMLRenderer] No iframe or contentWindow');\n return;\n }\n\n try {\n console.log('[StreamingHTMLRenderer] Sending execute-scripts message');\n isScriptExecuted.current = true;\n iframe.contentWindow.postMessage(\n { type: 'execute-scripts' },\n '*'\n );\n } catch (error) {\n console.error('[StreamingHTMLRenderer] Failed to execute scripts:', error);\n const streamingError: StreamingError = {\n type: 'POSTMESSAGE_ERROR',\n message: error instanceof Error ? error.message : 'Failed to execute scripts in iframe'\n };\n onError?.(streamingError);\n }\n }, [onError]);\n\n /**\n * 发送 chunk 到 iframe\n */\n const sendChunk = useCallback((chunk: string) => {\n const iframe = iframeRef.current;\n if (!iframe || !iframe.contentWindow) {\n return;\n }\n\n if (!isReadyRef.current) {\n // 如果 iframe 还没准备好,将 chunk 加入队列\n console.log('[StreamingHTMLRenderer] Iframe not ready, queueing chunk');\n pendingChunksRef.current.push(chunk);\n return;\n }\n\n try {\n iframe.contentWindow.postMessage(\n { type: 'stream-chunk', chunk },\n '*'\n );\n } catch (error) {\n console.error('[StreamingHTMLRenderer] Failed to send chunk:', error);\n const streamingError: StreamingError = {\n type: 'POSTMESSAGE_ERROR',\n message: error instanceof Error ? error.message : 'Failed to send chunk to iframe'\n };\n onError?.(streamingError);\n }\n }, [onError]);\n\n /**\n * 处理来自 iframe 的消息\n */\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n // 验证消息来源\n const iframe = iframeRef.current;\n if (!iframe || event.source !== iframe.contentWindow) {\n return;\n }\n\n const message = event.data;\n if (!message || typeof message !== 'object') {\n return;\n }\n\n switch (message.type) {\n case 'iframe-ready':\n console.log('[StreamingHTMLRenderer] Iframe ready');\n isReadyRef.current = true;\n // 发送队列中的 pending chunks\n while (pendingChunksRef.current.length > 0) {\n const chunk = pendingChunksRef.current.shift();\n if (chunk) {\n sendChunk(chunk);\n }\n }\n // 如果 isComplete 已经为 true,立即执行脚本\n if (isCompleteRef.current) {\n executeScripts();\n }\n break;\n\n case 'iframe-height':\n if (typeof message.height === 'number' && message.height > 0) {\n setIframeHeight(message.height);\n }\n break;\n\n case 'iframe-error': {\n const streamingError: StreamingError = {\n type: 'RENDER_ERROR',\n message: message.error || 'Unknown iframe error'\n };\n onError?.(streamingError);\n break;\n }\n\n case 'widget-prompt':\n if (typeof message.text === 'string') {\n onPrompt?.(message.text);\n }\n break;\n\n case 'widget-open-link':\n if (typeof message.url === 'string') {\n // 默认行为:在新标签页打开链接\n window.open(message.url, '_blank', 'noopener,noreferrer');\n }\n break;\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [onError, onPrompt, sendChunk, executeScripts]);\n\n /**\n * 处理 HTML 变化\n */\n useEffect(() => {\n // 如果 HTML 没有变化,跳过\n if (html === prevHTMLRef.current) {\n return;\n }\n\n // 计算新增的 chunk\n const prevLength = prevHTMLRef.current.length;\n const newChunk = html.slice(prevLength);\n\n // 更新之前的 HTML 记录\n prevHTMLRef.current = html;\n\n // 发送新增内容\n if (newChunk) {\n sendChunk(newChunk);\n }\n }, [html, sendChunk]);\n\n /**\n * 处理 isComplete 变化\n */\n useEffect(() => {\n if (isComplete && isReadyRef.current) {\n executeScripts();\n }\n }, [isComplete, executeScripts]);\n\n /**\n * 监听祖先元素 .ant-bubble 的 resize\n */\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n // 向上查找最近的 .ant-bubble 祖先元素\n const antBubble = container.closest('.ant-bubble');\n if (!antBubble) {\n console.warn('[StreamingHTMLRenderer] .ant-bubble ancestor not found');\n return;\n }\n\n // 创建 ResizeObserver 监听 ant-bubble 的宽度变化\n resizeObserverRef.current = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const width = entry.contentRect.width;\n if (width > 0) {\n setIframeWidth(width);\n }\n }\n });\n\n resizeObserverRef.current.observe(antBubble);\n\n // 初始化时立即获取一次宽度\n const initialWidth = antBubble.getBoundingClientRect().width;\n if (initialWidth > 0) {\n setIframeWidth(initialWidth);\n }\n\n return () => {\n resizeObserverRef.current?.disconnect();\n resizeObserverRef.current = null;\n };\n }, []);\n\n /**\n * 清理\n */\n useEffect(() => {\n return () => {\n // 重置状态\n isReadyRef.current = false;\n pendingChunksRef.current = [];\n prevHTMLRef.current = '';\n };\n }, []);\n\n return (\n <div\n ref={containerRef}\n className={`streaming-html-renderer ${className}`}\n style={{ minHeight: '100px', position: 'relative' }}\n >\n {showLoading && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: radius.lg,\n background: `linear-gradient(90deg, ${colors.light.surfaceHover} 25%, ${colors.light.surface} 50%, ${colors.light.surfaceHover} 75%)`,\n backgroundSize: '200% 100%',\n animation: 'shimmer 1.5s infinite',\n zIndex: 10,\n }}\n >\n <style>{`\n @keyframes shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n }\n `}</style>\n <span\n style={{\n fontSize: '14px',\n color: colors.light.textSecondary,\n textAlign: 'center',\n padding: '0 16px',\n }}\n >\n {loadingMessages?.[currentMessageIndex] || 'Loading...'}\n </span>\n </div>\n )}\n <iframe\n ref={iframeRef}\n srcDoc={generateIframeSrcdoc()}\n sandbox=\"allow-scripts\"\n style={{\n width: iframeWidth ? `${iframeWidth}px` : '100%',\n height: iframeHeight > 0 ? `${iframeHeight}px` : '100px',\n border: 'none',\n display: 'block',\n overflow: 'hidden'\n }}\n title={title}\n />\n </div>\n );\n};\n\nexport default StreamingHTMLRenderer;","/**\n * Show Widget CSS Variables Generator\n * \n * Dynamically generates CSS variables from Axiom design tokens.\n * This ensures that when axiom-tokens.ts changes, the widget CSS updates automatically.\n * \n * Usage:\n * import { generateShowWidgetCSS } from './show-widget-css-generator';\n * import { axiomTokens } from '../theme/axiom-tokens';\n * \n * const css = generateShowWidgetCSS(axiomTokens);\n * \n * Or use the pre-configured export:\n * import { showWidgetCSS } from './show-widget-css-generator';\n */\n\nimport { axiomTokens } from '../theme/axiom-tokens';\n\n/**\n * Generate Show Widget CSS variables from Axiom tokens\n */\nexport function generateShowWidgetCSS(tokens: typeof axiomTokens): string {\n const { colors, radius, typography } = tokens;\n\n return `\n:root {\n /* ============================================\n Background Colors (from Axiom tokens)\n ============================================ */\n \n --color-background-primary: ${colors.light.surface};\n --color-background-secondary: ${colors.light.surfaceHover};\n --color-background-tertiary: ${colors.light.bg};\n \n /* Semantic backgrounds - derived from functional colors */\n --color-background-info: ${colors.info}1a;\n --color-background-danger: ${colors.error}1a;\n --color-background-success: ${colors.success}1a;\n --color-background-warning: ${colors.warning}1a;\n\n /* ============================================\n Text Colors (from Axiom tokens)\n ============================================ */\n \n --color-text-primary: ${colors.light.text};\n --color-text-secondary: ${colors.light.textSecondary};\n --color-text-tertiary: ${colors.light.textMuted};\n \n /* Semantic text - from functional colors */\n --color-text-info: ${colors.info};\n --color-text-danger: ${colors.error};\n --color-text-success: ${colors.success};\n --color-text-warning: ${colors.warning};\n\n /* ============================================\n Border Colors (derived from Axiom tokens)\n ============================================ */\n \n --color-border-tertiary: ${colors.light.border}99;\n --color-border-secondary: ${colors.light.borderHover}b3;\n --color-border-primary: ${colors.light.textMuted}cc;\n \n /* Semantic borders */\n --color-border-info: ${colors.info}80;\n --color-border-danger: ${colors.error}80;\n --color-border-success: ${colors.success}80;\n --color-border-warning: ${colors.warning}80;\n\n /* ============================================\n Typography (from Axiom tokens)\n ============================================ */\n \n --font-sans: ${typography.fontFamily};\n --font-serif: Georgia, 'Times New Roman', serif;\n --font-mono: 'Fira Code', 'Monaco', 'Consolas', monospace;\n\n /* ============================================\n Border Radius (from Axiom tokens, adjusted)\n ============================================ */\n \n --border-radius-md: ${radius.md};\n --border-radius-lg: ${radius.lg};\n --border-radius-xl: ${radius.xl};\n\n /* ============================================\n Color Ramps (9 ramps x 7 stops)\n Derived from Axiom primary and functional colors\n ============================================ */\n \n /* Purple - from Axiom primary indigo */\n --color-purple-50: ${colors.primary[50]};\n --color-purple-100: ${colors.primary[100]};\n --color-purple-200: ${colors.primary[200]};\n --color-purple-400: ${colors.primary[400]};\n --color-purple-600: ${colors.primary[600]};\n --color-purple-800: ${colors.primary[800]};\n --color-purple-900: ${colors.primary[900]};\n\n /* Teal - cool accent (complementary to primary) */\n --color-teal-50: #e1f5ee;\n --color-teal-100: #9fe1cb;\n --color-teal-200: #5dcaa5;\n --color-teal-400: #1d9e75;\n --color-teal-600: #0f6e56;\n --color-teal-800: #085041;\n --color-teal-900: #04342c;\n\n /* Coral - warm accent */\n --color-coral-50: #faece7;\n --color-coral-100: #f5c4b3;\n --color-coral-200: #f0997b;\n --color-coral-400: #d85a30;\n --color-coral-600: #993c1d;\n --color-coral-800: #712b13;\n --color-coral-900: #4a1b0c;\n\n /* Pink - soft accent */\n --color-pink-50: #fbeaf0;\n --color-pink-100: #f4c0d1;\n --color-pink-200: #ed93b1;\n --color-pink-400: #d4537e;\n --color-pink-600: #993556;\n --color-pink-800: #72243e;\n --color-pink-900: #4b1528;\n\n /* Gray - neutral scale (derived from text colors) */\n --color-gray-50: #f1efe8;\n --color-gray-100: #d3d1c7;\n --color-gray-200: #b4b2a9;\n --color-gray-400: #888780;\n --color-gray-600: #5f5e5a;\n --color-gray-800: #444441;\n --color-gray-900: #2c2c2a;\n\n /* Blue - from Axiom info color */\n --color-blue-50: #e6f1fb;\n --color-blue-100: #b5d4f4;\n --color-blue-200: #85b7eb;\n --color-blue-400: ${colors.info};\n --color-blue-600: #185fa5;\n --color-blue-800: #0c447c;\n --color-blue-900: #042c53;\n\n /* Green - from Axiom success color */\n --color-green-50: #eaf3de;\n --color-green-100: #c0dd97;\n --color-green-200: #97c459;\n --color-green-400: ${colors.success};\n --color-green-600: #3b6d11;\n --color-green-800: #27500a;\n --color-green-900: #173404;\n\n /* Amber - from Axiom warning color */\n --color-amber-50: #faeeda;\n --color-amber-100: #fac775;\n --color-amber-200: #ef9f27;\n --color-amber-400: ${colors.warning};\n --color-amber-600: #854f0b;\n --color-amber-800: #633806;\n --color-amber-900: #412402;\n\n /* Red - from Axiom error color */\n --color-red-50: #fcebeb;\n --color-red-100: #f7c1c1;\n --color-red-200: #f09595;\n --color-red-400: ${colors.error};\n --color-red-600: #a32d2d;\n --color-red-800: #791f1f;\n --color-red-900: #501313;\n\n /* Short Aliases */\n --p: var(--color-text-primary);\n --s: var(--color-text-secondary);\n --t: var(--color-text-tertiary);\n --bg2: var(--color-background-secondary);\n --b: var(--color-border-tertiary);\n}\n\n/* Dark Mode - using Axiom dark tokens */\n@media (prefers-color-scheme: dark) {\n :root {\n --color-background-primary: ${colors.dark.surface};\n --color-background-secondary: ${colors.dark.surfaceHover};\n --color-background-tertiary: ${colors.dark.bg};\n \n --color-background-info: ${colors.info}26;\n --color-background-danger: ${colors.error}26;\n --color-background-success: ${colors.success}26;\n --color-background-warning: ${colors.warning}26;\n\n --color-text-primary: ${colors.dark.text};\n --color-text-secondary: ${colors.dark.textSecondary};\n --color-text-tertiary: ${colors.dark.textMuted};\n\n --color-border-tertiary: ${colors.dark.border}99;\n --color-border-secondary: ${colors.dark.borderHover}b3;\n --color-border-primary: ${colors.dark.textMuted}cc;\n --color-border-info: ${colors.info}66;\n --color-border-danger: ${colors.error}66;\n --color-border-success: ${colors.success}66;\n --color-border-warning: ${colors.warning}66;\n }\n}\n\n/* Base Styles */\nhtml, body {\n margin: 0;\n padding: 0;\n font-family: var(--font-sans);\n color: var(--color-text-primary);\n background: transparent;\n overflow: hidden;\n width: fit-content;\n min-width: 100%;\n box-sizing: border-box;\n}\n\n#root {\n overflow: hidden;\n width: fit-content;\n min-width: 100%;\n box-sizing: border-box;\n}\n\n#root img, #root video, #root canvas, #root svg {\n max-width: 100%;\n height: 100%;\n}\n\n/* SVG Text Classes */\n.t {\n font-family: var(--font-sans);\n font-size: 14px;\n font-weight: 400;\n fill: var(--color-text-primary);\n}\n\n.ts {\n font-family: var(--font-sans);\n font-size: 12px;\n font-weight: 400;\n fill: var(--color-text-secondary);\n}\n\n.th {\n font-family: var(--font-sans);\n font-size: 14px;\n font-weight: 500;\n fill: var(--color-text-primary);\n}\n\n/* Box & Node Classes */\n.box {\n fill: var(--color-background-secondary);\n stroke: var(--color-border-tertiary);\n stroke-width: 0.5px;\n}\n\n.node {\n cursor: pointer;\n}\n\n.node:hover {\n opacity: 0.85;\n}\n\n/* Arrow & Leader Lines */\n.arr {\n stroke: var(--color-text-tertiary);\n stroke-width: 1.5px;\n fill: none;\n}\n\n.leader {\n stroke: var(--color-text-tertiary);\n stroke-width: 0.5px;\n stroke-dasharray: 4 2;\n fill: none;\n}\n\n/* Color Ramp Classes for SVG */\n.c-purple { fill: var(--color-purple-200); stroke: var(--color-purple-600); }\n.c-purple .t, .c-purple .th { fill: var(--color-purple-800); }\n.c-purple .ts { fill: var(--color-purple-600); }\n\n.c-teal { fill: var(--color-teal-200); stroke: var(--color-teal-600); }\n.c-teal .t, .c-teal .th { fill: var(--color-teal-800); }\n.c-teal .ts { fill: var(--color-teal-600); }\n\n.c-coral { fill: var(--color-coral-200); stroke: var(--color-coral-600); }\n.c-coral .t, .c-coral .th { fill: var(--color-coral-800); }\n.c-coral .ts { fill: var(--color-coral-600); }\n\n.c-pink { fill: var(--color-pink-200); stroke: var(--color-pink-600); }\n.c-pink .t, .c-pink .th { fill: var(--color-pink-800); }\n.c-pink .ts { fill: var(--color-pink-600); }\n\n.c-gray { fill: var(--color-gray-200); stroke: var(--color-gray-600); }\n.c-gray .t, .c-gray .th { fill: var(--color-gray-800); }\n.c-gray .ts { fill: var(--color-gray-600); }\n\n.c-blue { fill: var(--color-blue-200); stroke: var(--color-blue-600); }\n.c-blue .t, .c-blue .th { fill: var(--color-blue-800); }\n.c-blue .ts { fill: var(--color-blue-600); }\n\n.c-green { fill: var(--color-green-200); stroke: var(--color-green-600); }\n.c-green .t, .c-green .th { fill: var(--color-green-800); }\n.c-green .ts { fill: var(--color-green-600); }\n\n.c-amber { fill: var(--color-amber-200); stroke: var(--color-amber-600); }\n.c-amber .t, .c-amber .th { fill: var(--color-amber-800); }\n.c-amber .ts { fill: var(--color-amber-600); }\n\n.c-red { fill: var(--color-red-200); stroke: var(--color-red-600); }\n.c-red .t, .c-red .th { fill: var(--color-red-800); }\n.c-red .ts { fill: var(--color-red-600); }\n\n/* Dark Mode Color Ramps */\n@media (prefers-color-scheme: dark) {\n .c-purple { fill: var(--color-purple-800); stroke: var(--color-purple-200); }\n .c-purple .t, .c-purple .th { fill: var(--color-purple-100); }\n .c-purple .ts { fill: var(--color-purple-200); }\n \n .c-teal { fill: var(--color-teal-800); stroke: var(--color-teal-200); }\n .c-teal .t, .c-teal .th { fill: var(--color-teal-100); }\n .c-teal .ts { fill: var(--color-teal-200); }\n \n .c-coral { fill: var(--color-coral-800); stroke: var(--color-coral-200); }\n .c-coral .t, .c-coral .th { fill: var(--color-coral-100); }\n .c-coral .ts { fill: var(--color-coral-200); }\n \n .c-pink { fill: var(--color-pink-800); stroke: var(--color-pink-200); }\n .c-pink .t, .c-pink .th { fill: var(--color-pink-100); }\n .c-pink .ts { fill: var(--color-pink-200); }\n \n .c-gray { fill: var(--color-gray-800); stroke: var(--color-gray-200); }\n .c-gray .t, .c-gray .th { fill: var(--color-gray-100); }\n .c-gray .ts { fill: var(--color-gray-200); }\n \n .c-blue { fill: var(--color-blue-800); stroke: var(--color-blue-200); }\n .c-blue .t, .c-blue .th { fill: var(--color-blue-100); }\n .c-blue .ts { fill: var(--color-blue-200); }\n \n .c-green { fill: var(--color-green-800); stroke: var(--color-green-200); }\n .c-green .t, .c-green .th { fill: var(--color-green-100); }\n .c-green .ts { fill: var(--color-green-200); }\n \n .c-amber { fill: var(--color-amber-800); stroke: var(--color-amber-200); }\n .c-amber .t, .c-amber .th { fill: var(--color-amber-100); }\n .c-amber .ts { fill: var(--color-amber-200); }\n \n .c-red { fill: var(--color-red-800); stroke: var(--color-red-200); }\n .c-red .t, .c-red .th { fill: var(--color-red-100); }\n .c-red .ts { fill: var(--color-red-200); }\n}\n/* Pre-styled form elements */\nbutton {\n background: transparent;\n border: 0.5px solid var(--color-border-secondary);\n border-radius: var(--border-radius-md);\n color: var(--color-text-primary);\n padding: 6px 14px;\n font-size: 14px;\n cursor: pointer;\n font-family: var(--font-sans);\n}\nbutton:hover { background: var(--color-background-secondary); }\nbutton:active { transform: scale(0.98); }\n\ninput[type=\"range\"] {\n -webkit-appearance: none;\n height: 4px;\n background: var(--color-border-secondary);\n border-radius: 2px;\n outline: none;\n}\ninput[type=\"range\"]::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: var(--color-text-primary);\n cursor: pointer;\n}\n\ninput[type=\"text\"], input[type=\"number\"], textarea, select {\n height: 36px;\n background: var(--color-background-primary);\n border: 0.5px solid var(--color-border-tertiary);\n border-radius: var(--border-radius-md);\n color: var(--color-text-primary);\n padding: 0 10px;\n font-size: 14px;\n font-family: var(--font-sans);\n outline: none;\n}\ninput[type=\"text\"]:hover, input[type=\"number\"]:hover, textarea:hover, select:hover {\n border-color: var(--color-border-secondary);\n}\ninput[type=\"text\"]:focus, input[type=\"number\"]:focus, textarea:focus, select:focus {\n border-color: var(--color-border-primary);\n box-shadow: 0 0 0 2px rgba(255,255,255,0.1);\n}\n`;\n}\n\n/**\n * Pre-generated CSS using current Axiom tokens\n * This is a snapshot - use generateShowWidgetCSS() for dynamic generation\n */\nexport const showWidgetCSS = generateShowWidgetCSS(axiomTokens);\n\nexport default showWidgetCSS;\n","export type IframeMessage =\n | { type: 'stream-chunk'; chunk: string }\n | { type: 'execute-scripts' };\n\n/**\n * Import dynamic CSS generator\n * This ensures CSS variables are always synced with Axiom tokens\n */\nimport { showWidgetCSS } from './show-widget-css-generator';\nimport { SVG_STYLES } from './show-widget-css';\n\nexport function generateIframeSrcdoc(): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <style>\n *{box-sizing:border-box}\nbody{margin:0;padding:1rem;font-family:system-ui,-apple-system,sans-serif;}\nsvg { height:100%}\n@keyframes _fadeIn{from{opacity:0;transform:translateY(4px);}to{opacity:1;transform:none;}}\n\n ${showWidgetCSS}\n </style>\n <script>\n // Load morphdom from CDN with fallback\n (function() {\n if (typeof morphdom === 'undefined') {\n var script = document.createElement('script');\n script.src = 'https://cdn.jsdelivr.net/npm/morphdom@2.7.4/dist/morphdom-umd.min.js';\n script.onload = function() {\n window.parent.postMessage({ type: 'iframe-ready' }, '*');\n };\n script.onerror = function() {\n window.parent.postMessage({ type: 'iframe-error', error: 'Failed to load morphdom' }, '*');\n };\n document.head.appendChild(script);\n }\n })();\n </script>\n</head>\n<body>\n <div id=\"root\"></div>\n <script>\n class TagBalancer {\n constructor() {\n this.voidElements = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n ]);\n this.openTags = [];\n this.accumulatedHTML = '';\n }\n\n parseChunk(chunk) {\n this.accumulatedHTML += chunk;\n \n // Parse tags from chunk\n const tagRegex = /<\\\\/?([a-zA-Z][a-zA-Z0-9]*)[^>]*?>/g;\n let match;\n \n while ((match = tagRegex.exec(chunk)) !== null) {\n const fullTag = match[0];\n const tagName = match[1].toLowerCase();\n const isClosing = fullTag.startsWith('</');\n const isSelfClosing = fullTag.endsWith('/>') || this.voidElements.has(tagName);\n \n if (isSelfClosing) {\n // Void elements don't affect stack\n continue;\n }\n \n if (isClosing) {\n // Remove matching open tag if present\n const idx = this.openTags.lastIndexOf(tagName);\n if (idx !== -1) {\n this.openTags.splice(idx, 1);\n }\n } else {\n // Opening tag - add to stack\n this.openTags.push(tagName);\n }\n }\n }\n\n getAccumulatedHTML() {\n return this.accumulatedHTML;\n }\n\n getStack() {\n return [...this.openTags];\n }\n }\n\n const tagBalancer = new TagBalancer();\n const root = document.getElementById('root');\n let renderTimeout = null;\n\n function preserveInputValues() {\n const inputs = document.querySelectorAll('input, textarea');\n const values = new Map();\n inputs.forEach((input, index) => {\n const key = input.tagName + '-' + index + '-' + (input.name || input.id || '');\n values.set(key, input.value);\n });\n return values;\n }\n\n function restoreInputValues(values) {\n const inputs = document.querySelectorAll('input, textarea');\n inputs.forEach((input, index) => {\n const key = input.tagName + '-' + index + '-' + (input.name || input.id || '');\n if (values.has(key)) {\n input.value = values.get(key);\n }\n });\n }\n\n function render() {\n try {\n const preservedValues = preserveInputValues();\n \n // Build complete HTML with auto-closing tags\n const openTags = tagBalancer.getStack();\n const closingTags = openTags\n .slice()\n .reverse()\n .map(tag => '</' + tag + '>')\n .join('');\n const balancedHTML = tagBalancer.getAccumulatedHTML() + closingTags;\n \n // Use morphdom to update DOM\n if (root) {\n const temp = document.createElement('div');\n temp.innerHTML = balancedHTML;\n \n if (!root.firstChild) {\n root.innerHTML = balancedHTML;\n } else if (temp.firstChild) {\n morphdom(root, temp, {\n childrenOnly: true,\n onBeforeElUpdated: function(fromEl, toEl) {\n // Preserve input/textarea values\n if (fromEl.tagName === 'INPUT' || fromEl.tagName === 'TEXTAREA') {\n toEl.value = fromEl.value;\n }\n return true;\n },\n onNodeAdded: function(node) {\n // Add fade-in animation to newly added elements\n if (node.nodeType === Node.ELEMENT_NODE) {\n node.style.animation = '_fadeIn 0.3s ease-out';\n }\n return node;\n }\n });\n }\n }\n \n restoreInputValues(preservedValues);\n } catch (error) {\n console.error('[iframe] Render error:', error);\n parent.postMessage({ type: 'iframe-error', error: error.message }, '*');\n }\n }\n\n function scheduleRender() {\n if (renderTimeout) {\n clearTimeout(renderTimeout);\n }\n renderTimeout = setTimeout(render, 50);\n }\n\n function notifyHeight() {\n try {\n const height = document.body.scrollHeight;\n parent.postMessage({ type: 'iframe-height', height }, '*');\n } catch (error) {\n console.error('[iframe] Failed to notify height:', error);\n }\n }\n\n function notifyWidth() {\n try {\n const width = document.body.scrollWidth;\n parent.postMessage({ type: 'iframe-width', width }, '*');\n } catch (error) {\n console.error('[iframe] Failed to notify width:', error);\n }\n }\n\n function notifySize() {\n notifyHeight();\n notifyWidth();\n }\n\n // Observe size changes\n const resizeObserver = new ResizeObserver(() => {\n notifySize();\n });\n \n if (root) {\n resizeObserver.observe(root);\n }\n \n // Also notify on initial load\n window.addEventListener('load', notifySize);\n\n function executeScripts() {\n try {\n const scripts = root.querySelectorAll('script');\n const executedScripts = new Set();\n \n scripts.forEach((oldScript) => {\n // 通过内容哈希避免重复执行相同脚本\n const scriptKey = oldScript.src || oldScript.textContent;\n if (executedScripts.has(scriptKey)) {\n oldScript.remove();\n return;\n }\n executedScripts.add(scriptKey);\n \n const newScript = document.createElement('script');\n \n // Copy attributes\n Array.from(oldScript.attributes).forEach(attr => {\n newScript.setAttribute(attr.name, attr.value);\n });\n \n // Copy content\n if (oldScript.src) {\n newScript.src = oldScript.src;\n } else {\n newScript.textContent = oldScript.textContent;\n }\n \n // Replace old script with new one to execute it\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n } catch (error) {\n console.error('[iframe] Script execution error:', error);\n parent.postMessage({ type: 'iframe-error', error: error.message }, '*');\n }\n }\n\n // Listen for messages from parent\n window.addEventListener('message', function(event) {\n try {\n const message = event.data;\n \n if (!message || typeof message !== 'object') {\n return;\n }\n\n switch (message.type) {\n case 'stream-chunk':\n if (message.chunk) {\n tagBalancer.parseChunk(message.chunk);\n scheduleRender();\n }\n break;\n \n case 'execute-scripts':\n // 延迟执行脚本,确保 render 已完成\n setTimeout(() => {\n executeScripts();\n }, 100);\n break;\n }\n } catch (error) {\n parent.postMessage({ type: 'iframe-error', error: error.message }, '*');\n }\n });\n\n // Global sendPrompt function for widgets to communicate with parent\n window.sendPrompt = function(text) {\n if (typeof text !== 'string') {\n console.error('[iframe] sendPrompt requires a string argument');\n return;\n }\n parent.postMessage({ type: 'widget-prompt', text: text }, '*');\n };\n\n // Also expose openLink for opening URLs\n window.openLink = function(url) {\n if (typeof url !== 'string') {\n console.error('[iframe] openLink requires a string argument');\n return;\n }\n parent.postMessage({ type: 'widget-open-link', url: url }, '*');\n };\n\n // Signal that iframe is ready (only if morphdom was already loaded)\n if (typeof morphdom !== 'undefined') {\n parent.postMessage({ type: 'iframe-ready' }, '*');\n }\n </script>\n</body>\n</html>`;\n}\n","import React, { useCallback } from \"react\";\nimport { ElementProps } from \"../types\";\nimport { useOptionalAgentThreadContext } from \"@context/AgentThreadContext\";\nimport StreamingHTMLRenderer from \"@streaming-html\";\n\ninterface ShowWidgetAppData {\n widget_code: string;\n title?: string;\n}\n\nexport const ShowWidgetApp: React.FC<ElementProps<ShowWidgetAppData>> = ({\n data,\n}) => {\n const { widget_code, title } = data || {};\n const threadCtx = useOptionalAgentThreadContext();\n\n const sendPrompt = useCallback(\n (text: string) => {\n threadCtx?.sendMessage({\n input: {\n message: text,\n },\n });\n },\n [threadCtx?.sendMessage]\n );\n\n if (!widget_code) {\n return null;\n }\n\n return (\n <div style={{ padding: 24 }}>\n <StreamingHTMLRenderer\n html={widget_code}\n isComplete={true}\n onError={(err) => console.error(\"Widget render error:\", err)}\n onPrompt={sendPrompt}\n />\n </div>\n );\n};\n","import React from \"react\";\nimport { Card, Typography, Tag, Space } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport type { ElementProps } from \"../types\";\n\nconst { Text, Paragraph } = Typography;\n\nconst useStyles = createStyles(({ token, css }) => ({\n container: css`\n margin-bottom: ${token.marginMD}px;\n `,\n resultCard: css`\n margin-bottom: ${token.marginSM}px;\n border-radius: ${token.borderRadiusLG}px;\n `,\n score: css`\n color: ${token.colorTextTertiary};\n font-size: 12px;\n `,\n metadata: css`\n margin-top: ${token.marginXS}px;\n `,\n}));\n\ninterface SearchResult {\n content: string;\n metadata?: Record<string, unknown>;\n score?: number;\n}\n\ninterface SearchCollectionResultData {\n query?: string;\n collection?: string;\n results?: SearchResult[];\n}\n\nexport const SearchCollectionResult: React.FC<ElementProps<SearchCollectionResultData>> = ({\n data,\n}) => {\n const { styles } = useStyles();\n const { query, collection, results } = data ?? {};\n\n if (!results || results.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.container}>\n <Card size=\"small\" title={`Search: \"${query || \"\"}\"`}>\n {collection && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n Collection: {collection}\n </Text>\n )}\n {results.map((item, index) => (\n <Card key={index} size=\"small\" className={styles.resultCard}>\n <Paragraph\n ellipsis={{ rows: 3, expandable: true, symbol: \"more\" }}\n style={{ marginBottom: 4 }}\n >\n {item.content}\n </Paragraph>\n <Space wrap className={styles.metadata}>\n {item.score !== undefined && (\n <Text className={styles.score}>\n Score: {item.score.toFixed(4)}\n </Text>\n )}\n {item.metadata &&\n Object.entries(item.metadata)\n .filter(([k]) => !k.startsWith(\"_\"))\n .map(([k, v]) => (\n <Tag key={k}>\n {k}: {String(v)}\n </Tag>\n ))}\n </Space>\n </Card>\n ))}\n </Card>\n </div>\n );\n};\n","import { ElementProps, ElementMeta } from \"../types\";\nimport { elements } from \"./builtIns\";\n\nexport const getElement = (language: string | undefined) => {\n if (language && elements[language]) {\n return elements[language];\n }\n return null;\n};\n\nexport const regsiterElement = (language: string, ElementMeta: ElementMeta) => {\n console.log(\"regsiterElement\", language, ElementMeta);\n elements[language] = ElementMeta;\n return ElementMeta;\n};\n","import React, { useMemo, useState } from \"react\";\nimport { Collapse, Button } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { FileRenderer } from \"./FileRenderer\";\nimport { getFileCategory } from \"../../utils/fileUtils\";\nimport { useLatticeChatShellContext } from \"@components/Chat/LatticeChatShellContext\";\nimport { useOptionalConversationContext } from \"@components/Chat/ConversationContext\";\nimport { ComponentProps } from \"react\";\nimport {\n FileTextOutlined,\n FileImageOutlined,\n FilePdfOutlined,\n FileUnknownOutlined,\n FileWordOutlined,\n FileExcelOutlined,\n FileZipOutlined,\n PlayCircleOutlined,\n SoundOutlined,\n LinkOutlined\n} from \"@ant-design/icons\";\nimport { Alert } from \"antd\";\nimport { ShareModal } from \"./ShareModal\";\n\nconst useStyles = createStyles(({ token, css }) => ({\n container: css`\n margin: 16px 0;\n border: 1px solid ${token.colorBorderSecondary};\n border-radius: ${token.borderRadius}px;\n overflow: hidden;\n `,\n header: css`\n display: flex;\n align-items: center;\n padding: 10px 16px;\n background: ${token.colorFillAlter};\n border-bottom: 1px solid ${token.colorBorderSecondary};\n font-size: 13px;\n color: ${token.colorTextSecondary};\n gap: 10px;\n `,\n headerIcon: css`\n font-size: 18px;\n color: ${token.colorPrimary};\n `,\n headerTitle: css`\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n content: css`\n min-height: 200px;\n max-height: 600px;\n overflow: auto;\n background: ${token.colorBgContainer};\n `,\n error: css`\n padding: 24px;\n `,\n}));\n\ninterface EmbedConfig {\n path?: string;\n url?: string;\n title?: string;\n collapsed?: boolean;\n}\n\nfunction parseEmbedContent(children: React.ReactNode): EmbedConfig {\n let content = \"\";\n if (typeof children === \"string\") {\n content = children.trim();\n } else if (Array.isArray(children)) {\n content = children.join(\"\").trim();\n }\n\n if (!content) return {};\n\n if (content.startsWith(\"{\")) {\n try {\n return JSON.parse(content);\n } catch {\n return { path: content };\n }\n }\n\n if (content.startsWith(\"http://\") || content.startsWith(\"https://\")) {\n return { url: content };\n }\n\n return { path: content };\n}\n\n// 根据文件类型获取图标\nfunction getFileIcon(fileName: string) {\n const category = getFileCategory(fileName);\n switch (category) {\n case \"markdown\":\n case \"text\":\n return <FileTextOutlined />;\n case \"image\":\n return <FileImageOutlined />;\n case \"pdf\":\n return <FilePdfOutlined />;\n case \"audio\":\n return <SoundOutlined />;\n case \"video\":\n return <PlayCircleOutlined />;\n default: {\n // 根据扩展名判断\n const ext = fileName.split(\".\").pop()?.toLowerCase();\n if ([\"doc\", \"docx\"].includes(ext || \"\")) return <FileWordOutlined />;\n if ([\"xls\", \"xlsx\", \"csv\"].includes(ext || \"\")) return <FileExcelOutlined />;\n if ([\"zip\", \"rar\", \"7z\", \"tar\", \"gz\"].includes(ext || \"\")) return <FileZipOutlined />;\n return <FileUnknownOutlined />;\n }\n }\n}\n\nexport const Embed: React.FC<ComponentProps<any>> = ({ children }) => {\n const { styles } = useStyles();\n const { config } = useLatticeChatShellContext();\n const { threadId, assistantId } = useOptionalConversationContext() ?? {};\n\n const [shareOpen, setShareOpen] = useState(false);\n\n const embedConfig = useMemo(() => parseEmbedContent(children), [children]);\n\n const fileUrl = useMemo(() => {\n if (embedConfig.url) return embedConfig.url;\n if (!embedConfig.path || !config?.baseURL || !assistantId || !threadId) return null;\n return `${config.baseURL}/api/assistants/${assistantId}/threads/${threadId}/sandbox/downloadfile?path=${encodeURIComponent(embedConfig.path)}`;\n }, [embedConfig, config?.baseURL, assistantId, threadId]);\n\n const displayTitle = useMemo(() => {\n if (embedConfig.title) return embedConfig.title;\n if (embedConfig.path) return embedConfig.path.split(\"/\").pop() || embedConfig.path;\n if (embedConfig.url) {\n try {\n return new URL(embedConfig.url).pathname.split(\"/\").pop() || embedConfig.url;\n } catch { return embedConfig.url; }\n }\n return \"Embedded File\";\n }, [embedConfig]);\n\n const fileIcon = useMemo(() => {\n const fileName = embedConfig.path || embedConfig.url || \"\";\n return getFileIcon(fileName);\n }, [embedConfig]);\n\n if (!fileUrl) {\n return (\n <div className={styles.error}>\n <Alert \n message=\"Invalid embed configuration\" \n description=\"Please provide a valid file path or URL\" \n type=\"warning\" \n showIcon \n />\n </div>\n );\n }\n\n const contentElement = (\n <div className={styles.content}>\n <FileRenderer fileUrl={fileUrl} fileName={displayTitle} />\n </div>\n );\n\n if (embedConfig.collapsed) {\n return (\n <Collapse\n size=\"small\"\n defaultActiveKey={[\"1\"]}\n items={[\n {\n key: \"1\",\n label: (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span>{fileIcon}</span>\n <span>{displayTitle}</span>\n </span>\n ),\n children: contentElement,\n },\n ]}\n />\n );\n }\n\n return (\n <div className={styles.container}>\n <div className={styles.header}>\n <span className={styles.headerIcon}>{fileIcon}</span>\n <span className={styles.headerTitle}>{displayTitle}</span>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<LinkOutlined />}\n onClick={() => setShareOpen(true)}\n >\n Share\n </Button>\n </div>\n {contentElement}\n {shareOpen && (\n <ShareModal\n open={shareOpen}\n filePath={embedConfig.path ?? \"\"}\n assistantId={assistantId ?? undefined}\n fileName={displayTitle}\n onClose={() => setShareOpen(false)}\n />\n )}\n </div>\n );\n};\n\nexport default Embed;\n","import React from \"react\";\nimport { ComponentProps } from \"react\";\nimport { ElementProps } from \"./types\";\n\nexport const MDComponentWrap: (\n element: React.FC<ElementProps>\n) => React.FC<ComponentProps<any>> = (Element) => {\n return (props) => {\n if (!props) {\n return null;\n }\n const { className, children } = props;\n\n let childrenStr: string | undefined;\n\n if (typeof children === \"string\") {\n childrenStr = children;\n } else if (Array.isArray(children)) {\n childrenStr = children.join(\"\");\n }\n\n // Handle undefined/null children\n if (!childrenStr) {\n return <Element component_key={className} data={undefined} />;\n }\n\n let data;\n try {\n data = JSON.parse(childrenStr);\n } catch (error) {\n data = childrenStr;\n }\n return <Element component_key={className} data={data} />;\n };\n};\n","import { ElementProps } from \"../types\";\nimport { Button } from \"antd\";\nimport React, { useMemo, useCallback } from \"react\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\nimport { useLatticeChatShellContext } from \"@components/Chat/LatticeChatShellContext\";\nimport { useOptionalConversationContext } from \"@components/Chat/ConversationContext\";\nimport { isFileName } from \"../../../utils/fileUtils\";\n\nexport const FileLink: React.FC<ElementProps<string>> = ({ data }) => {\n if (!data) {\n return null;\n }\n if (!isFileName(data)) {\n return <>{data}</>;\n }\n\n const openSideApp = useSideAppOpener();\n const { threadId, assistantId } = useOptionalConversationContext() ?? {};\n const { config } = useLatticeChatShellContext();\n\n const fileEndpoint = useMemo(() => {\n if (!config?.baseURL || !assistantId || !threadId) {\n return null;\n }\n return `${config.baseURL}/api/assistants/${assistantId}/threads/${threadId}/sandbox/downloadfile`;\n }, [config?.baseURL, assistantId, threadId]);\n\n const handleItemClick = useCallback((path: string) => {\n if (!fileEndpoint) return;\n const params = new URLSearchParams({ path });\n const fileUrl = `${fileEndpoint}?${params.toString()}`;\n openSideApp({\n component_key: \"attachments\",\n data: {\n file_id: path,\n message: \"预览:\" + path.split(\"/\").pop(),\n full_url: fileUrl,\n download_url: fileUrl,\n },\n message: \"预览:\" + path.split(\"/\").pop(),\n });\n }, [fileEndpoint, openSideApp]);\n\n if (!fileEndpoint) {\n return <span>{data}</span>;\n }\n\n return (\n <Button type=\"link\" size=\"small\" onClick={() => handleItemClick(data)}>\n {data}\n </Button>\n );\n};\n","import React, { useCallback, useContext, useMemo } from \"react\";\nimport { Button } from \"antd\";\nimport { ElementProps } from \"../types\";\nimport { useSideAppOpener } from \"../../Chat/SideAppBrowserContext\";\nimport { useLatticeChatShellContext } from \"@components/Chat/LatticeChatShellContext\";\nimport { useOptionalConversationContext } from \"@components/Chat/ConversationContext\";\nimport { WorkspaceContext } from \"../../../context/WorkspaceContext\";\n\ninterface ResolvedUrls {\n fullUrl: string;\n downloadUrl: string;\n}\n\nconst WEB_APP_RUNTIME_BASE_RE = /\\/api\\/web-apps\\/[^/]+\\/runtime$/;\n\nexport const FilePathLink: React.FC<ElementProps<string>> = ({ data }) => {\n if (data === undefined || data === null) {\n return null;\n }\n\n const path = typeof data === \"string\" ? data : String(data ?? \"\");\n if (path.length === 0) {\n return null;\n }\n\n const openSideApp = useSideAppOpener();\n const { threadId, assistantId } = useOptionalConversationContext() ?? {};\n const { config } = useLatticeChatShellContext();\n const workspaceCtx = useContext(WorkspaceContext);\n\n const urls = useMemo<ResolvedUrls | null>(() => {\n if (workspaceCtx?.workspaceId && workspaceCtx?.projectId) {\n const view = workspaceCtx.getFileViewUrl(path, assistantId || undefined);\n const download = workspaceCtx.getFileDownloadUrl(path, assistantId || undefined);\n if (view && download) {\n return { fullUrl: view, downloadUrl: download };\n }\n }\n if (!config?.baseURL) {\n return null;\n }\n const params = new URLSearchParams({ path });\n if (WEB_APP_RUNTIME_BASE_RE.test(config.baseURL)) {\n const base = config.baseURL.replace(/\\/$/, \"\");\n return {\n fullUrl: `${base}/files/viewfile?${params.toString()}`,\n downloadUrl: `${base}/files/downloadfile?${params.toString()}`,\n };\n }\n if (!assistantId || !threadId) {\n return null;\n }\n const sandboxUrl = `${config.baseURL}/api/assistants/${assistantId}/threads/${threadId}/sandbox/downloadfile?${params.toString()}`;\n return { fullUrl: sandboxUrl, downloadUrl: sandboxUrl };\n }, [workspaceCtx, config?.baseURL, assistantId, threadId, path]);\n\n const handleClick = useCallback(() => {\n if (!urls) {\n return;\n }\n const label = path.split(\"/\").pop() ?? path;\n openSideApp({\n component_key: \"attachments\",\n data: {\n file_id: path,\n message: `预览:${label}`,\n full_url: urls.fullUrl,\n download_url: urls.downloadUrl,\n },\n message: `预览:${label}`,\n });\n }, [urls, path, openSideApp]);\n\n if (!urls) {\n return <span>{path}</span>;\n }\n\n return (\n <Button type=\"link\" size=\"small\" onClick={handleClick}>\n {path}\n </Button>\n );\n};\n","import React, { useMemo } from \"react\";\nimport { ComponentProps } from \"@ant-design/x-markdown\";\nimport { GenericDataTable } from \"./generic_data_table\";\n\n/**\n * Extracts table data from DOM node structure\n * Parses thead and tbody to extract headers and rows\n */\nconst extractTableData = (domNode: any) => {\n if (!domNode || !domNode.children) {\n return null;\n }\n\n const headers: string[] = [];\n const rows: any[] = [];\n\n // Find thead and tbody\n const thead = domNode.children.find((child: any) => child.name === \"thead\");\n const tbody = domNode.children.find((child: any) => child.name === \"tbody\");\n\n // Extract headers from thead\n if (thead && thead.children) {\n const tr = thead.children.find((child: any) => child.name === \"tr\");\n if (tr && tr.children) {\n tr.children.forEach((th: any) => {\n if (th.name === \"th\" && th.children) {\n const headerText = th.children\n .map((child: any) => {\n if (child.type === \"text\") return child.data;\n if (child.children) {\n return child.children\n .map((c: any) => (c.type === \"text\" ? c.data : \"\"))\n .join(\"\");\n }\n return \"\";\n })\n .join(\"\")\n .trim();\n headers.push(headerText);\n }\n });\n }\n }\n\n // Extract rows from tbody\n if (tbody && tbody.children) {\n tbody.children.forEach((tr: any) => {\n if (tr.name === \"tr\" && tr.children) {\n const rowData: any = {};\n let colIndex = 0;\n\n tr.children.forEach((td: any) => {\n if (td.name === \"td\" && colIndex < headers.length) {\n const cellText = td.children\n .map((child: any) => {\n if (child.type === \"text\") return child.data;\n if (child.children) {\n return child.children\n .map((c: any) => (c.type === \"text\" ? c.data : \"\"))\n .join(\"\");\n }\n return \"\";\n })\n .join(\"\")\n .trim();\n\n // Use header as key, fallback to column index\n const key = headers[colIndex] || `col_${colIndex}`;\n rowData[key] = cellText;\n colIndex++;\n }\n });\n\n if (Object.keys(rowData).length > 0) {\n rows.push(rowData);\n }\n }\n });\n }\n\n // If no thead but has tbody, try to extract headers from first row\n if (headers.length === 0 && rows.length > 0) {\n const firstRow = rows[0];\n const extractedHeaders = Object.keys(firstRow);\n return {\n headers: extractedHeaders,\n dataSource: rows,\n };\n }\n\n return {\n headers,\n dataSource: rows,\n };\n};\n\n/**\n * MarkdownTable component - Renders markdown tables as GenericDataTable\n * Extracts data from domNode and passes it to GenericDataTable for rich features\n */\nexport const MarkdownTable: React.FC<ComponentProps> = (props) => {\n const { domNode } = props;\n\n const tableData = useMemo(() => {\n return extractTableData(domNode);\n }, [domNode]);\n\n if (!tableData || tableData.dataSource.length === 0) {\n return null;\n }\n\n return (\n <GenericDataTable\n component_key=\"markdown_table\"\n data={{\n dataSource: tableData.dataSource,\n message: '',\n }}\n interactive={true}\n default_open_in_side_app={true}\n />\n );\n};\n\nexport default MarkdownTable;\n","import { Code } from \"./Code\";\nimport { Row, Col, Input, Button } from \"antd\";\nimport { MDComponentWrap } from \"./MDComponentWrap\";\nimport { GenericDataTable } from \"./elements/generic_data_table\";\nimport { FileLink } from \"./elements/file_link\";\nimport { FilePathLink } from \"./elements/file_path_link\";\nimport { MarkdownTable } from \"./elements/MarkdownTable\";\n\nconst genericdatatable = MDComponentWrap(GenericDataTable);\nconst filelink = MDComponentWrap(FileLink);\nconst filepathlink = MDComponentWrap(FilePathLink);\nexport const mdComponents = {\n code: Code,\n file: filelink,\n filelink: filepathlink,\n genericdatatable,\n table: MarkdownTable,\n // row: Row,\n // col: Col,\n // input: Input,\n // button: Button,\n};\n","import { lexer } from \"marked\";\n\nexport interface LinkifySandboxPathsOptions {\n volumes?: string[];\n}\n\ninterface MdToken {\n type: string;\n raw?: string;\n tokens?: MdToken[];\n items?: MdToken[];\n}\n\ninterface Range {\n start: number;\n end: number;\n}\n\nconst SENTINEL = \"\\uE000\";\n\nconst PROTECTED_TOKEN_TYPES = new Set([\n \"code\",\n \"codespan\",\n \"html\",\n \"table\",\n \"def\",\n \"hr\",\n \"link\",\n \"image\",\n \"autolink\",\n \"url\",\n \"escape\",\n]);\n\nconst PATH_SEGMENT_CHAR = \"[A-Za-z0-9_.\\\\-~\\\\u4e00-\\\\u9fff]\";\nconst SEGMENT_CHAR_RE = new RegExp(`^${PATH_SEGMENT_CHAR}$`);\nconst DEFAULT_VOLUMES = [\"project\", \"agent\", \"root\"];\n\nfunction escapeRegExp(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction childTokens(token: MdToken): MdToken[] | null {\n if (Array.isArray(token.items) && token.items.length > 0) {\n return token.items;\n }\n if (Array.isArray(token.tokens) && token.tokens.length > 0) {\n return token.tokens;\n }\n return null;\n}\n\nfunction collectProtectedRanges(\n src: string,\n tokens: MdToken[],\n windowRange: Range,\n out: Range[]\n): void {\n let cursor = windowRange.start;\n for (const token of tokens) {\n const raw = token.raw ?? \"\";\n if (raw.length === 0) continue;\n const found = src.indexOf(raw, cursor);\n if (found < windowRange.start || found + raw.length > windowRange.end) {\n out.push({ start: cursor, end: windowRange.end });\n return;\n }\n if (PROTECTED_TOKEN_TYPES.has(token.type)) {\n out.push({ start: found, end: found + raw.length });\n } else {\n const children = childTokens(token);\n if (children) {\n collectProtectedRanges(src, children, { start: found, end: found + raw.length }, out);\n }\n }\n cursor = found + raw.length;\n }\n}\n\nexport function linkifySandboxPaths(\n src: string,\n options?: LinkifySandboxPathsOptions\n): string {\n if (typeof src !== \"string\" || src.length === 0 || src.includes(SENTINEL)) {\n return src;\n }\n\n let volumes = (options?.volumes && options.volumes.length > 0\n ? options.volumes\n : DEFAULT_VOLUMES\n )\n .map((volume) => volume.replace(/^\\/+|\\/+$/g, \"\"))\n .filter((volume) => volume.length > 0)\n .map(escapeRegExp);\n if (volumes.length === 0) {\n volumes = DEFAULT_VOLUMES.map(escapeRegExp);\n }\n\n let blocks: MdToken[];\n try {\n blocks = lexer(src) as unknown as MdToken[];\n } catch {\n return src;\n }\n\n const ranges: Range[] = [];\n collectProtectedRanges(src, blocks, { start: 0, end: src.length }, ranges);\n\n const protectedSubstrings: string[] = [];\n let masked = \"\";\n let prev = 0;\n for (const range of ranges) {\n masked += src.slice(prev, range.start) + SENTINEL;\n protectedSubstrings.push(src.slice(range.start, range.end));\n prev = range.end;\n }\n masked += src.slice(prev);\n\n const pattern = new RegExp(\n `(?<![A-Za-z0-9_:/.])/(?:${volumes.join(\"|\")})(?:/${PATH_SEGMENT_CHAR}+)+`,\n \"g\"\n );\n\n let output = \"\";\n let lastIndex = 0;\n let matched = false;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(masked)) !== null) {\n const after = masked[pattern.lastIndex];\n if (after !== undefined && SEGMENT_CHAR_RE.test(after)) {\n continue;\n }\n const trimmed = match[0].replace(/\\.+$/, \"\");\n if (trimmed !== match[0] && !trimmed.includes(\"/\")) {\n continue;\n }\n output += masked.slice(lastIndex, match.index);\n output += `<filelink>${trimmed}</filelink>`;\n lastIndex = pattern.lastIndex;\n matched = true;\n }\n if (!matched) {\n return src;\n }\n output += masked.slice(lastIndex);\n\n const parts = output.split(SENTINEL);\n let result = \"\";\n for (let index = 0; index < parts.length; index += 1) {\n result += parts[index];\n if (index < protectedSubstrings.length) {\n result += protectedSubstrings[index];\n }\n }\n return result;\n}\n"],"mappings":"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","names":["threadId","message","stopStreaming","useCallback","useEffect","useRef","useState","useState","useRef","useEffect","useCallback","colors","radius","spacing","shadows","typography","animation","useState","jsx","useState","Button","Typography","Card","jsx","jsxs","Text","Typography","Card","Button","useState","useEffect","Building2","jsx","useState","useEffect","useMemo","useRef","useCallback","Button","Input","Spin","createStyles","LogOut","jsx","jsxs","createStyles","useMemo","useState","useRef","useEffect","useCallback","Spin","Button","LogOut","Input","useState","Form","Input","Button","Alert","LockOutlined","jsx","jsxs","Form","useState","Alert","Input","LockOutlined","Button","useState","useEffect","useCallback","message","React","createContext","useContext","useState","useCallback","useEffect","useRef","jsx","createContext","useContext","useState","React","useCallback","useEffect","useRef","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","createContext","message","useState","useRef","useEffect","useCallback","error","useContext","useMemo","createContext","useContext","useState","useCallback","useEffect","useLayoutEffect","useMemo","useRef","createSimpleMessageMerger","uuidv4","jsx","createContext","useState","useContext","useCallback","useEffect","useRef","createSimpleMessageMerger","threadId","tc","message","uuidv4","useLayoutEffect","useMemo","useState","useCallback","useEffect","useRef","useState","useRef","useCallback","useEffect","useState","useCallback","useState","useCallback","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useRef","message","useState","useRef","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useRef","normalizeError","message","useState","useRef","useCallback","useEffect","useCallback","useEffect","useRef","useState","normalizeError","isRecord","useState","useRef","useCallback","useEffect","message","createContext","useCallback","useContext","useState","jsx","createContext","useContext","createContext","useContext","Typography","Button","Flex","Space","React","useRef","useState","useMemo","useDeferredValue","createStyles","Suspense","lazy","Button","Space","Typography","useState","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useCallback","useRef","useRef","useState","useCallback","useState","useRef","useCallback","useEffect","useState","useRef","useEffect","useCallback","message","jsx","jsxs","Text","Typography","message","useState","Space","Button","Button","Space","Typography","Input","useState","useContext","createContext","Fragment","jsx","jsxs","Text","Typography","useContext","useState","Space","Input","Button","Button","Space","Typography","Input","Fragment","jsx","jsxs","Text","Typography","Space","Input","Button","jsx","Typography","Card","Typography","Space","createStyles","jsx","jsxs","Text","Title","formatToolName","jsx","jsx","jsxs","Typography","useMemo","Typography","createStyles","React","useState","useCallback","createStyles","jsx","jsxs","useStyles","createStyles","useState","useCallback","React","Fragment","jsx","jsxs","message","Text","Typography","useStyles","createStyles","useMemo","useEffect","useState","React","useState","useMemo","createStyles","Button","Card","Typography","Row","Col","Tag","theme","Popconfirm","message","Play","FlaskConical","TestTube2","CheckCircle","XCircle","ArrowRight","Trash2","FolderGit2","createStyles","Card","Typography","Spin","Trash2","TestTube2","jsx","jsxs","Text","Typography","useStyle","createStyles","Spin","Card","TestTube2","Trash2","useState","useEffect","createStyles","Button","Typography","Modal","Form","Input","Select","message","Trash2","FlaskConical","React","useState","useMemo","createStyles","Plus","React","Tooltip","createStyles","jsx","jsxs","useStyles","createStyles","Tooltip","React","createStyles","jsx","jsxs","useStyles","createStyles","Spin","theme","jsx","jsxs","useStyles","createStyles","List","jsx","useStyles","Fragment","jsx","jsxs","useStyles","createStyles","useState","useMemo","Plus","React","useState","Modal","Typography","useEffect","Select","createStyles","jsx","useStyles","jsx","useEffect","jsx","jsxs","Text","Typography","useState","Modal","jsx","jsxs","Text","Typography","Input","useStyle","createStyles","useState","Form","message","useEffect","Trash2","Button","FlaskConical","Modal","Select","useEffect","useRef","useState","createStyles","Alert","Button","Typography","Tag","Popconfirm","Trash2","useCallback","useEffect","useRef","useState","normalizeError","useState","useRef","useCallback","useEffect","jsx","jsxs","Text","Typography","useStyle","createStyles","message","useRef","useState","useEffect","Alert","Button","Tag","Popconfirm","Trash2","jsx","jsxs","Text","Title","Typography","useStyle","createStyles","theme","useState","React","useMemo","Card","FlaskConical","Button","Play","Row","Col","TestTube2","CheckCircle","XCircle","ArrowRight","Tag","FolderGit2","Popconfirm","message","Trash2","jsx","useState","useEffect","Typography","Progress","createStyles","Play","Fragment","jsx","jsxs","Text","Typography","useStyles","createStyles","actionTitleStyle","Play","isRecord","statusColor","Progress","useMemo","Collapse","Tooltip","Typography","createStyles","Fragment","jsx","jsxs","Text","Typography","useStyles","createStyles","actionTitleStyle","metaStyle","useMemo","Tooltip","raw","Collapse","Typography","createStyles","Fragment","jsx","jsxs","Text","Typography","useStyles","createStyles","actionTitleStyle","truncate","message","Suspense","Spin","Card","List","Typography","Space","Button","createStyles","CheckCircleOutlined","useState","useEffect","jsx","jsxs","Text","useStyle","getStatusIcon","getStatusColor","Space","Collapse","Typography","jsx","jsxs","Text","Typography","CollapsePanel","Collapse","Space","useState","useEffect","useMemo","Empty","createStyles","React","useState","useEffect","useRef","Button","Tooltip","message","createStyles","jsx","jsxs","useStyles","createStyles","useState","useRef","useEffect","message","React","Tooltip","Button","CodeOutlined","FilePdfOutlined","jsx","jsx","jsxs","useStyles","createStyles","jsx","useStyles","useState","useEffect","useMemo","Empty","jsxs","Card","Flex","Space","Typography","Row","Col","Button","useContext","useState","jsx","jsxs","useContext","Text","Typography","useState","Space","displayData","shouldShowViewMore","visibleData","Flex","Row","Col","Card","Button","Button","Empty","Space","useEffect","useState","useEffect","useState","useMemo","Spin","Alert","Button","createStyles","FileImageOutlined","FilePdfOutlined","FileTextOutlined","FileUnknownOutlined","jsx","jsxs","useStyles","createStyles","useStyles","useState","useMemo","useEffect","jsx","Spin","Alert","jsxs","FileUnknownOutlined","Button","jsx","LinkOutlined","DownloadOutlined","useState","useEffect","useCallback","Modal","Input","Select","Button","Space","Typography","message","List","Tag","Popconfirm","CopyOutlined","jsx","jsxs","Text","Title","Typography","useState","useCallback","useEffect","message","Modal","Space","List","Button","CopyOutlined","Popconfirm","Tag","Input","Select","Fragment","jsx","jsxs","useState","useEffect","Empty","Button","Space","DownloadOutlined","LinkOutlined","Button","Space","Typography","useRef","useState","useEffect","useCallback","Collapse","createStyles","DownOutlined","UpOutlined","Fragment","jsx","jsxs","CollapsePanel","useStyle","jsx","jsxs","Text","Typography","Space","toolCallData","Button","React","useState","useCallback","diff","_typeof","_loop","message","jsx","Button","Space","Typography","jsx","jsxs","Text","Typography","Space","toolCallData","Button","Card","Typography","Tag","Avatar","createStyles","CheckCircleOutlined","LoadingOutlined","UserOutlined","RightOutlined","jsx","jsxs","Text","Typography","useStyle","createStyles","getStatusConfig","status","CheckCircleOutlined","LoadingOutlined","Card","Avatar","UserOutlined","Tag","RightOutlined","Typography","FileImageOutlined","FileTextOutlined","FilePdfOutlined","FileMarkdownOutlined","FileZipOutlined","FileExcelOutlined","FilePptOutlined","FileWordOutlined","FileUnknownOutlined","Prompts","React","Spin","Alert","Space","useCallback","useEffect","useMemo","useRef","useState","createStyles","useStyle","jsx","jsxs","Alert","message","useRef","useState","useEffect","useStyle","useCallback","Space","useMemo","role","jsx","React","Spin","message","Alert","Badge","Button","Divider","Flex","message","Space","Typography","React","useCallback","useContext","useDeferredValue","useEffect","useLayoutEffect","useMemo","useRef","useState","BrainCircuit","Collapse","Space","Tag","createStyles","jsx","CollapsePanel","Collapse","useStyle","createStyles","Tag","Space","Typography","Space","Button","message","createStyles","ClockCircleOutlined","DownOutlined","RightOutlined","LoadingOutlined","useState","jsx","jsxs","useStyle","createStyles","message","Space","Typography","Button","Space","Tooltip","Progress","jsx","jsxs","Tooltip","Progress","Tooltip","Progress","jsx","jsxs","Tooltip","Progress","jsx","Tooltip","Button","jsx","Tooltip","Button","useState","useCallback","useEffect","Tooltip","Button","Spin","jsx","useState","useCallback","useEffect","Tooltip","Button","Spin","Button","Tooltip","jsx","Tooltip","Button","Button","Tooltip","MailOutlined","jsx","Tooltip","Button","MailOutlined","jsx","jsxs","Space","createStyles","createStyles","jsx","jsxs","useStyles","React","useCallback","useEffect","useLayoutEffect","useRef","useState","Tooltip","theme","jsx","jsxs","jsx","jsx","jsxs","createStyles","useCallback","useContext","Tooltip","Button","Dropdown","PlusOutlined","Fragment","jsx","jsxs","useCallback","Tooltip","Button","PlusOutlined","Dropdown","useContext","useRef","useState","Modal","List","Checkbox","Spin","Empty","Typography","Button","Space","Tooltip","Fragment","jsx","jsxs","useState","useRef","Space","Typography","Tooltip","Button","Modal","Spin","Empty","List","Checkbox","useRef","useState","Modal","List","Checkbox","Spin","Empty","Typography","Button","Space","Tooltip","Fragment","jsx","jsxs","useState","useRef","Space","Typography","Tooltip","Button","Modal","Spin","Empty","List","Checkbox","useEffect","useState","Modal","List","Spin","Empty","Typography","Button","Tooltip","Bot","Fragment","jsx","jsxs","useState","useEffect","Tooltip","Button","Bot","Modal","Spin","Empty","List","Typography","useEffect","useState","useRef","Modal","List","Spin","Empty","Typography","Button","Tag","Tooltip","Database","Server","Fragment","jsx","jsxs","useState","useRef","config","useEffect","Tooltip","Button","Database","Modal","Spin","Empty","Server","Typography","Tag","List","useState","useEffect","useCallback","useRef","Select","jsx","useState","useRef","useCallback","useEffect","Select","CodeOutlined","FileTextOutlined","ToolOutlined","CheckCircleOutlined","CoffeeOutlined","Space","Typography","Spin","useEffect","useState","useMemo","BrainCircuit","jsx","jsxs","CodeOutlined","FileTextOutlined","ToolOutlined","CheckCircleOutlined","CoffeeOutlined","useState","useEffect","useMemo","Space","BrainCircuit","Typography","Spin","ToolOutlined","MoreOutlined","TagsOutlined","Prompts","Space","Tabs","useState","useMemo","jsx","jsxs","ToolOutlined","useState","useMemo","TagsOutlined","MoreOutlined","Prompts","Tabs","Space","React","useCallback","useEffect","useRef","useState","Button","message","createStyles","jsx","useStyle","createStyles","useState","useEffect","useCallback","useRef","React","message","Button","useEffect","useRef","useRef","useEffect","useEffect","useRef","useRef","useEffect","message","Fragment","jsx","jsxs","useRef","useState","useEffect","useLayoutEffect","useStyle","React","useCallback","config","useContext","getFileIcon","FileImageOutlined","FilePdfOutlined","FileMarkdownOutlined","FileZipOutlined","FileExcelOutlined","FilePptOutlined","FileWordOutlined","FileTextOutlined","FileUnknownOutlined","message","Flex","Badge","Button","Divider","error","useDeferredValue","useMemo","BrainCircuit","Space","Typography","lastAtIndex","Prompts","Alert","jsx","Text","Typography","Avatar","Button","List","Space","Typography","createStyles","jsx","jsxs","Text","useStyle","colors","useState","useEffect","useCallback","Tag","Button","Empty","Spin","Typography","Space","Tooltip","Popconfirm","message","Card","ClockCircleOutlined","StopOutlined","ReloadOutlined","CheckCircleOutlined","CloseCircleOutlined","SyncOutlined","createStyles","dayjs","ScheduledTaskStatus","jsx","jsxs","dayjs","Text","Title","Typography","useStyles","createStyles","getStatusIcon","ClockCircleOutlined","SyncOutlined","CheckCircleOutlined","CloseCircleOutlined","StopOutlined","useState","useCallback","message","useEffect","Space","Tooltip","Button","Popconfirm","Card","Tag","ReloadOutlined","Spin","Empty","Button","Flex","Typography","CheckCircleOutlined","InfoCircleOutlined","LoadingOutlined","jsx","jsxs","Text","Typography","getStatusIcon","CheckCircleOutlined","InfoCircleOutlined","LoadingOutlined","formatToolName","Flex","toolCallData","Button","Button","Space","Typography","jsx","jsxs","Text","Typography","Space","toolCallData","Button","Card","Typography","Avatar","Tag","List","Space","Button","Skeleton","UserOutlined","TeamOutlined","jsx","jsxs","Text","Typography","colors","getInitials","Card","Skeleton","Space","TeamOutlined","Button","List","Avatar","UserOutlined","Tag","useMemo","jsx","jsxs","useStyle","jsx","jsxs","useStyle","useMemo","useState","useMemo","useRef","useEffect","jsx","jsxs","useStyle","formatTime","getStatusColor","useState","useMemo","Typography","Empty","createStyles","ChevronDown","Mail","Modal","Typography","Tag","Divider","createStyles","jsx","jsxs","Title","Text","Paragraph","useStyles","getInitials","getAvatarColor","colors","message","jsx","jsxs","Title","Text","Typography","useStyles","createStyles","getInitials","getAvatarColor","colors","formatDate","useState","ChevronDown","message","useMemo","Mail","Empty","useCallback","Button","Typography","React","useEffect","useRef","useCallback","useState","colors","radius","typography","jsx","jsxs","useRef","React","useState","useEffect","useCallback","message","jsx","jsxs","useCallback","Typography","Button","useCallback","jsx","useCallback","Card","Typography","Tag","Space","createStyles","jsx","jsxs","Text","Paragraph","useStyles","jsx","Suspense","Spin","useMemo","useState","Collapse","Button","createStyles","FileTextOutlined","FileImageOutlined","FilePdfOutlined","FileUnknownOutlined","FileWordOutlined","FileExcelOutlined","FileZipOutlined","PlayCircleOutlined","LinkOutlined","Alert","jsx","jsxs","useStyles","createStyles","getFileIcon","FileTextOutlined","FileImageOutlined","FilePdfOutlined","PlayCircleOutlined","FileWordOutlined","FileExcelOutlined","FileZipOutlined","FileUnknownOutlined","useState","useMemo","Alert","Collapse","Button","LinkOutlined","jsx","lazy","Suspense","jsx","Button","useMemo","useCallback","Fragment","jsx","useMemo","useCallback","Button","useCallback","useContext","useMemo","Button","jsx","useContext","useMemo","useCallback","Button","useMemo","jsx","useMemo","jsx","useStyles","createStyles","React","useDeferredValue","useMemo","useState","DownloadOutlined","jsx","jsxs","Text","Typography","message","useState","Flex","Space","Button","DownloadOutlined"]}
|