@axiom-lattice/react-sdk 4.1.4 → 4.2.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.
Files changed (78) hide show
  1. package/dist/{AgentDetailSideApp-KVL27KAF.mjs → AgentDetailSideApp-ETXLLXP2.mjs} +9 -9
  2. package/dist/AgentGovernanceWorkbench-D47KUMAA.mjs +20 -0
  3. package/dist/{MessageGraph-LOSAZQ2V.mjs → MessageGraph-PVOC7XW4.mjs} +3 -3
  4. package/dist/{ReactChart-NDLIHCJJ.mjs → ReactChart-BZTCD4P7.mjs} +3 -3
  5. package/dist/{SkillFlow-OVKEKBOL.mjs → SkillFlow-TBKF765E.mjs} +4 -4
  6. package/dist/{TasksSideApp-37YKH7HV.mjs → TasksSideApp-NNFCW65B.mjs} +4 -4
  7. package/dist/{TeamWorkspace-EAFZU3KS.mjs → TeamWorkspace-GS7C7E4X.mjs} +3 -3
  8. package/dist/{TopologyRuntimeView-53OCKDYA.mjs → TopologyRuntimeView-VWGYRX74.mjs} +4 -4
  9. package/dist/{WorkflowAutomationView-R4EHXT7I.mjs → WorkflowAutomationView-T4YKEPSP.mjs} +6 -6
  10. package/dist/agent-chat-loader.js +1 -1
  11. package/dist/{chunk-SLXJAOF2.mjs → chunk-7DCDRNN5.mjs} +2 -2
  12. package/dist/{chunk-DTZKYPER.mjs → chunk-7QQKL657.mjs} +5 -2
  13. package/dist/chunk-7QQKL657.mjs.map +1 -0
  14. package/dist/{chunk-YYP5ASCR.mjs → chunk-AYNHFB6M.mjs} +5 -5
  15. package/dist/{chunk-LEEQPRDB.mjs → chunk-HMBSH53V.mjs} +102 -33
  16. package/dist/chunk-HMBSH53V.mjs.map +1 -0
  17. package/dist/{chunk-NHD2XFH4.mjs → chunk-K7WBURGK.mjs} +3 -3
  18. package/dist/{chunk-AMIVRDYB.mjs → chunk-MFAPAXZ2.mjs} +2 -2
  19. package/dist/{chunk-FKK4AXDU.mjs → chunk-NHWTNX7F.mjs} +5 -5
  20. package/dist/{chunk-WQBBDRPU.mjs → chunk-NLN5EB7R.mjs} +3730 -3080
  21. package/dist/chunk-NLN5EB7R.mjs.map +1 -0
  22. package/dist/{chunk-N4C7TX7T.mjs → chunk-NQK7AVBH.mjs} +3 -3
  23. package/dist/{chunk-EWLXRAWY.mjs → chunk-QPF4RBTJ.mjs} +240 -299
  24. package/dist/chunk-QPF4RBTJ.mjs.map +1 -0
  25. package/dist/{chunk-OT7IZRSM.mjs → chunk-THWLCTFU.mjs} +2 -2
  26. package/dist/{embed-page-AgentDetailSideApp-3LBCEKFU.js → embed-page-AgentDetailSideApp-7FH2JSZI.js} +1 -1
  27. package/dist/{embed-page-AgentGovernanceWorkbench-K3JUQNBW.js → embed-page-AgentGovernanceWorkbench-Y5F3ZPYC.js} +1 -1
  28. package/dist/{embed-page-MessageGraph-3X4ROEN6.js → embed-page-MessageGraph-ONODQPG4.js} +1 -1
  29. package/dist/{embed-page-ReactChart-F6VYCIYY.js → embed-page-ReactChart-GZQSKCUG.js} +1 -1
  30. package/dist/{embed-page-SkillFlow-3CF7R3CW.js → embed-page-SkillFlow-TPESM4DI.js} +1 -1
  31. package/dist/{embed-page-TasksSideApp-3WRDBZU3.js → embed-page-TasksSideApp-HYKCJ356.js} +1 -1
  32. package/dist/{embed-page-TeamWorkspace-6JSMZYUF.js → embed-page-TeamWorkspace-IOHS4RJV.js} +1 -1
  33. package/dist/{embed-page-TopologyRuntimeView-YDFENLHH.js → embed-page-TopologyRuntimeView-QLMZ4OE7.js} +1 -1
  34. package/dist/{embed-page-WorkflowAutomationView-MP5B7Q2Q.js → embed-page-WorkflowAutomationView-FJJSGY7Z.js} +1 -1
  35. package/dist/{embed-page-chunk-QEYWJHEK.js → embed-page-chunk-6LL6YULZ.js} +1 -1
  36. package/dist/{embed-page-chunk-UOL6CUAL.js → embed-page-chunk-D3NRIME3.js} +1 -1
  37. package/dist/embed-page-chunk-EMPMOO53.js +466 -0
  38. package/dist/{embed-page-chunk-GDTBDOUE.js → embed-page-chunk-FXTSVMPN.js} +89 -38
  39. package/dist/embed-page-chunk-KFUAWYJ7.js +5 -0
  40. package/dist/{embed-page-chunk-IRP6JSSX.js → embed-page-chunk-L7RMIQ7C.js} +9 -9
  41. package/dist/{embed-page-chunk-YMJGPA3F.js → embed-page-chunk-MCUFFMAW.js} +116 -124
  42. package/dist/{embed-page-chunk-PAJ5NG2Z.js → embed-page-chunk-SMQZEZYG.js} +1 -1
  43. package/dist/{embed-page-chunk-FFO7CAYL.js → embed-page-chunk-VVYB3C4O.js} +1 -1
  44. package/dist/{embed-page-chunk-RVXX5HKF.js → embed-page-chunk-ZTRCHYWV.js} +1 -1
  45. package/dist/embed-page.js +3 -3
  46. package/dist/index.d.mts +44 -7
  47. package/dist/index.d.ts +44 -7
  48. package/dist/index.js +5705 -4998
  49. package/dist/index.js.map +1 -1
  50. package/dist/index.mjs +27 -15
  51. package/dist/index.mjs.map +1 -1
  52. package/dist/web-app.js +4 -1
  53. package/dist/web-app.js.map +1 -1
  54. package/dist/web-app.mjs +1 -1
  55. package/package.json +3 -3
  56. package/dist/AgentGovernanceWorkbench-I6S4XU3T.mjs +0 -20
  57. package/dist/chunk-DTZKYPER.mjs.map +0 -1
  58. package/dist/chunk-EWLXRAWY.mjs.map +0 -1
  59. package/dist/chunk-LEEQPRDB.mjs.map +0 -1
  60. package/dist/chunk-WQBBDRPU.mjs.map +0 -1
  61. package/dist/embed-page-chunk-B2E2XOH2.js +0 -467
  62. package/dist/embed-page-chunk-URNZX66S.js +0 -5
  63. /package/dist/{AgentDetailSideApp-KVL27KAF.mjs.map → AgentDetailSideApp-ETXLLXP2.mjs.map} +0 -0
  64. /package/dist/{AgentGovernanceWorkbench-I6S4XU3T.mjs.map → AgentGovernanceWorkbench-D47KUMAA.mjs.map} +0 -0
  65. /package/dist/{MessageGraph-LOSAZQ2V.mjs.map → MessageGraph-PVOC7XW4.mjs.map} +0 -0
  66. /package/dist/{ReactChart-NDLIHCJJ.mjs.map → ReactChart-BZTCD4P7.mjs.map} +0 -0
  67. /package/dist/{SkillFlow-OVKEKBOL.mjs.map → SkillFlow-TBKF765E.mjs.map} +0 -0
  68. /package/dist/{TasksSideApp-37YKH7HV.mjs.map → TasksSideApp-NNFCW65B.mjs.map} +0 -0
  69. /package/dist/{TeamWorkspace-EAFZU3KS.mjs.map → TeamWorkspace-GS7C7E4X.mjs.map} +0 -0
  70. /package/dist/{TopologyRuntimeView-53OCKDYA.mjs.map → TopologyRuntimeView-VWGYRX74.mjs.map} +0 -0
  71. /package/dist/{WorkflowAutomationView-R4EHXT7I.mjs.map → WorkflowAutomationView-T4YKEPSP.mjs.map} +0 -0
  72. /package/dist/{chunk-SLXJAOF2.mjs.map → chunk-7DCDRNN5.mjs.map} +0 -0
  73. /package/dist/{chunk-YYP5ASCR.mjs.map → chunk-AYNHFB6M.mjs.map} +0 -0
  74. /package/dist/{chunk-NHD2XFH4.mjs.map → chunk-K7WBURGK.mjs.map} +0 -0
  75. /package/dist/{chunk-AMIVRDYB.mjs.map → chunk-MFAPAXZ2.mjs.map} +0 -0
  76. /package/dist/{chunk-FKK4AXDU.mjs.map → chunk-NHWTNX7F.mjs.map} +0 -0
  77. /package/dist/{chunk-N4C7TX7T.mjs.map → chunk-NQK7AVBH.mjs.map} +0 -0
  78. /package/dist/{chunk-OT7IZRSM.mjs.map → chunk-THWLCTFU.mjs.map} +0 -0
@@ -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","../src/integrations/push/useWebPush.ts"],"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/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 { 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 { 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","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 Popconfirm,\n Tag,\n Tabs,\n Drawer,\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\";\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 label: string;\n icon: React.ReactNode;\n};\n\nconst SETTINGS_MENU_ITEMS: SettingsMenuItem[] = [\n {\n key: \"environment\",\n label: \"Environment Variables\",\n icon: <EnvironmentOutlined />,\n },\n {\n key: \"models\",\n label: \"Model Configuration\",\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 apiKey: string;\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 { 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: \"Default\",\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: \"Server returned an error\",\n });\n }\n } catch (error: any) {\n if (error.name === \"AbortError\") {\n updateConnectionStatus(serverId, {\n connected: false,\n connecting: false,\n error: \"Connection timeout\",\n });\n } else {\n updateConnectionStatus(serverId, {\n connected: false,\n connecting: false,\n error: error.message || \"Failed to connect to server\",\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(\"Failed to load current configuration\");\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 setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n ...prev[serverId],\n models: data.data,\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(\"Please enter a server URL\");\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(\"Server added successfully\");\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(\"Server deleted\");\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(\"Please connect to a server first\");\n return;\n }\n\n const url = connection.url;\n if (!url) {\n message.error(\"Please connect to a server first\");\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 `Configuration saved. Please restart the server for ${data.requiresRestart.join(\n \", \"\n )} to take effect.`,\n 5\n );\n } else {\n message.success(\"Configuration saved and applied successfully\");\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 || \"Failed to save configuration\");\n }\n } else if (activeMenu === \"models\") {\n // Save models configuration\n const validModels = config.models.filter(\n (m) => m.key && m.model && m.provider\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(\"Model configuration saved and registered successfully\");\n onClose();\n } else {\n message.error(data.error || \"Failed to save model configuration\");\n }\n }\n } catch (error: any) {\n console.error(\"Failed to save configuration:\", error);\n message.error(error.message || \"Failed to save configuration\");\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=\"Configuration Effect\"\n description={\n <div>\n <div style={{ marginBottom: 8 }}>\n <CheckCircleOutlined\n style={{ color: \"#52c41a\", marginRight: 8 }}\n />\n <strong>Immediately effective:</strong> QUEUE_SERVICE_TYPE,\n REDIS_URL, REDIS_PASSWORD, QUEUE_NAME\n </div>\n <div>\n <ReloadOutlined style={{ color: \"#faad14\", marginRight: 8 }} />\n <strong>Requires restart:</strong> PORT (server must be\n restarted to change port)\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 Configure environment variables in .env format (key=value). One\n variable per line. Leave password fields empty to keep current\n values.\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 Configure model lattices. Each model will be registered with the\n provided key and can be used by agents.\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 Model {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 Remove\n </Button>\n )}\n </div>\n\n <Space direction=\"vertical\" style={{ width: \"100%\" }} size=\"large\">\n <div>\n <Text className={styles.formLabel}>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 Unique identifier for this model\n </Text>\n </div>\n\n <div>\n <Text className={styles.formLabel}>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}>Model Name *</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}>API Key</Text>\n <Input.Password\n placeholder=\"Enter your API key\"\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 API key for the model provider. Leave empty to use environment\n variable.\n </Text>\n </div>\n\n <div>\n <Text className={styles.formLabel}>Base URL</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 Optional custom base URL for the API\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>Enable Streaming</Text>\n </Space>\n </div>\n\n <div style={{ display: \"flex\", gap: 20 }}>\n <div style={{ flex: 1 }}>\n <Text className={styles.formLabel}>Max Tokens</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}>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 + Add Model\n </Button>\n </div>\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}>{item.label}</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?.label}\n </Title>\n <Text className={styles.contentDescription}>\n {activeMenu === \"environment\" &&\n \"Manage environment variables for the gateway server\"}\n {activeMenu === \"models\" &&\n \"Configure and register model lattices for use by agents\"}\n </Text>\n </div>\n <div className={styles.contentHeaderRight}>\n <Button onClick={onClose}>Cancel</Button>\n <Button\n type=\"primary\"\n icon={<SaveOutlined />}\n onClick={handleSave}\n loading={loading}\n >\n Save Configuration\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}>Connecting...</Title>\n <Text type=\"secondary\" style={{ textAlign: \"center\" }}>\n Connecting to {connection.url}\n </Text>\n </>\n ) : (\n <>\n <LinkOutlined style={{ fontSize: 64, color: \"#d9d9d9\" }} />\n <Title level={4} type=\"secondary\">\n {connection.error || \"Not Connected\"}\n </Title>\n <Text\n type=\"secondary\"\n style={{ textAlign: \"center\", maxWidth: 400 }}\n >\n {connection.error\n ? `Failed to connect to ${connection.url}. Please check the server URL and try again.`\n : `Click \"Reconnect\" to connect to ${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 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=\"Settings\"\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>Add Server</span>\n </div>\n }\n />\n </div>\n </Modal>\n\n {/* Add Server Modal */}\n <Modal\n title=\"Add New Server\"\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 Server Name\n </Text>\n <Input\n placeholder=\"e.g., Production Server\"\n value={newServerName}\n onChange={(e) => setNewServerName(e.target.value)}\n onPressEnter={handleAddServer}\n />\n <Text type=\"secondary\" style={{ fontSize: 12, marginTop: 4 }}>\n Optional: Leave empty to use URL as name\n </Text>\n </div>\n <div>\n <Text strong style={{ display: \"block\", marginBottom: 8 }}>\n Server URL *\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 Enter the full URL of the gateway server\n </Text>\n </div>\n <div>\n <Text strong style={{ display: \"block\", marginBottom: 8 }}>\n API Key\n </Text>\n <Input.Password\n placeholder=\"Optional: Enter API key for authentication\"\n value={newServerApiKey}\n onChange={(e) => setNewServerApiKey(e.target.value)}\n onPressEnter={handleAddServer}\n />\n <Text type=\"secondary\" style={{ fontSize: 12, marginTop: 4 }}>\n Optional: API key for server authentication\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\";\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 { 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=\"Chat shell\">\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\";\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 [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 || \"Failed to load channel installations\");\n }\n } catch (error) {\n console.error(\"Failed to load channel installations:\", error);\n setInstallations([]);\n message.error(\"Failed to load channel installations\");\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(\"Installation deleted\");\n } else {\n message.error(result.message || \"Failed to delete installation\");\n }\n } catch (error) {\n console.error(\"Failed to delete channel installation:\", error);\n message.error(\"Failed to delete installation\");\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 Channel Installations\n </Title>\n <Button\n type=\"primary\"\n icon={<Plus size={16} />}\n onClick={() => {\n setEditingInstallation(null);\n setFormModalOpen(true);\n }}\n >\n Add Installation\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 No channel installations\n </Text>\n <Text type=\"secondary\" style={{ marginTop: 8 }}>\n Click \"Add Installation\" to create one\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 Unsupported channel configuration UI\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 Edit\n </Button>\n <Popconfirm\n title=\"Delete Channel Installation\"\n description={`Are you sure you want to delete \"${installation.name || installation.id}\"?`}\n onConfirm={() => handleDelete(installation)}\n okText=\"Delete\"\n okType=\"danger\"\n cancelText=\"Cancel\"\n >\n <Button danger icon={<Trash2 size={14} />}>\n 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\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(\"Installation updated\");\n onSave();\n } else {\n message.error(result.message || \"Failed to update installation\");\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(\"Installation created\");\n onSave();\n } else {\n message.error(result.message || \"Failed to create installation\");\n }\n } catch (error) {\n console.error(\"Failed to save channel installation:\", error);\n message.error(\n installation ? \"Failed to update installation\" : \"Failed to create installation\"\n );\n }\n };\n\n return (\n <Modal\n open={open}\n title={installation ? \"Edit Installation\" : \"Add Installation\"}\n onCancel={onCancel}\n onOk={handleSubmit}\n okText={installation ? \"Save\" : \"Create\"}\n destroyOnHidden\n >\n <Form<FormValues> form={form} layout=\"vertical\">\n <Form.Item label=\"Channel\">\n <Input value=\"lark\" disabled />\n </Form.Item>\n <Form.Item name=\"name\" label=\"Name\">\n <Input />\n </Form.Item>\n <Form.Item\n name=\"appId\"\n label=\"App ID\"\n rules={[{ required: true, message: \"App ID is required\" }]}\n >\n <Input />\n </Form.Item>\n <Form.Item\n name=\"appSecret\"\n label=\"App Secret\"\n rules={[{ required: true, message: \"App Secret is required\" }]}\n >\n <Input />\n </Form.Item>\n <Form.Item name=\"verificationToken\" label=\"Verification Token\">\n <Input />\n </Form.Item>\n <Form.Item name=\"encryptKey\" label=\"Encrypt Key\">\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 { 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 { 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(`${currentState.label} CLI is not installed`);\n return;\n }\n if (currentState.status === \"disabled\") {\n message.warning(`${currentState.label} is disabled`);\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 : \"Failed to update local A2A provider\");\n } finally {\n setActiveRuntimeId(null);\n }\n },\n [client, localStates, refreshLocalA2A, refreshAssistants]\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 || \"Agent configuration saved successfully\");\n } else {\n message.error(data.message || \"Failed to save agent configuration\");\n throw new Error(data.message || \"Failed to save agent configuration\");\n }\n } catch (error) {\n console.error(\"Failed to save agent configuration:\", error);\n message.error(error instanceof Error ? error.message : \"Failed to save agent configuration\");\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(\"Assistant deleted successfully\");\n } else {\n message.error(data.message || \"Failed to delete assistant\");\n throw new Error(data.message || \"Failed to delete assistant\");\n }\n } catch (error) {\n console.error(\"Failed to delete assistant:\", error);\n message.error(error instanceof Error ? error.message : \"Failed to delete assistant\");\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}>Loading assistants...</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\";\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 { 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: \"Executor\",\n deep_agent: \"Orchestrator\",\n processing: \"Workflow\",\n plan_execute: \"PLAN EXECUTE\",\n sequential: \"SEQUENTIAL\",\n a2a_remote: \"A2A Remote\",\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 Model Engine\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 SYSTEM PROMPT\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 Available Tools ({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 +{tools.length - 5} more\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 Sub-Agent Architecture ({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 +{subAgents.length - 3} more\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\" ? \"Not Installed\" : \"Disabled\"}\n </Text>\n ) : localA2A.status === \"starting\" ? (\n <Text type=\"secondary\" style={{ fontSize: 11 }}>\n 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 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 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 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 {tools.length} Tools\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>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","/**\n * Web Push subscription for a PWA.\n *\n * Uses the application's EXISTING service worker registration (the framework\n * does not register one). The consumer app's service worker must handle\n * `push` / `notificationclick` (see the Web Push integration docs).\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLatticeChatShellContext } from \"../../components/Chat/LatticeChatShellContext\";\nimport { useAuthOptional } from \"../../context/AuthContext\";\n\nexport type WebPushPermission = NotificationPermission | \"unsupported\";\n\nexport interface UseWebPushOptions {\n /** VAPID public key. When omitted, it is fetched from `vapidPublicKeyUrl` or the gateway default. */\n vapidPublicKey?: string;\n /** Overrides the endpoint used to fetch the VAPID public key. */\n vapidPublicKeyUrl?: string;\n /** Overrides the endpoint that stores the subscription. */\n subscribeUrl?: string;\n /**\n * When true: silently (re)subscribe if permission is already granted, and\n * prompt once on the first user gesture otherwise.\n */\n autoEnable?: boolean;\n}\n\nexport interface WebPushState {\n supported: boolean;\n permission: WebPushPermission;\n subscribed: boolean;\n busy: boolean;\n enable: () => Promise<void>;\n disable: () => Promise<void>;\n}\n\nfunction supported(): boolean {\n return typeof navigator !== \"undefined\"\n && \"serviceWorker\" in navigator\n && typeof window !== \"undefined\"\n && \"PushManager\" in window\n && \"Notification\" in window;\n}\n\n/** Decodes a base64url VAPID public key into the ArrayBuffer the Push API expects. */\nfunction urlBase64ToUint8Array(base64: string): ArrayBuffer {\n const padding = \"=\".repeat((4 - (base64.length % 4)) % 4);\n const normalized = (base64 + padding).replace(/-/g, \"+\").replace(/_/g, \"/\");\n const raw = atob(normalized);\n const output = new Uint8Array(raw.length);\n for (let i = 0; i < raw.length; i += 1) output[i] = raw.charCodeAt(i);\n return output.buffer as ArrayBuffer;\n}\n\nfunction authToken(): string {\n if (typeof sessionStorage === \"undefined\") return \"\";\n return sessionStorage.getItem(\"lattice_token\") ?? \"\";\n}\n\n/**\n * Manages the browser Web Push subscription for the current user.\n *\n * @param options - Optional VAPID/subscribe overrides and `autoEnable`.\n * @returns Subscription state and `enable`/`disable` actions.\n */\nexport function useWebPush(options: UseWebPushOptions = {}): WebPushState {\n const { config } = useLatticeChatShellContext();\n const userId = useAuthOptional()?.user?.id;\n const baseURL = config.baseURL;\n const [permission, setPermission] = useState<WebPushPermission>(\n supported() ? Notification.permission : \"unsupported\"\n );\n const [subscribed, setSubscribed] = useState(false);\n const [busy, setBusy] = useState(false);\n const autoPromptedRef = useRef(false);\n\n const vapidKeyUrl = options.vapidPublicKeyUrl ?? `${baseURL}/api/push/vapid-public-key`;\n const subscribeUrl = options.subscribeUrl ?? `${baseURL}/api/push/subscriptions`;\n\n const resolveVapidKey = useCallback(async (): Promise<string | null> => {\n if (options.vapidPublicKey !== undefined) return options.vapidPublicKey;\n try {\n const response = await fetch(vapidKeyUrl, { headers: authToken() ? { Authorization: `Bearer ${authToken()}` } : {} });\n if (!response.ok) return null;\n const payload = (await response.json()) as { data?: { publicKey?: unknown } };\n const key = payload.data?.publicKey;\n return typeof key === \"string\" && key.length > 0 ? key : null;\n } catch {\n return null;\n }\n }, [options.vapidPublicKey, vapidKeyUrl]);\n\n const subscribe = useCallback(async (): Promise<void> => {\n if (!supported()) return;\n setBusy(true);\n try {\n const registration = await navigator.serviceWorker.ready;\n const vapidKey = await resolveVapidKey();\n if (vapidKey === null) return;\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(vapidKey),\n });\n const response = await fetch(subscribeUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...(authToken() ? { Authorization: `Bearer ${authToken()}` } : {}) },\n body: JSON.stringify(subscription.toJSON()),\n });\n if (response.ok) setSubscribed(true);\n } finally {\n setBusy(false);\n }\n }, [resolveVapidKey, subscribeUrl]);\n\n const enable = useCallback(async (): Promise<void> => {\n if (!supported()) return;\n if (typeof userId !== \"string\") return;\n const result = await Notification.requestPermission();\n setPermission(result);\n if (result === \"granted\") await subscribe();\n }, [subscribe, userId]);\n\n const disable = useCallback(async (): Promise<void> => {\n if (!supported()) return;\n try {\n const registration = await navigator.serviceWorker.ready;\n const subscription = await registration.pushManager.getSubscription();\n if (subscription) {\n const endpoint = subscription.endpoint;\n await subscription.unsubscribe();\n await fetch(subscribeUrl, {\n method: \"DELETE\",\n headers: { \"Content-Type\": \"application/json\", ...(authToken() ? { Authorization: `Bearer ${authToken()}` } : {}) },\n body: JSON.stringify({ endpoint }),\n });\n }\n setSubscribed(false);\n } catch {\n setSubscribed(false);\n }\n }, [subscribeUrl]);\n\n // autoEnable: silently subscribe when already granted; prompt once on first gesture otherwise.\n useEffect(() => {\n if (options.autoEnable !== true || !supported() || autoPromptedRef.current) return;\n autoPromptedRef.current = true;\n if (Notification.permission === \"granted\") {\n void subscribe();\n return;\n }\n if (Notification.permission === \"default\" && typeof document !== \"undefined\") {\n const onFirstGesture = (): void => {\n document.removeEventListener(\"pointerdown\", onFirstGesture);\n void enable();\n };\n document.addEventListener(\"pointerdown\", onFirstGesture, { once: true });\n return () => document.removeEventListener(\"pointerdown\", onFirstGesture);\n }\n }, [options.autoEnable, subscribe, enable]);\n\n return { supported: supported(), permission, subscribed, busy, enable, disable };\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","Popconfirm","Tag","Typography","message","jsx","jsxs","Text","Title","Typography","useState","message","useEffect","Button","Tag","Popconfirm","payload","result","Modal","Input","useMemo","useEffect","useState","useRef","createStyles","useMemo","Typography","theme","Tag","Space","Button","Fragment","jsx","jsxs","Text","colors","useMemo","index","Button","message","theme","PlusOutlined","jsx","jsxs","useStyles","createStyles","useState","theme","useMemo","message","useEffect","index","useRef","Button","PlusOutlined","jsx","useCallback","useEffect","useRef","useState","useState","useRef","useCallback","useEffect"]}
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","../src/integrations/push/useWebPush.ts"],"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/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 { 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 { 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","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 Popconfirm,\n Tag,\n Tabs,\n Drawer,\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\";\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 label: string;\n icon: React.ReactNode;\n};\n\nconst SETTINGS_MENU_ITEMS: SettingsMenuItem[] = [\n {\n key: \"environment\",\n label: \"Environment Variables\",\n icon: <EnvironmentOutlined />,\n },\n {\n key: \"models\",\n label: \"Model Configuration\",\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 apiKey: string;\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 { 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: \"Default\",\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: \"Server returned an error\",\n });\n }\n } catch (error: any) {\n if (error.name === \"AbortError\") {\n updateConnectionStatus(serverId, {\n connected: false,\n connecting: false,\n error: \"Connection timeout\",\n });\n } else {\n updateConnectionStatus(serverId, {\n connected: false,\n connecting: false,\n error: error.message || \"Failed to connect to server\",\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(\"Failed to load current configuration\");\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 setServerConfigs((prev) => ({\n ...prev,\n [serverId]: {\n ...prev[serverId],\n models: data.data,\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(\"Please enter a server URL\");\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(\"Server added successfully\");\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(\"Server deleted\");\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(\"Please connect to a server first\");\n return;\n }\n\n const url = connection.url;\n if (!url) {\n message.error(\"Please connect to a server first\");\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 `Configuration saved. Please restart the server for ${data.requiresRestart.join(\n \", \"\n )} to take effect.`,\n 5\n );\n } else {\n message.success(\"Configuration saved and applied successfully\");\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 || \"Failed to save configuration\");\n }\n } else if (activeMenu === \"models\") {\n // Save models configuration\n const validModels = config.models.filter(\n (m) => m.key && m.model && m.provider\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(\"Model configuration saved and registered successfully\");\n onClose();\n } else {\n message.error(data.error || \"Failed to save model configuration\");\n }\n }\n } catch (error: any) {\n console.error(\"Failed to save configuration:\", error);\n message.error(error.message || \"Failed to save configuration\");\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=\"Configuration Effect\"\n description={\n <div>\n <div style={{ marginBottom: 8 }}>\n <CheckCircleOutlined\n style={{ color: \"#52c41a\", marginRight: 8 }}\n />\n <strong>Immediately effective:</strong> QUEUE_SERVICE_TYPE,\n REDIS_URL, REDIS_PASSWORD, QUEUE_NAME\n </div>\n <div>\n <ReloadOutlined style={{ color: \"#faad14\", marginRight: 8 }} />\n <strong>Requires restart:</strong> PORT (server must be\n restarted to change port)\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 Configure environment variables in .env format (key=value). One\n variable per line. Leave password fields empty to keep current\n values.\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 Configure model lattices. Each model will be registered with the\n provided key and can be used by agents.\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 Model {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 Remove\n </Button>\n )}\n </div>\n\n <Space direction=\"vertical\" style={{ width: \"100%\" }} size=\"large\">\n <div>\n <Text className={styles.formLabel}>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 Unique identifier for this model\n </Text>\n </div>\n\n <div>\n <Text className={styles.formLabel}>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}>Model Name *</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}>API Key</Text>\n <Input.Password\n placeholder=\"Enter your API key\"\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 API key for the model provider. Leave empty to use environment\n variable.\n </Text>\n </div>\n\n <div>\n <Text className={styles.formLabel}>Base URL</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 Optional custom base URL for the API\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>Enable Streaming</Text>\n </Space>\n </div>\n\n <div style={{ display: \"flex\", gap: 20 }}>\n <div style={{ flex: 1 }}>\n <Text className={styles.formLabel}>Max Tokens</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}>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 + Add Model\n </Button>\n </div>\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}>{item.label}</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?.label}\n </Title>\n <Text className={styles.contentDescription}>\n {activeMenu === \"environment\" &&\n \"Manage environment variables for the gateway server\"}\n {activeMenu === \"models\" &&\n \"Configure and register model lattices for use by agents\"}\n </Text>\n </div>\n <div className={styles.contentHeaderRight}>\n <Button onClick={onClose}>Cancel</Button>\n <Button\n type=\"primary\"\n icon={<SaveOutlined />}\n onClick={handleSave}\n loading={loading}\n >\n Save Configuration\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}>Connecting...</Title>\n <Text type=\"secondary\" style={{ textAlign: \"center\" }}>\n Connecting to {connection.url}\n </Text>\n </>\n ) : (\n <>\n <LinkOutlined style={{ fontSize: 64, color: \"#d9d9d9\" }} />\n <Title level={4} type=\"secondary\">\n {connection.error || \"Not Connected\"}\n </Title>\n <Text\n type=\"secondary\"\n style={{ textAlign: \"center\", maxWidth: 400 }}\n >\n {connection.error\n ? `Failed to connect to ${connection.url}. Please check the server URL and try again.`\n : `Click \"Reconnect\" to connect to ${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 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=\"Settings\"\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>Add Server</span>\n </div>\n }\n />\n </div>\n </Modal>\n\n {/* Add Server Modal */}\n <Modal\n title=\"Add New Server\"\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 Server Name\n </Text>\n <Input\n placeholder=\"e.g., Production Server\"\n value={newServerName}\n onChange={(e) => setNewServerName(e.target.value)}\n onPressEnter={handleAddServer}\n />\n <Text type=\"secondary\" style={{ fontSize: 12, marginTop: 4 }}>\n Optional: Leave empty to use URL as name\n </Text>\n </div>\n <div>\n <Text strong style={{ display: \"block\", marginBottom: 8 }}>\n Server URL *\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 Enter the full URL of the gateway server\n </Text>\n </div>\n <div>\n <Text strong style={{ display: \"block\", marginBottom: 8 }}>\n API Key\n </Text>\n <Input.Password\n placeholder=\"Optional: Enter API key for authentication\"\n value={newServerApiKey}\n onChange={(e) => setNewServerApiKey(e.target.value)}\n onPressEnter={handleAddServer}\n />\n <Text type=\"secondary\" style={{ fontSize: 12, marginTop: 4 }}>\n Optional: API key for server authentication\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\";\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 { 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=\"Chat shell\">\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\";\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 [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 || \"Failed to load channel installations\");\n }\n } catch (error) {\n console.error(\"Failed to load channel installations:\", error);\n setInstallations([]);\n message.error(\"Failed to load channel installations\");\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(\"Installation deleted\");\n } else {\n message.error(result.message || \"Failed to delete installation\");\n }\n } catch (error) {\n console.error(\"Failed to delete channel installation:\", error);\n message.error(\"Failed to delete installation\");\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 Channel Installations\n </Title>\n <Button\n type=\"primary\"\n icon={<Plus size={16} />}\n onClick={() => {\n setEditingInstallation(null);\n setFormModalOpen(true);\n }}\n >\n Add Installation\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 No channel installations\n </Text>\n <Text type=\"secondary\" style={{ marginTop: 8 }}>\n Click \"Add Installation\" to create one\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 Unsupported channel configuration UI\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 Edit\n </Button>\n <Popconfirm\n title=\"Delete Channel Installation\"\n description={`Are you sure you want to delete \"${installation.name || installation.id}\"?`}\n onConfirm={() => handleDelete(installation)}\n okText=\"Delete\"\n okType=\"danger\"\n cancelText=\"Cancel\"\n >\n <Button danger icon={<Trash2 size={14} />}>\n 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\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(\"Installation updated\");\n onSave();\n } else {\n message.error(result.message || \"Failed to update installation\");\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(\"Installation created\");\n onSave();\n } else {\n message.error(result.message || \"Failed to create installation\");\n }\n } catch (error) {\n console.error(\"Failed to save channel installation:\", error);\n message.error(\n installation ? \"Failed to update installation\" : \"Failed to create installation\"\n );\n }\n };\n\n return (\n <Modal\n open={open}\n title={installation ? \"Edit Installation\" : \"Add Installation\"}\n onCancel={onCancel}\n onOk={handleSubmit}\n okText={installation ? \"Save\" : \"Create\"}\n destroyOnHidden\n >\n <Form<FormValues> form={form} layout=\"vertical\">\n <Form.Item label=\"Channel\">\n <Input value=\"lark\" disabled />\n </Form.Item>\n <Form.Item name=\"name\" label=\"Name\">\n <Input />\n </Form.Item>\n <Form.Item\n name=\"appId\"\n label=\"App ID\"\n rules={[{ required: true, message: \"App ID is required\" }]}\n >\n <Input />\n </Form.Item>\n <Form.Item\n name=\"appSecret\"\n label=\"App Secret\"\n rules={[{ required: true, message: \"App Secret is required\" }]}\n >\n <Input />\n </Form.Item>\n <Form.Item name=\"verificationToken\" label=\"Verification Token\">\n <Input />\n </Form.Item>\n <Form.Item name=\"encryptKey\" label=\"Encrypt Key\">\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 { 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 { 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(`${currentState.label} CLI is not installed`);\n return;\n }\n if (currentState.status === \"disabled\") {\n message.warning(`${currentState.label} is disabled`);\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 : \"Failed to update local A2A provider\");\n } finally {\n setActiveRuntimeId(null);\n }\n },\n [client, localStates, refreshLocalA2A, refreshAssistants]\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 || \"Agent configuration saved successfully\");\n } else {\n message.error(data.message || \"Failed to save agent configuration\");\n throw new Error(data.message || \"Failed to save agent configuration\");\n }\n } catch (error) {\n console.error(\"Failed to save agent configuration:\", error);\n message.error(error instanceof Error ? error.message : \"Failed to save agent configuration\");\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(\"Assistant deleted successfully\");\n } else {\n message.error(data.message || \"Failed to delete assistant\");\n throw new Error(data.message || \"Failed to delete assistant\");\n }\n } catch (error) {\n console.error(\"Failed to delete assistant:\", error);\n message.error(error instanceof Error ? error.message : \"Failed to delete assistant\");\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}>Loading assistants...</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\";\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 { 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: \"Executor\",\n deep_agent: \"Orchestrator\",\n processing: \"Workflow\",\n plan_execute: \"PLAN EXECUTE\",\n sequential: \"SEQUENTIAL\",\n a2a_remote: \"A2A Remote\",\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 Model Engine\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 SYSTEM PROMPT\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 Available Tools ({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 +{tools.length - 5} more\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 Sub-Agent Architecture ({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 +{subAgents.length - 3} more\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\" ? \"Not Installed\" : \"Disabled\"}\n </Text>\n ) : localA2A.status === \"starting\" ? (\n <Text type=\"secondary\" style={{ fontSize: 11 }}>\n 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 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 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 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 {tools.length} Tools\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>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","/**\n * Web Push subscription for a PWA.\n *\n * Uses the application's EXISTING service worker registration (the framework\n * does not register one). The consumer app's service worker must handle\n * `push` / `notificationclick` (see the Web Push integration docs).\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLatticeChatShellContext } from \"../../components/Chat/LatticeChatShellContext\";\nimport { useAuthOptional } from \"../../context/AuthContext\";\nimport { readAuthItem } from \"../../utils/authStorage\";\n\nexport type WebPushPermission = NotificationPermission | \"unsupported\";\n\nexport interface UseWebPushOptions {\n /** VAPID public key. When omitted, it is fetched from `vapidPublicKeyUrl` or the gateway default. */\n vapidPublicKey?: string;\n /** Overrides the endpoint used to fetch the VAPID public key. */\n vapidPublicKeyUrl?: string;\n /** Overrides the endpoint that stores the subscription. */\n subscribeUrl?: string;\n /**\n * When true: silently (re)subscribe if permission is already granted, and\n * prompt once on the first user gesture otherwise.\n */\n autoEnable?: boolean;\n}\n\nexport interface WebPushState {\n supported: boolean;\n permission: WebPushPermission;\n subscribed: boolean;\n busy: boolean;\n enable: () => Promise<void>;\n disable: () => Promise<void>;\n}\n\nfunction supported(): boolean {\n return typeof navigator !== \"undefined\"\n && \"serviceWorker\" in navigator\n && typeof window !== \"undefined\"\n && \"PushManager\" in window\n && \"Notification\" in window;\n}\n\n/** Decodes a base64url VAPID public key into the ArrayBuffer the Push API expects. */\nfunction urlBase64ToUint8Array(base64: string): ArrayBuffer {\n const padding = \"=\".repeat((4 - (base64.length % 4)) % 4);\n const normalized = (base64 + padding).replace(/-/g, \"+\").replace(/_/g, \"/\");\n const raw = atob(normalized);\n const output = new Uint8Array(raw.length);\n for (let i = 0; i < raw.length; i += 1) output[i] = raw.charCodeAt(i);\n return output.buffer as ArrayBuffer;\n}\n\nfunction authToken(): string {\n if (typeof window === \"undefined\") return \"\";\n return readAuthItem(\"lattice_token\") ?? \"\";\n}\n\n/**\n * Manages the browser Web Push subscription for the current user.\n *\n * @param options - Optional VAPID/subscribe overrides and `autoEnable`.\n * @returns Subscription state and `enable`/`disable` actions.\n */\nexport function useWebPush(options: UseWebPushOptions = {}): WebPushState {\n const { config } = useLatticeChatShellContext();\n const userId = useAuthOptional()?.user?.id;\n const baseURL = config.baseURL;\n const [permission, setPermission] = useState<WebPushPermission>(\n supported() ? Notification.permission : \"unsupported\"\n );\n const [subscribed, setSubscribed] = useState(false);\n const [busy, setBusy] = useState(false);\n const autoPromptedRef = useRef(false);\n\n const vapidKeyUrl = options.vapidPublicKeyUrl ?? `${baseURL}/api/push/vapid-public-key`;\n const subscribeUrl = options.subscribeUrl ?? `${baseURL}/api/push/subscriptions`;\n\n const resolveVapidKey = useCallback(async (): Promise<string | null> => {\n if (options.vapidPublicKey !== undefined) return options.vapidPublicKey;\n try {\n const response = await fetch(vapidKeyUrl, { headers: authToken() ? { Authorization: `Bearer ${authToken()}` } : {} });\n if (!response.ok) return null;\n const payload = (await response.json()) as { data?: { publicKey?: unknown } };\n const key = payload.data?.publicKey;\n return typeof key === \"string\" && key.length > 0 ? key : null;\n } catch {\n return null;\n }\n }, [options.vapidPublicKey, vapidKeyUrl]);\n\n const subscribe = useCallback(async (): Promise<void> => {\n if (!supported()) return;\n setBusy(true);\n try {\n const registration = await navigator.serviceWorker.ready;\n const vapidKey = await resolveVapidKey();\n if (vapidKey === null) return;\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(vapidKey),\n });\n const response = await fetch(subscribeUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...(authToken() ? { Authorization: `Bearer ${authToken()}` } : {}) },\n body: JSON.stringify(subscription.toJSON()),\n });\n if (response.ok) setSubscribed(true);\n } finally {\n setBusy(false);\n }\n }, [resolveVapidKey, subscribeUrl]);\n\n const enable = useCallback(async (): Promise<void> => {\n if (!supported()) return;\n if (typeof userId !== \"string\") return;\n const result = await Notification.requestPermission();\n setPermission(result);\n if (result === \"granted\") await subscribe();\n }, [subscribe, userId]);\n\n const disable = useCallback(async (): Promise<void> => {\n if (!supported()) return;\n try {\n const registration = await navigator.serviceWorker.ready;\n const subscription = await registration.pushManager.getSubscription();\n if (subscription) {\n const endpoint = subscription.endpoint;\n await subscription.unsubscribe();\n await fetch(subscribeUrl, {\n method: \"DELETE\",\n headers: { \"Content-Type\": \"application/json\", ...(authToken() ? { Authorization: `Bearer ${authToken()}` } : {}) },\n body: JSON.stringify({ endpoint }),\n });\n }\n setSubscribed(false);\n } catch {\n setSubscribed(false);\n }\n }, [subscribeUrl]);\n\n // autoEnable: silently subscribe when already granted; prompt once on first gesture otherwise.\n useEffect(() => {\n if (options.autoEnable !== true || !supported() || autoPromptedRef.current) return;\n autoPromptedRef.current = true;\n if (Notification.permission === \"granted\") {\n void subscribe();\n return;\n }\n if (Notification.permission === \"default\" && typeof document !== \"undefined\") {\n const onFirstGesture = (): void => {\n document.removeEventListener(\"pointerdown\", onFirstGesture);\n void enable();\n };\n document.addEventListener(\"pointerdown\", onFirstGesture, { once: true });\n return () => document.removeEventListener(\"pointerdown\", onFirstGesture);\n }\n }, [options.autoEnable, subscribe, enable]);\n\n return { supported: supported(), permission, subscribed, busy, enable, disable };\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","Popconfirm","Tag","Typography","message","jsx","jsxs","Text","Title","Typography","useState","message","useEffect","Button","Tag","Popconfirm","payload","result","Modal","Input","useMemo","useEffect","useState","useRef","createStyles","useMemo","Typography","theme","Tag","Space","Button","Fragment","jsx","jsxs","Text","colors","useMemo","index","Button","message","theme","PlusOutlined","jsx","jsxs","useStyles","createStyles","useState","theme","useMemo","message","useEffect","index","useRef","Button","PlusOutlined","jsx","useCallback","useEffect","useRef","useState","useState","useRef","useCallback","useEffect"]}