@axiom-lattice/react-sdk 4.11.2 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AgentDetailSideApp-GSO53ECQ.mjs → AgentDetailSideApp-QZPV7MNB.mjs} +8 -8
- package/dist/AgentGovernanceWorkbench-25C3AKQI.mjs +20 -0
- package/dist/{MessageGraph-RUU5W4OT.mjs → MessageGraph-JX6Y3VFH.mjs} +4 -4
- package/dist/{ReactChart-KU4TD7TM.mjs → ReactChart-LYUXL5M6.mjs} +4 -4
- package/dist/{SkillFlow-MLSQCF4X.mjs → SkillFlow-7OCWAF5V.mjs} +4 -4
- package/dist/{TasksSideApp-LWM6XAWN.mjs → TasksSideApp-TWDLVB4D.mjs} +5 -7
- package/dist/TasksSideApp-TWDLVB4D.mjs.map +1 -0
- package/dist/{TeamWorkspace-3NLKUNRK.mjs → TeamWorkspace-FGFAUD5Z.mjs} +4 -4
- package/dist/{TopologyRuntimeView-NVFFMHTP.mjs → TopologyRuntimeView-O3VL4A7R.mjs} +5 -5
- package/dist/{WorkflowAutomationView-WBVKM73F.mjs → WorkflowAutomationView-D4YMZLRJ.mjs} +7 -7
- package/dist/{chunk-YDIVRYML.mjs → chunk-3ZEMSWAC.mjs} +4 -4
- package/dist/{chunk-ZX53OESZ.mjs → chunk-466FV4VM.mjs} +3 -3
- package/dist/{chunk-QM3NPPQJ.mjs → chunk-6BWBE7MR.mjs} +8 -8
- package/dist/{chunk-PMICYMSW.mjs → chunk-7JDWJZ5M.mjs} +1176 -944
- package/dist/chunk-7JDWJZ5M.mjs.map +1 -0
- package/dist/{chunk-RDC4ZHXF.mjs → chunk-IFRTNJ2P.mjs} +2 -2
- package/dist/{chunk-PEEXMLMK.mjs → chunk-IODHU3BD.mjs} +3 -3
- package/dist/{chunk-NRT6JXPT.mjs → chunk-JJIGSAPR.mjs} +129 -222
- package/dist/chunk-JJIGSAPR.mjs.map +1 -0
- package/dist/{chunk-BXPPM4ZX.mjs → chunk-QABSNIMF.mjs} +3 -3
- package/dist/{chunk-ZQ7G446O.mjs → chunk-UDSGQ7R7.mjs} +3 -3
- package/dist/{chunk-ZXEY5OGX.mjs → chunk-UZWBRDTU.mjs} +6 -6
- package/dist/{embed-page-AgentDetailSideApp-FHC56ARN.js → embed-page-AgentDetailSideApp-JYVZKSUU.js} +1 -1
- package/dist/embed-page-AgentGovernanceWorkbench-SD2EHW2B.js +1 -0
- package/dist/{embed-page-MessageGraph-DMP5EZBM.js → embed-page-MessageGraph-GLQXKAVC.js} +1 -1
- package/dist/{embed-page-ReactChart-PYGNSRHG.js → embed-page-ReactChart-74MHCE2K.js} +1 -1
- package/dist/{embed-page-SkillFlow-6LPE2VG3.js → embed-page-SkillFlow-NDAK3GAD.js} +1 -1
- package/dist/{embed-page-TasksSideApp-MPYOPRXW.js → embed-page-TasksSideApp-DA4LUTMD.js} +5 -5
- package/dist/{embed-page-TeamWorkspace-EXUAXKAH.js → embed-page-TeamWorkspace-DUB3L6V6.js} +1 -1
- package/dist/{embed-page-TopologyRuntimeView-MH4YMU7D.js → embed-page-TopologyRuntimeView-NFBHAICN.js} +1 -1
- package/dist/{embed-page-WorkflowAutomationView-KQYFSLLH.js → embed-page-WorkflowAutomationView-43YGTXGF.js} +1 -1
- package/dist/{embed-page-chunk-O44JEYLD.js → embed-page-chunk-2PFKLMTR.js} +5 -5
- package/dist/{embed-page-chunk-NW37OVAX.js → embed-page-chunk-BVSC3MSO.js} +1 -1
- package/dist/{embed-page-chunk-YQZI5LNV.js → embed-page-chunk-C4ZV4IXK.js} +2 -2
- package/dist/{embed-page-chunk-QGXGVLAX.js → embed-page-chunk-DWIBLGBW.js} +1 -1
- package/dist/{embed-page-chunk-I7BVN6EY.js → embed-page-chunk-GKHIPXZ2.js} +1 -1
- package/dist/{embed-page-chunk-QHXKZNDU.js → embed-page-chunk-P477ZTUO.js} +307 -191
- package/dist/{embed-page-chunk-JSAUTBU5.js → embed-page-chunk-UHH575CK.js} +1 -1
- package/dist/{embed-page-en-PQZ2ZCEH.js → embed-page-en-GLT2HEZZ.js} +1 -1
- package/dist/{embed-page-zh-D3EX4GW4.js → embed-page-zh-XMEJPDMF.js} +1 -1
- package/dist/embed-page.js +1 -1
- package/dist/{en-WQVDOIB7.mjs → en-FDNQNTHX.mjs} +7 -2
- package/dist/{en-WQVDOIB7.mjs.map → en-FDNQNTHX.mjs.map} +1 -1
- package/dist/index.d.mts +24 -26
- package/dist/index.d.ts +24 -26
- package/dist/index.js +2806 -2782
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +92 -222
- package/dist/index.mjs.map +1 -1
- package/dist/web-app.js +12 -2
- package/dist/web-app.js.map +1 -1
- package/dist/web-app.mjs +1 -1
- package/dist/{zh-6PHD4AY5.mjs → zh-2EJFFUSY.mjs} +7 -2
- package/dist/zh-2EJFFUSY.mjs.map +1 -0
- package/package.json +2 -2
- package/dist/AgentGovernanceWorkbench-LHXFBEYO.mjs +0 -20
- package/dist/TasksSideApp-LWM6XAWN.mjs.map +0 -1
- package/dist/chunk-NRT6JXPT.mjs.map +0 -1
- package/dist/chunk-PMICYMSW.mjs.map +0 -1
- package/dist/embed-page-AgentGovernanceWorkbench-KAPZJBE6.js +0 -5
- package/dist/zh-6PHD4AY5.mjs.map +0 -1
- /package/dist/{AgentDetailSideApp-GSO53ECQ.mjs.map → AgentDetailSideApp-QZPV7MNB.mjs.map} +0 -0
- /package/dist/{AgentGovernanceWorkbench-LHXFBEYO.mjs.map → AgentGovernanceWorkbench-25C3AKQI.mjs.map} +0 -0
- /package/dist/{MessageGraph-RUU5W4OT.mjs.map → MessageGraph-JX6Y3VFH.mjs.map} +0 -0
- /package/dist/{ReactChart-KU4TD7TM.mjs.map → ReactChart-LYUXL5M6.mjs.map} +0 -0
- /package/dist/{SkillFlow-MLSQCF4X.mjs.map → SkillFlow-7OCWAF5V.mjs.map} +0 -0
- /package/dist/{TeamWorkspace-3NLKUNRK.mjs.map → TeamWorkspace-FGFAUD5Z.mjs.map} +0 -0
- /package/dist/{TopologyRuntimeView-NVFFMHTP.mjs.map → TopologyRuntimeView-O3VL4A7R.mjs.map} +0 -0
- /package/dist/{WorkflowAutomationView-WBVKM73F.mjs.map → WorkflowAutomationView-D4YMZLRJ.mjs.map} +0 -0
- /package/dist/{chunk-YDIVRYML.mjs.map → chunk-3ZEMSWAC.mjs.map} +0 -0
- /package/dist/{chunk-ZX53OESZ.mjs.map → chunk-466FV4VM.mjs.map} +0 -0
- /package/dist/{chunk-QM3NPPQJ.mjs.map → chunk-6BWBE7MR.mjs.map} +0 -0
- /package/dist/{chunk-RDC4ZHXF.mjs.map → chunk-IFRTNJ2P.mjs.map} +0 -0
- /package/dist/{chunk-PEEXMLMK.mjs.map → chunk-IODHU3BD.mjs.map} +0 -0
- /package/dist/{chunk-BXPPM4ZX.mjs.map → chunk-QABSNIMF.mjs.map} +0 -0
- /package/dist/{chunk-ZQ7G446O.mjs.map → chunk-UDSGQ7R7.mjs.map} +0 -0
- /package/dist/{chunk-ZXEY5OGX.mjs.map → chunk-UZWBRDTU.mjs.map} +0 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Chat/registerWorkspaceApp.tsx","../src/components/Auth/TenantBranding.tsx","../src/index.ts","../src/components/Chat/AgentConversations.tsx","../src/components/Chat/LatticeChatView.tsx","../src/components/Chat/SettingsModal.tsx","../src/components/Chat/AgentServerSetting.tsx","../src/components/Chat/LatticeChatShell.tsx","../src/components/Chat/ChannelInstallationsDrawerContent.tsx","../src/components/Chat/AssistantFlow.tsx","../src/components/Chat/AssistantNode.tsx","../src/components/Chat/LatticeAgentWorkspace.tsx"],"sourcesContent":["/**\n * Workspace App Registration\n *\n * Registers workspace and CoSpace as apps in the global app registry.\n * This happens at module load time, before any components render,\n * ensuring AppSwitcherModal has apps available on first render.\n */\n\nimport { appRegistry } from \"../../AppRegistry\";\nimport { LayoutGrid, Users } from \"lucide-react\";\n\n// Register Workspace as an app - this runs at module load time\nappRegistry.register({\n id: \"workspace\",\n name: \"Workspace\",\n icon: <LayoutGrid size={16} />,\n description: \"Manage projects, assistants, and workflows\",\n});\n\n// Register CoSpace as a standalone app (visible in AppSwitcher only,\n// NOT in the workspace sidebar menu)\nappRegistry.register({\n id: \"cospace\",\n name: \"CoSpace\",\n icon: <Users size={16} />,\n description: \"Direct messaging and collaboration spaces\",\n});\n","import React from \"react\";\nimport { theme } from \"antd\";\nimport { useTenantBranding } from \"../../hooks/useTenantBranding\";\nimport { TenantLogo } from \"./TenantLogo\";\n\nconst { useToken } = theme;\n\nexport interface TenantBrandingProps {\n /** Logo + text size preset */\n size?: \"small\" | \"medium\";\n /** Whether to show the tenant name next to the logo (default true) */\n showName?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Brand bar combining tenant logo and tenant name.\n *\n * Uses `useTenantBranding()` internally to read the current tenant's\n * logo URL. Renders nothing visible when there is no current tenant.\n */\nexport const TenantBranding: React.FC<TenantBrandingProps> = ({\n size = \"medium\",\n showName = true,\n className,\n}) => {\n const { logoUrl, tenantName } = useTenantBranding();\n const { token } = useToken();\n\n if (!tenantName) {\n return null;\n }\n\n const logoSize = size === \"medium\" ? 32 : 24;\n const gap = size === \"medium\" ? 10 : 8;\n const fontSize = size === \"medium\" ? 16 : 13;\n\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap,\n padding: \"8px 16px\",\n }}\n >\n <TenantLogo logoUrl={logoUrl} size={logoSize} />\n {showName && (\n <span\n style={{\n fontWeight: 600,\n fontSize,\n color: token.colorText,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {tenantName}\n </span>\n )}\n </div>\n );\n};\n","/**\n * @packageDocumentation\n * Axiom Lattice React SDK - React hooks for the Axiom Lattice Agent Service API\n */\n\n// Register workspace app at module load time (before any components render)\n// This ensures AppSwitcherModal has apps available on first render\nimport \"./components/Chat/registerWorkspaceApp\";\n\n// Export types\nexport * from \"./types\";\n\n// Export hooks\nexport * from \"./hooks/useChat\";\nexport * from \"./hooks/useAgentChat\";\nexport * from \"./hooks/useAgentState\";\nexport * from \"./hooks/useAgentGraph\";\nexport * from \"./hooks/useApi\";\nexport * from \"./hooks/useMiddlewareTypes\";\nexport * from \"./hooks/useCapabilityBundles\";\nexport * from \"./hooks/useModelProviders\";\nexport * from \"./hooks/useProjectCapabilities\";\nexport * from \"./hooks/eval/useEvalProjects\";\nexport * from \"./hooks/eval/useEvalSuites\";\nexport * from \"./hooks/eval/useEvalCases\";\nexport * from \"./hooks/eval/useEvalRuns\";\nexport * from \"./hooks/eval/useEvalRunStream\";\n\n// Export context\nexport * from \"./context\";\nexport * from \"./context/AgentThreadContext\";\n\n// App registry + contexts for app switching and standalone app composition\n// (e.g. building a CoSpace-only app).\nexport { appRegistry } from \"./AppRegistry\";\nexport type { AppDefinition, AppRegistry } from \"./AppRegistry\";\nexport { AppProvider, useApp, useCurrentApp } from \"./context/AppContext\";\nexport type { AppContextValue, AppProviderProps } from \"./context/AppContext\";\nexport { WorkspaceContextProvider, WorkspaceContext, useWorkspaceContext, useWorkspaceContextOptional } from \"./context/WorkspaceContext\";\nexport type { WorkspaceContextValue, WorkspaceContextProviderProps } from \"./context/WorkspaceContext\";\nexport { useClient } from \"./context\";\n\nexport * from \"./auth\";\n\nexport { TenantLogo } from \"./components/Auth/TenantLogo\";\nexport { TenantBranding } from \"./components/Auth/TenantBranding\";\nexport { TenantSettingsModal } from \"./components/Auth/TenantSettingsModal\";\nexport {\n TenantModelProvidersModal,\n TenantModelProvidersPanel,\n} from \"./components/Auth/TenantModelProvidersModal\";\nexport { useTenantBranding } from \"./hooks/useTenantBranding\";\nexport type { TenantBrandingData } from \"./hooks/useTenantBranding\";\n\nexport * from \"@axiom-lattice/protocols\";\n\n// Export components\nexport * from \"./components/Chat/ChatErrorBoundary\";\nexport * from \"./components/Chat/LatticeChat\";\nexport * from \"./components/Chat/ModelSelector\";\nexport * from \"./components/ProjectSelector\";\nexport * from \"./components/ProjectScopeProvider\";\nexport * from \"./components/Eval/RunEnvModal\";\nexport * from \"./components/GenUI/MDResponse\";\nexport * from \"./components/GenUI/types\";\nexport * from \"./components/GenUI/elements\";\nexport * from \"./components/Chat/Chating\";\nexport * from \"./components/Chat/SideAppViewBrowser\";\nexport * from \"./components/Chat/SideAppBrowserContext\";\nexport * from \"./components/Chat/ChatUIContext\";\nexport * from \"./components/Chat/ConversationContext\";\nexport * from \"./components/Chat/AssistantContext\";\nexport { AgentChatApp } from \"./integrations/web-app/console-chat/AgentChatApp\";\nexport type { AgentChatAppProps } from \"./integrations/web-app/console-chat/AgentChatApp\";\nexport * from \"./components/Chat/ConnectionListField\";\nexport * from \"./components/Chat/ConnectionConfigDrawerContent\";\nexport * from \"./components/Chat/ConnectionsHub\";\nexport * from \"./components/Chat/LatticeChatShellContext\";\nexport * from \"./components/CapabilityBundles/CapabilityBundleList\";\nexport * from \"./components/CapabilityBundles/CapabilityBundleForm\";\nexport * from \"./components/CapabilityBundles/ProjectCapabilityPanel\";\nexport * from \"./components/CapabilityBundles/CapabilityPreviewPanel\";\nexport * from \"./components/CapabilityBundles/CapabilityOverrideDetails\";\nexport * from \"./components/Chat/types\";\nexport * from \"./components/Chat/ColumnLayout\";\nexport * from \"./components/GenUI/FileExplorer\";\nexport * from \"./components/Chat/AgentConversations\";\nexport * from \"./components/Chat/MetricsConfigDrawerContent\";\nexport * from \"./components/Chat/WorkspaceResourceManager\";\nexport * from \"./components/Chat/LatticeChatShell\";\nexport * from \"./components/Chat/ChatSidebar\";\nexport * from \"./components/Chat/ChannelInstallationsDrawerContent\";\nexport * from \"./components/Chat/ScheduleButton\";\nexport { default as AssistantFlow } from \"./components/Chat/AssistantFlow\";\nexport { default as AssistantNode } from \"./components/Chat/AssistantNode\";\nexport type { AssistantFlowProps } from \"./components/Chat/AssistantFlow\";\nexport type { AssistantNodeData } from \"./components/Chat/AssistantNode\";\nexport { default as SkillFlow } from \"./components/Chat/SkillFlow\";\nexport { default as SkillNode } from \"./components/Chat/SkillNode\";\nexport type { SkillFlowProps } from \"./components/Chat/SkillFlow\";\nexport type { SkillNodeData } from \"./components/Chat/SkillNode\";\nexport { default as WorkflowCanvas } from \"./components/Chat/WorkflowCanvas\";\nexport { default as WorkflowNode } from \"./components/Chat/WorkflowNode\";\nexport type { WorkflowCanvasProps } from \"./components/Chat/WorkflowCanvas\";\nexport type { WorkflowNodeData } from \"./components/Chat/WorkflowNode\";\nexport { WorkflowAutomationView } from \"./components/Chat/WorkflowAutomationView\";\nexport { default as CreateAssistantModal } from \"./components/Chat/CreateAssistantModal\";\nexport type { CreationMode, CreateAssistantModalProps } from \"./components/Chat/CreateAssistantModal\";\nexport { EvalPanel } from \"./components/Eval/EvalPanel\";\nexport { EvalSuiteCardList } from \"./components/Eval/EvalSuiteCardList\";\nexport { EvalSuiteDetail } from \"./components/Eval/EvalSuiteDetail\";\nexport { EvalRunResults } from \"./components/Eval/EvalRunResults\";\nexport { AgentGovernanceWorkbench } from \"./components/Governance/AgentGovernanceWorkbench\";\nexport { AgentList } from \"./components/Governance/AgentList\";\nexport { AgentDetailView } from \"./components/Governance/AgentDetailView\";\nexport { AgentEvalPanel } from \"./components/Governance/AgentEvalPanel\";\nexport { isTrainingRound, getRoundRepresentativeScore, toAttachmentItems } from \"./components/Governance/Learning/trainingUtils\";\nexport { AgentOverview } from \"./components/Governance/AgentOverview\";\nexport { AgentCardStats, type AgentCardStatsData } from \"./components/Governance/AgentCardStats\";\nexport { AgentConfigGraph } from \"./components/Governance/AgentConfigGraph\";\nexport { AgentGraphView } from \"./components/Governance/AgentGraphView\";\nexport { buildAgentConfigGraphData, type ConfigGraphNode, type ConfigNodeType } from \"./components/Governance/configGraph\";\nexport { buildAgentListItems, buildAgentGraphData } from \"./components/Governance/agentMeta\";\nexport { PersonalAssistantPage } from \"./components/Chat/PersonalAssistantPage\";\nexport { LatticeAgentWorkspace } from \"./components/Chat/LatticeAgentWorkspace\";\nexport { ProjectScopedChating } from \"./components/Chat/ProjectScopedChating\";\nexport type { ProjectScopedChatingProps } from \"./components/Chat/ProjectScopedChating\";\nexport { FilePanelToggle } from \"./components/Chat/FilePanelToggle\";\nexport { PersonalAssistantChannelModal } from \"./components/Chat/PersonalAssistantChannelModal\";\nexport { default as SkillCategoryPrompts } from \"./components/Chat/SkillCategoryPrompts\";\nexport type { SkillCategoryPromptsProps } from \"./components/Chat/SkillCategoryPrompts\";\nexport { VoiceInputButton } from \"./components/Chat/VoiceInputButton\";\nexport type { VoiceInputButtonProps } from \"./components/Chat/VoiceInputButton\";\nexport { useVoiceRecorder } from \"./hooks/useVoiceRecorder\";\nexport type { VoiceRecorderState, RecorderMode, RecorderStatus, RecorderError, UseVoiceRecorderOptions } from \"./hooks/useVoiceRecorder\";\n\n// EntityList components\nexport { ViewToggle } from \"./components/EntityList/ViewToggle\";\nexport { EntityCard } from \"./components/EntityList/EntityCard\";\nexport { EntityRow } from \"./components/EntityList/EntityRow\";\nexport { EntityCreateTrigger } from \"./components/EntityList/EntityCreateTrigger\";\nexport { EntityListShell } from \"./components/EntityList/EntityListShell\";\nexport { EntityListView } from \"./components/EntityList/EntityListView\";\nexport { FilterSelect } from \"./components/EntityList/FilterSelect\";\nexport type { FilterSelectProps } from \"./components/EntityList/FilterSelect\";\nexport type { EntityAction, ViewMode, ViewModeExtension } from \"./components/EntityList/types\";\n\n// Shared UI components\nexport { SegmentedToggle } from \"./components/shared/SegmentedToggle\";\nexport type {\n SegmentedToggleProps,\n SegmentOption,\n} from \"./components/shared/SegmentedToggle\";\n\n// A2A keys components\nexport { A2AKeyList } from \"./components/A2AKeys/A2AKeyList\";\nexport { KeyEditorDrawer } from \"./components/A2AKeys/KeyEditorDrawer\";\nexport type { KeyEditorDrawerProps } from \"./components/A2AKeys/KeyEditorDrawer\";\nexport { OpenGrantsPicker } from \"./components/A2AKeys/OpenGrantsPicker\";\nexport { OpenAuditLogList } from \"./components/A2AKeys/OpenAuditLogList\";\nexport { KeyExposureDetail } from \"./components/A2AKeys/KeyExposureDetail\";\nexport type { KeyExposureDetailProps } from \"./components/A2AKeys/KeyExposureDetail\";\nexport type { OpenAuditLogListProps } from \"./components/A2AKeys/OpenAuditLogList\";\nexport type { OpenGrantsPickerProps, OpenGrantsValue } from \"./components/A2AKeys/OpenGrantsPicker\";\n\n// A2A exposure components\n\n// Migration components\nexport { ConflictResolver } from \"./components/Migration/ConflictResolver\";\nexport { ExportStep } from \"./components/Migration/ExportStep\";\nexport { ImportStep } from \"./components/Migration/ImportStep\";\nexport { MigrationPage, MigrationPageWrapper } from \"./components/Migration/MigrationPage\";\n\n// Project Room collaboration UI\nexport { ProjectRoomPage } from \"./components/ProjectRoom/ProjectRoomPage\";\nexport { ProjectRoomShell } from \"./components/ProjectRoom/ProjectRoomShell\";\nexport type { ProjectRoomShellProps } from \"./components/ProjectRoom/ProjectRoomShell\";\nexport { ProjectRoomHeader } from \"./components/ProjectRoom/ProjectRoomHeader\";\nexport type { ProjectRoomHeaderProps } from \"./components/ProjectRoom/ProjectRoomHeader\";\nexport { ProjectRoomTimeline } from \"./components/ProjectRoom/ProjectRoomTimeline\";\nexport type { ProjectRoomTimelineProps } from \"./components/ProjectRoom/ProjectRoomTimeline\";\nexport { ProjectRoomComposer } from \"./components/ProjectRoom/ProjectRoomComposer\";\nexport type { ProjectRoomComposerProps, ProjectRoomComposerSendInput, ProjectRoomComposerReplyTarget } from \"./components/ProjectRoom/ProjectRoomComposer\";\nexport { ProjectRoomRoster } from \"./components/ProjectRoom/ProjectRoomRoster\";\nexport { deriveBotAvailability } from \"./components/ProjectRoom/ProjectRoomRoster\";\nexport type { ProjectRoomBotAvailability } from \"./components/ProjectRoom/ProjectRoomRoster\";\nexport { ProjectRoomTasksPanel } from \"./components/ProjectRoom/ProjectRoomTasksPanel\";\nexport { ProjectRoomFilesPanel } from \"./components/ProjectRoom/ProjectRoomFilesPanel\";\nexport { ProjectRoomProvider, useProjectRoom } from \"./integrations/project-room/ProjectRoomContext\";\nexport type {\n ProjectRoomContextValue,\n ProjectRoomProviderProps,\n ProjectRoomComposerSubmission,\n ProjectRoomMemberActions,\n ProjectRoomHumanCandidate,\n ProjectRoomBotActions,\n} from \"./integrations/project-room/ProjectRoomContext\";\nexport {\n createProjectRoomState,\n applyBootstrap,\n applyStreamFrame,\n applyResource,\n applySendResult,\n applyDispatch,\n applyOlderMessages,\n deriveProjectRoomCapabilities,\n} from \"./integrations/project-room/projectRoomState\";\nexport type {\n ProjectRoomState,\n ProjectRoomBootstrap,\n ProjectRoomConnectionStatus,\n ProjectRoomRefreshKey,\n ProjectRoomUiError,\n ProjectRoomCapabilities,\n ProjectRoomEventResult,\n ProjectRoomResourceValue,\n} from \"./integrations/project-room/projectRoomState\";\nexport { RoomEventsProvider, useRoomEvents, RoomEventsContext } from \"./integrations/room-events/RoomEventsContext\";\nexport type {\n RoomEventsConnectionStatus,\n RoomEventsContextValue,\n RoomEventsProviderProps,\n RoomEventsState,\n} from \"./integrations/room-events/RoomEventsContext\";\nexport { useRoomNotifications } from \"./integrations/room-events/useRoomNotifications\";\nexport type { RoomNotificationsState, RoomNotificationPermission } from \"./integrations/room-events/useRoomNotifications\";\nexport {\n authStorage,\n clearAuthItems,\n isStandalonePwa,\n readAuthItem,\n removeAuthItem,\n writeAuthItem,\n} from \"./utils/authStorage\";\nexport { formatErrorMessage, rootErrorMessage } from \"./utils/errorMessage\";\nexport { useWebPush } from \"./integrations/push/useWebPush\";\nexport type { UseWebPushOptions, WebPushState, WebPushPermission } from \"./integrations/push/useWebPush\";\n\n// Export theme\nexport * from \"./theme\";\n\n// Export streaming HTML renderer\nexport * from \"./streaming-html\";\n\n// CoSpace components\nexport * from \"./components/CoSpace\";\n\n// MCP Apps host renderer\nexport { McpAppRenderer } from \"./components/McpApp/McpAppRenderer\";\nexport type { McpAppRendererProps } from \"./components/McpApp/McpAppRenderer\";\nexport { McpAppFullscreen } from \"./components/McpApp/McpAppFullscreen\";\nexport { extractUiRef } from \"./components/McpApp/extractUiRef\";\n\n// i18n — locale provider, translator, and the key conventions behind them.\n//\n// `createT` / `interpolate` / `DEFAULT_LOCALE` / `DICTIONARIES` used to be\n// re-exported from `@axiom-lattice/i18n`; i18next owns interpolation and\n// dictionaries now, so those names are gone rather than shimmed. Nothing\n// outside this barrel consumed them.\nexport {\n useT,\n useLocale,\n LatticeLocaleProvider,\n SUPPORTED_LOCALES,\n NAMESPACES,\n namespaceOf,\n} from \"./i18n\";\n/**\n * The per-module TS dictionaries and `reactSdkEnUS` are no longer exported:\n * copy lives in `src/i18n/locales/<ns>/<lang>.json` and reaches consumers\n * through i18next. `reactSdkZhCN` in particular must never be re-exported —\n * a static re-export puts ~200 KB of Chinese into every barrel consumer's\n * startup graph, including the budgeted embed closure.\n */\nexport type {\n Dictionary,\n LatticeLocale,\n TFunction,\n TParams,\n} from \"./i18n\";\n","import {\n CodeOutlined,\n FileImageOutlined,\n FileSearchOutlined,\n SignatureOutlined,\n} from \"@ant-design/icons\";\nimport { Conversations } from \"@ant-design/x\";\nimport type { GetProp } from \"antd\";\nimport { theme } from \"antd\";\nimport React, { useMemo } from \"react\";\nimport {\n ConversationThread,\n useConversationContext,\n} from \"./ConversationContext\";\nimport { useAssistantContext } from \"./AssistantContext\";\n\n/**\n * Props for the {@link AgentConversations} component.\n */\nexport interface AgentConversationsProps {\n /**\n * Whether users can create new threads from the UI.\n * Defaults to true.\n */\n enableThreadCreation?: boolean;\n /**\n * Whether the thread list should be rendered.\n * Defaults to true.\n */\n enableThreadList?: boolean;\n}\n\n/**\n * Thread list sidebar component showing conversation history for the current agent.\n *\n * Uses Ant Design X `Conversations` component to display threads fetched from\n * {@link useConversationContext}. Supports creating new threads when\n * `enableThreadCreation` is true.\n *\n * @param enableThreadCreation - Whether the \"New Chat\" button is shown. Default: true.\n * @param enableThreadList - Whether the thread list is rendered at all. Default: true.\n * @returns The conversations list or `null` if thread list is disabled.\n *\n * @example\n * ```tsx\n * import { AgentConversations } from \"@axiom-lattice/react-sdk\";\n *\n * <AgentConversations\n * enableThreadCreation={false}\n * enableThreadList\n * />\n * ```\n *\n * @remarks\n * - Requires ancestor context providers: {@link ConversationContextProvider} and\n * {@link AssistantContextProvider}.\n * - Returns `null` when `enableThreadList` is false.\n */\nexport const AgentConversations: React.FC<AgentConversationsProps> = ({\n enableThreadCreation = true,\n enableThreadList = true,\n}) => {\n const { token } = theme.useToken();\n const { currentAssistant } = useAssistantContext();\n const {\n assistantId,\n thread,\n selectThread,\n createThread,\n listThreads,\n threads,\n } = useConversationContext();\n\n // Customize the style of the container\n const style = {\n width: \"100%\",\n background: \"transparent\",\n borderRadius: token.borderRadius,\n };\n\n const threadItems = useMemo(() => {\n return threads || [];\n }, [threads]);\n\n const items = threadItems.map((thread) => ({\n key: thread.id,\n label: thread.label,\n }));\n\n const newChatClick = async () => {\n if (!assistantId) {\n return;\n }\n await createThread();\n };\n\n if (!enableThreadList) {\n return null;\n }\n\n const creation = enableThreadCreation\n ? {\n onClick: newChatClick,\n }\n : undefined;\n\n return (\n <Conversations\n creation={creation as GetProp<typeof Conversations, \"creation\">}\n items={items}\n activeKey={thread?.id}\n style={style}\n groupable\n onActiveChange={(key) => {\n selectThread(key);\n }}\n />\n );\n};\n","import React, { useContext } from \"react\";\nimport { LatticeChat } from \"./LatticeChat\";\nimport { useConversationContext } from \"./ConversationContext\";\nimport { AxiomLatticeProvider } from \"@context\";\nimport { LatticeChatShellContext, useLatticeChatShellContext } from \"./LatticeChatShellContext\";\nimport { ChatSidebar } from \"./ChatSidebar\";\nimport { useAssistantContext } from \"./AssistantContext\";\nimport { LatticeShellHeader } from \"./LatticeShellHeader\";\nexport type LatticeChatViewProps = Record<string, never>;\n\nexport const LatticeChatView: React.FC<LatticeChatViewProps> = (props) => {\n const shellContext = useContext(LatticeChatShellContext);\n const { showSideMenu, sideMenuItems } = shellContext.config;\n const { assistantId, thread } = useConversationContext();\n const { currentAssistant } = useAssistantContext();\n const {\n config: { baseURL },\n } = useLatticeChatShellContext();\n\n return assistantId && thread ? (\n <AxiomLatticeProvider\n config={{\n baseURL,\n apiKey: \"\",\n assistantId,\n transport: \"sse\",\n }}\n >\n <LatticeChat\n thread_id={thread?.id}\n assistant_id={assistantId}\n name={currentAssistant?.name}\n description={currentAssistant?.description}\n menu={showSideMenu ? <ChatSidebar customMenuItems={sideMenuItems} /> : undefined}\n />\n </AxiomLatticeProvider>\n ) : null;\n};\n","import React, { useState, useEffect, useRef } from \"react\";\nimport {\n Modal,\n Input,\n Button,\n message,\n Typography,\n Alert,\n Select,\n Switch,\n Space,\n Tabs,\n} from \"antd\";\nimport {\n SaveOutlined,\n EnvironmentOutlined,\n ReloadOutlined,\n CheckCircleOutlined,\n ApiOutlined,\n LinkOutlined,\n CheckCircleFilled,\n CloseCircleFilled,\n PlusOutlined,\n DeleteOutlined,\n RightOutlined,\n DownOutlined,\n CloudServerOutlined,\n} from \"@ant-design/icons\";\nimport { createStyles } from \"antd-style\";\nimport { useLatticeChatShellContext } from \"./LatticeChatShellContext\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { useT, type TranslationKey } from \"../../i18n\";\n\nconst { Text, Title } = Typography;\nconst { TextArea } = Input;\n\nconst useStyles = createStyles(({ token, css }) => ({\n // settingsModal: css`\n // .ant-modal {\n // max-width: 100vw !important;\n // width: 100vw !important;\n // margin: 0 !important;\n // top: 0 !important;\n // padding-bottom: 0 !important;\n // }\n\n // .ant-modal-content {\n // padding: 0;\n // height: 100vh;\n // max-height: 100vh;\n // border-radius: 0;\n // overflow: hidden;\n // width: 100%;\n // }\n\n // .ant-modal-body {\n // padding: 0;\n // height: 100%;\n // display: flex;\n // overflow: hidden;\n // width: 100%;\n // }\n // `,\n tabsContainer: css`\n height: 100vh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n .ant-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .ant-tabs-content-holder {\n flex: 1;\n overflow: hidden;\n }\n\n .ant-tabs-content {\n height: 100%;\n }\n\n .ant-tabs-tabpane {\n height: 100%;\n overflow: hidden;\n }\n\n .ant-tabs-nav {\n margin: 0;\n padding: 0 ${token.paddingLG}px;\n background: ${token.colorBgContainer};\n border-bottom: 1px solid ${token.colorBorder};\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n }\n\n .ant-tabs-tab {\n padding: ${token.paddingMD}px ${token.paddingLG}px;\n margin: ${token.paddingSM}px ${token.marginXS}px 0 0;\n border-radius: ${token.borderRadius}px ${token.borderRadius}px 0 0;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n\n &:hover {\n background: ${token.colorFillTertiary};\n }\n\n &.ant-tabs-tab-active {\n background: ${token.colorBgContainer};\n border-bottom-color: ${token.colorBgContainer};\n }\n }\n `,\n tabContent: css`\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: linear-gradient(\n 135deg,\n ${token.colorBgLayout} 0%,\n ${token.colorFillQuaternary} 100%\n );\n `,\n sidebar: css`\n width: 280px;\n background: linear-gradient(\n 180deg,\n ${token.colorBgContainer} 0%,\n ${token.colorFillQuaternary} 100%\n );\n border-right: 1px solid ${token.colorBorder};\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n flex-shrink: 0;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.04);\n\n /* Custom scrollbar */\n &::-webkit-scrollbar {\n width: 8px;\n }\n\n &::-webkit-scrollbar-track {\n background: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background: ${token.colorBorder};\n border-radius: 4px;\n transition: background 0.2s;\n\n &:hover {\n background: ${token.colorBorderSecondary};\n }\n }\n `,\n sidebarHeader: css`\n padding: ${token.paddingXL}px ${token.paddingLG}px;\n border-bottom: 1px solid ${token.colorBorder};\n background: linear-gradient(\n 135deg,\n ${token.colorPrimaryBg} 0%,\n ${token.colorBgContainer} 100%\n );\n position: sticky;\n top: 0;\n z-index: 10;\n backdrop-filter: blur(10px);\n `,\n sidebarTitle: css`\n font-size: ${token.fontSizeXL}px;\n font-weight: 700;\n background: linear-gradient(\n 135deg,\n ${token.colorPrimary} 0%,\n ${token.colorPrimaryHover} 100%\n );\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n margin: 0;\n letter-spacing: -0.5px;\n `,\n menuItem: css`\n padding: ${token.paddingMD}px ${token.paddingLG}px;\n margin: ${token.marginXS}px ${token.paddingSM}px;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: ${token.borderRadiusLG}px;\n display: flex;\n align-items: center;\n gap: ${token.marginMD}px;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: ${token.colorPrimary};\n transform: scaleY(0);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: 0 2px 2px 0;\n }\n\n &:hover {\n background: ${token.colorFillTertiary};\n transform: translateX(4px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n &.active {\n background: linear-gradient(\n 135deg,\n ${token.colorPrimaryBg} 0%,\n ${token.colorFillTertiary} 100%\n );\n color: ${token.colorPrimary};\n box-shadow: 0 4px 12px rgba(24, 144, 255, 0.15);\n transform: translateX(4px);\n\n &::before {\n transform: scaleY(1);\n }\n\n .menuItemIcon {\n transform: scale(1.1);\n }\n }\n `,\n menuItemIcon: css`\n font-size: 18px;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n `,\n menuItemText: css`\n font-size: ${token.fontSize}px;\n font-weight: 600;\n letter-spacing: 0.2px;\n `,\n content: css`\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n width: 100%;\n min-width: 0;\n `,\n contentHeader: css`\n padding: ${token.paddingLG}px ${token.paddingXL * 2}px;\n background: ${token.colorBgContainer};\n border-bottom: 1px solid ${token.colorBorder};\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n position: sticky;\n top: 0;\n z-index: 5;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: ${token.marginLG}px;\n `,\n contentHeaderLeft: css`\n flex: 1;\n `,\n contentHeaderRight: css`\n display: flex;\n gap: ${token.marginMD}px;\n flex-shrink: 0;\n `,\n contentTitle: css`\n font-size: ${token.fontSizeHeading3}px;\n font-weight: 700;\n color: ${token.colorTextHeading};\n margin: 0 0 ${token.marginSM}px 0;\n letter-spacing: -0.5px;\n `,\n contentDescription: css`\n color: ${token.colorTextSecondary};\n font-size: ${token.fontSize}px;\n margin: 0;\n line-height: 1.6;\n `,\n contentBody: css`\n flex: 1;\n overflow-y: auto;\n padding: ${token.paddingXL * 2}px ${token.paddingXL * 2}px;\n background: transparent;\n\n /* Custom scrollbar */\n &::-webkit-scrollbar {\n width: 8px;\n }\n\n &::-webkit-scrollbar-track {\n background: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background: ${token.colorBorder};\n border-radius: 4px;\n transition: background 0.2s;\n\n &:hover {\n background: ${token.colorBorderSecondary};\n }\n }\n `,\n formContainer: css`\n width: 100%;\n max-width: 100%;\n `,\n formLabel: css`\n font-weight: 600;\n color: ${token.colorTextHeading};\n margin-bottom: ${token.marginMD}px;\n display: block;\n font-size: ${token.fontSize}px;\n `,\n formDescription: css`\n color: ${token.colorTextSecondary};\n font-size: ${token.fontSizeSM}px;\n margin-top: ${token.marginSM}px;\n line-height: 1.6;\n `,\n card: css`\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorBorder};\n border-radius: ${token.borderRadiusLG}px;\n padding: ${token.paddingXL}px;\n margin-bottom: ${token.marginLG}px;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n\n &:hover {\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n transform: translateY(-2px);\n border-color: ${token.colorPrimary};\n }\n `,\n alertCard: css`\n border-radius: ${token.borderRadiusLG}px;\n margin-bottom: ${token.marginLG}px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid ${token.colorBorder};\n `,\n textArea: css`\n border-radius: ${token.borderRadius}px;\n border: 1px solid ${token.colorBorder};\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n\n &:hover {\n border-color: ${token.colorPrimaryHover};\n }\n\n &:focus {\n border-color: ${token.colorPrimary};\n box-shadow: 0 0 0 2px ${token.colorPrimaryBg};\n }\n `,\n connectionStatus: css`\n display: flex;\n align-items: center;\n gap: ${token.marginXS}px;\n margin-left: ${token.marginSM}px;\n `,\n addServerModal: css`\n .ant-modal-body {\n padding: ${token.paddingXL}px;\n }\n `,\n}));\n\nexport interface SettingsModalProps {\n open: boolean;\n onClose: () => void;\n}\n\ntype SettingsMenuItem = {\n key: string;\n labelKey: TranslationKey;\n icon: React.ReactNode;\n};\n\nconst SETTINGS_MENU_ITEMS: SettingsMenuItem[] = [\n {\n key: \"environment\",\n labelKey: \"chatConfig.settings.menu.environment\",\n icon: <EnvironmentOutlined />,\n },\n {\n key: \"models\",\n labelKey: \"chatConfig.settings.menu.models\",\n icon: <ApiOutlined />,\n },\n];\n\ninterface ServerConnection {\n id: string;\n name: string;\n url: string;\n apiKey?: string;\n connected?: boolean;\n connecting?: boolean;\n error?: string;\n}\n\ninterface ServerConfig {\n envText: string;\n models: Array<{\n key: string;\n model: string;\n provider: string;\n streaming: boolean;\n /**\n * Only ever holds a key the user just typed. The API never returns stored\n * keys — `hasApiKey` reports whether one exists, and submitting an empty\n * field keeps whatever is stored.\n */\n apiKey: string;\n /** Server-side flag: a key is already configured for this model. */\n hasApiKey?: boolean;\n baseURL: string;\n maxTokens?: number;\n temperature?: number;\n timeout?: number;\n maxRetries?: number;\n }>;\n}\n\nexport const SettingsModal: React.FC<SettingsModalProps> = ({\n open,\n onClose,\n}) => {\n const { styles } = useStyles();\n const t = useT();\n const { config: shellConfig, updateConfigValue } =\n useLatticeChatShellContext();\n\n const [connections, setConnections] = useState<ServerConnection[]>(() => {\n // Load connections from localStorage\n if (typeof window !== \"undefined\") {\n try {\n const stored = localStorage.getItem(\"lattice_server_connections\");\n if (stored) {\n const parsed = JSON.parse(stored);\n return parsed;\n }\n } catch (error) {\n console.warn(\"Failed to load connections from localStorage:\", error);\n }\n }\n // Default connection from shell config\n if (shellConfig.baseURL) {\n return [\n {\n id: \"default\",\n name: t(\"chatConfig.settings.defaultConnectionName\"),\n url: shellConfig.baseURL,\n },\n ];\n }\n return [];\n });\n\n // Store config data for each server\n const [serverConfigs, setServerConfigs] = useState<\n Record<string, ServerConfig>\n >({});\n\n // Use ref to store latest connections for async functions\n const connectionsRef = useRef(connections);\n useEffect(() => {\n connectionsRef.current = connections;\n }, [connections]);\n\n const [activeTabKey, setActiveTabKey] = useState<string>(\n connections.length > 0 ? connections[0].id : \"\"\n );\n const [activeMenu, setActiveMenu] = useState<string>(\"environment\");\n const [loading, setLoading] = useState(false);\n const [showAddServerModal, setShowAddServerModal] = useState(false);\n const [newServerUrl, setNewServerUrl] = useState<string>(\"\");\n const [newServerName, setNewServerName] = useState<string>(\"\");\n const [newServerApiKey, setNewServerApiKey] = useState<string>(\"\");\n const [addingServer, setAddingServer] = useState(false);\n\n // Save connections to localStorage\n const saveConnections = (newConnections: ServerConnection[]) => {\n setConnections(newConnections);\n if (typeof window !== \"undefined\") {\n try {\n localStorage.setItem(\n \"lattice_server_connections\",\n JSON.stringify(newConnections)\n );\n } catch (error) {\n console.warn(\"Failed to save connections to localStorage:\", error);\n }\n }\n };\n\n // Initialize config for a server\n const initializeServerConfig = (serverId: string) => {\n if (!serverConfigs[serverId]) {\n setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n envText: \"\",\n models: [\n {\n key: \"\",\n model: \"\",\n provider: \"openai\",\n streaming: false,\n apiKey: \"\",\n baseURL: \"\",\n },\n ],\n },\n }));\n }\n };\n\n // Check connection status\n const checkConnection = async (serverId: string) => {\n const connection = connectionsRef.current.find((c) => c.id === serverId);\n if (!connection) return;\n\n const url = connection.url;\n if (!url) {\n updateConnectionStatus(serverId, { connected: false });\n return;\n }\n\n try {\n updateConnectionStatus(serverId, { connecting: true, error: \"\" });\n\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n // Prepare headers with API key if available\n const headers: HeadersInit = {};\n if (connection.apiKey) {\n headers[\"Authorization\"] = `Bearer ${connection.apiKey}`;\n }\n\n // Try to fetch config endpoint to test connection\n const response = await fetch(`${url}/api/config`, {\n method: \"GET\",\n signal: controller.signal,\n headers,\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok) {\n // Disconnect all other servers\n setConnections((prev) =>\n prev.map((conn) =>\n conn.id === serverId\n ? { ...conn, connected: true, connecting: false, error: \"\" }\n : { ...conn, connected: false, connecting: false }\n )\n );\n // Update shell config with the connected URL\n if (url !== shellConfig.baseURL) {\n updateConfigValue(\"baseURL\", url);\n }\n } else {\n updateConnectionStatus(serverId, {\n connected: false,\n connecting: false,\n error: t(\"chatConfig.settings.error.serverError\"),\n });\n }\n } catch (error: any) {\n if (error.name === \"AbortError\") {\n updateConnectionStatus(serverId, {\n connected: false,\n connecting: false,\n error: t(\"chatConfig.settings.error.timeout\"),\n });\n } else {\n updateConnectionStatus(serverId, {\n connected: false,\n connecting: false,\n error: error.message || t(\"chatConfig.settings.error.connectFailed\"),\n });\n }\n }\n };\n\n // Update connection status\n const updateConnectionStatus = (\n serverId: string,\n updates: Partial<ServerConnection>\n ) => {\n setConnections((prev) =>\n prev.map((conn) =>\n conn.id === serverId ? { ...conn, ...updates } : conn\n )\n );\n };\n\n // Load current configuration\n const loadCurrentConfig = async (serverId: string) => {\n const connection = connectionsRef.current.find((c) => c.id === serverId);\n if (!connection || !connection.connected) return;\n\n const url = connection.url;\n if (!url) return;\n\n try {\n // Prepare headers with API key if available\n const headers: HeadersInit = {};\n if (connection.apiKey) {\n headers[\"Authorization\"] = `Bearer ${connection.apiKey}`;\n }\n\n const response = await fetch(`${url}/api/config`, {\n headers,\n });\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.data) {\n // Convert config object to .env format string\n const lines: string[] = [];\n const configData = data.data;\n\n // Add known config keys\n if (configData.port !== undefined) {\n lines.push(`PORT=${configData.port}`);\n }\n if (configData.queueServiceType) {\n lines.push(`QUEUE_SERVICE_TYPE=${configData.queueServiceType}`);\n }\n if (configData.redisUrl) {\n lines.push(`REDIS_URL=${configData.redisUrl}`);\n }\n if (configData.redisPassword) {\n lines.push(`REDIS_PASSWORD=`);\n }\n if (configData.queueName) {\n lines.push(`QUEUE_NAME=${configData.queueName}`);\n }\n\n setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n ...prev[serverId],\n envText: lines.join(\"\\n\"),\n },\n }));\n }\n }\n } catch (error) {\n console.error(\"Failed to load configuration:\", error);\n message.error(t(\"chatConfig.settings.loadConfigFailed\"));\n }\n };\n\n // Load models configuration\n const loadModelsConfig = async (serverId: string) => {\n const connection = connectionsRef.current.find((c) => c.id === serverId);\n if (!connection || !connection.connected) return;\n\n const url = connection.url;\n if (!url) return;\n\n try {\n // Prepare headers with API key if available\n const headers: HeadersInit = {};\n if (connection.apiKey) {\n headers[\"Authorization\"] = `Bearer ${connection.apiKey}`;\n }\n\n const response = await fetch(`${url}/api/models`, {\n headers,\n });\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.data && Array.isArray(data.data)) {\n if (data.data.length > 0) {\n // The current API reports whether a key is stored but never\n // returns it, so the field starts empty and an empty submit means\n // \"keep the stored key\". A gateway predating that contract still\n // returns the real key — keep it in the form instead of blanking\n // it, or the next save would overwrite the stored credential.\n const models = data.data.map(\n (model: Record<string, unknown>) => {\n const returnedKey =\n typeof model.apiKey === \"string\" ? model.apiKey : \"\";\n\n return {\n ...model,\n apiKey: returnedKey,\n hasApiKey: Boolean(model.hasApiKey ?? returnedKey !== \"\"),\n };\n }\n );\n\n setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n ...prev[serverId],\n models,\n },\n }));\n } else {\n setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n ...prev[serverId],\n models: [\n {\n key: \"\",\n model: \"\",\n provider: \"openai\",\n streaming: false,\n apiKey: \"\",\n baseURL: \"\",\n },\n ],\n },\n }));\n }\n }\n }\n } catch (error) {\n console.error(\"Failed to load models configuration:\", error);\n }\n };\n\n // Check connection when tab changes or modal opens\n useEffect(() => {\n if (open && activeTabKey) {\n initializeServerConfig(activeTabKey);\n const connection = connections.find((c) => c.id === activeTabKey);\n if (connection && !connection.connected && !connection.connecting) {\n checkConnection(activeTabKey);\n }\n }\n }, [open, activeTabKey]);\n\n // Load config when connection is established\n useEffect(() => {\n if (open && activeTabKey) {\n const connection = connections.find((c) => c.id === activeTabKey);\n if (connection?.connected) {\n if (activeMenu === \"environment\") {\n loadCurrentConfig(activeTabKey);\n } else if (activeMenu === \"models\") {\n loadModelsConfig(activeTabKey);\n }\n }\n }\n }, [open, activeTabKey, activeMenu]);\n\n // Handle add new server\n const handleAddServer = async () => {\n if (!newServerUrl.trim()) {\n message.error(t(\"chatConfig.settings.pleaseEnterServerUrl\"));\n return;\n }\n\n // Normalize URL\n let normalizedUrl = newServerUrl.trim();\n if (\n !normalizedUrl.startsWith(\"http://\") &&\n !normalizedUrl.startsWith(\"https://\")\n ) {\n normalizedUrl = `http://${normalizedUrl}`;\n }\n\n const serverName =\n newServerName.trim() || normalizedUrl.replace(/^https?:\\/\\//, \"\");\n\n const newConnection: ServerConnection = {\n id: `conn_${Date.now()}`,\n name: serverName,\n url: normalizedUrl,\n apiKey: newServerApiKey.trim() || undefined,\n connected: false,\n };\n\n setAddingServer(true);\n const newConnections = [...connections, newConnection];\n saveConnections(newConnections);\n setActiveTabKey(newConnection.id);\n initializeServerConfig(newConnection.id);\n\n // Try to connect\n await checkConnection(newConnection.id);\n\n setAddingServer(false);\n setShowAddServerModal(false);\n setNewServerUrl(\"\");\n setNewServerName(\"\");\n setNewServerApiKey(\"\");\n message.success(t(\"chatConfig.settings.serverAdded\"));\n };\n\n // Handle delete server\n const handleDeleteServer = (serverId: string) => {\n const newConnections = connections.filter((c) => c.id !== serverId);\n saveConnections(newConnections);\n\n // Remove config data\n setServerConfigs((prev) => {\n const newConfigs = { ...prev };\n delete newConfigs[serverId];\n return newConfigs;\n });\n\n if (activeTabKey === serverId) {\n if (newConnections.length > 0) {\n setActiveTabKey(newConnections[0].id);\n } else {\n setActiveTabKey(\"\");\n }\n }\n\n message.success(t(\"chatConfig.settings.serverDeleted\"));\n };\n\n // Handle tab change - disconnect other servers\n const handleTabChange = (newTabKey: string) => {\n // Disconnect all other servers when switching tabs\n // Keep the current tab's connection status unchanged\n setConnections((prev) =>\n prev.map(\n (conn) =>\n conn.id === newTabKey\n ? conn // Keep current tab's status\n : { ...conn, connected: false, connecting: false } // Disconnect others\n )\n );\n setActiveTabKey(newTabKey);\n };\n\n // Handle save configuration\n const handleSave = async () => {\n const connection = connections.find((c) => c.id === activeTabKey);\n if (!connection || !connection.connected) {\n message.error(t(\"chatConfig.settings.connectFirst\"));\n return;\n }\n\n const url = connection.url;\n if (!url) {\n message.error(t(\"chatConfig.settings.connectFirst\"));\n return;\n }\n\n try {\n setLoading(true);\n const config = serverConfigs[activeTabKey];\n\n if (activeMenu === \"environment\") {\n // Parse .env format string to config object\n const configObj: Record<string, any> = {};\n const lines = config.envText.split(\"\\n\");\n\n for (const line of lines) {\n // Skip empty lines and comments\n const trimmedLine = line.trim();\n if (!trimmedLine || trimmedLine.startsWith(\"#\")) {\n continue;\n }\n\n // Parse key=value format\n const equalIndex = trimmedLine.indexOf(\"=\");\n if (equalIndex === -1) {\n continue; // Skip invalid lines\n }\n\n const key = trimmedLine.substring(0, equalIndex).trim();\n const value = trimmedLine.substring(equalIndex + 1).trim();\n\n if (!key) {\n continue; // Skip lines without key\n }\n\n const upperKey = key.toUpperCase();\n // Handle special keys\n if (upperKey === \"PORT\") {\n if (value) {\n configObj.port = Number(value);\n }\n } else if (upperKey === \"QUEUE_SERVICE_TYPE\") {\n if (value) {\n configObj.queueServiceType = value;\n }\n } else if (upperKey === \"REDIS_URL\") {\n if (value) {\n configObj.redisUrl = value;\n }\n } else if (upperKey === \"REDIS_PASSWORD\") {\n // Only include password if a value is provided\n if (value) {\n configObj.redisPassword = value;\n }\n } else if (upperKey === \"QUEUE_NAME\") {\n if (value) {\n configObj.queueName = value;\n }\n } else {\n // For other keys, only add if value is provided\n if (value) {\n configObj[key] = value;\n }\n }\n }\n\n // Prepare headers with API key if available\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n if (connection.apiKey) {\n headers[\"Authorization\"] = `Bearer ${connection.apiKey}`;\n }\n\n const response = await fetch(`${url}/api/config`, {\n method: \"PUT\",\n headers,\n body: JSON.stringify({ config: configObj }),\n });\n\n const data = await response.json();\n\n if (response.ok && data.success) {\n // Show success message with warnings if any\n if (data.requiresRestart && data.requiresRestart.length > 0) {\n message.warning(\n t(\"chatConfig.settings.restartWarning\", { services: data.requiresRestart.join(\", \") }),\n 5\n );\n } else {\n message.success(t(\"chatConfig.settings.savedApplied\"));\n }\n\n // Show warnings if any\n if (data.warnings && data.warnings.length > 0) {\n data.warnings.forEach((warning: string) => {\n message.warning(warning, 5);\n });\n }\n\n onClose();\n } else {\n message.error(data.error || t(\"chatConfig.settings.saveFailed\"));\n }\n } else if (activeMenu === \"models\") {\n // Save models configuration\n const validModels = config.models\n .filter((m) => m.key && m.model && m.provider)\n .map((m) => {\n // The server does not send the key back (it answers with\n // `hasApiKey`), so an untouched field is EMPTY rather than\n // pre-filled. Omitting it tells the server to keep what it has;\n // sending the empty string would clear it.\n if (m.apiKey) return m;\n const { apiKey: _omitted, ...rest } = m;\n return rest;\n });\n\n // Prepare headers with API key if available\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n if (connection.apiKey) {\n headers[\"Authorization\"] = `Bearer ${connection.apiKey}`;\n }\n\n const response = await fetch(`${url}/api/models`, {\n method: \"PUT\",\n headers,\n body: JSON.stringify({ models: validModels }),\n });\n\n const data = await response.json();\n\n if (response.ok && data.success) {\n message.success(t(\"chatConfig.settings.modelSaved\"));\n onClose();\n } else {\n message.error(data.error || t(\"chatConfig.settings.modelSaveFailed\"));\n }\n }\n } catch (error: any) {\n console.error(\"Failed to save configuration:\", error);\n message.error(error.message || t(\"chatConfig.settings.saveFailed\"));\n } finally {\n setLoading(false);\n }\n };\n\n const renderEnvironmentSettings = (serverId: string) => {\n const config = serverConfigs[serverId] || { envText: \"\", models: [] };\n const setEnvText = (text: string) => {\n setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n ...prev[serverId],\n envText: text,\n },\n }));\n };\n\n return (\n <div className={styles.formContainer}>\n <Alert\n message={t(\"chatConfig.settings.alert.title\")}\n description={\n <div>\n <div style={{ marginBottom: 8 }}>\n <CheckCircleOutlined\n style={{ color: \"#52c41a\", marginRight: 8 }}\n />\n <strong>{t(\"chatConfig.settings.alert.immediate\")}</strong> QUEUE_SERVICE_TYPE,\n REDIS_URL, REDIS_PASSWORD, QUEUE_NAME\n </div>\n <div>\n <ReloadOutlined style={{ color: \"#faad14\", marginRight: 8 }} />\n <strong>{t(\"chatConfig.settings.alert.restart\")}</strong> {t(\"chatConfig.settings.alert.restartDetail\")}\n </div>\n </div>\n }\n type=\"info\"\n showIcon\n className={styles.alertCard}\n />\n\n <div style={{ marginBottom: 24 }}>\n <Text type=\"secondary\" style={{ fontSize: 14, lineHeight: 1.6 }}>\n {t(\"chatConfig.settings.envHint\")}\n </Text>\n </div>\n\n <TextArea\n value={config.envText}\n onChange={(e) => setEnvText(e.target.value)}\n placeholder={`PORT=4001\nQUEUE_SERVICE_TYPE=redis\nREDIS_URL=redis://localhost:6379\nREDIS_PASSWORD=\nQUEUE_NAME=tasks`}\n rows={18}\n className={styles.textArea}\n style={{\n fontFamily: \"SF Mono, Monaco, Inconsolata, Roboto Mono, monospace\",\n fontSize: 13,\n padding: \"16px\",\n lineHeight: 1.6,\n }}\n />\n </div>\n );\n };\n\n const renderModelSettings = (serverId: string) => {\n const config = serverConfigs[serverId] || {\n envText: \"\",\n models: [\n {\n key: \"\",\n model: \"\",\n provider: \"openai\",\n streaming: false,\n apiKey: \"\",\n baseURL: \"\",\n },\n ],\n };\n\n const handleModelChange = (index: number, field: string, value: any) => {\n const newModels = [...config.models];\n newModels[index] = { ...newModels[index], [field]: value };\n setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n ...prev[serverId],\n models: newModels,\n },\n }));\n };\n\n const handleAddModel = () => {\n setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n ...prev[serverId],\n models: [\n ...config.models,\n {\n key: \"\",\n model: \"\",\n provider: \"openai\",\n streaming: false,\n apiKey: \"\",\n baseURL: \"\",\n },\n ],\n },\n }));\n };\n\n const handleRemoveModel = (index: number) => {\n if (config.models.length > 1) {\n setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n ...prev[serverId],\n models: config.models.filter((_, i) => i !== index),\n },\n }));\n }\n };\n\n return (\n <div className={styles.formContainer}>\n <div style={{ marginBottom: 32 }}>\n <Text type=\"secondary\" style={{ fontSize: 14, lineHeight: 1.6 }}>\n {t(\"chatConfig.settings.modelsHint\")}\n </Text>\n </div>\n\n {config.models.map((model, index) => (\n <div key={index} className={styles.card}>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: 24,\n paddingBottom: 20,\n borderBottom: \"1px solid rgba(0, 0, 0, 0.06)\",\n }}\n >\n <div>\n <Text strong style={{ fontSize: 16 }}>\n {t(\"chatConfig.settings.model\", { index: index + 1 })}\n </Text>\n {model.key && (\n <Text\n type=\"secondary\"\n style={{ marginLeft: 8, fontSize: 12 }}\n >\n ({model.key})\n </Text>\n )}\n </div>\n {config.models.length > 1 && (\n <Button\n type=\"text\"\n danger\n size=\"small\"\n onClick={() => handleRemoveModel(index)}\n style={{\n borderRadius: 6,\n transition: \"all 0.2s\",\n }}\n >\n {t(\"chatConfig.settings.remove\")}\n </Button>\n )}\n </div>\n\n <Space direction=\"vertical\" style={{ width: \"100%\" }} size=\"large\">\n <div>\n <Text className={styles.formLabel}>{t(\"chatConfig.settings.field.key\")}</Text>\n <Input\n placeholder=\"e.g., default, gpt-4, claude\"\n value={model.key}\n onChange={(e) =>\n handleModelChange(index, \"key\", e.target.value)\n }\n style={{ height: 40 }}\n />\n <Text className={styles.formDescription}>\n {t(\"chatConfig.settings.field.keyHint\")}\n </Text>\n </div>\n\n <div>\n <Text className={styles.formLabel}>{t(\"chatConfig.settings.field.provider\")}</Text>\n <Select\n style={{ width: \"100%\", height: 40 }}\n value={model.provider}\n onChange={(value) =>\n handleModelChange(index, \"provider\", value)\n }\n options={[\n { label: \"OpenAI\", value: \"openai\" },\n { label: \"Azure\", value: \"azure\" },\n { label: \"DeepSeek\", value: \"deepseek\" },\n { label: \"SiliconCloud\", value: \"siliconcloud\" },\n { label: \"VolcEngine\", value: \"volcengine\" },\n ]}\n />\n </div>\n\n <div>\n <Text className={styles.formLabel}>{t(\"chatConfig.settings.field.modelName\")}</Text>\n <Input\n placeholder=\"e.g., gpt-4, claude-3-opus, kimi-k2-250905\"\n value={model.model}\n onChange={(e) =>\n handleModelChange(index, \"model\", e.target.value)\n }\n style={{ height: 40 }}\n />\n </div>\n\n <div>\n <Text className={styles.formLabel}>{t(\"chatConfig.field.apiKey\")}</Text>\n <Input.Password\n placeholder={\n model.hasApiKey\n ? t(\"chatConfig.settings.apiKeyPlaceholderConfigured\")\n : t(\"chatConfig.settings.apiKeyPlaceholderNew\")\n }\n value={model.apiKey}\n onChange={(e) =>\n handleModelChange(index, \"apiKey\", e.target.value)\n }\n style={{ height: 40 }}\n />\n <Text className={styles.formDescription}>\n {model.hasApiKey\n ? t(\"chatConfig.settings.field.apiKeyHintStored\")\n : t(\"chatConfig.settings.field.apiKeyHintNew\")}\n </Text>\n </div>\n\n <div>\n <Text className={styles.formLabel}>{t(\"chatConfig.settings.field.baseUrl\")}</Text>\n <Input\n placeholder=\"e.g., https://api.openai.com/v1\"\n value={model.baseURL}\n onChange={(e) =>\n handleModelChange(index, \"baseURL\", e.target.value)\n }\n style={{ height: 40 }}\n />\n <Text className={styles.formDescription}>\n {t(\"chatConfig.settings.field.baseUrlHint\")}\n </Text>\n </div>\n\n <div>\n <Space>\n <Switch\n checked={model.streaming}\n onChange={(checked) =>\n handleModelChange(index, \"streaming\", checked)\n }\n />\n <Text>{t(\"chatConfig.settings.field.streaming\")}</Text>\n </Space>\n </div>\n\n <div style={{ display: \"flex\", gap: 20 }}>\n <div style={{ flex: 1 }}>\n <Text className={styles.formLabel}>{t(\"chatConfig.settings.field.maxTokens\")}</Text>\n <Input\n type=\"number\"\n placeholder=\"e.g., 4096\"\n value={model.maxTokens}\n onChange={(e) =>\n handleModelChange(\n index,\n \"maxTokens\",\n e.target.value ? Number(e.target.value) : undefined\n )\n }\n style={{ height: 40 }}\n />\n </div>\n <div style={{ flex: 1 }}>\n <Text className={styles.formLabel}>{t(\"chatConfig.settings.field.temperature\")}</Text>\n <Input\n type=\"number\"\n step=\"0.1\"\n placeholder=\"e.g., 0.7\"\n value={model.temperature}\n onChange={(e) =>\n handleModelChange(\n index,\n \"temperature\",\n e.target.value ? Number(e.target.value) : undefined\n )\n }\n style={{ height: 40 }}\n />\n </div>\n </div>\n </Space>\n </div>\n ))}\n\n <Button\n type=\"dashed\"\n onClick={handleAddModel}\n block\n size=\"large\"\n style={{ marginTop: 24, height: 48 }}\n >\n {t(\"chatConfig.settings.addModel\")}\n </Button>\n </div>\n );\n };\n\n\n const renderContent = (serverId: string) => {\n switch (activeMenu) {\n case \"environment\":\n return renderEnvironmentSettings(serverId);\n case \"models\":\n return renderModelSettings(serverId);\n default:\n return null;\n }\n };\n\n const activeMenuItem = SETTINGS_MENU_ITEMS.find(\n (item) => item.key === activeMenu\n );\n\n const currentConnection = connections.find((c) => c.id === activeTabKey);\n\n // Render tab label with connection status\n const renderTabLabel = (connection: ServerConnection) => {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\" }}>\n <CloudServerOutlined\n style={{\n marginRight: 8,\n color: connection.connected\n ? \"#52c41a\"\n : connection.connecting\n ? \"#1890ff\"\n : \"#d9d9d9\",\n }}\n />\n <span>{connection.name}</span>\n {connection.connected && (\n <CheckCircleFilled\n style={{ color: \"#52c41a\", fontSize: 12, marginLeft: 8 }}\n />\n )}\n {connection.error && !connection.connecting && (\n <CloseCircleFilled\n style={{ color: \"#ff4d4f\", fontSize: 12, marginLeft: 8 }}\n />\n )}\n </div>\n );\n };\n\n const tabItems = connections.map((connection) => ({\n key: connection.id,\n label: renderTabLabel(connection),\n children: (\n <div className={styles.tabContent}>\n {connection.connected ? (\n <>\n <div style={{ display: \"flex\", height: \"100%\" }}>\n {/* Sidebar */}\n <div className={styles.sidebar}>\n {/* <div className={styles.sidebarHeader}>\n <Title level={4} className={styles.sidebarTitle}>\n Settings\n </Title>\n </div> */}\n {SETTINGS_MENU_ITEMS.map((item) => (\n <div\n key={item.key}\n className={`${styles.menuItem} ${\n activeMenu === item.key ? \"active\" : \"\"\n }`}\n onClick={() => setActiveMenu(item.key)}\n >\n <span className={styles.menuItemIcon}>{item.icon}</span>\n <span className={styles.menuItemText}>{t(item.labelKey)}</span>\n </div>\n ))}\n </div>\n\n {/* Content */}\n <div className={styles.content}>\n <div className={styles.contentHeader}>\n <div className={styles.contentHeaderLeft}>\n <Title level={3} className={styles.contentTitle}>\n {activeMenuItem ? t(activeMenuItem.labelKey) : undefined}\n </Title>\n <Text className={styles.contentDescription}>\n {activeMenu === \"environment\" &&\n t(\"chatConfig.settings.menu.environment.desc\")}\n {activeMenu === \"models\" &&\n t(\"chatConfig.settings.menu.models.desc\")}\n </Text>\n </div>\n <div className={styles.contentHeaderRight}>\n <Button onClick={onClose}>{t(\"common.cancel\")}</Button>\n <Button\n type=\"primary\"\n icon={<SaveOutlined />}\n onClick={handleSave}\n loading={loading}\n >\n {t(\"chatConfig.settings.saveConfiguration\")}\n </Button>\n </div>\n </div>\n\n <div className={styles.contentBody}>\n {renderContent(connection.id)}\n </div>\n </div>\n </div>\n </>\n ) : (\n <div\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexDirection: \"column\",\n gap: 16,\n padding: 48,\n }}\n >\n {connection.connecting ? (\n <>\n <LinkOutlined style={{ fontSize: 64, color: \"#1890ff\" }} spin />\n <Title level={4}>{t(\"chatConfig.settings.connecting\")}</Title>\n <Text type=\"secondary\" style={{ textAlign: \"center\" }}>\n {t(\"chatConfig.settings.connectingTo\", { url: connection.url })}\n </Text>\n </>\n ) : (\n <>\n <LinkOutlined style={{ fontSize: 64, color: \"#d9d9d9\" }} />\n <Title level={4} type=\"secondary\">\n {connection.error || t(\"chatConfig.settings.notConnected\")}\n </Title>\n <Text\n type=\"secondary\"\n style={{ textAlign: \"center\", maxWidth: 400 }}\n >\n {connection.error\n ? t(\"chatConfig.settings.connectFailedDetail\", { url: connection.url })\n : t(\"chatConfig.settings.clickReconnect\", { url: connection.url })}\n </Text>\n <Button\n type=\"primary\"\n icon={<LinkOutlined />}\n onClick={() => checkConnection(connection.id)}\n loading={connection.connecting}\n style={{ marginTop: 16 }}\n >\n {t(\"chatConfig.settings.reconnect\")}\n </Button>\n </>\n )}\n </div>\n )}\n </div>\n ),\n closable: connections.length > 1,\n }));\n\n return (\n <>\n <Modal\n open={open}\n onCancel={onClose}\n height={\"70%\"}\n width={\"80%\"}\n footer={null}\n title={t(\"chatConfig.settings.title\")}\n // destroyOnClose\n >\n <div>\n <Tabs\n activeKey={activeTabKey}\n onChange={handleTabChange}\n type=\"editable-card\"\n onEdit={(targetKey, action) => {\n if (action === \"add\") {\n setShowAddServerModal(true);\n } else if (action === \"remove\") {\n handleDeleteServer(targetKey as string);\n }\n }}\n items={tabItems}\n addIcon={\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"4px 8px\",\n }}\n >\n <PlusOutlined />\n <span>{t(\"chatConfig.settings.addServer\")}</span>\n </div>\n }\n />\n </div>\n </Modal>\n\n {/* Add Server Modal */}\n <Modal\n title={t(\"chatConfig.settings.addNewServer\")}\n open={showAddServerModal}\n onOk={handleAddServer}\n onCancel={() => {\n setShowAddServerModal(false);\n setNewServerUrl(\"\");\n setNewServerName(\"\");\n setNewServerApiKey(\"\");\n }}\n confirmLoading={addingServer}\n className={styles.addServerModal}\n >\n <Space direction=\"vertical\" style={{ width: \"100%\" }} size=\"large\">\n <div>\n <Text strong style={{ display: \"block\", marginBottom: 8 }}>\n {t(\"chatConfig.settings.serverName\")}\n </Text>\n <Input\n placeholder={t(\"chatConfig.settings.serverNamePlaceholder\")}\n value={newServerName}\n onChange={(e) => setNewServerName(e.target.value)}\n onPressEnter={handleAddServer}\n />\n <Text type=\"secondary\" style={{ fontSize: 12, marginTop: 4 }}>\n {t(\"chatConfig.settings.serverNameHint\")}\n </Text>\n </div>\n <div>\n <Text strong style={{ display: \"block\", marginBottom: 8 }}>\n {t(\"chatConfig.settings.serverUrl\")}\n </Text>\n <Input\n placeholder=\"e.g., http://localhost:4001\"\n value={newServerUrl}\n onChange={(e) => setNewServerUrl(e.target.value)}\n onPressEnter={handleAddServer}\n />\n <Text type=\"secondary\" style={{ fontSize: 12, marginTop: 4 }}>\n {t(\"chatConfig.settings.serverUrlHint\")}\n </Text>\n </div>\n <div>\n <Text strong style={{ display: \"block\", marginBottom: 8 }}>\n {t(\"chatConfig.settings.apiKey\")}\n </Text>\n <Input.Password\n placeholder={t(\"chatConfig.settings.apiKeyPlaceholder\")}\n value={newServerApiKey}\n onChange={(e) => setNewServerApiKey(e.target.value)}\n onPressEnter={handleAddServer}\n />\n <Text type=\"secondary\" style={{ fontSize: 12, marginTop: 4 }}>\n {t(\"chatConfig.settings.apiKeyHint\")}\n </Text>\n </div>\n </Space>\n </Modal>\n </>\n );\n};\n","import { SettingsModal } from \"./SettingsModal\";\nimport { useLatticeChatShellContext } from \"./LatticeChatShellContext\";\nexport const AgentServerSetting = () => {\n const { settingsModalOpen, setSettingsModalOpen } =\n useLatticeChatShellContext();\n return (\n <SettingsModal\n open={settingsModalOpen}\n onClose={() => setSettingsModalOpen(false)}\n />\n );\n};\n","import React from \"react\";\nimport { ConversationContextProvider } from \"./ConversationContext\";\nimport { LatticeChatView } from \"./LatticeChatView\";\nimport {\n LatticeChatShellContextProvider,\n LatticeChatShellContextProviderProps,\n useLatticeChatShellContext,\n} from \"./LatticeChatShellContext\";\nimport { AssistantContextProvider } from \"./AssistantContext\";\nimport { AgentServerSetting } from \"./AgentServerSetting\";\nimport { WorkspaceContextProvider, useWorkspaceContext } from \"../../context/WorkspaceContext\";\nimport { useAuth } from \"../../context/AuthContext\";\nimport { ChatErrorBoundary } from \"./ChatErrorBoundary\";\nimport { WorkspaceResourceUIContext } from \"./WorkspaceResourceManager\";\nimport { useT } from \"../../i18n\";\n\n/**\n * Props for the {@link LatticeChatShell} component.\n *\n * Extends {@link LatticeChatShellContextProviderProps} (minus `children`) with\n * feature toggles that control chat UI surface capabilities.\n */\nexport type LatticeChatShellProps = Omit<\n LatticeChatShellContextProviderProps,\n \"children\"\n> & {\n /**\n * Whether users can create new assistants (default: true)\n */\n enableAssistantCreation?: boolean;\n /**\n * Whether users can edit existing assistants (default: true)\n */\n enableAssistantEditing?: boolean;\n /**\n * Whether to enable workspace and project management (default: false)\n */\n enableWorkspace?: boolean;\n /**\n * Whether to enable the model selector in the chat sender (default: false)\n */\n enableModelSelector?: boolean;\n};\n\nconst ChatContent: React.FC<{ initialAssistantId?: string }> = ({ initialAssistantId }) => (\n <AssistantContextProvider autoLoad={true} initialAssistantId={initialAssistantId}>\n <ConversationContextProvider>\n <LatticeChatView />\n </ConversationContextProvider>\n </AssistantContextProvider>\n);\n\n/**\n * WorkspaceAwareContent — mounts the workspace browser shell, which swaps to\n * the project-scoped chat surface only when a project is selected and no\n * workspace content app (Projects browser or Project Room) is open. The gate\n * lives inside the workspace Chat UI provider so the Project Room side app can\n * boot from the selected project without being unmounted.\n */\nconst WorkspaceAwareContent: React.FC<{ initialAssistantId?: string }> = ({ initialAssistantId }) => {\n const { workspaceId } = useWorkspaceContext();\n\n return (\n <WorkspaceResourceUIContext\n workspaceId={workspaceId || \"\"}\n renderChatContent={() => <ChatContent initialAssistantId={initialAssistantId} />}\n />\n );\n};\n\nconst ShellContent: React.FC<{ initialAssistantId?: string; enableWorkspace: boolean }> = ({\n initialAssistantId,\n enableWorkspace\n}) => {\n const { currentTenant } = useAuth();\n\n return (\n <>\n {enableWorkspace ? (\n <WorkspaceContextProvider>\n <WorkspaceAwareContent initialAssistantId={initialAssistantId} />\n </WorkspaceContextProvider>\n ) : (\n <ChatContent initialAssistantId={initialAssistantId} />\n )}\n <AgentServerSetting />\n </>\n );\n};\n\n/**\n * Lattice Chat Shell — the top-level provider component for the full chat interface.\n *\n * Sets up the required context hierarchy:\n * - {@link LatticeChatShellContextProvider} — config layer (baseURL, feature toggles)\n * - Optionally {@link WorkspaceContextProvider} when `enableWorkspace` is true\n * - {@link AssistantContextProvider} — assistant loading\n * - {@link ConversationContextProvider} — thread management\n * - {@link AgentServerSetting} — server configuration modal\n *\n * Children render {@link LatticeChatView} which contains the chat sidebar and\n * the {@link LatticeChat} thread interface.\n *\n * @param props - See {@link LatticeChatShellProps}.\n * @returns A React provider tree wrapping the chat UI.\n *\n * @example\n * ```tsx\n * import { LatticeChatShell } from \"@axiom-lattice/react-sdk\";\n *\n * <LatticeChatShell\n * initialConfig={{ baseURL: \"https://api.example.com\", assistantId: \"asst_1\" }}\n * enableAssistantCreation={false}\n * enableWorkspace\n * enableModelSelector\n * />\n * ```\n *\n * @remarks\n * - `enableWorkspace` in props takes priority over `initialConfig.enableWorkspace`.\n * - This component should wrap all chat-related components in the application.\n */\nexport const LatticeChatShell: React.FC<LatticeChatShellProps> = (props) => {\n const t = useT();\n const { enableAssistantCreation, enableAssistantEditing, enableWorkspace: enableWorkspaceProp, ...restProps } = props;\n\n console.log(\n \"[LatticeChatShell] props.initialConfig?.assistantId:\", props.initialConfig?.assistantId,\n \"restProps.initialConfig?.assistantId:\", restProps.initialConfig?.assistantId,\n \"restProps keys:\", Object.keys(restProps),\n );\n\n // enableWorkspaceProp takes priority over restProps.initialConfig.enableWorkspace\n const enableWorkspace = enableWorkspaceProp ?? restProps.initialConfig?.enableWorkspace ?? false;\n\n return (\n <LatticeChatShellContextProvider\n initialConfig={{\n enableAssistantCreation,\n enableAssistantEditing,\n enableWorkspace,\n ...restProps.initialConfig,\n }}\n >\n <ChatErrorBoundary name={t(\"chat.error.boundary.chatShell\")} t={t}>\n <ShellContent\n initialAssistantId={restProps.initialConfig?.assistantId}\n enableWorkspace={enableWorkspace}\n />\n </ChatErrorBoundary>\n </LatticeChatShellContextProvider>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport {\n Button,\n Card,\n Form,\n Input,\n Modal,\n Popconfirm,\n Spin,\n Tag,\n Typography,\n message,\n} from \"antd\";\nimport { Edit2, Plus, RadioTower, Trash2 } from \"lucide-react\";\nimport type {\n ChannelInstallation,\n CreateChannelInstallationRequest,\n LarkChannelInstallationConfig,\n UpdateChannelInstallationRequest,\n} from \"@axiom-lattice/protocols\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { useT } from \"../../i18n\";\n\nconst { Text, Title } = Typography;\n\ninterface ChannelInstallationResponse {\n success: boolean;\n message?: string;\n data?: ChannelInstallation;\n}\n\ninterface ChannelInstallationListResponse {\n success: boolean;\n message?: string;\n data?: {\n records: ChannelInstallation[];\n };\n}\n\ntype FormValues = {\n name?: string;\n appId: string;\n appSecret: string;\n verificationToken?: string;\n encryptKey?: string;\n};\n\nexport const ChannelInstallationsDrawerContent: React.FC = () => {\n const { get, post, put, del } = useApi();\n const t = useT();\n const [installations, setInstallations] = useState<ChannelInstallation[]>([]);\n const [loading, setLoading] = useState(false);\n const [formModalOpen, setFormModalOpen] = useState(false);\n const [editingInstallation, setEditingInstallation] =\n useState<ChannelInstallation | null>(null);\n\n const loadInstallations = async () => {\n setLoading(true);\n\n try {\n const result = await get<ChannelInstallationListResponse>(\n \"/api/channel-installations\"\n );\n\n if (result.success) {\n setInstallations(result.data?.records ?? []);\n } else {\n setInstallations([]);\n message.error(result.message || t(\"chatConfig.channelInstall.loadFailed\"));\n }\n } catch (error) {\n console.error(\"Failed to load channel installations:\", error);\n setInstallations([]);\n message.error(t(\"chatConfig.channelInstall.loadFailed\"));\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n loadInstallations();\n }, []);\n\n const handleDelete = async (installation: ChannelInstallation) => {\n try {\n const result = await del<{ success: boolean; message?: string }>(\n `/api/channel-installations/${installation.id}`\n );\n\n if (result.success) {\n setInstallations((current) =>\n current.filter((item) => item.id !== installation.id)\n );\n message.success(t(\"chatConfig.channelInstall.deleted\"));\n } else {\n message.error(result.message || t(\"chatConfig.channelInstall.deleteFailed\"));\n }\n } catch (error) {\n console.error(\"Failed to delete channel installation:\", error);\n message.error(t(\"chatConfig.channelInstall.deleteFailed\"));\n }\n };\n\n return (\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\" }}>\n <div style={{ padding: 16 }}>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <Title level={5} style={{ margin: 0 }}>\n {t(\"chatConfig.channelInstall.title\")}\n </Title>\n <Button\n type=\"primary\"\n icon={<Plus size={16} />}\n onClick={() => {\n setEditingInstallation(null);\n setFormModalOpen(true);\n }}\n >\n {t(\"chatConfig.channelInstall.add\")}\n </Button>\n </div>\n </div>\n\n <div style={{ flex: 1, overflowY: \"auto\", padding: 16 }}>\n {loading ? (\n <div style={{ display: \"flex\", justifyContent: \"center\", padding: 32 }}>\n <Spin />\n </div>\n ) : installations.length === 0 ? (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"48px 16px\",\n }}\n >\n <RadioTower size={48} style={{ marginBottom: 16, opacity: 0.5 }} />\n <Text strong style={{ fontSize: 15 }}>\n {t(\"chatConfig.channelInstall.empty.title\")}\n </Text>\n <Text type=\"secondary\" style={{ marginTop: 8 }}>\n {t(\"chatConfig.channelInstall.empty.description\")}\n </Text>\n </div>\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n {installations.map((installation) => {\n const webhookPath =\n installation.channel === \"lark\"\n ? `/api/channels/lark/installations/${installation.id}/events`\n : null;\n\n return (\n <Card key={installation.id} size=\"small\">\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n marginBottom: 10,\n }}\n >\n <Text strong style={{ fontSize: 15 }}>\n {installation.name || installation.id}\n </Text>\n <Tag color=\"blue\">{installation.channel}</Tag>\n </div>\n\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n marginBottom: 12,\n }}\n >\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n ID: {installation.id}\n </Text>\n {webhookPath ? (\n <Text code style={{ fontSize: 12 }}>\n {webhookPath}\n </Text>\n ) : (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {t(\"chatConfig.channelInstall.unsupported\")}\n </Text>\n )}\n </div>\n\n <div style={{ display: \"flex\", gap: 8 }}>\n <Button\n icon={<Edit2 size={14} />}\n onClick={() => {\n setEditingInstallation(installation);\n setFormModalOpen(true);\n }}\n >\n {t(\"common.edit\")}\n </Button>\n <Popconfirm\n title={t(\"chatConfig.channelInstall.delete.title\")}\n description={t(\"chatConfig.channelInstall.delete.description\", { name: installation.name || installation.id })}\n onConfirm={() => handleDelete(installation)}\n okText={t(\"common.delete\")}\n okType=\"danger\"\n cancelText={t(\"common.cancel\")}\n >\n <Button danger icon={<Trash2 size={14} />}>\n {t(\"common.delete\")}\n </Button>\n </Popconfirm>\n </div>\n </Card>\n );\n })}\n </div>\n )}\n </div>\n\n {formModalOpen ? (\n <LarkChannelInstallationFormModal\n installation={editingInstallation}\n open={formModalOpen}\n post={post}\n put={put}\n onCancel={() => {\n setFormModalOpen(false);\n setEditingInstallation(null);\n }}\n onSave={() => {\n setFormModalOpen(false);\n setEditingInstallation(null);\n loadInstallations();\n }}\n />\n ) : null}\n </div>\n );\n};\n\ninterface LarkChannelInstallationFormModalProps {\n installation: ChannelInstallation | null;\n open: boolean;\n post: <T>(path: string, body: unknown) => Promise<T>;\n put: <T>(path: string, body: unknown) => Promise<T>;\n onCancel: () => void;\n onSave: () => void;\n}\n\nconst LarkChannelInstallationFormModal: React.FC<\n LarkChannelInstallationFormModalProps\n> = ({ installation, open, post, put, onCancel, onSave }) => {\n const [form] = Form.useForm<FormValues>();\n const t = useT();\n\n useEffect(() => {\n if (installation) {\n const config = installation.config as LarkChannelInstallationConfig;\n form.setFieldsValue({\n name: installation.name,\n appId: config.appId,\n appSecret: config.appSecret,\n verificationToken: config.verificationToken,\n encryptKey: config.encryptKey,\n });\n return;\n }\n\n form.resetFields();\n }, [installation, form]);\n\n const handleSubmit = async () => {\n const values = await form.validateFields();\n\n const config: LarkChannelInstallationConfig = {\n appId: values.appId,\n appSecret: values.appSecret,\n verificationToken: values.verificationToken,\n encryptKey: values.encryptKey,\n };\n\n try {\n if (installation) {\n const payload: UpdateChannelInstallationRequest = {\n name: values.name,\n config: config as unknown as Record<string, unknown>,\n };\n\n const result = await put<ChannelInstallationResponse>(\n `/api/channel-installations/${installation.id}`,\n payload\n );\n\n if (result.success) {\n message.success(t(\"chatConfig.channelInstall.updated\"));\n onSave();\n } else {\n message.error(result.message || t(\"chatConfig.channelInstall.updateFailed\"));\n }\n\n return;\n }\n\n const payload: CreateChannelInstallationRequest = {\n channel: \"lark\",\n name: values.name,\n config,\n };\n\n const result = await post<ChannelInstallationResponse>(\n \"/api/channel-installations\",\n payload\n );\n\n if (result.success) {\n message.success(t(\"chatConfig.channelInstall.created\"));\n onSave();\n } else {\n message.error(result.message || t(\"chatConfig.channelInstall.createFailed\"));\n }\n } catch (error) {\n console.error(\"Failed to save channel installation:\", error);\n message.error(\n installation ? t(\"chatConfig.channelInstall.updateFailed\") : t(\"chatConfig.channelInstall.createFailed\")\n );\n }\n };\n\n return (\n <Modal\n open={open}\n title={installation ? t(\"chatConfig.channelInstall.editTitle\") : t(\"chatConfig.channelInstall.addTitle\")}\n onCancel={onCancel}\n onOk={handleSubmit}\n okText={installation ? t(\"common.save\") : t(\"common.create\")}\n destroyOnHidden\n >\n <Form<FormValues> form={form} layout=\"vertical\">\n <Form.Item label={t(\"chatConfig.channelInstall.field.channel\")}>\n <Input value=\"lark\" disabled />\n </Form.Item>\n <Form.Item name=\"name\" label={t(\"chatConfig.channelInstall.field.name\")}>\n <Input />\n </Form.Item>\n <Form.Item\n name=\"appId\"\n label={t(\"chatConfig.channelInstall.field.appId\")}\n rules={[{ required: true, message: t(\"chatConfig.channelInstall.validation.appIdRequired\") }]}\n >\n <Input />\n </Form.Item>\n <Form.Item\n name=\"appSecret\"\n label={t(\"chatConfig.channelInstall.field.appSecret\")}\n rules={[{ required: true, message: t(\"chatConfig.channelInstall.validation.appSecretRequired\") }]}\n >\n <Input />\n </Form.Item>\n <Form.Item name=\"verificationToken\" label={t(\"chatConfig.channelInstall.field.verificationToken\")}>\n <Input />\n </Form.Item>\n <Form.Item name=\"encryptKey\" label={t(\"chatConfig.channelInstall.field.encryptKey\")}>\n <Input />\n </Form.Item>\n </Form>\n </Modal>\n );\n};\n","import React, { useMemo, useEffect, useState, useCallback, useRef } from \"react\";\nimport {\n ReactFlow,\n Background,\n Controls,\n Node,\n Edge,\n useNodesState,\n useEdgesState,\n ReactFlowProvider,\n NodeTypes,\n useReactFlow,\n type OnSelectionChangeFunc,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { createStyles } from \"antd-style\";\nimport AssistantNode from \"./AssistantNode\";\nimport AgentConfigPanel from \"./AgentConfigPanel\";\nimport CreateAssistantModal from \"./CreateAssistantModal\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { useT } from \"../../i18n\";\nimport { useLatticeChatShellContext } from \"./LatticeChatShellContext\";\nimport type { Assistant } from \"@axiom-lattice/client-sdk\";\nimport type { LocalA2AProviderState } from \"@axiom-lattice/client-sdk\";\nimport { useClient } from \"../../context\";\nimport { Button, message, theme } from \"antd\";\nimport { PlusOutlined } from \"@ant-design/icons\";\nimport { useAssistantContext } from \"./AssistantContext\";\n\n/**\n * Props for AssistantFlow component\n */\nexport interface AssistantFlowProps {\n /**\n * Callback when chat button is clicked\n */\n onChat?: (assistant: Assistant) => void;\n}\n\nconst useStyles = createStyles(({ token, css }) => ({\n root: css`\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: row;\n overflow: hidden;\n background: #fafafa;\n `,\n canvasRow: css`\n flex: 1;\n min-height: 0;\n display: flex;\n align-items: stretch;\n `,\n canvasWrap: css`\n flex: 1;\n min-width: 0;\n min-height: 0;\n background: #fafafa;\n position: relative;\n `,\n loadingState: css`\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${token.colorTextSecondary};\n font-size: 14px;\n `,\n}));\n\n/**\n * Internal component that handles the flow logic\n */\nconst AssistantFlowInner: React.FC<AssistantFlowProps> = ({ onChat }) => {\n const t = useT();\n const { styles } = useStyles();\n const { setCenter } = useReactFlow();\n const [nodes, setNodes, onNodesChange] = useNodesState<Node>([]);\n const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([]);\n const [assistants, setAssistants] = useState<Assistant[]>([]);\n const [assistantsLoading, setAssistantsLoading] = useState(false);\n const [localStates, setLocalStates] = useState<LocalA2AProviderState[]>([]);\n const [activeRuntimeId, setActiveRuntimeId] = useState<string | null>(null);\n const [configPanelVisible, setConfigPanelVisible] = useState(false);\n const [selectedAssistant, setSelectedAssistant] = useState<Assistant | null>(null);\n const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);\n const { get, del, put } = useApi();\n const client = useClient(\"__GLOBAL__\");\n const { config } = useLatticeChatShellContext();\n const { refresh: refreshAssistants } = useAssistantContext();\n const { token } = theme.useToken();\n const { enableAssistantCreation = true, enableAssistantEditing = true } = config;\n\n const localStatesByAssistantId = useMemo(() => {\n const map = new Map<string, LocalA2AProviderState>();\n localStates.forEach((state) => {\n map.set(state.runtimeId, state);\n });\n return map;\n }, [localStates]);\n\n const displayAssistants = useMemo(() => {\n return assistants;\n }, [assistants]);\n\n const nodeTypes = useMemo(\n () =>\n ({\n assistant: AssistantNode as any,\n }) as NodeTypes,\n []\n );\n\n /**\n * Handle configure button click - show configuration panel\n */\n const handleConfigure = useCallback((assistant: Assistant) => {\n setSelectedAssistant(assistant);\n setConfigPanelVisible(true);\n }, []);\n\n /**\n * Handle close configuration panel\n */\n const handleClosePanel = useCallback(() => {\n setConfigPanelVisible(false);\n setSelectedAssistant(null);\n }, []);\n\n /**\n * Handle node selection change - open config panel when a node is selected\n */\n const handleSelectionChange: OnSelectionChangeFunc = useCallback(\n ({ nodes: selectedNodes }) => {\n if (selectedNodes.length === 1) {\n const nodeData = selectedNodes[0].data as {\n assistant?: Assistant;\n localA2A?: LocalA2AProviderState;\n };\n if (nodeData?.assistant && enableAssistantEditing) {\n setSelectedAssistant(nodeData.assistant);\n setConfigPanelVisible(true);\n return;\n }\n }\n if (selectedNodes.length === 0) {\n setConfigPanelVisible(false);\n setSelectedAssistant(null);\n }\n },\n [enableAssistantEditing]\n );\n\n /**\n * Fetch assistants from API\n */\n const fetchAssistants = useCallback(async () => {\n setAssistantsLoading(true);\n try {\n const data = await get<{ success: boolean; data: { records: Assistant[] } }>(\"/api/assistants\");\n if (data.success && data.data && Array.isArray(data.data.records)) {\n setAssistants(data.data.records);\n }\n } catch (error) {\n console.error(\"Failed to fetch assistants:\", error);\n setAssistants([]);\n } finally {\n setAssistantsLoading(false);\n }\n }, [get]);\n\n const refreshLocalA2A = useCallback(async () => {\n try {\n const records = await client.assistants.localA2A.list();\n setLocalStates(records);\n } catch (error) {\n console.error(\"Failed to fetch local A2A states:\", error);\n setLocalStates([]);\n }\n }, [client]);\n\n const runLocalA2AAction = useCallback(\n async (\n runtimeId: string,\n action: \"start\" | \"stop\" | \"restart\"\n ) => {\n const currentState = localStates.find((s) => s.runtimeId === runtimeId);\n\n if (action === \"start\" && currentState) {\n if (currentState.status === \"missing\") {\n message.warning(t(\"chatWorkspace.assistantFlow.cliNotInstalled\", { label: currentState.label }));\n return;\n }\n if (currentState.status === \"disabled\") {\n message.warning(t(\"chatWorkspace.assistantFlow.disabled\", { label: currentState.label }));\n return;\n }\n }\n\n setActiveRuntimeId(runtimeId);\n try {\n if (action === \"start\") {\n await client.assistants.localA2A.start(runtimeId);\n } else if (action === \"stop\") {\n await client.assistants.localA2A.stop(runtimeId);\n } else {\n await client.assistants.localA2A.restart(runtimeId);\n }\n await refreshLocalA2A();\n await refreshAssistants();\n } catch (error) {\n message.error(error instanceof Error ? error.message : t(\"chatWorkspace.assistantFlow.localProviderFailed\"));\n } finally {\n setActiveRuntimeId(null);\n }\n },\n [client, localStates, refreshLocalA2A, refreshAssistants, t]\n );\n\n // Fetch assistants on mount\n useEffect(() => {\n fetchAssistants();\n }, [fetchAssistants]);\n\n useEffect(() => {\n void refreshLocalA2A();\n }, [refreshLocalA2A]);\n\n useEffect(() => {\n const syncAssistants = async () => {\n if (localStates.some((state) => state.status === \"running\")) {\n await refreshAssistants();\n }\n };\n void syncAssistants();\n }, [localStates, refreshAssistants]);\n\n useEffect(() => {\n if (!displayAssistants || displayAssistants.length === 0) {\n setNodes([]);\n setEdges([]);\n return;\n }\n\n const initialNodes: Node[] = [];\n const initialEdges: Edge[] = [];\n\n // Configuration for layout\n const nodeWidth = 280;\n const nodeHeight = 200;\n const horizontalSpacing = 320;\n const verticalSpacing = 300;\n const nodesPerRow = Math.ceil(Math.sqrt(displayAssistants.length));\n\n // Try to extract relationships from graphDefinition\n // Check if graphDefinition contains node/edge information\n const assistantMap = new Map<string, Assistant>();\n const relationships: Array<{ source: string; target: string }> = [];\n\n displayAssistants.forEach((assistant) => {\n assistantMap.set(assistant.id, assistant);\n });\n\n // Extract relationships from graphDefinition\n displayAssistants.forEach((assistant) => {\n if (assistant.graphDefinition) {\n try {\n const graphDef =\n typeof assistant.graphDefinition === \"string\"\n ? JSON.parse(assistant.graphDefinition)\n : assistant.graphDefinition;\n\n // Check for subAgents (for DeepAgentConfig)\n // subAgents is an array of agent keys (strings)\n if (graphDef.subAgents && Array.isArray(graphDef.subAgents)) {\n graphDef.subAgents.forEach((subAgentKey: string) => {\n // Find the assistant with this key/id\n const subAssistant = displayAssistants.find(\n (a) => a.id === subAgentKey || a.id === String(subAgentKey)\n );\n if (subAssistant && subAssistant.id !== assistant.id) {\n relationships.push({\n source: assistant.id,\n target: subAssistant.id,\n });\n }\n });\n }\n\n // Check for internalSubAgents (for DeepAgentConfig)\n if (\n graphDef.internalSubAgents &&\n Array.isArray(graphDef.internalSubAgents)\n ) {\n graphDef.internalSubAgents.forEach((internalSubAgent: any) => {\n // internalSubAgents have a key property\n if (internalSubAgent.key) {\n const subAssistant = displayAssistants.find(\n (a) =>\n a.id === internalSubAgent.key ||\n a.id === String(internalSubAgent.key)\n );\n if (subAssistant && subAssistant.id !== assistant.id) {\n relationships.push({\n source: assistant.id,\n target: subAssistant.id,\n });\n }\n }\n });\n }\n\n // Check for common graph structure patterns\n if (graphDef.nodes && Array.isArray(graphDef.nodes)) {\n graphDef.nodes.forEach((node: any) => {\n // If node references another assistant ID\n if (node.assistantId && node.assistantId !== assistant.id) {\n const targetAssistant = displayAssistants.find(\n (a) =>\n a.id === node.assistantId ||\n a.id === String(node.assistantId)\n );\n if (targetAssistant) {\n relationships.push({\n source: assistant.id,\n target: targetAssistant.id,\n });\n }\n }\n });\n }\n\n // Check for edges array\n if (graphDef.edges && Array.isArray(graphDef.edges)) {\n graphDef.edges.forEach((edge: any) => {\n if (edge.source && edge.target) {\n const sourceId =\n typeof edge.source === \"string\"\n ? edge.source\n : edge.source.id || edge.source.assistantId;\n const targetId =\n typeof edge.target === \"string\"\n ? edge.target\n : edge.target.id || edge.target.assistantId;\n\n const sourceAssistant = displayAssistants.find(\n (a) => a.id === sourceId || a.id === String(sourceId)\n );\n const targetAssistant = displayAssistants.find(\n (a) => a.id === targetId || a.id === String(targetId)\n );\n\n if (sourceAssistant && targetAssistant) {\n relationships.push({\n source: sourceAssistant.id,\n target: targetAssistant.id,\n });\n }\n }\n });\n }\n } catch (error) {\n // If parsing fails, ignore and continue\n console.warn(\n `Failed to parse graphDefinition for assistant ${assistant.id}:`,\n error\n );\n }\n }\n });\n\n // Determine layout strategy\n const hasRelationships = relationships.length > 0;\n\n if (hasRelationships) {\n // Use hierarchical layout based on relationships\n const processedIds = new Set<string>();\n const levelMap = new Map<string, number>();\n const childrenMap = new Map<string, string[]>();\n\n // Build relationship graph\n relationships.forEach((rel) => {\n if (!childrenMap.has(rel.source)) {\n childrenMap.set(rel.source, []);\n }\n childrenMap.get(rel.source)!.push(rel.target);\n });\n\n // Calculate levels (BFS)\n const queue: Array<{ id: string; level: number }> = [];\n const rootNodes = displayAssistants.filter(\n (a) => !relationships.some((r) => r.target === a.id)\n );\n\n if (rootNodes.length === 0 && displayAssistants.length > 0) {\n // If no clear roots, use first assistant\n queue.push({ id: displayAssistants[0].id, level: 0 });\n } else {\n rootNodes.forEach((root) => {\n queue.push({ id: root.id, level: 0 });\n });\n }\n\n while (queue.length > 0) {\n const { id, level } = queue.shift()!;\n if (processedIds.has(id)) continue;\n processedIds.add(id);\n levelMap.set(id, level);\n\n const children = childrenMap.get(id) || [];\n children.forEach((childId) => {\n if (!processedIds.has(childId)) {\n queue.push({ id: childId, level: level + 1 });\n }\n });\n }\n\n // Assign levels to all assistants\n displayAssistants.forEach((assistant) => {\n if (!levelMap.has(assistant.id)) {\n levelMap.set(assistant.id, 0);\n }\n });\n\n // Group by level and calculate positions\n const levelGroups = new Map<number, Assistant[]>();\n displayAssistants.forEach((assistant) => {\n const level = levelMap.get(assistant.id) || 0;\n if (!levelGroups.has(level)) {\n levelGroups.set(level, []);\n }\n levelGroups.get(level)!.push(assistant);\n });\n\n // Calculate positions\n levelGroups.forEach((group, level) => {\n const y = level * verticalSpacing;\n const groupWidth = (group.length - 1) * horizontalSpacing;\n const startX = -groupWidth / 2;\n\n group.forEach((assistant, index) => {\n const x = startX + index * horizontalSpacing;\n const localA2A = localStatesByAssistantId.get(assistant.id);\n\n initialNodes.push({\n id: assistant.id,\n type: \"assistant\",\n data: {\n assistant,\n localA2A,\n isLocalA2ABusy: activeRuntimeId === localA2A?.runtimeId,\n onConfigure: localA2A\n ? undefined\n : enableAssistantEditing\n ? () => handleConfigure(assistant)\n : undefined,\n onChat,\n onLocalA2AAction: localA2A ? runLocalA2AAction : undefined,\n },\n position: { x, y },\n });\n });\n });\n\n // Add edges\n relationships.forEach((rel) => {\n if (assistantMap.has(rel.source) && assistantMap.has(rel.target)) {\n initialEdges.push({\n id: `e${rel.source}-${rel.target}`,\n source: rel.source,\n target: rel.target,\n animated: true,\n style: { stroke: \"#1677ff\" },\n type: \"smoothstep\",\n });\n }\n });\n } else {\n // Use grid layout when no relationships are found\n displayAssistants.forEach((assistant, index) => {\n const row = Math.floor(index / nodesPerRow);\n const col = index % nodesPerRow;\n const x = col * horizontalSpacing - ((nodesPerRow - 1) * horizontalSpacing) / 2;\n const y = row * verticalSpacing;\n const localA2A = localStatesByAssistantId.get(assistant.id);\n\n initialNodes.push({\n id: assistant.id,\n type: \"assistant\",\n data: {\n assistant,\n localA2A,\n isLocalA2ABusy: activeRuntimeId === localA2A?.runtimeId,\n onConfigure: localA2A\n ? undefined\n : enableAssistantEditing\n ? () => handleConfigure(assistant)\n : undefined,\n onChat,\n onLocalA2AAction: localA2A ? runLocalA2AAction : undefined,\n },\n position: { x, y },\n });\n });\n }\n\n setNodes(initialNodes);\n setEdges(initialEdges);\n }, [\n displayAssistants,\n localStatesByAssistantId,\n activeRuntimeId,\n runLocalA2AAction,\n enableAssistantEditing,\n handleConfigure,\n onChat,\n setNodes,\n setEdges,\n ]);\n\n /**\n * Handle save agent configuration\n */\n const handleSaveConfig = async (assistant: Assistant, agentConfig: any) => {\n try {\n // Get current graph definition and merge with new config\n const currentGraphDef =\n typeof assistant.graphDefinition === \"string\"\n ? JSON.parse(assistant.graphDefinition || \"{}\")\n : assistant.graphDefinition || {};\n\n const updatedGraphDef = {\n ...currentGraphDef,\n ...agentConfig,\n };\n\n const data = await put<{ success: boolean; message?: string }>(\n `/api/assistants/${assistant.id}`,\n {\n name: agentConfig.name ?? assistant.name,\n description: agentConfig.description ?? assistant.description,\n graphDefinition: updatedGraphDef,\n }\n );\n\n if (data.success) {\n // Update local state\n setAssistants((prev) =>\n prev.map((a) =>\n a.id === assistant.id\n ? {\n ...a,\n name: agentConfig.name ?? assistant.name,\n description: agentConfig.description ?? assistant.description,\n graphDefinition: updatedGraphDef,\n }\n : a\n )\n );\n message.success(data.message || t(\"chatWorkspace.assistantFlow.saveSuccess\"));\n } else {\n message.error(data.message || t(\"chatWorkspace.assistantFlow.saveFailed\"));\n throw new Error(data.message || t(\"chatWorkspace.assistantFlow.saveFailed\"));\n }\n } catch (error) {\n console.error(\"Failed to save agent configuration:\", error);\n message.error(error instanceof Error ? error.message : t(\"chatWorkspace.assistantFlow.saveFailed\"));\n throw error;\n }\n };\n\n /**\n * Handle delete assistant\n */\n const handleDeleteAssistant = async (assistant: Assistant) => {\n try {\n const data = await del<{ success: boolean; message?: string }>(`/api/assistants/${assistant.id}`);\n\n if (data.success) {\n setAssistants((prev) => prev.filter((a) => a.id !== assistant.id));\n if (selectedAssistant?.id === assistant.id) {\n setSelectedAssistant(null);\n setConfigPanelVisible(false);\n }\n message.success(t(\"chatWorkspace.assistantFlow.deleted\"));\n } else {\n message.error(data.message || t(\"chatWorkspace.assistantFlow.deleteFailed\"));\n throw new Error(data.message || t(\"chatWorkspace.assistantFlow.deleteFailed\"));\n }\n } catch (error) {\n console.error(\"Failed to delete assistant:\", error);\n message.error(error instanceof Error ? error.message : t(\"chatWorkspace.assistantFlow.deleteFailed\"));\n throw error;\n }\n };\n\n /**\n * Handle successful assistant creation\n */\n const handleAssistantCreated = useCallback(async (createdAssistant: Assistant) => {\n setAssistants((prev) => {\n const exists = prev.some((a) => a.id === createdAssistant.id);\n if (exists) {\n return prev.map((a) => (a.id === createdAssistant.id ? createdAssistant : a));\n }\n return [...prev, createdAssistant];\n });\n\n const graphDef = createdAssistant.graphDefinition;\n const isA2A = typeof graphDef === \"object\" && graphDef !== null && (graphDef as Record<string, unknown>).type === \"a2a_remote\";\n if (isA2A) {\n await refreshLocalA2A();\n }\n\n lastCreatedAssistantRef.current = createdAssistant;\n }, [refreshLocalA2A]);\n\n useEffect(() => {\n if (selectedAssistant) {\n const node = nodes.find((n) => n.id === selectedAssistant.id);\n if (node) {\n setCenter(node.position.x + 140, node.position.y + 100, { zoom: 1, duration: 800 });\n }\n }\n }, [selectedAssistant, nodes, setCenter]);\n\n useEffect(() => {\n if (assistants.length > 0 && selectedAssistant) {\n const assistant = assistants.find((a) => a.id === selectedAssistant.id);\n if (assistant && !configPanelVisible) {\n setConfigPanelVisible(true);\n }\n }\n }, [assistants, selectedAssistant, configPanelVisible]);\n\n const lastCreatedAssistantRef = useRef<Assistant | null>(null);\n useEffect(() => {\n if (lastCreatedAssistantRef.current && !assistants.find(a => a.id === lastCreatedAssistantRef.current?.id)) {\n lastCreatedAssistantRef.current = null;\n }\n if (lastCreatedAssistantRef.current) {\n const node = nodes.find((n) => n.id === lastCreatedAssistantRef.current!.id);\n if (node) {\n setCenter(node.position.x + 140, node.position.y + 100, { zoom: 1, duration: 800 });\n setSelectedAssistant(lastCreatedAssistantRef.current);\n setConfigPanelVisible(true);\n lastCreatedAssistantRef.current = null;\n }\n }\n }, [nodes, setCenter]);\n\n if (assistantsLoading) {\n return (\n <div\n className={styles.root}\n >\n <div className={styles.loadingState}>{t(\"chatWorkspace.assistantFlow.loading\")}</div>\n </div>\n );\n }\n\n return (\n <div className={styles.root}>\n <div className={styles.canvasRow}>\n <div className={styles.canvasWrap}>\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onSelectionChange={handleSelectionChange}\n nodeTypes={nodeTypes}\n fitView\n >\n <Background color=\"#eee\" gap={20} />\n <Controls />\n </ReactFlow>\n\n {enableAssistantCreation && (\n <div\n style={{\n position: \"absolute\",\n top: 20,\n right: 20,\n zIndex: 10,\n }}\n >\n <Button\n type=\"primary\"\n size=\"large\"\n icon={<PlusOutlined />}\n onClick={() => setIsCreateModalOpen(true)}\n style={{\n height: 48,\n width: 48,\n borderRadius: \"50%\",\n boxShadow: token.boxShadowTertiary,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0,\n }}\n />\n </div>\n )}\n </div>\n\n <AgentConfigPanel\n visible={configPanelVisible}\n assistant={selectedAssistant}\n allAssistants={assistants}\n onClose={handleClosePanel}\n onSave={handleSaveConfig}\n onDelete={handleDeleteAssistant}\n />\n </div>\n\n {/* Create assistant modal */}\n <CreateAssistantModal\n open={isCreateModalOpen}\n onCancel={() => setIsCreateModalOpen(false)}\n onSuccess={handleAssistantCreated}\n />\n </div>\n );\n};\n\n/**\n * AssistantFlow component - Canvas for visualizing assistants with side panel\n * Wraps the inner component with ReactFlowProvider\n */\nconst AssistantFlow: React.FC<AssistantFlowProps> = (props) => (\n <ReactFlowProvider>\n <AssistantFlowInner {...props} />\n </ReactFlowProvider>\n);\n\nexport default AssistantFlow;\n","import React, { useMemo } from \"react\";\nimport { Handle, Position, NodeProps, Node } from \"@xyflow/react\";\nimport { Avatar, Typography, theme, Tag, Tooltip, Space, Button } from \"antd\";\nimport {\n UserOutlined,\n ToolOutlined,\n SettingOutlined,\n IdcardOutlined,\n InfoCircleOutlined,\n BranchesOutlined,\n CodeOutlined,\n MessageOutlined,\n} from \"@ant-design/icons\";\nimport type { Assistant, LocalA2AProviderState } from \"@axiom-lattice/client-sdk\";\nimport { Play, Square, RotateCcw } from \"lucide-react\";\nimport { useT } from \"../../i18n\";\n\nconst { Text } = Typography;\n\n/**\n * Props for AssistantNode component\n */\nexport interface AssistantNodeData extends Record<string, unknown> {\n /**\n * Assistant data\n */\n assistant: Assistant;\n /**\n * Click handler for configure button\n */\n onConfigure?: (assistant: Assistant) => void;\n /**\n * Click handler for chat button\n */\n onChat?: (assistant: Assistant) => void;\n /**\n * Local A2A provider state if this assistant is a local wrapper.\n */\n localA2A?: LocalA2AProviderState;\n /**\n * Local A2A action handler.\n */\n onLocalA2AAction?: (\n runtimeId: string,\n action: \"start\" | \"stop\" | \"restart\"\n ) => void | Promise<void>;\n}\n\nconst LOCAL_STATUS_DOTS: Record<LocalA2AProviderState[\"status\"], string> = {\n missing: \"#8c8c8c\",\n disabled: \"#8c8c8c\",\n starting: \"#1677ff\",\n running: \"#52c41a\",\n stopped: \"#faad14\",\n failed: \"#ff4d4f\",\n};\n\n/**\n * Generate a color based on assistant ID for consistent badge colors\n */\nconst getBadgeColor = (id: string): string => {\n const colors = [\n \"#1890ff\", // Blue\n \"#52c41a\", // Green\n \"#faad14\", // Orange\n \"#f5222d\", // Red\n \"#722ed1\", // Purple\n \"#13c2c2\", // Cyan\n \"#eb2f96\", // Magenta\n \"#fa8c16\", // Orange Red\n ];\n let hash = 0;\n for (let i = 0; i < id.length; i++) {\n hash = id.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n};\n\n/**\n * Custom node component for displaying assistants in the flow\n * Designed to look like a digital ID badge\n */\nconst AssistantNode: React.FC<NodeProps<Node<AssistantNodeData>>> = ({\n data,\n selected,\n}) => {\n const t = useT();\n const { token } = theme.useToken();\n\n if (!data) {\n return null;\n }\n\n const { assistant, onConfigure, onChat, localA2A, onLocalA2AAction } = data;\n\n if (!assistant) {\n return null;\n }\n\n const badgeColor = getBadgeColor(assistant.id);\n const localStatus = localA2A?.status;\n const statusDotColor = localStatus\n ? LOCAL_STATUS_DOTS[localStatus]\n : \"#52c41a\";\n const initials = assistant.name\n ?.split(\" \")\n .map((n) => n.charAt(0))\n .join(\"\")\n .toUpperCase()\n .slice(0, 2) || \"A\";\n\n // Extract model, tools, type, prompt, and subAgents from graphDefinition\n const { modelKey, tools, agentType, prompt, subAgents } = useMemo(() => {\n if (!assistant.graphDefinition) {\n return {\n modelKey: undefined,\n tools: [],\n agentType: undefined,\n prompt: undefined,\n subAgents: [],\n };\n }\n\n try {\n const graphDef =\n typeof assistant.graphDefinition === \"string\"\n ? JSON.parse(assistant.graphDefinition)\n : assistant.graphDefinition;\n\n return {\n modelKey: graphDef.modelKey || graphDef.model,\n tools: graphDef.tools || [],\n agentType: graphDef.type,\n prompt: graphDef.prompt,\n subAgents: graphDef.subAgents || [],\n };\n } catch (error) {\n return {\n modelKey: undefined,\n tools: [],\n agentType: undefined,\n prompt: undefined,\n subAgents: [],\n };\n }\n }, [assistant.graphDefinition]);\n\n // Format agent type for display\n const getAgentTypeLabel = (type: string | undefined): string => {\n if (!type) return \"\";\n const typeMap: Record<string, string> = {\n react: t(\"chatWorkspace.assistantNode.type.react\"),\n deep_agent: t(\"chatWorkspace.assistantNode.type.deepAgent\"),\n processing: t(\"chatWorkspace.assistantNode.type.processing\"),\n plan_execute: t(\"chatWorkspace.assistantNode.type.planExecute\"),\n sequential: t(\"chatWorkspace.assistantNode.type.sequential\"),\n a2a_remote: t(\"chatWorkspace.assistantNode.type.a2aRemote\"),\n };\n return typeMap[type] || type.toUpperCase();\n };\n\n // Detail card content for hover tooltip\n const detailTooltipContent = (\n <div\n style={{\n maxWidth: 400,\n maxHeight: \"60vh\",\n overflowY: \"auto\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n justifyContent: \"space-between\",\n marginBottom: 12,\n }}\n >\n <div style={{ flex: 1 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 8,\n }}\n >\n <Text\n strong\n style={{\n fontSize: 16,\n fontWeight: 600,\n color: token.colorText,\n }}\n >\n {assistant.name}\n </Text>\n {agentType && (\n <Tag\n color=\"purple\"\n style={{\n margin: 0,\n fontSize: 10,\n padding: \"2px 8px\",\n fontWeight: 600,\n }}\n >\n {getAgentTypeLabel(agentType)}\n </Tag>\n )}\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n <Text\n style={{\n fontSize: 11,\n color: token.colorTextTertiary,\n fontFamily: \"monospace\",\n }}\n >\n {`>_ ${assistant.id}`}\n </Text>\n </div>\n </div>\n </div>\n\n {/* Description */}\n {assistant.description && (\n <div style={{ marginBottom: 12 }}>\n <Text\n style={{\n fontSize: 12,\n color: token.colorText,\n lineHeight: 1.6,\n fontStyle: \"italic\",\n }}\n >\n \"{assistant.description}\"\n </Text>\n </div>\n )}\n\n {/* Model Engine */}\n {modelKey && (\n <div style={{ marginBottom: 12 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 8,\n }}\n >\n <SettingOutlined\n style={{\n fontSize: 14,\n color: token.colorTextSecondary,\n }}\n />\n <Text\n style={{\n fontSize: 12,\n color: token.colorTextSecondary,\n fontWeight: 500,\n }}\n >\n {t(\"chatWorkspace.assistantNode.modelEngine\")}\n </Text>\n </div>\n <Tag\n color=\"blue\"\n style={{\n fontSize: 11,\n padding: \"4px 12px\",\n }}\n >\n {modelKey}\n </Tag>\n </div>\n )}\n\n {/* System Prompt */}\n {prompt && (\n <div style={{ marginBottom: 12 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 8,\n justifyContent: \"space-between\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n <CodeOutlined\n style={{\n fontSize: 14,\n color: token.colorTextSecondary,\n }}\n />\n <Text\n style={{\n fontSize: 12,\n color: token.colorTextSecondary,\n fontWeight: 600,\n letterSpacing: 0.5,\n }}\n >\n {t(\"chatWorkspace.assistantNode.systemPrompt\")}\n </Text>\n </div>\n </div>\n <div\n style={{\n padding: 12,\n background: token.colorFillTertiary,\n border: `1px solid ${token.colorBorderSecondary}`,\n borderRadius: 4,\n maxHeight: 150,\n overflowY: \"auto\",\n }}\n >\n <Text\n style={{\n fontSize: 11,\n color: token.colorText,\n lineHeight: 1.6,\n whiteSpace: \"pre-wrap\",\n }}\n >\n {prompt.length > 300 ? prompt.slice(0, 300) + \"...\" : prompt}\n </Text>\n </div>\n </div>\n )}\n\n {/* Available Tools */}\n {tools && tools.length > 0 && (\n <div style={{ marginBottom: 12 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 8,\n }}\n >\n <ToolOutlined\n style={{\n fontSize: 14,\n color: token.colorTextSecondary,\n }}\n />\n <Text\n style={{\n fontSize: 12,\n color: token.colorTextSecondary,\n fontWeight: 500,\n }}\n >\n {t(\"chatWorkspace.assistantNode.availableTools\", { count: tools.length })}\n </Text>\n </div>\n <Space size={[8, 8]} wrap>\n {tools.slice(0, 5).map((tool: string, index: number) => (\n <Tag\n key={index}\n color=\"blue\"\n style={{\n fontSize: 11,\n padding: \"4px 12px\",\n }}\n >\n {tool.replace(/_/g, \" \")}\n </Tag>\n ))}\n {tools.length > 5 && (\n <Tag\n style={{\n fontSize: 11,\n padding: \"4px 12px\",\n backgroundColor: token.colorFillTertiary,\n color: token.colorTextSecondary,\n }}\n >\n {t(\"chatWorkspace.assistantNode.more\", { count: tools.length - 5 })}\n </Tag>\n )}\n </Space>\n </div>\n )}\n\n {/* Sub-Agent Architecture */}\n {subAgents && subAgents.length > 0 && (\n <div style={{ marginBottom: 8 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 8,\n }}\n >\n <BranchesOutlined\n style={{\n fontSize: 14,\n color: token.colorTextSecondary,\n }}\n />\n <Text\n style={{\n fontSize: 12,\n color: token.colorTextSecondary,\n fontWeight: 500,\n }}\n >\n {t(\"chatWorkspace.assistantNode.subAgentArchitecture\", { count: subAgents.length })}\n </Text>\n </div>\n <Space size={[8, 8]} wrap>\n {subAgents.slice(0, 3).map((subAgent: string, index: number) => (\n <Tag\n key={index}\n style={{\n fontSize: 11,\n padding: \"4px 12px\",\n backgroundColor: token.colorFillTertiary,\n color: token.colorText,\n border: `1px solid ${token.colorBorderSecondary}`,\n }}\n >\n {`> ${subAgent}`}\n </Tag>\n ))}\n {subAgents.length > 3 && (\n <Tag\n style={{\n fontSize: 11,\n padding: \"4px 12px\",\n backgroundColor: token.colorFillTertiary,\n color: token.colorTextSecondary,\n }}\n >\n {t(\"chatWorkspace.assistantNode.more\", { count: subAgents.length - 3 })}\n </Tag>\n )}\n </Space>\n </div>\n )}\n </div>\n );\n\n return (\n <div\n style={{\n padding: 4,\n }}\n >\n {/* Top connection point */}\n <Handle type=\"target\" position={Position.Top} />\n\n {/* Main card */}\n <div\n style={{\n width: 260,\n minHeight: 180,\n background: token.colorBgContainer,\n borderRadius: 8,\n boxShadow: `0 1px 4px rgba(0, 0, 0, 0.08)`,\n overflow: \"hidden\",\n transition: \"all 0.2s ease\",\n position: \"relative\",\n border: selected\n ? `2px solid ${token.colorPrimary}`\n : `1px solid ${token.colorBorder}`,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = \"translateY(-2px)\";\n e.currentTarget.style.boxShadow = `0 2px 8px rgba(0, 0, 0, 0.12)`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = \"translateY(0)\";\n e.currentTarget.style.boxShadow = `0 1px 4px rgba(0, 0, 0, 0.08)`;\n }}\n >\n {/* Content area */}\n <div\n style={{\n padding: 12,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 10,\n flex: 1,\n }}\n >\n {/* Header: Avatar and Name Section */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 10,\n }}\n >\n {/* Avatar with status indicator */}\n <Tooltip\n title={detailTooltipContent}\n placement=\"rightTop\"\n mouseEnterDelay={0.5}\n overlayStyle={{\n maxWidth: \"none\",\n }}\n color={token.colorBgContainer}\n >\n <div\n style={{\n position: \"relative\",\n flexShrink: 0,\n cursor: \"pointer\",\n }}\n >\n <Avatar\n size={44}\n icon={<UserOutlined />}\n style={{\n backgroundColor: badgeColor,\n color: \"#fff\",\n fontSize: 16,\n fontWeight: 600,\n }}\n >\n {initials}\n </Avatar>\n {/* Status indicator */}\n <div\n style={{\n position: \"absolute\",\n bottom: 0,\n right: 0,\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n background: statusDotColor,\n border: `2px solid ${token.colorBgContainer}`,\n }}\n />\n </div>\n </Tooltip>\n\n {/* Name and ID */}\n <div\n style={{\n flex: 1,\n minWidth: 0,\n paddingRight: 32,\n }}\n >\n <Text\n strong\n style={{\n fontSize: 14,\n fontWeight: 600,\n display: \"block\",\n marginBottom: 3,\n color: token.colorText,\n lineHeight: 1.3,\n }}\n ellipsis={{ tooltip: assistant.name }}\n >\n {assistant.name}\n </Text>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n }}\n >\n <IdcardOutlined\n style={{\n fontSize: 9,\n color: token.colorTextTertiary,\n }}\n />\n <Text\n style={{\n fontSize: 9,\n color: token.colorTextTertiary,\n }}\n ellipsis={{ tooltip: assistant.id }}\n >\n {assistant.id}\n </Text>\n </div>\n </div>\n </div>\n\n {/* Description */}\n {assistant.description && (\n <div\n style={{\n padding: 8,\n background: token.colorFillTertiary,\n border: `1px solid ${token.colorBorderSecondary}`,\n borderRadius: 4,\n borderLeft: `2px solid ${badgeColor}`,\n }}\n >\n <Tooltip\n title={\n assistant.description.length > 150\n ? assistant.description\n : undefined\n }\n placement=\"top\"\n >\n <div\n style={{\n fontSize: 10,\n color: token.colorText,\n lineHeight: 1.5,\n fontStyle: \"italic\",\n display: \"-webkit-box\",\n WebkitLineClamp: 3,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n cursor:\n assistant.description.length > 150\n ? \"help\"\n : \"default\",\n }}\n >\n \"{assistant.description}\"\n </div>\n </Tooltip>\n </div>\n )}\n\n {localA2A && onLocalA2AAction && (\n <Space size={6} wrap style={{ paddingTop: 4 }}>\n {localA2A.status === \"missing\" || localA2A.status === \"disabled\" ? (\n <Text type=\"secondary\" style={{ fontSize: 11 }}>\n {localA2A.status === \"missing\" ? t(\"chatWorkspace.assistantNode.status.notInstalled\") : t(\"chatWorkspace.assistantNode.status.disabled\")}\n </Text>\n ) : localA2A.status === \"starting\" ? (\n <Text type=\"secondary\" style={{ fontSize: 11 }}>\n {t(\"chatWorkspace.assistantNode.status.starting\")}\n </Text>\n ) : (\n <>\n {localA2A.status === \"running\" ? (\n <Button\n size=\"small\"\n icon={<Square size={12} />}\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n void onLocalA2AAction(localA2A.runtimeId, \"stop\");\n }}\n >\n {t(\"chatWorkspace.assistantNode.action.stop\")}\n </Button>\n ) : (\n <Button\n size=\"small\"\n icon={<Play size={12} />}\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n void onLocalA2AAction(localA2A.runtimeId, \"start\");\n }}\n >\n {t(\"chatWorkspace.assistantNode.action.start\")}\n </Button>\n )}\n <Button\n size=\"small\"\n icon={<RotateCcw size={12} />}\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n void onLocalA2AAction(localA2A.runtimeId, \"restart\");\n }}\n >\n {t(\"chatWorkspace.assistantNode.action.restart\")}\n </Button>\n </>\n )}\n </Space>\n )}\n\n {/* Bottom Info Tags and Chat */}\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: 4,\n padding: \"4px 0\",\n marginTop: \"auto\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n {/* Tags */}\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: 4,\n }}\n >\n {/* Agent Type */}\n {agentType && (\n <Tag\n style={{\n margin: 0,\n fontSize: 7,\n padding: \"2px 6px\",\n borderRadius: 6,\n backgroundColor: token.colorPrimaryBg,\n color: token.colorPrimary,\n border: `1px solid ${token.colorPrimaryBorder}`,\n fontWeight: 500,\n lineHeight: \"14px\",\n }}\n >\n {getAgentTypeLabel(agentType)}\n </Tag>\n )}\n\n {/* Has Tools Indicator */}\n {tools && tools.length > 0 && (\n <Tag\n style={{\n margin: 0,\n fontSize: 7,\n padding: \"2px 6px\",\n borderRadius: 6,\n backgroundColor: token.colorSuccessBg,\n color: token.colorSuccess,\n border: `1px solid ${token.colorSuccessBorder}`,\n fontWeight: 500,\n lineHeight: \"14px\",\n }}\n >\n {t(\"chatWorkspace.assistantNode.toolsCount\", { count: tools.length })}\n </Tag>\n )}\n\n {/* Model */}\n {modelKey && (\n <Tag\n style={{\n margin: 0,\n fontSize: 7,\n padding: \"2px 6px\",\n borderRadius: 6,\n backgroundColor: token.colorWarningBg,\n color: token.colorWarning,\n border: `1px solid ${token.colorWarningBorder}`,\n fontWeight: 500,\n lineHeight: \"14px\",\n }}\n title={modelKey}\n >\n {modelKey.length > 12\n ? `${modelKey.slice(0, 12)}...`\n : modelKey}\n </Tag>\n )}\n </div>\n\n {/* Chat Button - stopPropagation prevents node selection */}\n {onChat && (!localA2A || localA2A.status === \"running\") && (\n <div\n onMouseDown={(e: React.MouseEvent) => {\n // Prevent ReactFlow from handling this as a node selection\n e.stopPropagation();\n }}\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n onChat(assistant);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n padding: \"2px 6px\",\n borderRadius: 4,\n backgroundColor: token.colorPrimary,\n color: \"#fff\",\n cursor: \"pointer\",\n fontSize: 10,\n fontWeight: 500,\n transition: \"all 0.2s ease\",\n }}\n onMouseEnter={(e: React.MouseEvent<HTMLDivElement>) => {\n e.currentTarget.style.backgroundColor = token.colorPrimaryHover;\n }}\n onMouseLeave={(e: React.MouseEvent<HTMLDivElement>) => {\n e.currentTarget.style.backgroundColor = token.colorPrimary;\n }}\n >\n <MessageOutlined style={{ fontSize: 10 }} />\n <span>{t(\"chatWorkspace.assistantNode.chat\")}</span>\n </div>\n )}\n </div>\n </div>\n\n {/* Bottom connection point */}\n <Handle type=\"source\" position={Position.Bottom} />\n </div>\n </div>\n );\n};\n\nexport default AssistantNode;\n","import React from \"react\";\nimport { WorkspaceContextProvider } from \"../../context/WorkspaceContext\";\nimport { LatticeChat, type AgentChatProps } from \"./LatticeChat\";\nimport { AssistantContextProvider } from \"./AssistantContext\";\n\nexport type LatticeAgentWorkspaceProps = AgentChatProps & {\n workspaceId?: string;\n projectId?: string;\n};\n\nexport const LatticeAgentWorkspace: React.FC<LatticeAgentWorkspaceProps> = ({\n workspaceId,\n projectId = \"default\",\n assistant_id,\n ...chatProps\n}) => (\n <WorkspaceContextProvider workspaceId={workspaceId} projectId={projectId}>\n <AssistantContextProvider autoLoad={true} initialAssistantId={assistant_id}>\n <LatticeChat showProjectSelector={false} assistant_id={assistant_id} {...chatProps} />\n </AssistantContextProvider>\n </WorkspaceContextProvider>\n);\n"],"mappings":"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","names":["jsx","theme","jsx","theme","thread","jsx","jsx","jsxs","index","jsx","Fragment","jsx","jsxs","useEffect","useState","Button","Input","Modal","Typography","message","jsx","jsxs","Text","Title","Typography","useState","message","useEffect","Button","payload","result","Modal","Input","useMemo","useEffect","useState","useRef","createStyles","useMemo","Typography","theme","Tag","Space","Button","Fragment","jsx","jsxs","Text","Typography","colors","theme","useMemo","Tag","Space","index","Button","Button","message","theme","PlusOutlined","jsx","jsxs","useStyles","createStyles","useState","theme","useMemo","message","useEffect","index","useRef","Button","PlusOutlined","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Chat/registerWorkspaceApp.tsx","../src/components/Auth/TenantBranding.tsx","../src/index.ts","../src/components/Chat/AgentConversations.tsx","../src/components/Chat/LatticeChatView.tsx","../src/components/Chat/SettingsModal.tsx","../src/components/Chat/AgentServerSetting.tsx","../src/components/Chat/LatticeChatShell.tsx","../src/components/Chat/ChannelInstallationsDrawerContent.tsx","../src/components/Chat/AssistantFlow.tsx","../src/components/Chat/AssistantNode.tsx","../src/components/Governance/AgentCardStats.tsx","../src/components/Chat/LatticeAgentWorkspace.tsx"],"sourcesContent":["/**\n * Workspace App Registration\n *\n * Registers workspace and CoSpace as apps in the global app registry.\n * This happens at module load time, before any components render,\n * ensuring AppSwitcherModal has apps available on first render.\n */\n\nimport { appRegistry } from \"../../AppRegistry\";\nimport { LayoutGrid, Users } from \"lucide-react\";\n\n// Register Workspace as an app - this runs at module load time\nappRegistry.register({\n id: \"workspace\",\n name: \"Workspace\",\n icon: <LayoutGrid size={16} />,\n description: \"Manage projects, assistants, and workflows\",\n});\n\n// Register CoSpace as a standalone app (visible in AppSwitcher only,\n// NOT in the workspace sidebar menu)\nappRegistry.register({\n id: \"cospace\",\n name: \"CoSpace\",\n icon: <Users size={16} />,\n description: \"Direct messaging and collaboration spaces\",\n});\n","import React from \"react\";\nimport { theme } from \"antd\";\nimport { useTenantBranding } from \"../../hooks/useTenantBranding\";\nimport { TenantLogo } from \"./TenantLogo\";\n\nconst { useToken } = theme;\n\nexport interface TenantBrandingProps {\n /** Logo + text size preset */\n size?: \"small\" | \"medium\";\n /** Whether to show the tenant name next to the logo (default true) */\n showName?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Brand bar combining tenant logo and tenant name.\n *\n * Uses `useTenantBranding()` internally to read the current tenant's\n * logo URL. Renders nothing visible when there is no current tenant.\n */\nexport const TenantBranding: React.FC<TenantBrandingProps> = ({\n size = \"medium\",\n showName = true,\n className,\n}) => {\n const { logoUrl, tenantName } = useTenantBranding();\n const { token } = useToken();\n\n if (!tenantName) {\n return null;\n }\n\n const logoSize = size === \"medium\" ? 32 : 24;\n const gap = size === \"medium\" ? 10 : 8;\n const fontSize = size === \"medium\" ? 16 : 13;\n\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap,\n padding: \"8px 16px\",\n }}\n >\n <TenantLogo logoUrl={logoUrl} size={logoSize} />\n {showName && (\n <span\n style={{\n fontWeight: 600,\n fontSize,\n color: token.colorText,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {tenantName}\n </span>\n )}\n </div>\n );\n};\n","/**\n * @packageDocumentation\n * Axiom Lattice React SDK - React hooks for the Axiom Lattice Agent Service API\n */\n\n// Register workspace app at module load time (before any components render)\n// This ensures AppSwitcherModal has apps available on first render\nimport \"./components/Chat/registerWorkspaceApp\";\n\n// Export types\nexport * from \"./types\";\n\n// Export hooks\nexport * from \"./hooks/useChat\";\nexport * from \"./hooks/useAgentChat\";\nexport * from \"./hooks/useAgentState\";\nexport * from \"./hooks/useAgentGraph\";\nexport * from \"./hooks/useApi\";\nexport * from \"./hooks/useMiddlewareTypes\";\nexport * from \"./hooks/useCapabilityBundles\";\nexport * from \"./hooks/useModelProviders\";\nexport * from \"./hooks/useProjectCapabilities\";\nexport * from \"./hooks/eval/useEvalProjects\";\nexport * from \"./hooks/eval/useEvalSuites\";\nexport * from \"./hooks/eval/useEvalCases\";\nexport * from \"./hooks/eval/useEvalRuns\";\nexport * from \"./hooks/eval/useEvalRunStream\";\n\n// Export context\nexport * from \"./context\";\nexport * from \"./context/AgentThreadContext\";\n\n// App registry + contexts for app switching and standalone app composition\n// (e.g. building a CoSpace-only app).\nexport { appRegistry } from \"./AppRegistry\";\nexport type { AppDefinition, AppRegistry } from \"./AppRegistry\";\nexport { AppProvider, useApp, useCurrentApp } from \"./context/AppContext\";\nexport type { AppContextValue, AppProviderProps } from \"./context/AppContext\";\nexport { WorkspaceContextProvider, WorkspaceContext, useWorkspaceContext, useWorkspaceContextOptional } from \"./context/WorkspaceContext\";\nexport type { WorkspaceContextValue, WorkspaceContextProviderProps } from \"./context/WorkspaceContext\";\nexport { useClient } from \"./context\";\n\nexport * from \"./auth\";\n\nexport { TenantLogo } from \"./components/Auth/TenantLogo\";\nexport { TenantBranding } from \"./components/Auth/TenantBranding\";\nexport { TenantSettingsModal } from \"./components/Auth/TenantSettingsModal\";\nexport {\n TenantModelProvidersModal,\n TenantModelProvidersPanel,\n} from \"./components/Auth/TenantModelProvidersModal\";\nexport { useTenantBranding } from \"./hooks/useTenantBranding\";\nexport type { TenantBrandingData } from \"./hooks/useTenantBranding\";\n\nexport * from \"@axiom-lattice/protocols\";\n\n// Export components\nexport * from \"./components/Chat/ChatErrorBoundary\";\nexport * from \"./components/Chat/LatticeChat\";\nexport * from \"./components/Chat/ModelSelector\";\nexport * from \"./components/ProjectSelector\";\nexport * from \"./components/ProjectScopeProvider\";\nexport * from \"./components/Eval/RunEnvModal\";\nexport * from \"./components/GenUI/MDResponse\";\nexport * from \"./components/GenUI/types\";\nexport * from \"./components/GenUI/elements\";\nexport * from \"./components/Chat/Chating\";\nexport * from \"./components/Chat/SideAppViewBrowser\";\nexport * from \"./components/Chat/SideAppBrowserContext\";\nexport * from \"./components/Chat/ChatUIContext\";\nexport * from \"./components/Chat/ConversationContext\";\nexport * from \"./components/Chat/AssistantContext\";\nexport { AgentChatApp } from \"./integrations/web-app/console-chat/AgentChatApp\";\nexport type { AgentChatAppProps } from \"./integrations/web-app/console-chat/AgentChatApp\";\nexport * from \"./components/Chat/ConnectionListField\";\nexport * from \"./components/Chat/ConnectionConfigDrawerContent\";\nexport * from \"./components/Chat/ConnectionsHub\";\nexport * from \"./components/Chat/LatticeChatShellContext\";\nexport * from \"./components/CapabilityBundles/CapabilityBundleList\";\nexport * from \"./components/CapabilityBundles/CapabilityBundleForm\";\nexport * from \"./components/CapabilityBundles/ProjectCapabilityPanel\";\nexport * from \"./components/CapabilityBundles/CapabilityPreviewPanel\";\nexport * from \"./components/CapabilityBundles/CapabilityOverrideDetails\";\nexport * from \"./components/Chat/types\";\nexport * from \"./components/Chat/ColumnLayout\";\nexport * from \"./components/GenUI/FileExplorer\";\nexport * from \"./components/Chat/AgentConversations\";\nexport * from \"./components/Chat/MetricsConfigDrawerContent\";\nexport * from \"./components/Chat/WorkspaceResourceManager\";\nexport * from \"./components/Chat/LatticeChatShell\";\nexport * from \"./components/Chat/ChatSidebar\";\nexport * from \"./components/Chat/ChannelInstallationsDrawerContent\";\nexport * from \"./components/Chat/ScheduleButton\";\nexport { default as AssistantFlow } from \"./components/Chat/AssistantFlow\";\nexport { default as AssistantNode } from \"./components/Chat/AssistantNode\";\nexport type { AssistantFlowProps } from \"./components/Chat/AssistantFlow\";\nexport type { AssistantNodeData } from \"./components/Chat/AssistantNode\";\nexport { default as SkillFlow } from \"./components/Chat/SkillFlow\";\nexport { default as SkillNode } from \"./components/Chat/SkillNode\";\nexport type { SkillFlowProps } from \"./components/Chat/SkillFlow\";\nexport type { SkillNodeData } from \"./components/Chat/SkillNode\";\nexport { default as WorkflowCanvas } from \"./components/Chat/WorkflowCanvas\";\nexport { default as WorkflowNode } from \"./components/Chat/WorkflowNode\";\nexport type { WorkflowCanvasProps } from \"./components/Chat/WorkflowCanvas\";\nexport type { WorkflowNodeData } from \"./components/Chat/WorkflowNode\";\nexport { WorkflowAutomationView } from \"./components/Chat/WorkflowAutomationView\";\nexport { default as CreateAssistantModal } from \"./components/Chat/CreateAssistantModal\";\nexport type { CreationMode, CreateAssistantModalProps } from \"./components/Chat/CreateAssistantModal\";\nexport { EvalPanel } from \"./components/Eval/EvalPanel\";\nexport { EvalSuiteCardList } from \"./components/Eval/EvalSuiteCardList\";\nexport { EvalSuiteDetail } from \"./components/Eval/EvalSuiteDetail\";\nexport { EvalRunResults } from \"./components/Eval/EvalRunResults\";\nexport { AgentGovernanceWorkbench } from \"./components/Governance/AgentGovernanceWorkbench\";\nexport { AgentList } from \"./components/Governance/AgentList\";\nexport { AgentDetailView } from \"./components/Governance/AgentDetailView\";\nexport { AgentEvalPanel } from \"./components/Governance/AgentEvalPanel\";\nexport { isTrainingRound, getRoundRepresentativeScore, toAttachmentItems } from \"./components/Governance/Learning/trainingUtils\";\nexport { AgentOverview } from \"./components/Governance/AgentOverview\";\nexport { AgentCardStats, type AgentCardStatsData } from \"./components/Governance/AgentCardStats\";\nexport { AgentConfigGraph } from \"./components/Governance/AgentConfigGraph\";\nexport { AgentGraphView } from \"./components/Governance/AgentGraphView\";\nexport { buildAgentConfigGraphData, type ConfigGraphNode, type ConfigNodeType } from \"./components/Governance/configGraph\";\nexport { buildAgentListItems, buildAgentGraphData } from \"./components/Governance/agentMeta\";\nexport { PersonalAssistantPage } from \"./components/Chat/PersonalAssistantPage\";\nexport { LatticeAgentWorkspace } from \"./components/Chat/LatticeAgentWorkspace\";\nexport { ProjectScopedChating } from \"./components/Chat/ProjectScopedChating\";\nexport type { ProjectScopedChatingProps } from \"./components/Chat/ProjectScopedChating\";\nexport { FilePanelToggle } from \"./components/Chat/FilePanelToggle\";\nexport { PersonalAssistantChannelModal } from \"./components/Chat/PersonalAssistantChannelModal\";\nexport { default as SkillCategoryPrompts } from \"./components/Chat/SkillCategoryPrompts\";\nexport type { SkillCategoryPromptsProps } from \"./components/Chat/SkillCategoryPrompts\";\nexport { VoiceInputButton } from \"./components/Chat/VoiceInputButton\";\nexport type { VoiceInputButtonProps } from \"./components/Chat/VoiceInputButton\";\nexport { useVoiceRecorder } from \"./hooks/useVoiceRecorder\";\nexport type { VoiceRecorderState, RecorderMode, RecorderStatus, RecorderError, UseVoiceRecorderOptions } from \"./hooks/useVoiceRecorder\";\n\n// EntityList components\nexport { ViewToggle } from \"./components/EntityList/ViewToggle\";\nexport { EntityCard } from \"./components/EntityList/EntityCard\";\nexport { EntityRow } from \"./components/EntityList/EntityRow\";\nexport { EntityCreateTrigger } from \"./components/EntityList/EntityCreateTrigger\";\nexport { EntityListShell } from \"./components/EntityList/EntityListShell\";\nexport { EntityListView } from \"./components/EntityList/EntityListView\";\nexport { FilterSelect } from \"./components/EntityList/FilterSelect\";\nexport type { FilterSelectProps } from \"./components/EntityList/FilterSelect\";\nexport type { EntityAction, ViewMode, ViewModeExtension } from \"./components/EntityList/types\";\n\n// Shared UI components\nexport { SegmentedToggle } from \"./components/shared/SegmentedToggle\";\nexport type {\n SegmentedToggleProps,\n SegmentOption,\n} from \"./components/shared/SegmentedToggle\";\n\n// A2A keys components\nexport { A2AKeyList } from \"./components/A2AKeys/A2AKeyList\";\nexport { KeyEditorDrawer } from \"./components/A2AKeys/KeyEditorDrawer\";\nexport type { KeyEditorDrawerProps } from \"./components/A2AKeys/KeyEditorDrawer\";\nexport { OpenGrantsPicker } from \"./components/A2AKeys/OpenGrantsPicker\";\nexport { OpenAuditLogList } from \"./components/A2AKeys/OpenAuditLogList\";\nexport { KeyExposureDetail } from \"./components/A2AKeys/KeyExposureDetail\";\nexport type { KeyExposureDetailProps } from \"./components/A2AKeys/KeyExposureDetail\";\nexport type { OpenAuditLogListProps } from \"./components/A2AKeys/OpenAuditLogList\";\nexport type { OpenGrantsPickerProps, OpenGrantsValue } from \"./components/A2AKeys/OpenGrantsPicker\";\n\n// A2A exposure components\n\n// Migration components\nexport { ConflictResolver } from \"./components/Migration/ConflictResolver\";\nexport { ExportStep } from \"./components/Migration/ExportStep\";\nexport { ImportStep } from \"./components/Migration/ImportStep\";\nexport { MigrationPage, MigrationPageWrapper } from \"./components/Migration/MigrationPage\";\n\n// Project Room collaboration UI\nexport { ProjectRoomPage } from \"./components/ProjectRoom/ProjectRoomPage\";\nexport { ProjectRoomShell } from \"./components/ProjectRoom/ProjectRoomShell\";\nexport type { ProjectRoomShellProps } from \"./components/ProjectRoom/ProjectRoomShell\";\nexport { ProjectRoomHeader } from \"./components/ProjectRoom/ProjectRoomHeader\";\nexport type { ProjectRoomHeaderProps } from \"./components/ProjectRoom/ProjectRoomHeader\";\nexport { ProjectRoomTimeline } from \"./components/ProjectRoom/ProjectRoomTimeline\";\nexport type { ProjectRoomTimelineProps } from \"./components/ProjectRoom/ProjectRoomTimeline\";\nexport { ProjectRoomComposer } from \"./components/ProjectRoom/ProjectRoomComposer\";\nexport type { ProjectRoomComposerProps, ProjectRoomComposerSendInput, ProjectRoomComposerReplyTarget } from \"./components/ProjectRoom/ProjectRoomComposer\";\nexport { ProjectRoomRoster } from \"./components/ProjectRoom/ProjectRoomRoster\";\nexport { deriveBotAvailability } from \"./components/ProjectRoom/ProjectRoomRoster\";\nexport type { ProjectRoomBotAvailability } from \"./components/ProjectRoom/ProjectRoomRoster\";\nexport { ProjectRoomTasksPanel } from \"./components/ProjectRoom/ProjectRoomTasksPanel\";\nexport { ProjectRoomFilesPanel } from \"./components/ProjectRoom/ProjectRoomFilesPanel\";\nexport { ProjectRoomProvider, useProjectRoom } from \"./integrations/project-room/ProjectRoomContext\";\nexport type {\n ProjectRoomContextValue,\n ProjectRoomProviderProps,\n ProjectRoomComposerSubmission,\n ProjectRoomMemberActions,\n ProjectRoomHumanCandidate,\n ProjectRoomBotActions,\n} from \"./integrations/project-room/ProjectRoomContext\";\nexport {\n createProjectRoomState,\n applyBootstrap,\n applyStreamFrame,\n applyResource,\n applySendResult,\n applyDispatch,\n applyOlderMessages,\n deriveProjectRoomCapabilities,\n} from \"./integrations/project-room/projectRoomState\";\nexport type {\n ProjectRoomState,\n ProjectRoomBootstrap,\n ProjectRoomConnectionStatus,\n ProjectRoomRefreshKey,\n ProjectRoomUiError,\n ProjectRoomCapabilities,\n ProjectRoomEventResult,\n ProjectRoomResourceValue,\n} from \"./integrations/project-room/projectRoomState\";\nexport { RoomEventsProvider, useRoomEvents, RoomEventsContext } from \"./integrations/room-events/RoomEventsContext\";\nexport type {\n RoomEventsConnectionStatus,\n RoomEventsContextValue,\n RoomEventsProviderProps,\n RoomEventsState,\n} from \"./integrations/room-events/RoomEventsContext\";\nexport { useRoomNotifications } from \"./integrations/room-events/useRoomNotifications\";\nexport type { RoomNotificationsState, RoomNotificationPermission } from \"./integrations/room-events/useRoomNotifications\";\nexport {\n authStorage,\n clearAuthItems,\n isStandalonePwa,\n readAuthItem,\n removeAuthItem,\n writeAuthItem,\n} from \"./utils/authStorage\";\nexport { formatErrorMessage, rootErrorMessage } from \"./utils/errorMessage\";\nexport { useWebPush } from \"./integrations/push/useWebPush\";\nexport type { UseWebPushOptions, WebPushState, WebPushPermission } from \"./integrations/push/useWebPush\";\n\n// Export theme\nexport * from \"./theme\";\n\n// Export streaming HTML renderer\nexport * from \"./streaming-html\";\n\n// CoSpace components\nexport * from \"./components/CoSpace\";\n\n// MCP Apps host renderer\nexport { McpAppRenderer } from \"./components/McpApp/McpAppRenderer\";\nexport type { McpAppRendererProps } from \"./components/McpApp/McpAppRenderer\";\nexport { McpAppFullscreen } from \"./components/McpApp/McpAppFullscreen\";\nexport { extractUiRef } from \"./components/McpApp/extractUiRef\";\n\n// i18n — locale provider, translator, and the key conventions behind them.\n//\n// `createT` / `interpolate` / `DEFAULT_LOCALE` / `DICTIONARIES` used to be\n// re-exported from `@axiom-lattice/i18n`; i18next owns interpolation and\n// dictionaries now, so those names are gone rather than shimmed. Nothing\n// outside this barrel consumed them.\nexport {\n useT,\n useLocale,\n LatticeLocaleProvider,\n SUPPORTED_LOCALES,\n NAMESPACES,\n namespaceOf,\n} from \"./i18n\";\n/**\n * The per-module TS dictionaries and `reactSdkEnUS` are no longer exported:\n * copy lives in `src/i18n/locales/<ns>/<lang>.json` and reaches consumers\n * through i18next. `reactSdkZhCN` in particular must never be re-exported —\n * a static re-export puts ~200 KB of Chinese into every barrel consumer's\n * startup graph, including the budgeted embed closure.\n */\nexport type {\n Dictionary,\n LatticeLocale,\n TFunction,\n TParams,\n} from \"./i18n\";\n","import {\n CodeOutlined,\n FileImageOutlined,\n FileSearchOutlined,\n SignatureOutlined,\n} from \"@ant-design/icons\";\nimport { Conversations } from \"@ant-design/x\";\nimport type { GetProp } from \"antd\";\nimport { theme } from \"antd\";\nimport React, { useMemo } from \"react\";\nimport {\n ConversationThread,\n useConversationContext,\n} from \"./ConversationContext\";\nimport { useAssistantContext } from \"./AssistantContext\";\n\n/**\n * Props for the {@link AgentConversations} component.\n */\nexport interface AgentConversationsProps {\n /**\n * Whether users can create new threads from the UI.\n * Defaults to true.\n */\n enableThreadCreation?: boolean;\n /**\n * Whether the thread list should be rendered.\n * Defaults to true.\n */\n enableThreadList?: boolean;\n}\n\n/**\n * Thread list sidebar component showing conversation history for the current agent.\n *\n * Uses Ant Design X `Conversations` component to display threads fetched from\n * {@link useConversationContext}. Supports creating new threads when\n * `enableThreadCreation` is true.\n *\n * @param enableThreadCreation - Whether the \"New Chat\" button is shown. Default: true.\n * @param enableThreadList - Whether the thread list is rendered at all. Default: true.\n * @returns The conversations list or `null` if thread list is disabled.\n *\n * @example\n * ```tsx\n * import { AgentConversations } from \"@axiom-lattice/react-sdk\";\n *\n * <AgentConversations\n * enableThreadCreation={false}\n * enableThreadList\n * />\n * ```\n *\n * @remarks\n * - Requires ancestor context providers: {@link ConversationContextProvider} and\n * {@link AssistantContextProvider}.\n * - Returns `null` when `enableThreadList` is false.\n */\nexport const AgentConversations: React.FC<AgentConversationsProps> = ({\n enableThreadCreation = true,\n enableThreadList = true,\n}) => {\n const { token } = theme.useToken();\n const { currentAssistant } = useAssistantContext();\n const {\n assistantId,\n thread,\n selectThread,\n createThread,\n listThreads,\n threads,\n } = useConversationContext();\n\n // Customize the style of the container\n const style = {\n width: \"100%\",\n background: \"transparent\",\n borderRadius: token.borderRadius,\n };\n\n const threadItems = useMemo(() => {\n return threads || [];\n }, [threads]);\n\n const items = threadItems.map((thread) => ({\n key: thread.id,\n label: thread.label,\n }));\n\n const newChatClick = async () => {\n if (!assistantId) {\n return;\n }\n await createThread();\n };\n\n if (!enableThreadList) {\n return null;\n }\n\n const creation = enableThreadCreation\n ? {\n onClick: newChatClick,\n }\n : undefined;\n\n return (\n <Conversations\n creation={creation as GetProp<typeof Conversations, \"creation\">}\n items={items}\n activeKey={thread?.id}\n style={style}\n groupable\n onActiveChange={(key) => {\n selectThread(key);\n }}\n />\n );\n};\n","import React, { useContext } from \"react\";\nimport { LatticeChat } from \"./LatticeChat\";\nimport { useConversationContext } from \"./ConversationContext\";\nimport { AxiomLatticeProvider } from \"@context\";\nimport { LatticeChatShellContext, useLatticeChatShellContext } from \"./LatticeChatShellContext\";\nimport { ChatSidebar } from \"./ChatSidebar\";\nimport { useAssistantContext } from \"./AssistantContext\";\nimport { LatticeShellHeader } from \"./LatticeShellHeader\";\nexport type LatticeChatViewProps = Record<string, never>;\n\nexport const LatticeChatView: React.FC<LatticeChatViewProps> = (props) => {\n const shellContext = useContext(LatticeChatShellContext);\n const { showSideMenu, sideMenuItems } = shellContext.config;\n const { assistantId, thread } = useConversationContext();\n const { currentAssistant } = useAssistantContext();\n const {\n config: { baseURL },\n } = useLatticeChatShellContext();\n\n return assistantId && thread ? (\n <AxiomLatticeProvider\n config={{\n baseURL,\n apiKey: \"\",\n assistantId,\n transport: \"sse\",\n }}\n >\n <LatticeChat\n thread_id={thread?.id}\n assistant_id={assistantId}\n name={currentAssistant?.name}\n description={currentAssistant?.description}\n menu={showSideMenu ? <ChatSidebar customMenuItems={sideMenuItems} /> : undefined}\n />\n </AxiomLatticeProvider>\n ) : null;\n};\n","import React, { useState, useEffect, useRef } from \"react\";\nimport {\n Modal,\n Input,\n Button,\n message,\n Typography,\n Select,\n Switch,\n Space,\n Tabs,\n} from \"antd\";\nimport {\n SaveOutlined,\n ApiOutlined,\n LinkOutlined,\n CheckCircleFilled,\n CloseCircleFilled,\n PlusOutlined,\n DeleteOutlined,\n RightOutlined,\n DownOutlined,\n CloudServerOutlined,\n} from \"@ant-design/icons\";\nimport { createStyles } from \"antd-style\";\nimport { useLatticeChatShellContext } from \"./LatticeChatShellContext\";\nimport { useT, type TranslationKey } from \"../../i18n\";\n\nconst { Text, Title } = Typography;\n\nconst useStyles = createStyles(({ token, css }) => ({\n // settingsModal: css`\n // .ant-modal {\n // max-width: 100vw !important;\n // width: 100vw !important;\n // margin: 0 !important;\n // top: 0 !important;\n // padding-bottom: 0 !important;\n // }\n\n // .ant-modal-content {\n // padding: 0;\n // height: 100vh;\n // max-height: 100vh;\n // border-radius: 0;\n // overflow: hidden;\n // width: 100%;\n // }\n\n // .ant-modal-body {\n // padding: 0;\n // height: 100%;\n // display: flex;\n // overflow: hidden;\n // width: 100%;\n // }\n // `,\n tabsContainer: css`\n height: 100vh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n .ant-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .ant-tabs-content-holder {\n flex: 1;\n overflow: hidden;\n }\n\n .ant-tabs-content {\n height: 100%;\n }\n\n .ant-tabs-tabpane {\n height: 100%;\n overflow: hidden;\n }\n\n .ant-tabs-nav {\n margin: 0;\n padding: 0 ${token.paddingLG}px;\n background: ${token.colorBgContainer};\n border-bottom: 1px solid ${token.colorBorder};\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n }\n\n .ant-tabs-tab {\n padding: ${token.paddingMD}px ${token.paddingLG}px;\n margin: ${token.paddingSM}px ${token.marginXS}px 0 0;\n border-radius: ${token.borderRadius}px ${token.borderRadius}px 0 0;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n\n &:hover {\n background: ${token.colorFillTertiary};\n }\n\n &.ant-tabs-tab-active {\n background: ${token.colorBgContainer};\n border-bottom-color: ${token.colorBgContainer};\n }\n }\n `,\n tabContent: css`\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: linear-gradient(\n 135deg,\n ${token.colorBgLayout} 0%,\n ${token.colorFillQuaternary} 100%\n );\n `,\n sidebar: css`\n width: 280px;\n background: linear-gradient(\n 180deg,\n ${token.colorBgContainer} 0%,\n ${token.colorFillQuaternary} 100%\n );\n border-right: 1px solid ${token.colorBorder};\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n flex-shrink: 0;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.04);\n\n /* Custom scrollbar */\n &::-webkit-scrollbar {\n width: 8px;\n }\n\n &::-webkit-scrollbar-track {\n background: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background: ${token.colorBorder};\n border-radius: 4px;\n transition: background 0.2s;\n\n &:hover {\n background: ${token.colorBorderSecondary};\n }\n }\n `,\n sidebarHeader: css`\n padding: ${token.paddingXL}px ${token.paddingLG}px;\n border-bottom: 1px solid ${token.colorBorder};\n background: linear-gradient(\n 135deg,\n ${token.colorPrimaryBg} 0%,\n ${token.colorBgContainer} 100%\n );\n position: sticky;\n top: 0;\n z-index: 10;\n backdrop-filter: blur(10px);\n `,\n sidebarTitle: css`\n font-size: ${token.fontSizeXL}px;\n font-weight: 700;\n background: linear-gradient(\n 135deg,\n ${token.colorPrimary} 0%,\n ${token.colorPrimaryHover} 100%\n );\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n margin: 0;\n letter-spacing: -0.5px;\n `,\n menuItem: css`\n padding: ${token.paddingMD}px ${token.paddingLG}px;\n margin: ${token.marginXS}px ${token.paddingSM}px;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: ${token.borderRadiusLG}px;\n display: flex;\n align-items: center;\n gap: ${token.marginMD}px;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: ${token.colorPrimary};\n transform: scaleY(0);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: 0 2px 2px 0;\n }\n\n &:hover {\n background: ${token.colorFillTertiary};\n transform: translateX(4px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n &.active {\n background: linear-gradient(\n 135deg,\n ${token.colorPrimaryBg} 0%,\n ${token.colorFillTertiary} 100%\n );\n color: ${token.colorPrimary};\n box-shadow: 0 4px 12px rgba(24, 144, 255, 0.15);\n transform: translateX(4px);\n\n &::before {\n transform: scaleY(1);\n }\n\n .menuItemIcon {\n transform: scale(1.1);\n }\n }\n `,\n menuItemIcon: css`\n font-size: 18px;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n `,\n menuItemText: css`\n font-size: ${token.fontSize}px;\n font-weight: 600;\n letter-spacing: 0.2px;\n `,\n content: css`\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n width: 100%;\n min-width: 0;\n `,\n contentHeader: css`\n padding: ${token.paddingLG}px ${token.paddingXL * 2}px;\n background: ${token.colorBgContainer};\n border-bottom: 1px solid ${token.colorBorder};\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n position: sticky;\n top: 0;\n z-index: 5;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: ${token.marginLG}px;\n `,\n contentHeaderLeft: css`\n flex: 1;\n `,\n contentHeaderRight: css`\n display: flex;\n gap: ${token.marginMD}px;\n flex-shrink: 0;\n `,\n contentTitle: css`\n font-size: ${token.fontSizeHeading3}px;\n font-weight: 700;\n color: ${token.colorTextHeading};\n margin: 0 0 ${token.marginSM}px 0;\n letter-spacing: -0.5px;\n `,\n contentDescription: css`\n color: ${token.colorTextSecondary};\n font-size: ${token.fontSize}px;\n margin: 0;\n line-height: 1.6;\n `,\n contentBody: css`\n flex: 1;\n overflow-y: auto;\n padding: ${token.paddingXL * 2}px ${token.paddingXL * 2}px;\n background: transparent;\n\n /* Custom scrollbar */\n &::-webkit-scrollbar {\n width: 8px;\n }\n\n &::-webkit-scrollbar-track {\n background: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background: ${token.colorBorder};\n border-radius: 4px;\n transition: background 0.2s;\n\n &:hover {\n background: ${token.colorBorderSecondary};\n }\n }\n `,\n formContainer: css`\n width: 100%;\n max-width: 100%;\n `,\n formLabel: css`\n font-weight: 600;\n color: ${token.colorTextHeading};\n margin-bottom: ${token.marginMD}px;\n display: block;\n font-size: ${token.fontSize}px;\n `,\n formDescription: css`\n color: ${token.colorTextSecondary};\n font-size: ${token.fontSizeSM}px;\n margin-top: ${token.marginSM}px;\n line-height: 1.6;\n `,\n card: css`\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorBorder};\n border-radius: ${token.borderRadiusLG}px;\n padding: ${token.paddingXL}px;\n margin-bottom: ${token.marginLG}px;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n\n &:hover {\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n transform: translateY(-2px);\n border-color: ${token.colorPrimary};\n }\n `,\n alertCard: css`\n border-radius: ${token.borderRadiusLG}px;\n margin-bottom: ${token.marginLG}px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n border: 1px solid ${token.colorBorder};\n `,\n textArea: css`\n border-radius: ${token.borderRadius}px;\n border: 1px solid ${token.colorBorder};\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n\n &:hover {\n border-color: ${token.colorPrimaryHover};\n }\n\n &:focus {\n border-color: ${token.colorPrimary};\n box-shadow: 0 0 0 2px ${token.colorPrimaryBg};\n }\n `,\n connectionStatus: css`\n display: flex;\n align-items: center;\n gap: ${token.marginXS}px;\n margin-left: ${token.marginSM}px;\n `,\n addServerModal: css`\n .ant-modal-body {\n padding: ${token.paddingXL}px;\n }\n `,\n}));\n\nexport interface SettingsModalProps {\n open: boolean;\n onClose: () => void;\n}\n\ntype SettingsMenuItem = {\n key: string;\n labelKey: TranslationKey;\n icon: React.ReactNode;\n};\n\nconst SETTINGS_MENU_ITEMS: SettingsMenuItem[] = [\n {\n key: \"models\",\n labelKey: \"chatConfig.settings.menu.models\",\n icon: <ApiOutlined />,\n },\n];\n\ninterface ServerConnection {\n id: string;\n name: string;\n url: string;\n apiKey?: string;\n connected?: boolean;\n connecting?: boolean;\n error?: string;\n}\n\ninterface ServerConfig {\n models: Array<{\n key: string;\n model: string;\n provider: string;\n streaming: boolean;\n /**\n * Only ever holds a key the user just typed. The API never returns stored\n * keys — `hasApiKey` reports whether one exists, and submitting an empty\n * field keeps whatever is stored.\n */\n apiKey: string;\n /** Server-side flag: a key is already configured for this model. */\n hasApiKey?: boolean;\n baseURL: string;\n maxTokens?: number;\n temperature?: number;\n timeout?: number;\n maxRetries?: number;\n }>;\n}\n\nexport const SettingsModal: React.FC<SettingsModalProps> = ({\n open,\n onClose,\n}) => {\n const { styles } = useStyles();\n const t = useT();\n const { config: shellConfig, updateConfigValue } =\n useLatticeChatShellContext();\n\n const [connections, setConnections] = useState<ServerConnection[]>(() => {\n // Load connections from localStorage\n if (typeof window !== \"undefined\") {\n try {\n const stored = localStorage.getItem(\"lattice_server_connections\");\n if (stored) {\n const parsed = JSON.parse(stored);\n return parsed;\n }\n } catch (error) {\n console.warn(\"Failed to load connections from localStorage:\", error);\n }\n }\n // Default connection from shell config\n if (shellConfig.baseURL) {\n return [\n {\n id: \"default\",\n name: t(\"chatConfig.settings.defaultConnectionName\"),\n url: shellConfig.baseURL,\n },\n ];\n }\n return [];\n });\n\n // Store config data for each server\n const [serverConfigs, setServerConfigs] = useState<\n Record<string, ServerConfig>\n >({});\n\n // Use ref to store latest connections for async functions\n const connectionsRef = useRef(connections);\n useEffect(() => {\n connectionsRef.current = connections;\n }, [connections]);\n\n const [activeTabKey, setActiveTabKey] = useState<string>(\n connections.length > 0 ? connections[0].id : \"\"\n );\n const [activeMenu, setActiveMenu] = useState<string>(\"models\");\n const [loading, setLoading] = useState(false);\n const [showAddServerModal, setShowAddServerModal] = useState(false);\n const [newServerUrl, setNewServerUrl] = useState<string>(\"\");\n const [newServerName, setNewServerName] = useState<string>(\"\");\n const [newServerApiKey, setNewServerApiKey] = useState<string>(\"\");\n const [addingServer, setAddingServer] = useState(false);\n\n // Save connections to localStorage\n const saveConnections = (newConnections: ServerConnection[]) => {\n setConnections(newConnections);\n if (typeof window !== \"undefined\") {\n try {\n localStorage.setItem(\n \"lattice_server_connections\",\n JSON.stringify(newConnections)\n );\n } catch (error) {\n console.warn(\"Failed to save connections to localStorage:\", error);\n }\n }\n };\n\n // Initialize config for a server\n const initializeServerConfig = (serverId: string) => {\n if (!serverConfigs[serverId]) {\n setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n models: [\n {\n key: \"\",\n model: \"\",\n provider: \"openai\",\n streaming: false,\n apiKey: \"\",\n baseURL: \"\",\n },\n ],\n },\n }));\n }\n };\n\n // Check connection status\n const checkConnection = async (serverId: string) => {\n const connection = connectionsRef.current.find((c) => c.id === serverId);\n if (!connection) return;\n\n const url = connection.url;\n if (!url) {\n updateConnectionStatus(serverId, { connected: false });\n return;\n }\n\n try {\n updateConnectionStatus(serverId, { connecting: true, error: \"\" });\n\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n // Prepare headers with API key if available\n const headers: HeadersInit = {};\n if (connection.apiKey) {\n headers[\"Authorization\"] = `Bearer ${connection.apiKey}`;\n }\n\n // Probe the public health endpoint to test connectivity\n const response = await fetch(`${url}/health`, {\n method: \"GET\",\n signal: controller.signal,\n headers,\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok) {\n // Disconnect all other servers\n setConnections((prev) =>\n prev.map((conn) =>\n conn.id === serverId\n ? { ...conn, connected: true, connecting: false, error: \"\" }\n : { ...conn, connected: false, connecting: false }\n )\n );\n // Update shell config with the connected URL\n if (url !== shellConfig.baseURL) {\n updateConfigValue(\"baseURL\", url);\n }\n } else {\n updateConnectionStatus(serverId, {\n connected: false,\n connecting: false,\n error: t(\"chatConfig.settings.error.serverError\"),\n });\n }\n } catch (error: any) {\n if (error.name === \"AbortError\") {\n updateConnectionStatus(serverId, {\n connected: false,\n connecting: false,\n error: t(\"chatConfig.settings.error.timeout\"),\n });\n } else {\n updateConnectionStatus(serverId, {\n connected: false,\n connecting: false,\n error: error.message || t(\"chatConfig.settings.error.connectFailed\"),\n });\n }\n }\n };\n\n // Update connection status\n const updateConnectionStatus = (\n serverId: string,\n updates: Partial<ServerConnection>\n ) => {\n setConnections((prev) =>\n prev.map((conn) =>\n conn.id === serverId ? { ...conn, ...updates } : conn\n )\n );\n };\n\n // Load models configuration\n const loadModelsConfig = async (serverId: string) => {\n const connection = connectionsRef.current.find((c) => c.id === serverId);\n if (!connection || !connection.connected) return;\n\n const url = connection.url;\n if (!url) return;\n\n try {\n // Prepare headers with API key if available\n const headers: HeadersInit = {};\n if (connection.apiKey) {\n headers[\"Authorization\"] = `Bearer ${connection.apiKey}`;\n }\n\n const response = await fetch(`${url}/api/models`, {\n headers,\n });\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.data && Array.isArray(data.data)) {\n if (data.data.length > 0) {\n // The current API reports whether a key is stored but never\n // returns it, so the field starts empty and an empty submit means\n // \"keep the stored key\". A gateway predating that contract still\n // returns the real key — keep it in the form instead of blanking\n // it, or the next save would overwrite the stored credential.\n const models = data.data.map(\n (model: Record<string, unknown>) => {\n const returnedKey =\n typeof model.apiKey === \"string\" ? model.apiKey : \"\";\n\n return {\n ...model,\n apiKey: returnedKey,\n hasApiKey: Boolean(model.hasApiKey ?? returnedKey !== \"\"),\n };\n }\n );\n\n setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n ...prev[serverId],\n models,\n },\n }));\n } else {\n setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n ...prev[serverId],\n models: [\n {\n key: \"\",\n model: \"\",\n provider: \"openai\",\n streaming: false,\n apiKey: \"\",\n baseURL: \"\",\n },\n ],\n },\n }));\n }\n }\n }\n } catch (error) {\n console.error(\"Failed to load models configuration:\", error);\n }\n };\n\n // Check connection when tab changes or modal opens\n useEffect(() => {\n if (open && activeTabKey) {\n initializeServerConfig(activeTabKey);\n const connection = connections.find((c) => c.id === activeTabKey);\n if (connection && !connection.connected && !connection.connecting) {\n checkConnection(activeTabKey);\n }\n }\n }, [open, activeTabKey]);\n\n // Load config when connection is established\n useEffect(() => {\n if (open && activeTabKey) {\n const connection = connections.find((c) => c.id === activeTabKey);\n if (connection?.connected) {\n loadModelsConfig(activeTabKey);\n }\n }\n }, [open, activeTabKey, activeMenu]);\n\n // Handle add new server\n const handleAddServer = async () => {\n if (!newServerUrl.trim()) {\n message.error(t(\"chatConfig.settings.pleaseEnterServerUrl\"));\n return;\n }\n\n // Normalize URL\n let normalizedUrl = newServerUrl.trim();\n if (\n !normalizedUrl.startsWith(\"http://\") &&\n !normalizedUrl.startsWith(\"https://\")\n ) {\n normalizedUrl = `http://${normalizedUrl}`;\n }\n\n const serverName =\n newServerName.trim() || normalizedUrl.replace(/^https?:\\/\\//, \"\");\n\n const newConnection: ServerConnection = {\n id: `conn_${Date.now()}`,\n name: serverName,\n url: normalizedUrl,\n apiKey: newServerApiKey.trim() || undefined,\n connected: false,\n };\n\n setAddingServer(true);\n const newConnections = [...connections, newConnection];\n saveConnections(newConnections);\n setActiveTabKey(newConnection.id);\n initializeServerConfig(newConnection.id);\n\n // Try to connect\n await checkConnection(newConnection.id);\n\n setAddingServer(false);\n setShowAddServerModal(false);\n setNewServerUrl(\"\");\n setNewServerName(\"\");\n setNewServerApiKey(\"\");\n message.success(t(\"chatConfig.settings.serverAdded\"));\n };\n\n // Handle delete server\n const handleDeleteServer = (serverId: string) => {\n const newConnections = connections.filter((c) => c.id !== serverId);\n saveConnections(newConnections);\n\n // Remove config data\n setServerConfigs((prev) => {\n const newConfigs = { ...prev };\n delete newConfigs[serverId];\n return newConfigs;\n });\n\n if (activeTabKey === serverId) {\n if (newConnections.length > 0) {\n setActiveTabKey(newConnections[0].id);\n } else {\n setActiveTabKey(\"\");\n }\n }\n\n message.success(t(\"chatConfig.settings.serverDeleted\"));\n };\n\n // Handle tab change - disconnect other servers\n const handleTabChange = (newTabKey: string) => {\n // Disconnect all other servers when switching tabs\n // Keep the current tab's connection status unchanged\n setConnections((prev) =>\n prev.map(\n (conn) =>\n conn.id === newTabKey\n ? conn // Keep current tab's status\n : { ...conn, connected: false, connecting: false } // Disconnect others\n )\n );\n setActiveTabKey(newTabKey);\n };\n\n // Handle save configuration\n const handleSave = async () => {\n const connection = connections.find((c) => c.id === activeTabKey);\n if (!connection || !connection.connected) {\n message.error(t(\"chatConfig.settings.connectFirst\"));\n return;\n }\n\n const url = connection.url;\n if (!url) {\n message.error(t(\"chatConfig.settings.connectFirst\"));\n return;\n }\n\n try {\n setLoading(true);\n const config = serverConfigs[activeTabKey];\n\n if (activeMenu === \"models\") {\n // Save models configuration\n const validModels = config.models\n .filter((m) => m.key && m.model && m.provider)\n .map((m) => {\n // The server does not send the key back (it answers with\n // `hasApiKey`), so an untouched field is EMPTY rather than\n // pre-filled. Omitting it tells the server to keep what it has;\n // sending the empty string would clear it.\n if (m.apiKey) return m;\n const { apiKey: _omitted, ...rest } = m;\n return rest;\n });\n\n // Prepare headers with API key if available\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n if (connection.apiKey) {\n headers[\"Authorization\"] = `Bearer ${connection.apiKey}`;\n }\n\n const response = await fetch(`${url}/api/models`, {\n method: \"PUT\",\n headers,\n body: JSON.stringify({ models: validModels }),\n });\n\n const data = await response.json();\n\n if (response.ok && data.success) {\n message.success(t(\"chatConfig.settings.modelSaved\"));\n onClose();\n } else {\n message.error(data.error || t(\"chatConfig.settings.modelSaveFailed\"));\n }\n }\n } catch (error: any) {\n console.error(\"Failed to save configuration:\", error);\n message.error(error.message || t(\"chatConfig.settings.saveFailed\"));\n } finally {\n setLoading(false);\n }\n };\n\n const renderModelSettings = (serverId: string) => {\n const config = serverConfigs[serverId] || {\n models: [\n {\n key: \"\",\n model: \"\",\n provider: \"openai\",\n streaming: false,\n apiKey: \"\",\n baseURL: \"\",\n },\n ],\n };\n\n const handleModelChange = (index: number, field: string, value: any) => {\n const newModels = [...config.models];\n newModels[index] = { ...newModels[index], [field]: value };\n setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n ...prev[serverId],\n models: newModels,\n },\n }));\n };\n\n const handleAddModel = () => {\n setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n ...prev[serverId],\n models: [\n ...config.models,\n {\n key: \"\",\n model: \"\",\n provider: \"openai\",\n streaming: false,\n apiKey: \"\",\n baseURL: \"\",\n },\n ],\n },\n }));\n };\n\n const handleRemoveModel = (index: number) => {\n if (config.models.length > 1) {\n setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n ...prev[serverId],\n models: config.models.filter((_, i) => i !== index),\n },\n }));\n }\n };\n\n return (\n <div className={styles.formContainer}>\n <div style={{ marginBottom: 32 }}>\n <Text type=\"secondary\" style={{ fontSize: 14, lineHeight: 1.6 }}>\n {t(\"chatConfig.settings.modelsHint\")}\n </Text>\n </div>\n\n {config.models.map((model, index) => (\n <div key={index} className={styles.card}>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: 24,\n paddingBottom: 20,\n borderBottom: \"1px solid rgba(0, 0, 0, 0.06)\",\n }}\n >\n <div>\n <Text strong style={{ fontSize: 16 }}>\n {t(\"chatConfig.settings.model\", { index: index + 1 })}\n </Text>\n {model.key && (\n <Text\n type=\"secondary\"\n style={{ marginLeft: 8, fontSize: 12 }}\n >\n ({model.key})\n </Text>\n )}\n </div>\n {config.models.length > 1 && (\n <Button\n type=\"text\"\n danger\n size=\"small\"\n onClick={() => handleRemoveModel(index)}\n style={{\n borderRadius: 6,\n transition: \"all 0.2s\",\n }}\n >\n {t(\"chatConfig.settings.remove\")}\n </Button>\n )}\n </div>\n\n <Space direction=\"vertical\" style={{ width: \"100%\" }} size=\"large\">\n <div>\n <Text className={styles.formLabel}>{t(\"chatConfig.settings.field.key\")}</Text>\n <Input\n placeholder=\"e.g., default, gpt-4, claude\"\n value={model.key}\n onChange={(e) =>\n handleModelChange(index, \"key\", e.target.value)\n }\n style={{ height: 40 }}\n />\n <Text className={styles.formDescription}>\n {t(\"chatConfig.settings.field.keyHint\")}\n </Text>\n </div>\n\n <div>\n <Text className={styles.formLabel}>{t(\"chatConfig.settings.field.provider\")}</Text>\n <Select\n style={{ width: \"100%\", height: 40 }}\n value={model.provider}\n onChange={(value) =>\n handleModelChange(index, \"provider\", value)\n }\n options={[\n { label: \"OpenAI\", value: \"openai\" },\n { label: \"Azure\", value: \"azure\" },\n { label: \"DeepSeek\", value: \"deepseek\" },\n { label: \"SiliconCloud\", value: \"siliconcloud\" },\n { label: \"VolcEngine\", value: \"volcengine\" },\n ]}\n />\n </div>\n\n <div>\n <Text className={styles.formLabel}>{t(\"chatConfig.settings.field.modelName\")}</Text>\n <Input\n placeholder=\"e.g., gpt-4, claude-3-opus, kimi-k2-250905\"\n value={model.model}\n onChange={(e) =>\n handleModelChange(index, \"model\", e.target.value)\n }\n style={{ height: 40 }}\n />\n </div>\n\n <div>\n <Text className={styles.formLabel}>{t(\"chatConfig.field.apiKey\")}</Text>\n <Input.Password\n placeholder={\n model.hasApiKey\n ? t(\"chatConfig.settings.apiKeyPlaceholderConfigured\")\n : t(\"chatConfig.settings.apiKeyPlaceholderNew\")\n }\n value={model.apiKey}\n onChange={(e) =>\n handleModelChange(index, \"apiKey\", e.target.value)\n }\n style={{ height: 40 }}\n />\n <Text className={styles.formDescription}>\n {model.hasApiKey\n ? t(\"chatConfig.settings.field.apiKeyHintStored\")\n : t(\"chatConfig.settings.field.apiKeyHintNew\")}\n </Text>\n </div>\n\n <div>\n <Text className={styles.formLabel}>{t(\"chatConfig.settings.field.baseUrl\")}</Text>\n <Input\n placeholder=\"e.g., https://api.openai.com/v1\"\n value={model.baseURL}\n onChange={(e) =>\n handleModelChange(index, \"baseURL\", e.target.value)\n }\n style={{ height: 40 }}\n />\n <Text className={styles.formDescription}>\n {t(\"chatConfig.settings.field.baseUrlHint\")}\n </Text>\n </div>\n\n <div>\n <Space>\n <Switch\n checked={model.streaming}\n onChange={(checked) =>\n handleModelChange(index, \"streaming\", checked)\n }\n />\n <Text>{t(\"chatConfig.settings.field.streaming\")}</Text>\n </Space>\n </div>\n\n <div style={{ display: \"flex\", gap: 20 }}>\n <div style={{ flex: 1 }}>\n <Text className={styles.formLabel}>{t(\"chatConfig.settings.field.maxTokens\")}</Text>\n <Input\n type=\"number\"\n placeholder=\"e.g., 4096\"\n value={model.maxTokens}\n onChange={(e) =>\n handleModelChange(\n index,\n \"maxTokens\",\n e.target.value ? Number(e.target.value) : undefined\n )\n }\n style={{ height: 40 }}\n />\n </div>\n <div style={{ flex: 1 }}>\n <Text className={styles.formLabel}>{t(\"chatConfig.settings.field.temperature\")}</Text>\n <Input\n type=\"number\"\n step=\"0.1\"\n placeholder=\"e.g., 0.7\"\n value={model.temperature}\n onChange={(e) =>\n handleModelChange(\n index,\n \"temperature\",\n e.target.value ? Number(e.target.value) : undefined\n )\n }\n style={{ height: 40 }}\n />\n </div>\n </div>\n </Space>\n </div>\n ))}\n\n <Button\n type=\"dashed\"\n onClick={handleAddModel}\n block\n size=\"large\"\n style={{ marginTop: 24, height: 48 }}\n >\n {t(\"chatConfig.settings.addModel\")}\n </Button>\n </div>\n );\n };\n\n\n const renderContent = (serverId: string) => {\n switch (activeMenu) {\n case \"models\":\n return renderModelSettings(serverId);\n default:\n return null;\n }\n };\n\n const activeMenuItem = SETTINGS_MENU_ITEMS.find(\n (item) => item.key === activeMenu\n );\n\n const currentConnection = connections.find((c) => c.id === activeTabKey);\n\n // Render tab label with connection status\n const renderTabLabel = (connection: ServerConnection) => {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\" }}>\n <CloudServerOutlined\n style={{\n marginRight: 8,\n color: connection.connected\n ? \"#52c41a\"\n : connection.connecting\n ? \"#1890ff\"\n : \"#d9d9d9\",\n }}\n />\n <span>{connection.name}</span>\n {connection.connected && (\n <CheckCircleFilled\n style={{ color: \"#52c41a\", fontSize: 12, marginLeft: 8 }}\n />\n )}\n {connection.error && !connection.connecting && (\n <CloseCircleFilled\n style={{ color: \"#ff4d4f\", fontSize: 12, marginLeft: 8 }}\n />\n )}\n </div>\n );\n };\n\n const tabItems = connections.map((connection) => ({\n key: connection.id,\n label: renderTabLabel(connection),\n children: (\n <div className={styles.tabContent}>\n {connection.connected ? (\n <>\n <div style={{ display: \"flex\", height: \"100%\" }}>\n {/* Sidebar */}\n <div className={styles.sidebar}>\n {/* <div className={styles.sidebarHeader}>\n <Title level={4} className={styles.sidebarTitle}>\n Settings\n </Title>\n </div> */}\n {SETTINGS_MENU_ITEMS.map((item) => (\n <div\n key={item.key}\n className={`${styles.menuItem} ${\n activeMenu === item.key ? \"active\" : \"\"\n }`}\n onClick={() => setActiveMenu(item.key)}\n >\n <span className={styles.menuItemIcon}>{item.icon}</span>\n <span className={styles.menuItemText}>{t(item.labelKey)}</span>\n </div>\n ))}\n </div>\n\n {/* Content */}\n <div className={styles.content}>\n <div className={styles.contentHeader}>\n <div className={styles.contentHeaderLeft}>\n <Title level={3} className={styles.contentTitle}>\n {activeMenuItem ? t(activeMenuItem.labelKey) : undefined}\n </Title>\n <Text className={styles.contentDescription}>\n {activeMenu === \"models\" &&\n t(\"chatConfig.settings.menu.models.desc\")}\n </Text>\n </div>\n <div className={styles.contentHeaderRight}>\n <Button onClick={onClose}>{t(\"common.cancel\")}</Button>\n <Button\n type=\"primary\"\n icon={<SaveOutlined />}\n onClick={handleSave}\n loading={loading}\n >\n {t(\"chatConfig.settings.saveConfiguration\")}\n </Button>\n </div>\n </div>\n\n <div className={styles.contentBody}>\n {renderContent(connection.id)}\n </div>\n </div>\n </div>\n </>\n ) : (\n <div\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexDirection: \"column\",\n gap: 16,\n padding: 48,\n }}\n >\n {connection.connecting ? (\n <>\n <LinkOutlined style={{ fontSize: 64, color: \"#1890ff\" }} spin />\n <Title level={4}>{t(\"chatConfig.settings.connecting\")}</Title>\n <Text type=\"secondary\" style={{ textAlign: \"center\" }}>\n {t(\"chatConfig.settings.connectingTo\", { url: connection.url })}\n </Text>\n </>\n ) : (\n <>\n <LinkOutlined style={{ fontSize: 64, color: \"#d9d9d9\" }} />\n <Title level={4} type=\"secondary\">\n {connection.error || t(\"chatConfig.settings.notConnected\")}\n </Title>\n <Text\n type=\"secondary\"\n style={{ textAlign: \"center\", maxWidth: 400 }}\n >\n {connection.error\n ? t(\"chatConfig.settings.connectFailedDetail\", { url: connection.url })\n : t(\"chatConfig.settings.clickReconnect\", { url: connection.url })}\n </Text>\n <Button\n type=\"primary\"\n icon={<LinkOutlined />}\n onClick={() => checkConnection(connection.id)}\n loading={connection.connecting}\n style={{ marginTop: 16 }}\n >\n {t(\"chatConfig.settings.reconnect\")}\n </Button>\n </>\n )}\n </div>\n )}\n </div>\n ),\n closable: connections.length > 1,\n }));\n\n return (\n <>\n <Modal\n open={open}\n onCancel={onClose}\n height={\"70%\"}\n width={\"80%\"}\n footer={null}\n title={t(\"chatConfig.settings.title\")}\n // destroyOnClose\n >\n <div>\n <Tabs\n activeKey={activeTabKey}\n onChange={handleTabChange}\n type=\"editable-card\"\n onEdit={(targetKey, action) => {\n if (action === \"add\") {\n setShowAddServerModal(true);\n } else if (action === \"remove\") {\n handleDeleteServer(targetKey as string);\n }\n }}\n items={tabItems}\n addIcon={\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"4px 8px\",\n }}\n >\n <PlusOutlined />\n <span>{t(\"chatConfig.settings.addServer\")}</span>\n </div>\n }\n />\n </div>\n </Modal>\n\n {/* Add Server Modal */}\n <Modal\n title={t(\"chatConfig.settings.addNewServer\")}\n open={showAddServerModal}\n onOk={handleAddServer}\n onCancel={() => {\n setShowAddServerModal(false);\n setNewServerUrl(\"\");\n setNewServerName(\"\");\n setNewServerApiKey(\"\");\n }}\n confirmLoading={addingServer}\n className={styles.addServerModal}\n >\n <Space direction=\"vertical\" style={{ width: \"100%\" }} size=\"large\">\n <div>\n <Text strong style={{ display: \"block\", marginBottom: 8 }}>\n {t(\"chatConfig.settings.serverName\")}\n </Text>\n <Input\n placeholder={t(\"chatConfig.settings.serverNamePlaceholder\")}\n value={newServerName}\n onChange={(e) => setNewServerName(e.target.value)}\n onPressEnter={handleAddServer}\n />\n <Text type=\"secondary\" style={{ fontSize: 12, marginTop: 4 }}>\n {t(\"chatConfig.settings.serverNameHint\")}\n </Text>\n </div>\n <div>\n <Text strong style={{ display: \"block\", marginBottom: 8 }}>\n {t(\"chatConfig.settings.serverUrl\")}\n </Text>\n <Input\n placeholder=\"e.g., http://localhost:4001\"\n value={newServerUrl}\n onChange={(e) => setNewServerUrl(e.target.value)}\n onPressEnter={handleAddServer}\n />\n <Text type=\"secondary\" style={{ fontSize: 12, marginTop: 4 }}>\n {t(\"chatConfig.settings.serverUrlHint\")}\n </Text>\n </div>\n <div>\n <Text strong style={{ display: \"block\", marginBottom: 8 }}>\n {t(\"chatConfig.settings.apiKey\")}\n </Text>\n <Input.Password\n placeholder={t(\"chatConfig.settings.apiKeyPlaceholder\")}\n value={newServerApiKey}\n onChange={(e) => setNewServerApiKey(e.target.value)}\n onPressEnter={handleAddServer}\n />\n <Text type=\"secondary\" style={{ fontSize: 12, marginTop: 4 }}>\n {t(\"chatConfig.settings.apiKeyHint\")}\n </Text>\n </div>\n </Space>\n </Modal>\n </>\n );\n};\n","import { SettingsModal } from \"./SettingsModal\";\nimport { useLatticeChatShellContext } from \"./LatticeChatShellContext\";\nexport const AgentServerSetting = () => {\n const { settingsModalOpen, setSettingsModalOpen } =\n useLatticeChatShellContext();\n return (\n <SettingsModal\n open={settingsModalOpen}\n onClose={() => setSettingsModalOpen(false)}\n />\n );\n};\n","import React from \"react\";\nimport { ConversationContextProvider } from \"./ConversationContext\";\nimport { LatticeChatView } from \"./LatticeChatView\";\nimport {\n LatticeChatShellContextProvider,\n LatticeChatShellContextProviderProps,\n useLatticeChatShellContext,\n} from \"./LatticeChatShellContext\";\nimport { AssistantContextProvider } from \"./AssistantContext\";\nimport { AgentServerSetting } from \"./AgentServerSetting\";\nimport { WorkspaceContextProvider, useWorkspaceContext } from \"../../context/WorkspaceContext\";\nimport { useAuth } from \"../../context/AuthContext\";\nimport { ChatErrorBoundary } from \"./ChatErrorBoundary\";\nimport { WorkspaceResourceUIContext } from \"./WorkspaceResourceManager\";\nimport { useT } from \"../../i18n\";\n\n/**\n * Props for the {@link LatticeChatShell} component.\n *\n * Extends {@link LatticeChatShellContextProviderProps} (minus `children`) with\n * feature toggles that control chat UI surface capabilities.\n */\nexport type LatticeChatShellProps = Omit<\n LatticeChatShellContextProviderProps,\n \"children\"\n> & {\n /**\n * Whether users can create new assistants (default: true)\n */\n enableAssistantCreation?: boolean;\n /**\n * Whether users can edit existing assistants (default: true)\n */\n enableAssistantEditing?: boolean;\n /**\n * Whether to enable workspace and project management (default: false)\n */\n enableWorkspace?: boolean;\n /**\n * Whether to enable the model selector in the chat sender (default: false)\n */\n enableModelSelector?: boolean;\n};\n\nconst ChatContent: React.FC<{ initialAssistantId?: string }> = ({ initialAssistantId }) => (\n <AssistantContextProvider autoLoad={true} initialAssistantId={initialAssistantId}>\n <ConversationContextProvider>\n <LatticeChatView />\n </ConversationContextProvider>\n </AssistantContextProvider>\n);\n\n/**\n * WorkspaceAwareContent — mounts the workspace browser shell, which swaps to\n * the project-scoped chat surface only when a project is selected and no\n * workspace content app (Projects browser or Project Room) is open. The gate\n * lives inside the workspace Chat UI provider so the Project Room side app can\n * boot from the selected project without being unmounted.\n */\nconst WorkspaceAwareContent: React.FC<{ initialAssistantId?: string }> = ({ initialAssistantId }) => {\n const { workspaceId } = useWorkspaceContext();\n\n return (\n <WorkspaceResourceUIContext\n workspaceId={workspaceId || \"\"}\n renderChatContent={() => <ChatContent initialAssistantId={initialAssistantId} />}\n />\n );\n};\n\nconst ShellContent: React.FC<{ initialAssistantId?: string; enableWorkspace: boolean }> = ({\n initialAssistantId,\n enableWorkspace\n}) => {\n const { currentTenant } = useAuth();\n\n return (\n <>\n {enableWorkspace ? (\n <WorkspaceContextProvider>\n <WorkspaceAwareContent initialAssistantId={initialAssistantId} />\n </WorkspaceContextProvider>\n ) : (\n <ChatContent initialAssistantId={initialAssistantId} />\n )}\n <AgentServerSetting />\n </>\n );\n};\n\n/**\n * Lattice Chat Shell — the top-level provider component for the full chat interface.\n *\n * Sets up the required context hierarchy:\n * - {@link LatticeChatShellContextProvider} — config layer (baseURL, feature toggles)\n * - Optionally {@link WorkspaceContextProvider} when `enableWorkspace` is true\n * - {@link AssistantContextProvider} — assistant loading\n * - {@link ConversationContextProvider} — thread management\n * - {@link AgentServerSetting} — server configuration modal\n *\n * Children render {@link LatticeChatView} which contains the chat sidebar and\n * the {@link LatticeChat} thread interface.\n *\n * @param props - See {@link LatticeChatShellProps}.\n * @returns A React provider tree wrapping the chat UI.\n *\n * @example\n * ```tsx\n * import { LatticeChatShell } from \"@axiom-lattice/react-sdk\";\n *\n * <LatticeChatShell\n * initialConfig={{ baseURL: \"https://api.example.com\", assistantId: \"asst_1\" }}\n * enableAssistantCreation={false}\n * enableWorkspace\n * enableModelSelector\n * />\n * ```\n *\n * @remarks\n * - `enableWorkspace` in props takes priority over `initialConfig.enableWorkspace`.\n * - This component should wrap all chat-related components in the application.\n */\nexport const LatticeChatShell: React.FC<LatticeChatShellProps> = (props) => {\n const t = useT();\n const { enableAssistantCreation, enableAssistantEditing, enableWorkspace: enableWorkspaceProp, ...restProps } = props;\n\n console.log(\n \"[LatticeChatShell] props.initialConfig?.assistantId:\", props.initialConfig?.assistantId,\n \"restProps.initialConfig?.assistantId:\", restProps.initialConfig?.assistantId,\n \"restProps keys:\", Object.keys(restProps),\n );\n\n // enableWorkspaceProp takes priority over restProps.initialConfig.enableWorkspace\n const enableWorkspace = enableWorkspaceProp ?? restProps.initialConfig?.enableWorkspace ?? false;\n\n return (\n <LatticeChatShellContextProvider\n initialConfig={{\n enableAssistantCreation,\n enableAssistantEditing,\n enableWorkspace,\n ...restProps.initialConfig,\n }}\n >\n <ChatErrorBoundary name={t(\"chat.error.boundary.chatShell\")} t={t}>\n <ShellContent\n initialAssistantId={restProps.initialConfig?.assistantId}\n enableWorkspace={enableWorkspace}\n />\n </ChatErrorBoundary>\n </LatticeChatShellContextProvider>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport {\n Button,\n Card,\n Form,\n Input,\n Modal,\n Popconfirm,\n Spin,\n Tag,\n Typography,\n message,\n} from \"antd\";\nimport { Edit2, Plus, RadioTower, Trash2 } from \"lucide-react\";\nimport type {\n ChannelInstallation,\n CreateChannelInstallationRequest,\n LarkChannelInstallationConfig,\n UpdateChannelInstallationRequest,\n} from \"@axiom-lattice/protocols\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { useT } from \"../../i18n\";\n\nconst { Text, Title } = Typography;\n\ninterface ChannelInstallationResponse {\n success: boolean;\n message?: string;\n data?: ChannelInstallation;\n}\n\ninterface ChannelInstallationListResponse {\n success: boolean;\n message?: string;\n data?: {\n records: ChannelInstallation[];\n };\n}\n\ntype FormValues = {\n name?: string;\n appId: string;\n appSecret: string;\n verificationToken?: string;\n encryptKey?: string;\n};\n\nexport const ChannelInstallationsDrawerContent: React.FC = () => {\n const { get, post, put, del } = useApi();\n const t = useT();\n const [installations, setInstallations] = useState<ChannelInstallation[]>([]);\n const [loading, setLoading] = useState(false);\n const [formModalOpen, setFormModalOpen] = useState(false);\n const [editingInstallation, setEditingInstallation] =\n useState<ChannelInstallation | null>(null);\n\n const loadInstallations = async () => {\n setLoading(true);\n\n try {\n const result = await get<ChannelInstallationListResponse>(\n \"/api/channel-installations\"\n );\n\n if (result.success) {\n setInstallations(result.data?.records ?? []);\n } else {\n setInstallations([]);\n message.error(result.message || t(\"chatConfig.channelInstall.loadFailed\"));\n }\n } catch (error) {\n console.error(\"Failed to load channel installations:\", error);\n setInstallations([]);\n message.error(t(\"chatConfig.channelInstall.loadFailed\"));\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n loadInstallations();\n }, []);\n\n const handleDelete = async (installation: ChannelInstallation) => {\n try {\n const result = await del<{ success: boolean; message?: string }>(\n `/api/channel-installations/${installation.id}`\n );\n\n if (result.success) {\n setInstallations((current) =>\n current.filter((item) => item.id !== installation.id)\n );\n message.success(t(\"chatConfig.channelInstall.deleted\"));\n } else {\n message.error(result.message || t(\"chatConfig.channelInstall.deleteFailed\"));\n }\n } catch (error) {\n console.error(\"Failed to delete channel installation:\", error);\n message.error(t(\"chatConfig.channelInstall.deleteFailed\"));\n }\n };\n\n return (\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\" }}>\n <div style={{ padding: 16 }}>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <Title level={5} style={{ margin: 0 }}>\n {t(\"chatConfig.channelInstall.title\")}\n </Title>\n <Button\n type=\"primary\"\n icon={<Plus size={16} />}\n onClick={() => {\n setEditingInstallation(null);\n setFormModalOpen(true);\n }}\n >\n {t(\"chatConfig.channelInstall.add\")}\n </Button>\n </div>\n </div>\n\n <div style={{ flex: 1, overflowY: \"auto\", padding: 16 }}>\n {loading ? (\n <div style={{ display: \"flex\", justifyContent: \"center\", padding: 32 }}>\n <Spin />\n </div>\n ) : installations.length === 0 ? (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"48px 16px\",\n }}\n >\n <RadioTower size={48} style={{ marginBottom: 16, opacity: 0.5 }} />\n <Text strong style={{ fontSize: 15 }}>\n {t(\"chatConfig.channelInstall.empty.title\")}\n </Text>\n <Text type=\"secondary\" style={{ marginTop: 8 }}>\n {t(\"chatConfig.channelInstall.empty.description\")}\n </Text>\n </div>\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n {installations.map((installation) => {\n const webhookPath =\n installation.channel === \"lark\"\n ? `/api/channels/lark/installations/${installation.id}/events`\n : null;\n\n return (\n <Card key={installation.id} size=\"small\">\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n marginBottom: 10,\n }}\n >\n <Text strong style={{ fontSize: 15 }}>\n {installation.name || installation.id}\n </Text>\n <Tag color=\"blue\">{installation.channel}</Tag>\n </div>\n\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n marginBottom: 12,\n }}\n >\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n ID: {installation.id}\n </Text>\n {webhookPath ? (\n <Text code style={{ fontSize: 12 }}>\n {webhookPath}\n </Text>\n ) : (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {t(\"chatConfig.channelInstall.unsupported\")}\n </Text>\n )}\n </div>\n\n <div style={{ display: \"flex\", gap: 8 }}>\n <Button\n icon={<Edit2 size={14} />}\n onClick={() => {\n setEditingInstallation(installation);\n setFormModalOpen(true);\n }}\n >\n {t(\"common.edit\")}\n </Button>\n <Popconfirm\n title={t(\"chatConfig.channelInstall.delete.title\")}\n description={t(\"chatConfig.channelInstall.delete.description\", { name: installation.name || installation.id })}\n onConfirm={() => handleDelete(installation)}\n okText={t(\"common.delete\")}\n okType=\"danger\"\n cancelText={t(\"common.cancel\")}\n >\n <Button danger icon={<Trash2 size={14} />}>\n {t(\"common.delete\")}\n </Button>\n </Popconfirm>\n </div>\n </Card>\n );\n })}\n </div>\n )}\n </div>\n\n {formModalOpen ? (\n <LarkChannelInstallationFormModal\n installation={editingInstallation}\n open={formModalOpen}\n post={post}\n put={put}\n onCancel={() => {\n setFormModalOpen(false);\n setEditingInstallation(null);\n }}\n onSave={() => {\n setFormModalOpen(false);\n setEditingInstallation(null);\n loadInstallations();\n }}\n />\n ) : null}\n </div>\n );\n};\n\ninterface LarkChannelInstallationFormModalProps {\n installation: ChannelInstallation | null;\n open: boolean;\n post: <T>(path: string, body: unknown) => Promise<T>;\n put: <T>(path: string, body: unknown) => Promise<T>;\n onCancel: () => void;\n onSave: () => void;\n}\n\nconst LarkChannelInstallationFormModal: React.FC<\n LarkChannelInstallationFormModalProps\n> = ({ installation, open, post, put, onCancel, onSave }) => {\n const [form] = Form.useForm<FormValues>();\n const t = useT();\n\n useEffect(() => {\n if (installation) {\n const config = installation.config as LarkChannelInstallationConfig;\n form.setFieldsValue({\n name: installation.name,\n appId: config.appId,\n appSecret: config.appSecret,\n verificationToken: config.verificationToken,\n encryptKey: config.encryptKey,\n });\n return;\n }\n\n form.resetFields();\n }, [installation, form]);\n\n const handleSubmit = async () => {\n const values = await form.validateFields();\n\n const config: LarkChannelInstallationConfig = {\n appId: values.appId,\n appSecret: values.appSecret,\n verificationToken: values.verificationToken,\n encryptKey: values.encryptKey,\n };\n\n try {\n if (installation) {\n const payload: UpdateChannelInstallationRequest = {\n name: values.name,\n config: config as unknown as Record<string, unknown>,\n };\n\n const result = await put<ChannelInstallationResponse>(\n `/api/channel-installations/${installation.id}`,\n payload\n );\n\n if (result.success) {\n message.success(t(\"chatConfig.channelInstall.updated\"));\n onSave();\n } else {\n message.error(result.message || t(\"chatConfig.channelInstall.updateFailed\"));\n }\n\n return;\n }\n\n const payload: CreateChannelInstallationRequest = {\n channel: \"lark\",\n name: values.name,\n config,\n };\n\n const result = await post<ChannelInstallationResponse>(\n \"/api/channel-installations\",\n payload\n );\n\n if (result.success) {\n message.success(t(\"chatConfig.channelInstall.created\"));\n onSave();\n } else {\n message.error(result.message || t(\"chatConfig.channelInstall.createFailed\"));\n }\n } catch (error) {\n console.error(\"Failed to save channel installation:\", error);\n message.error(\n installation ? t(\"chatConfig.channelInstall.updateFailed\") : t(\"chatConfig.channelInstall.createFailed\")\n );\n }\n };\n\n return (\n <Modal\n open={open}\n title={installation ? t(\"chatConfig.channelInstall.editTitle\") : t(\"chatConfig.channelInstall.addTitle\")}\n onCancel={onCancel}\n onOk={handleSubmit}\n okText={installation ? t(\"common.save\") : t(\"common.create\")}\n destroyOnHidden\n >\n <Form<FormValues> form={form} layout=\"vertical\">\n <Form.Item label={t(\"chatConfig.channelInstall.field.channel\")}>\n <Input value=\"lark\" disabled />\n </Form.Item>\n <Form.Item name=\"name\" label={t(\"chatConfig.channelInstall.field.name\")}>\n <Input />\n </Form.Item>\n <Form.Item\n name=\"appId\"\n label={t(\"chatConfig.channelInstall.field.appId\")}\n rules={[{ required: true, message: t(\"chatConfig.channelInstall.validation.appIdRequired\") }]}\n >\n <Input />\n </Form.Item>\n <Form.Item\n name=\"appSecret\"\n label={t(\"chatConfig.channelInstall.field.appSecret\")}\n rules={[{ required: true, message: t(\"chatConfig.channelInstall.validation.appSecretRequired\") }]}\n >\n <Input />\n </Form.Item>\n <Form.Item name=\"verificationToken\" label={t(\"chatConfig.channelInstall.field.verificationToken\")}>\n <Input />\n </Form.Item>\n <Form.Item name=\"encryptKey\" label={t(\"chatConfig.channelInstall.field.encryptKey\")}>\n <Input />\n </Form.Item>\n </Form>\n </Modal>\n );\n};\n","import React, { useMemo, useEffect, useState, useCallback, useRef } from \"react\";\nimport {\n ReactFlow,\n Background,\n Controls,\n Node,\n Edge,\n useNodesState,\n useEdgesState,\n ReactFlowProvider,\n NodeTypes,\n useReactFlow,\n type OnSelectionChangeFunc,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { createStyles } from \"antd-style\";\nimport AssistantNode from \"./AssistantNode\";\nimport AgentConfigPanel from \"./AgentConfigPanel\";\nimport CreateAssistantModal from \"./CreateAssistantModal\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { useT } from \"../../i18n\";\nimport { useLatticeChatShellContext } from \"./LatticeChatShellContext\";\nimport type { Assistant } from \"@axiom-lattice/client-sdk\";\nimport type { LocalA2AProviderState } from \"@axiom-lattice/client-sdk\";\nimport { useClient } from \"../../context\";\nimport { Button, message, theme } from \"antd\";\nimport { PlusOutlined } from \"@ant-design/icons\";\nimport { useAssistantContext } from \"./AssistantContext\";\n\n/**\n * Props for AssistantFlow component\n */\nexport interface AssistantFlowProps {\n /**\n * Callback when chat button is clicked\n */\n onChat?: (assistant: Assistant) => void;\n}\n\nconst useStyles = createStyles(({ token, css }) => ({\n root: css`\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: row;\n overflow: hidden;\n background: #fafafa;\n `,\n canvasRow: css`\n flex: 1;\n min-height: 0;\n display: flex;\n align-items: stretch;\n `,\n canvasWrap: css`\n flex: 1;\n min-width: 0;\n min-height: 0;\n background: #fafafa;\n position: relative;\n `,\n loadingState: css`\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${token.colorTextSecondary};\n font-size: 14px;\n `,\n}));\n\n/**\n * Internal component that handles the flow logic\n */\nconst AssistantFlowInner: React.FC<AssistantFlowProps> = ({ onChat }) => {\n const t = useT();\n const { styles } = useStyles();\n const { setCenter } = useReactFlow();\n const [nodes, setNodes, onNodesChange] = useNodesState<Node>([]);\n const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([]);\n const [assistants, setAssistants] = useState<Assistant[]>([]);\n const [assistantsLoading, setAssistantsLoading] = useState(false);\n const [localStates, setLocalStates] = useState<LocalA2AProviderState[]>([]);\n const [activeRuntimeId, setActiveRuntimeId] = useState<string | null>(null);\n const [configPanelVisible, setConfigPanelVisible] = useState(false);\n const [selectedAssistant, setSelectedAssistant] = useState<Assistant | null>(null);\n const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);\n const { get, del, put } = useApi();\n const client = useClient(\"__GLOBAL__\");\n const { config } = useLatticeChatShellContext();\n const { refresh: refreshAssistants } = useAssistantContext();\n const { token } = theme.useToken();\n const { enableAssistantCreation = true, enableAssistantEditing = true } = config;\n\n const localStatesByAssistantId = useMemo(() => {\n const map = new Map<string, LocalA2AProviderState>();\n localStates.forEach((state) => {\n map.set(state.runtimeId, state);\n });\n return map;\n }, [localStates]);\n\n const displayAssistants = useMemo(() => {\n return assistants;\n }, [assistants]);\n\n const nodeTypes = useMemo(\n () =>\n ({\n assistant: AssistantNode as any,\n }) as NodeTypes,\n []\n );\n\n /**\n * Handle configure button click - show configuration panel\n */\n const handleConfigure = useCallback((assistant: Assistant) => {\n setSelectedAssistant(assistant);\n setConfigPanelVisible(true);\n }, []);\n\n /**\n * Handle close configuration panel\n */\n const handleClosePanel = useCallback(() => {\n setConfigPanelVisible(false);\n setSelectedAssistant(null);\n }, []);\n\n /**\n * Handle node selection change - open config panel when a node is selected\n */\n const handleSelectionChange: OnSelectionChangeFunc = useCallback(\n ({ nodes: selectedNodes }) => {\n if (selectedNodes.length === 1) {\n const nodeData = selectedNodes[0].data as {\n assistant?: Assistant;\n localA2A?: LocalA2AProviderState;\n };\n if (nodeData?.assistant && enableAssistantEditing) {\n setSelectedAssistant(nodeData.assistant);\n setConfigPanelVisible(true);\n return;\n }\n }\n if (selectedNodes.length === 0) {\n setConfigPanelVisible(false);\n setSelectedAssistant(null);\n }\n },\n [enableAssistantEditing]\n );\n\n /**\n * Fetch assistants from API\n */\n const fetchAssistants = useCallback(async () => {\n setAssistantsLoading(true);\n try {\n const data = await get<{ success: boolean; data: { records: Assistant[] } }>(\"/api/assistants\");\n if (data.success && data.data && Array.isArray(data.data.records)) {\n setAssistants(data.data.records);\n }\n } catch (error) {\n console.error(\"Failed to fetch assistants:\", error);\n setAssistants([]);\n } finally {\n setAssistantsLoading(false);\n }\n }, [get]);\n\n const refreshLocalA2A = useCallback(async () => {\n try {\n const records = await client.assistants.localA2A.list();\n setLocalStates(records);\n } catch (error) {\n console.error(\"Failed to fetch local A2A states:\", error);\n setLocalStates([]);\n }\n }, [client]);\n\n const runLocalA2AAction = useCallback(\n async (\n runtimeId: string,\n action: \"start\" | \"stop\" | \"restart\"\n ) => {\n const currentState = localStates.find((s) => s.runtimeId === runtimeId);\n\n if (action === \"start\" && currentState) {\n if (currentState.status === \"missing\") {\n message.warning(t(\"chatWorkspace.assistantFlow.cliNotInstalled\", { label: currentState.label }));\n return;\n }\n if (currentState.status === \"disabled\") {\n message.warning(t(\"chatWorkspace.assistantFlow.disabled\", { label: currentState.label }));\n return;\n }\n }\n\n setActiveRuntimeId(runtimeId);\n try {\n if (action === \"start\") {\n await client.assistants.localA2A.start(runtimeId);\n } else if (action === \"stop\") {\n await client.assistants.localA2A.stop(runtimeId);\n } else {\n await client.assistants.localA2A.restart(runtimeId);\n }\n await refreshLocalA2A();\n await refreshAssistants();\n } catch (error) {\n message.error(error instanceof Error ? error.message : t(\"chatWorkspace.assistantFlow.localProviderFailed\"));\n } finally {\n setActiveRuntimeId(null);\n }\n },\n [client, localStates, refreshLocalA2A, refreshAssistants, t]\n );\n\n // Fetch assistants on mount\n useEffect(() => {\n fetchAssistants();\n }, [fetchAssistants]);\n\n useEffect(() => {\n void refreshLocalA2A();\n }, [refreshLocalA2A]);\n\n useEffect(() => {\n const syncAssistants = async () => {\n if (localStates.some((state) => state.status === \"running\")) {\n await refreshAssistants();\n }\n };\n void syncAssistants();\n }, [localStates, refreshAssistants]);\n\n useEffect(() => {\n if (!displayAssistants || displayAssistants.length === 0) {\n setNodes([]);\n setEdges([]);\n return;\n }\n\n const initialNodes: Node[] = [];\n const initialEdges: Edge[] = [];\n\n // Configuration for layout\n const nodeWidth = 280;\n const nodeHeight = 200;\n const horizontalSpacing = 320;\n const verticalSpacing = 300;\n const nodesPerRow = Math.ceil(Math.sqrt(displayAssistants.length));\n\n // Try to extract relationships from graphDefinition\n // Check if graphDefinition contains node/edge information\n const assistantMap = new Map<string, Assistant>();\n const relationships: Array<{ source: string; target: string }> = [];\n\n displayAssistants.forEach((assistant) => {\n assistantMap.set(assistant.id, assistant);\n });\n\n // Extract relationships from graphDefinition\n displayAssistants.forEach((assistant) => {\n if (assistant.graphDefinition) {\n try {\n const graphDef =\n typeof assistant.graphDefinition === \"string\"\n ? JSON.parse(assistant.graphDefinition)\n : assistant.graphDefinition;\n\n // Check for subAgents (for DeepAgentConfig)\n // subAgents is an array of agent keys (strings)\n if (graphDef.subAgents && Array.isArray(graphDef.subAgents)) {\n graphDef.subAgents.forEach((subAgentKey: string) => {\n // Find the assistant with this key/id\n const subAssistant = displayAssistants.find(\n (a) => a.id === subAgentKey || a.id === String(subAgentKey)\n );\n if (subAssistant && subAssistant.id !== assistant.id) {\n relationships.push({\n source: assistant.id,\n target: subAssistant.id,\n });\n }\n });\n }\n\n // Check for internalSubAgents (for DeepAgentConfig)\n if (\n graphDef.internalSubAgents &&\n Array.isArray(graphDef.internalSubAgents)\n ) {\n graphDef.internalSubAgents.forEach((internalSubAgent: any) => {\n // internalSubAgents have a key property\n if (internalSubAgent.key) {\n const subAssistant = displayAssistants.find(\n (a) =>\n a.id === internalSubAgent.key ||\n a.id === String(internalSubAgent.key)\n );\n if (subAssistant && subAssistant.id !== assistant.id) {\n relationships.push({\n source: assistant.id,\n target: subAssistant.id,\n });\n }\n }\n });\n }\n\n // Check for common graph structure patterns\n if (graphDef.nodes && Array.isArray(graphDef.nodes)) {\n graphDef.nodes.forEach((node: any) => {\n // If node references another assistant ID\n if (node.assistantId && node.assistantId !== assistant.id) {\n const targetAssistant = displayAssistants.find(\n (a) =>\n a.id === node.assistantId ||\n a.id === String(node.assistantId)\n );\n if (targetAssistant) {\n relationships.push({\n source: assistant.id,\n target: targetAssistant.id,\n });\n }\n }\n });\n }\n\n // Check for edges array\n if (graphDef.edges && Array.isArray(graphDef.edges)) {\n graphDef.edges.forEach((edge: any) => {\n if (edge.source && edge.target) {\n const sourceId =\n typeof edge.source === \"string\"\n ? edge.source\n : edge.source.id || edge.source.assistantId;\n const targetId =\n typeof edge.target === \"string\"\n ? edge.target\n : edge.target.id || edge.target.assistantId;\n\n const sourceAssistant = displayAssistants.find(\n (a) => a.id === sourceId || a.id === String(sourceId)\n );\n const targetAssistant = displayAssistants.find(\n (a) => a.id === targetId || a.id === String(targetId)\n );\n\n if (sourceAssistant && targetAssistant) {\n relationships.push({\n source: sourceAssistant.id,\n target: targetAssistant.id,\n });\n }\n }\n });\n }\n } catch (error) {\n // If parsing fails, ignore and continue\n console.warn(\n `Failed to parse graphDefinition for assistant ${assistant.id}:`,\n error\n );\n }\n }\n });\n\n // Determine layout strategy\n const hasRelationships = relationships.length > 0;\n\n if (hasRelationships) {\n // Use hierarchical layout based on relationships\n const processedIds = new Set<string>();\n const levelMap = new Map<string, number>();\n const childrenMap = new Map<string, string[]>();\n\n // Build relationship graph\n relationships.forEach((rel) => {\n if (!childrenMap.has(rel.source)) {\n childrenMap.set(rel.source, []);\n }\n childrenMap.get(rel.source)!.push(rel.target);\n });\n\n // Calculate levels (BFS)\n const queue: Array<{ id: string; level: number }> = [];\n const rootNodes = displayAssistants.filter(\n (a) => !relationships.some((r) => r.target === a.id)\n );\n\n if (rootNodes.length === 0 && displayAssistants.length > 0) {\n // If no clear roots, use first assistant\n queue.push({ id: displayAssistants[0].id, level: 0 });\n } else {\n rootNodes.forEach((root) => {\n queue.push({ id: root.id, level: 0 });\n });\n }\n\n while (queue.length > 0) {\n const { id, level } = queue.shift()!;\n if (processedIds.has(id)) continue;\n processedIds.add(id);\n levelMap.set(id, level);\n\n const children = childrenMap.get(id) || [];\n children.forEach((childId) => {\n if (!processedIds.has(childId)) {\n queue.push({ id: childId, level: level + 1 });\n }\n });\n }\n\n // Assign levels to all assistants\n displayAssistants.forEach((assistant) => {\n if (!levelMap.has(assistant.id)) {\n levelMap.set(assistant.id, 0);\n }\n });\n\n // Group by level and calculate positions\n const levelGroups = new Map<number, Assistant[]>();\n displayAssistants.forEach((assistant) => {\n const level = levelMap.get(assistant.id) || 0;\n if (!levelGroups.has(level)) {\n levelGroups.set(level, []);\n }\n levelGroups.get(level)!.push(assistant);\n });\n\n // Calculate positions\n levelGroups.forEach((group, level) => {\n const y = level * verticalSpacing;\n const groupWidth = (group.length - 1) * horizontalSpacing;\n const startX = -groupWidth / 2;\n\n group.forEach((assistant, index) => {\n const x = startX + index * horizontalSpacing;\n const localA2A = localStatesByAssistantId.get(assistant.id);\n\n initialNodes.push({\n id: assistant.id,\n type: \"assistant\",\n data: {\n assistant,\n localA2A,\n isLocalA2ABusy: activeRuntimeId === localA2A?.runtimeId,\n onConfigure: localA2A\n ? undefined\n : enableAssistantEditing\n ? () => handleConfigure(assistant)\n : undefined,\n onChat,\n onLocalA2AAction: localA2A ? runLocalA2AAction : undefined,\n },\n position: { x, y },\n });\n });\n });\n\n // Add edges\n relationships.forEach((rel) => {\n if (assistantMap.has(rel.source) && assistantMap.has(rel.target)) {\n initialEdges.push({\n id: `e${rel.source}-${rel.target}`,\n source: rel.source,\n target: rel.target,\n animated: true,\n style: { stroke: \"#1677ff\" },\n type: \"smoothstep\",\n });\n }\n });\n } else {\n // Use grid layout when no relationships are found\n displayAssistants.forEach((assistant, index) => {\n const row = Math.floor(index / nodesPerRow);\n const col = index % nodesPerRow;\n const x = col * horizontalSpacing - ((nodesPerRow - 1) * horizontalSpacing) / 2;\n const y = row * verticalSpacing;\n const localA2A = localStatesByAssistantId.get(assistant.id);\n\n initialNodes.push({\n id: assistant.id,\n type: \"assistant\",\n data: {\n assistant,\n localA2A,\n isLocalA2ABusy: activeRuntimeId === localA2A?.runtimeId,\n onConfigure: localA2A\n ? undefined\n : enableAssistantEditing\n ? () => handleConfigure(assistant)\n : undefined,\n onChat,\n onLocalA2AAction: localA2A ? runLocalA2AAction : undefined,\n },\n position: { x, y },\n });\n });\n }\n\n setNodes(initialNodes);\n setEdges(initialEdges);\n }, [\n displayAssistants,\n localStatesByAssistantId,\n activeRuntimeId,\n runLocalA2AAction,\n enableAssistantEditing,\n handleConfigure,\n onChat,\n setNodes,\n setEdges,\n ]);\n\n /**\n * Handle save agent configuration\n */\n const handleSaveConfig = async (assistant: Assistant, agentConfig: any) => {\n try {\n // Get current graph definition and merge with new config\n const currentGraphDef =\n typeof assistant.graphDefinition === \"string\"\n ? JSON.parse(assistant.graphDefinition || \"{}\")\n : assistant.graphDefinition || {};\n\n const updatedGraphDef = {\n ...currentGraphDef,\n ...agentConfig,\n };\n\n const data = await put<{ success: boolean; message?: string }>(\n `/api/assistants/${assistant.id}`,\n {\n name: agentConfig.name ?? assistant.name,\n description: agentConfig.description ?? assistant.description,\n graphDefinition: updatedGraphDef,\n }\n );\n\n if (data.success) {\n // Update local state\n setAssistants((prev) =>\n prev.map((a) =>\n a.id === assistant.id\n ? {\n ...a,\n name: agentConfig.name ?? assistant.name,\n description: agentConfig.description ?? assistant.description,\n graphDefinition: updatedGraphDef,\n }\n : a\n )\n );\n message.success(data.message || t(\"chatWorkspace.assistantFlow.saveSuccess\"));\n } else {\n message.error(data.message || t(\"chatWorkspace.assistantFlow.saveFailed\"));\n throw new Error(data.message || t(\"chatWorkspace.assistantFlow.saveFailed\"));\n }\n } catch (error) {\n console.error(\"Failed to save agent configuration:\", error);\n message.error(error instanceof Error ? error.message : t(\"chatWorkspace.assistantFlow.saveFailed\"));\n throw error;\n }\n };\n\n /**\n * Handle delete assistant\n */\n const handleDeleteAssistant = async (assistant: Assistant) => {\n try {\n const data = await del<{ success: boolean; message?: string }>(`/api/assistants/${assistant.id}`);\n\n if (data.success) {\n setAssistants((prev) => prev.filter((a) => a.id !== assistant.id));\n if (selectedAssistant?.id === assistant.id) {\n setSelectedAssistant(null);\n setConfigPanelVisible(false);\n }\n message.success(t(\"chatWorkspace.assistantFlow.deleted\"));\n } else {\n message.error(data.message || t(\"chatWorkspace.assistantFlow.deleteFailed\"));\n throw new Error(data.message || t(\"chatWorkspace.assistantFlow.deleteFailed\"));\n }\n } catch (error) {\n console.error(\"Failed to delete assistant:\", error);\n message.error(error instanceof Error ? error.message : t(\"chatWorkspace.assistantFlow.deleteFailed\"));\n throw error;\n }\n };\n\n /**\n * Handle successful assistant creation\n */\n const handleAssistantCreated = useCallback(async (createdAssistant: Assistant) => {\n setAssistants((prev) => {\n const exists = prev.some((a) => a.id === createdAssistant.id);\n if (exists) {\n return prev.map((a) => (a.id === createdAssistant.id ? createdAssistant : a));\n }\n return [...prev, createdAssistant];\n });\n\n const graphDef = createdAssistant.graphDefinition;\n const isA2A = typeof graphDef === \"object\" && graphDef !== null && (graphDef as Record<string, unknown>).type === \"a2a_remote\";\n if (isA2A) {\n await refreshLocalA2A();\n }\n\n lastCreatedAssistantRef.current = createdAssistant;\n }, [refreshLocalA2A]);\n\n useEffect(() => {\n if (selectedAssistant) {\n const node = nodes.find((n) => n.id === selectedAssistant.id);\n if (node) {\n setCenter(node.position.x + 140, node.position.y + 100, { zoom: 1, duration: 800 });\n }\n }\n }, [selectedAssistant, nodes, setCenter]);\n\n useEffect(() => {\n if (assistants.length > 0 && selectedAssistant) {\n const assistant = assistants.find((a) => a.id === selectedAssistant.id);\n if (assistant && !configPanelVisible) {\n setConfigPanelVisible(true);\n }\n }\n }, [assistants, selectedAssistant, configPanelVisible]);\n\n const lastCreatedAssistantRef = useRef<Assistant | null>(null);\n useEffect(() => {\n if (lastCreatedAssistantRef.current && !assistants.find(a => a.id === lastCreatedAssistantRef.current?.id)) {\n lastCreatedAssistantRef.current = null;\n }\n if (lastCreatedAssistantRef.current) {\n const node = nodes.find((n) => n.id === lastCreatedAssistantRef.current!.id);\n if (node) {\n setCenter(node.position.x + 140, node.position.y + 100, { zoom: 1, duration: 800 });\n setSelectedAssistant(lastCreatedAssistantRef.current);\n setConfigPanelVisible(true);\n lastCreatedAssistantRef.current = null;\n }\n }\n }, [nodes, setCenter]);\n\n if (assistantsLoading) {\n return (\n <div\n className={styles.root}\n >\n <div className={styles.loadingState}>{t(\"chatWorkspace.assistantFlow.loading\")}</div>\n </div>\n );\n }\n\n return (\n <div className={styles.root}>\n <div className={styles.canvasRow}>\n <div className={styles.canvasWrap}>\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onSelectionChange={handleSelectionChange}\n nodeTypes={nodeTypes}\n fitView\n >\n <Background color=\"#eee\" gap={20} />\n <Controls />\n </ReactFlow>\n\n {enableAssistantCreation && (\n <div\n style={{\n position: \"absolute\",\n top: 20,\n right: 20,\n zIndex: 10,\n }}\n >\n <Button\n type=\"primary\"\n size=\"large\"\n icon={<PlusOutlined />}\n onClick={() => setIsCreateModalOpen(true)}\n style={{\n height: 48,\n width: 48,\n borderRadius: \"50%\",\n boxShadow: token.boxShadowTertiary,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0,\n }}\n />\n </div>\n )}\n </div>\n\n <AgentConfigPanel\n visible={configPanelVisible}\n assistant={selectedAssistant}\n allAssistants={assistants}\n onClose={handleClosePanel}\n onSave={handleSaveConfig}\n onDelete={handleDeleteAssistant}\n />\n </div>\n\n {/* Create assistant modal */}\n <CreateAssistantModal\n open={isCreateModalOpen}\n onCancel={() => setIsCreateModalOpen(false)}\n onSuccess={handleAssistantCreated}\n />\n </div>\n );\n};\n\n/**\n * AssistantFlow component - Canvas for visualizing assistants with side panel\n * Wraps the inner component with ReactFlowProvider\n */\nconst AssistantFlow: React.FC<AssistantFlowProps> = (props) => (\n <ReactFlowProvider>\n <AssistantFlowInner {...props} />\n </ReactFlowProvider>\n);\n\nexport default AssistantFlow;\n","import React, { useMemo } from \"react\";\nimport { Handle, Position, NodeProps, Node } from \"@xyflow/react\";\nimport { Avatar, Typography, theme, Tag, Tooltip, Space, Button } from \"antd\";\nimport {\n UserOutlined,\n ToolOutlined,\n SettingOutlined,\n IdcardOutlined,\n InfoCircleOutlined,\n BranchesOutlined,\n CodeOutlined,\n MessageOutlined,\n} from \"@ant-design/icons\";\nimport type { Assistant, LocalA2AProviderState } from \"@axiom-lattice/client-sdk\";\nimport { Play, Square, RotateCcw } from \"lucide-react\";\nimport { useT } from \"../../i18n\";\n\nconst { Text } = Typography;\n\n/**\n * Props for AssistantNode component\n */\nexport interface AssistantNodeData extends Record<string, unknown> {\n /**\n * Assistant data\n */\n assistant: Assistant;\n /**\n * Click handler for configure button\n */\n onConfigure?: (assistant: Assistant) => void;\n /**\n * Click handler for chat button\n */\n onChat?: (assistant: Assistant) => void;\n /**\n * Local A2A provider state if this assistant is a local wrapper.\n */\n localA2A?: LocalA2AProviderState;\n /**\n * Local A2A action handler.\n */\n onLocalA2AAction?: (\n runtimeId: string,\n action: \"start\" | \"stop\" | \"restart\"\n ) => void | Promise<void>;\n}\n\nconst LOCAL_STATUS_DOTS: Record<LocalA2AProviderState[\"status\"], string> = {\n missing: \"#8c8c8c\",\n disabled: \"#8c8c8c\",\n starting: \"#1677ff\",\n running: \"#52c41a\",\n stopped: \"#faad14\",\n failed: \"#ff4d4f\",\n};\n\n/**\n * Generate a color based on assistant ID for consistent badge colors\n */\nconst getBadgeColor = (id: string): string => {\n const colors = [\n \"#1890ff\", // Blue\n \"#52c41a\", // Green\n \"#faad14\", // Orange\n \"#f5222d\", // Red\n \"#722ed1\", // Purple\n \"#13c2c2\", // Cyan\n \"#eb2f96\", // Magenta\n \"#fa8c16\", // Orange Red\n ];\n let hash = 0;\n for (let i = 0; i < id.length; i++) {\n hash = id.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n};\n\n/**\n * Custom node component for displaying assistants in the flow\n * Designed to look like a digital ID badge\n */\nconst AssistantNode: React.FC<NodeProps<Node<AssistantNodeData>>> = ({\n data,\n selected,\n}) => {\n const t = useT();\n const { token } = theme.useToken();\n\n if (!data) {\n return null;\n }\n\n const { assistant, onConfigure, onChat, localA2A, onLocalA2AAction } = data;\n\n if (!assistant) {\n return null;\n }\n\n const badgeColor = getBadgeColor(assistant.id);\n const localStatus = localA2A?.status;\n const statusDotColor = localStatus\n ? LOCAL_STATUS_DOTS[localStatus]\n : \"#52c41a\";\n const initials = assistant.name\n ?.split(\" \")\n .map((n) => n.charAt(0))\n .join(\"\")\n .toUpperCase()\n .slice(0, 2) || \"A\";\n\n // Extract model, tools, type, prompt, and subAgents from graphDefinition\n const { modelKey, tools, agentType, prompt, subAgents } = useMemo(() => {\n if (!assistant.graphDefinition) {\n return {\n modelKey: undefined,\n tools: [],\n agentType: undefined,\n prompt: undefined,\n subAgents: [],\n };\n }\n\n try {\n const graphDef =\n typeof assistant.graphDefinition === \"string\"\n ? JSON.parse(assistant.graphDefinition)\n : assistant.graphDefinition;\n\n return {\n modelKey: graphDef.modelKey || graphDef.model,\n tools: graphDef.tools || [],\n agentType: graphDef.type,\n prompt: graphDef.prompt,\n subAgents: graphDef.subAgents || [],\n };\n } catch (error) {\n return {\n modelKey: undefined,\n tools: [],\n agentType: undefined,\n prompt: undefined,\n subAgents: [],\n };\n }\n }, [assistant.graphDefinition]);\n\n // Format agent type for display\n const getAgentTypeLabel = (type: string | undefined): string => {\n if (!type) return \"\";\n const typeMap: Record<string, string> = {\n react: t(\"chatWorkspace.assistantNode.type.react\"),\n deep_agent: t(\"chatWorkspace.assistantNode.type.deepAgent\"),\n processing: t(\"chatWorkspace.assistantNode.type.processing\"),\n plan_execute: t(\"chatWorkspace.assistantNode.type.planExecute\"),\n sequential: t(\"chatWorkspace.assistantNode.type.sequential\"),\n a2a_remote: t(\"chatWorkspace.assistantNode.type.a2aRemote\"),\n };\n return typeMap[type] || type.toUpperCase();\n };\n\n // Detail card content for hover tooltip\n const detailTooltipContent = (\n <div\n style={{\n maxWidth: 400,\n maxHeight: \"60vh\",\n overflowY: \"auto\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n justifyContent: \"space-between\",\n marginBottom: 12,\n }}\n >\n <div style={{ flex: 1 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 8,\n }}\n >\n <Text\n strong\n style={{\n fontSize: 16,\n fontWeight: 600,\n color: token.colorText,\n }}\n >\n {assistant.name}\n </Text>\n {agentType && (\n <Tag\n color=\"purple\"\n style={{\n margin: 0,\n fontSize: 10,\n padding: \"2px 8px\",\n fontWeight: 600,\n }}\n >\n {getAgentTypeLabel(agentType)}\n </Tag>\n )}\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n <Text\n style={{\n fontSize: 11,\n color: token.colorTextTertiary,\n fontFamily: \"monospace\",\n }}\n >\n {`>_ ${assistant.id}`}\n </Text>\n </div>\n </div>\n </div>\n\n {/* Description */}\n {assistant.description && (\n <div style={{ marginBottom: 12 }}>\n <Text\n style={{\n fontSize: 12,\n color: token.colorText,\n lineHeight: 1.6,\n fontStyle: \"italic\",\n }}\n >\n \"{assistant.description}\"\n </Text>\n </div>\n )}\n\n {/* Model Engine */}\n {modelKey && (\n <div style={{ marginBottom: 12 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 8,\n }}\n >\n <SettingOutlined\n style={{\n fontSize: 14,\n color: token.colorTextSecondary,\n }}\n />\n <Text\n style={{\n fontSize: 12,\n color: token.colorTextSecondary,\n fontWeight: 500,\n }}\n >\n {t(\"chatWorkspace.assistantNode.modelEngine\")}\n </Text>\n </div>\n <Tag\n color=\"blue\"\n style={{\n fontSize: 11,\n padding: \"4px 12px\",\n }}\n >\n {modelKey}\n </Tag>\n </div>\n )}\n\n {/* System Prompt */}\n {prompt && (\n <div style={{ marginBottom: 12 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 8,\n justifyContent: \"space-between\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n <CodeOutlined\n style={{\n fontSize: 14,\n color: token.colorTextSecondary,\n }}\n />\n <Text\n style={{\n fontSize: 12,\n color: token.colorTextSecondary,\n fontWeight: 600,\n letterSpacing: 0.5,\n }}\n >\n {t(\"chatWorkspace.assistantNode.systemPrompt\")}\n </Text>\n </div>\n </div>\n <div\n style={{\n padding: 12,\n background: token.colorFillTertiary,\n border: `1px solid ${token.colorBorderSecondary}`,\n borderRadius: 4,\n maxHeight: 150,\n overflowY: \"auto\",\n }}\n >\n <Text\n style={{\n fontSize: 11,\n color: token.colorText,\n lineHeight: 1.6,\n whiteSpace: \"pre-wrap\",\n }}\n >\n {prompt.length > 300 ? prompt.slice(0, 300) + \"...\" : prompt}\n </Text>\n </div>\n </div>\n )}\n\n {/* Available Tools */}\n {tools && tools.length > 0 && (\n <div style={{ marginBottom: 12 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 8,\n }}\n >\n <ToolOutlined\n style={{\n fontSize: 14,\n color: token.colorTextSecondary,\n }}\n />\n <Text\n style={{\n fontSize: 12,\n color: token.colorTextSecondary,\n fontWeight: 500,\n }}\n >\n {t(\"chatWorkspace.assistantNode.availableTools\", { count: tools.length })}\n </Text>\n </div>\n <Space size={[8, 8]} wrap>\n {tools.slice(0, 5).map((tool: string, index: number) => (\n <Tag\n key={index}\n color=\"blue\"\n style={{\n fontSize: 11,\n padding: \"4px 12px\",\n }}\n >\n {tool.replace(/_/g, \" \")}\n </Tag>\n ))}\n {tools.length > 5 && (\n <Tag\n style={{\n fontSize: 11,\n padding: \"4px 12px\",\n backgroundColor: token.colorFillTertiary,\n color: token.colorTextSecondary,\n }}\n >\n {t(\"chatWorkspace.assistantNode.more\", { count: tools.length - 5 })}\n </Tag>\n )}\n </Space>\n </div>\n )}\n\n {/* Sub-Agent Architecture */}\n {subAgents && subAgents.length > 0 && (\n <div style={{ marginBottom: 8 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 8,\n }}\n >\n <BranchesOutlined\n style={{\n fontSize: 14,\n color: token.colorTextSecondary,\n }}\n />\n <Text\n style={{\n fontSize: 12,\n color: token.colorTextSecondary,\n fontWeight: 500,\n }}\n >\n {t(\"chatWorkspace.assistantNode.subAgentArchitecture\", { count: subAgents.length })}\n </Text>\n </div>\n <Space size={[8, 8]} wrap>\n {subAgents.slice(0, 3).map((subAgent: string, index: number) => (\n <Tag\n key={index}\n style={{\n fontSize: 11,\n padding: \"4px 12px\",\n backgroundColor: token.colorFillTertiary,\n color: token.colorText,\n border: `1px solid ${token.colorBorderSecondary}`,\n }}\n >\n {`> ${subAgent}`}\n </Tag>\n ))}\n {subAgents.length > 3 && (\n <Tag\n style={{\n fontSize: 11,\n padding: \"4px 12px\",\n backgroundColor: token.colorFillTertiary,\n color: token.colorTextSecondary,\n }}\n >\n {t(\"chatWorkspace.assistantNode.more\", { count: subAgents.length - 3 })}\n </Tag>\n )}\n </Space>\n </div>\n )}\n </div>\n );\n\n return (\n <div\n style={{\n padding: 4,\n }}\n >\n {/* Top connection point */}\n <Handle type=\"target\" position={Position.Top} />\n\n {/* Main card */}\n <div\n style={{\n width: 260,\n minHeight: 180,\n background: token.colorBgContainer,\n borderRadius: 8,\n boxShadow: `0 1px 4px rgba(0, 0, 0, 0.08)`,\n overflow: \"hidden\",\n transition: \"all 0.2s ease\",\n position: \"relative\",\n border: selected\n ? `2px solid ${token.colorPrimary}`\n : `1px solid ${token.colorBorder}`,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = \"translateY(-2px)\";\n e.currentTarget.style.boxShadow = `0 2px 8px rgba(0, 0, 0, 0.12)`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = \"translateY(0)\";\n e.currentTarget.style.boxShadow = `0 1px 4px rgba(0, 0, 0, 0.08)`;\n }}\n >\n {/* Content area */}\n <div\n style={{\n padding: 12,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 10,\n flex: 1,\n }}\n >\n {/* Header: Avatar and Name Section */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 10,\n }}\n >\n {/* Avatar with status indicator */}\n <Tooltip\n title={detailTooltipContent}\n placement=\"rightTop\"\n mouseEnterDelay={0.5}\n overlayStyle={{\n maxWidth: \"none\",\n }}\n color={token.colorBgContainer}\n >\n <div\n style={{\n position: \"relative\",\n flexShrink: 0,\n cursor: \"pointer\",\n }}\n >\n <Avatar\n size={44}\n icon={<UserOutlined />}\n style={{\n backgroundColor: badgeColor,\n color: \"#fff\",\n fontSize: 16,\n fontWeight: 600,\n }}\n >\n {initials}\n </Avatar>\n {/* Status indicator */}\n <div\n style={{\n position: \"absolute\",\n bottom: 0,\n right: 0,\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n background: statusDotColor,\n border: `2px solid ${token.colorBgContainer}`,\n }}\n />\n </div>\n </Tooltip>\n\n {/* Name and ID */}\n <div\n style={{\n flex: 1,\n minWidth: 0,\n paddingRight: 32,\n }}\n >\n <Text\n strong\n style={{\n fontSize: 14,\n fontWeight: 600,\n display: \"block\",\n marginBottom: 3,\n color: token.colorText,\n lineHeight: 1.3,\n }}\n ellipsis={{ tooltip: assistant.name }}\n >\n {assistant.name}\n </Text>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n }}\n >\n <IdcardOutlined\n style={{\n fontSize: 9,\n color: token.colorTextTertiary,\n }}\n />\n <Text\n style={{\n fontSize: 9,\n color: token.colorTextTertiary,\n }}\n ellipsis={{ tooltip: assistant.id }}\n >\n {assistant.id}\n </Text>\n </div>\n </div>\n </div>\n\n {/* Description */}\n {assistant.description && (\n <div\n style={{\n padding: 8,\n background: token.colorFillTertiary,\n border: `1px solid ${token.colorBorderSecondary}`,\n borderRadius: 4,\n borderLeft: `2px solid ${badgeColor}`,\n }}\n >\n <Tooltip\n title={\n assistant.description.length > 150\n ? assistant.description\n : undefined\n }\n placement=\"top\"\n >\n <div\n style={{\n fontSize: 10,\n color: token.colorText,\n lineHeight: 1.5,\n fontStyle: \"italic\",\n display: \"-webkit-box\",\n WebkitLineClamp: 3,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n cursor:\n assistant.description.length > 150\n ? \"help\"\n : \"default\",\n }}\n >\n \"{assistant.description}\"\n </div>\n </Tooltip>\n </div>\n )}\n\n {localA2A && onLocalA2AAction && (\n <Space size={6} wrap style={{ paddingTop: 4 }}>\n {localA2A.status === \"missing\" || localA2A.status === \"disabled\" ? (\n <Text type=\"secondary\" style={{ fontSize: 11 }}>\n {localA2A.status === \"missing\" ? t(\"chatWorkspace.assistantNode.status.notInstalled\") : t(\"chatWorkspace.assistantNode.status.disabled\")}\n </Text>\n ) : localA2A.status === \"starting\" ? (\n <Text type=\"secondary\" style={{ fontSize: 11 }}>\n {t(\"chatWorkspace.assistantNode.status.starting\")}\n </Text>\n ) : (\n <>\n {localA2A.status === \"running\" ? (\n <Button\n size=\"small\"\n icon={<Square size={12} />}\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n void onLocalA2AAction(localA2A.runtimeId, \"stop\");\n }}\n >\n {t(\"chatWorkspace.assistantNode.action.stop\")}\n </Button>\n ) : (\n <Button\n size=\"small\"\n icon={<Play size={12} />}\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n void onLocalA2AAction(localA2A.runtimeId, \"start\");\n }}\n >\n {t(\"chatWorkspace.assistantNode.action.start\")}\n </Button>\n )}\n <Button\n size=\"small\"\n icon={<RotateCcw size={12} />}\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n void onLocalA2AAction(localA2A.runtimeId, \"restart\");\n }}\n >\n {t(\"chatWorkspace.assistantNode.action.restart\")}\n </Button>\n </>\n )}\n </Space>\n )}\n\n {/* Bottom Info Tags and Chat */}\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: 4,\n padding: \"4px 0\",\n marginTop: \"auto\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n {/* Tags */}\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: 4,\n }}\n >\n {/* Agent Type */}\n {agentType && (\n <Tag\n style={{\n margin: 0,\n fontSize: 7,\n padding: \"2px 6px\",\n borderRadius: 6,\n backgroundColor: token.colorPrimaryBg,\n color: token.colorPrimary,\n border: `1px solid ${token.colorPrimaryBorder}`,\n fontWeight: 500,\n lineHeight: \"14px\",\n }}\n >\n {getAgentTypeLabel(agentType)}\n </Tag>\n )}\n\n {/* Has Tools Indicator */}\n {tools && tools.length > 0 && (\n <Tag\n style={{\n margin: 0,\n fontSize: 7,\n padding: \"2px 6px\",\n borderRadius: 6,\n backgroundColor: token.colorSuccessBg,\n color: token.colorSuccess,\n border: `1px solid ${token.colorSuccessBorder}`,\n fontWeight: 500,\n lineHeight: \"14px\",\n }}\n >\n {t(\"chatWorkspace.assistantNode.toolsCount\", { count: tools.length })}\n </Tag>\n )}\n\n {/* Model */}\n {modelKey && (\n <Tag\n style={{\n margin: 0,\n fontSize: 7,\n padding: \"2px 6px\",\n borderRadius: 6,\n backgroundColor: token.colorWarningBg,\n color: token.colorWarning,\n border: `1px solid ${token.colorWarningBorder}`,\n fontWeight: 500,\n lineHeight: \"14px\",\n }}\n title={modelKey}\n >\n {modelKey.length > 12\n ? `${modelKey.slice(0, 12)}...`\n : modelKey}\n </Tag>\n )}\n </div>\n\n {/* Chat Button - stopPropagation prevents node selection */}\n {onChat && (!localA2A || localA2A.status === \"running\") && (\n <div\n onMouseDown={(e: React.MouseEvent) => {\n // Prevent ReactFlow from handling this as a node selection\n e.stopPropagation();\n }}\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n onChat(assistant);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n padding: \"2px 6px\",\n borderRadius: 4,\n backgroundColor: token.colorPrimary,\n color: \"#fff\",\n cursor: \"pointer\",\n fontSize: 10,\n fontWeight: 500,\n transition: \"all 0.2s ease\",\n }}\n onMouseEnter={(e: React.MouseEvent<HTMLDivElement>) => {\n e.currentTarget.style.backgroundColor = token.colorPrimaryHover;\n }}\n onMouseLeave={(e: React.MouseEvent<HTMLDivElement>) => {\n e.currentTarget.style.backgroundColor = token.colorPrimary;\n }}\n >\n <MessageOutlined style={{ fontSize: 10 }} />\n <span>{t(\"chatWorkspace.assistantNode.chat\")}</span>\n </div>\n )}\n </div>\n </div>\n\n {/* Bottom connection point */}\n <Handle type=\"source\" position={Position.Bottom} />\n </div>\n </div>\n );\n};\n\nexport default AssistantNode;\n","import React from \"react\";\nimport { Tooltip } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { MiniBarChart } from \"./MiniChart\";\nimport { useT, type SdkTFunction } from \"../../i18n\";\n\nexport interface AgentCardStatsData {\n id: string;\n threadCount: number;\n last7d: number;\n last30d: number;\n lastActive: string | null;\n daily7d: number[];\n daily30d: number[];\n evalScore: number | null;\n evalPassRate: number | null;\n evalRuns: number;\n evalTrend: number[];\n}\n\nconst fmtActive = (iso: string | null, t?: SdkTFunction): string => {\n if (!iso) return \"—\";\n const diff = Date.now() - new Date(iso).getTime();\n const minutes = Math.floor(diff / 60000);\n if (minutes < 1) return t ? t(\"common.time.justNow\") : \"just now\";\n if (minutes < 60) return t ? t(\"common.time.minutesAgo\", { count: minutes }) : `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return t ? t(\"common.time.hoursAgo\", { count: hours }) : `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return t ? t(\"common.time.daysAgo\", { count: days }) : `${days}d ago`;\n};\n\nconst scoreColor = (score: number | null): string => {\n if (score === null) return \"#d9d9d9\";\n return score >= 80 ? \"#22c55e\" : score >= 50 ? \"#f59e0b\" : \"#ef4444\";\n};\n\nconst useStyles = createStyles(({ css }) => ({\n row: css`\n display: flex;\n justify-content: space-between;\n align-items: flex-end;\n `,\n}));\n\nconst valueStyle: React.CSSProperties = {\n fontSize: 16,\n fontWeight: 700,\n lineHeight: 1.2,\n cursor: \"help\",\n};\nconst labelStyle: React.CSSProperties = {\n fontSize: 10,\n color: \"rgba(0, 0, 0, 0.45)\",\n whiteSpace: \"nowrap\",\n marginTop: 1,\n};\nconst metricColumn: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n};\n\nexport const AgentCardStats: React.FC<{ stats?: AgentCardStatsData | null }> = ({ stats }) => {\n const { styles } = useStyles();\n const t = useT();\n\n if (!stats) {\n return (\n <div style={{ display: \"flex\", fontSize: 11, color: \"#d9d9d9\" }}>\n <span style={{ flex: 1 }}>{t(\"governance.cardStats.scoreEmpty\")}</span>\n <span style={{ flex: 1 }}>{t(\"governance.cardStats.threadsEmpty\")}</span>\n </div>\n );\n }\n\n const score = stats.evalScore !== null ? Number(stats.evalScore).toFixed(1) : \"—\";\n const threads = stats.threadCount > 0 ? stats.threadCount : \"—\";\n const scoreTextColor = scoreColor(stats.evalScore);\n const passRate = stats.evalPassRate !== null ? `${stats.evalPassRate}%` : \"—\";\n\n return (\n <div className={styles.row}>\n {/* Left: two StatCell-style metric columns */}\n <div style={{ display: \"flex\", gap: 16, alignItems: \"flex-end\" }}>\n <Tooltip title={t(\"governance.cardStats.evalTooltip\", { score, passRate, runs: stats.evalRuns })}>\n <div style={metricColumn}>\n <span style={{ ...valueStyle, color: scoreTextColor }}>{score}</span>\n <span className=\"lattice-stat-label\" style={labelStyle}>{t(\"governance.cardStats.evalScore\")}</span>\n </div>\n </Tooltip>\n <Tooltip title={stats.lastActive\n ? t(\"governance.cardStats.conversationsTooltipActive\", { total: stats.threadCount, last7d: stats.last7d, last30d: stats.last30d, lastActive: fmtActive(stats.lastActive, t) })\n : t(\"governance.cardStats.conversationsTooltip\", { total: stats.threadCount, last7d: stats.last7d, last30d: stats.last30d })}>\n <div style={metricColumn}>\n <span style={{ ...valueStyle, color: threads === \"—\" ? \"#d9d9d9\" : \"#595959\" }}>{threads}</span>\n <span className=\"lattice-stat-label\" style={labelStyle}>{t(\"governance.cardStats.threads\")}</span>\n </div>\n </Tooltip>\n </div>\n\n {/* Right: bar chart */}\n {stats.daily7d.length > 0 && (\n <div style={metricColumn}>\n <MiniBarChart values={stats.daily7d} width={40} height={24} color=\"#8c8c8c\" />\n <span className=\"lattice-stat-label\" style={labelStyle}>{t(\"governance.cardStats.threads7d\")}</span>\n </div>\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport { WorkspaceContextProvider } from \"../../context/WorkspaceContext\";\nimport { LatticeChat, type AgentChatProps } from \"./LatticeChat\";\nimport { AssistantContextProvider } from \"./AssistantContext\";\n\nexport type LatticeAgentWorkspaceProps = AgentChatProps & {\n workspaceId?: string;\n projectId?: string;\n};\n\nexport const LatticeAgentWorkspace: React.FC<LatticeAgentWorkspaceProps> = ({\n workspaceId,\n projectId = \"default\",\n assistant_id,\n ...chatProps\n}) => (\n <WorkspaceContextProvider workspaceId={workspaceId} projectId={projectId}>\n <AssistantContextProvider autoLoad={true} initialAssistantId={assistant_id}>\n <LatticeChat showProjectSelector={false} assistant_id={assistant_id} {...chatProps} />\n </AssistantContextProvider>\n </WorkspaceContextProvider>\n);\n"],"mappings":"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","names":["jsx","theme","jsx","theme","thread","jsx","jsx","jsxs","index","jsx","Fragment","jsx","jsxs","useEffect","useState","Button","Input","Modal","Typography","message","jsx","jsxs","Text","Title","Typography","useState","message","useEffect","Button","payload","result","Modal","Input","useMemo","useEffect","useState","useRef","createStyles","useMemo","Typography","theme","Tag","Space","Button","Fragment","jsx","jsxs","Text","Typography","colors","theme","useMemo","Tag","Space","index","Button","Button","message","theme","PlusOutlined","jsx","jsxs","useStyles","createStyles","useState","theme","useMemo","message","useEffect","index","useRef","Button","PlusOutlined","Tooltip","createStyles","jsx","jsxs","useStyles","createStyles","Tooltip","jsx"]}
|